Alien-Xmake

 view release on metacpan or  search on metacpan

eg/nuklear/nk_win.c  view on Meta::CPAN

            nk_input_end(&gdi.ctx);
            g_running = 0;
            return;
        }
        TranslateMessage(&msg);
        DispatchMessageW(&msg);
        g_needs_refresh = 1;
    }
    else {
        g_needs_refresh = 0;
    }
    while (PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE)) {
        if (msg.message == WM_QUIT) {
            nk_input_end(&gdi.ctx);
            g_running = 0;
            return;
        }
        TranslateMessage(&msg);
        DispatchMessageW(&msg);
        g_needs_refresh = 1;
    }
    nk_input_end(&gdi.ctx);
}

NK_WIN_API void nk_win_render(unsigned char r, unsigned char g, unsigned char b, unsigned char a) {
    HDC dc;
    if (!g_hwnd)
        return;
    dc = GetDC(g_hwnd);
    nk_gdi_set_font(g_font);
    nk_gdi_render(nk_rgba(r, g, b, a));
    ReleaseDC(g_hwnd, dc);
}

NK_WIN_API void nk_win_shutdown(void) {
    if (g_hwnd) {
        DestroyWindow(g_hwnd);
        g_hwnd = NULL;
    }
    nk_gdi_shutdown();
    if (g_font) {
        nk_gdifont_del(g_font);
        g_font = NULL;
    }
    UnregisterClassW(WIN_CLASS_NAME, GetModuleHandleW(NULL));
    g_running = 0;
}

NK_WIN_API void * nk_win_context(void) { return &gdi.ctx; }

#else /* Unix / X11 */
static Display     *g_dpy;
static Window       g_win;
static int          g_screen;
static Atom         g_wm_delete;
static XFont       *g_font;

/* Convert a wide string (as passed from Perl's WString) to UTF-8 so the X11 window title is
   correct regardless of the platform's wchar_t width.
 */
static void wstr_to_utf8(const wchar_t *ws, char *out, size_t outsz) {
    size_t i = 0, o = 0;
    out[0] = '\0';
    if (!ws)
        return;
    for (i = 0; ws[i] != 0 && o + 4 < outsz; i++) {
        unsigned int cp = (unsigned int)ws[i];
        if (cp < 0x80) {
            out[o++] = (char)cp;
        }
        else if (cp < 0x800) {
            out[o++] = (char)(0xC0 | (cp >> 6));
            out[o++] = (char)(0x80 | (cp & 0x3F));
        }
        else if (cp < 0x10000) {
            out[o++] = (char)(0xE0 | (cp >> 12));
            out[o++] = (char)(0x80 | ((cp >> 6) & 0x3F));
            out[o++] = (char)(0x80 | (cp & 0x3F));
        }
        else {
            out[o++] = (char)(0xF0 | (cp >> 18));
            out[o++] = (char)(0x80 | ((cp >> 12) & 0x3F));
            out[o++] = (char)(0x80 | ((cp >> 6) & 0x3F));
            out[o++] = (char)(0x80 | (cp & 0x3F));
        }
    }
    out[o] = '\0';
}

NK_WIN_API int nk_win_init(const wchar_t *title, int width, int height, const char *font_name, int font_size) {
    XSetWindowAttributes attrs;
    unsigned long mask;
    char title_utf8[256];
    const char *fc;

    g_dpy = XOpenDisplay(NULL);
    if (!g_dpy)
        return 0;
    g_screen = XDefaultScreen(g_dpy);

    mask = CWBackPixel | CWEventMask;
    attrs.background_pixel = BlackPixel(g_dpy, g_screen);
    attrs.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask |
        ButtonPressMask | ButtonReleaseMask | PointerMotionMask |
        StructureNotifyMask;
    g_win = XCreateWindow(g_dpy, RootWindow(g_dpy, g_screen),
        0, 0, (unsigned)width, (unsigned)height, 0,
        CopyFromParent, InputOutput, CopyFromParent, mask, &attrs);
    if (!g_win)
        return 0;

    wstr_to_utf8(title, title_utf8, sizeof(title_utf8));
    XStoreName(g_dpy, g_win, title_utf8);
    g_wm_delete = XInternAtom(g_dpy, "WM_DELETE_WINDOW", False);
    XSetWMProtocols(g_dpy, g_win, &g_wm_delete, 1);

    XMapWindow(g_dpy, g_win);
    XFlush(g_dpy);

    fc = font_name && font_name[0] ? font_name : "fixed";
    g_font = nk_xfont_create(g_dpy, fc);
    if (!g_font) {
        XDestroyWindow(g_dpy, g_win);
        XCloseDisplay(g_dpy);
        g_dpy = NULL;
        return 0;
    }

    if (!nk_xlib_init(g_font, g_dpy, g_screen, g_win,
        (unsigned)width, (unsigned)height)) {
        nk_xfont_del(g_dpy, g_font);
        g_font = NULL;
        XDestroyWindow(g_dpy, g_win);
        XCloseDisplay(g_dpy);
        g_dpy = NULL;
        return 0;
    }
    g_running = 1;
    return 1;
}

NK_WIN_API int nk_win_running(void) { return g_running; }

NK_WIN_API void nk_win_poll(void) {
    XEvent ev;
    if (!g_dpy)
        return;
    while (XPending(g_dpy)) {
        XNextEvent(g_dpy, &ev);
        if (ev.type == ClientMessage &&
            (Atom)ev.xclient.data.l[0] == g_wm_delete) {
            g_running = 0;
            return;
        }
        nk_xlib_handle_event(g_dpy, g_screen, g_win, &ev);
    }
}

NK_WIN_API void nk_win_render(unsigned char r, unsigned char g, unsigned char b, unsigned char a) {
    (void)a;
    if (!g_dpy || !g_win)
        return;
    nk_xlib_set_font(g_font);
    nk_xlib_render(g_win, nk_rgba(r, g, b, 255));
    XFlush(g_dpy);
}

NK_WIN_API void nk_win_shutdown(void) {
    nk_xlib_shutdown();
    if (g_font) {
        nk_xfont_del(g_dpy, g_font);
        g_font = NULL;
    }



( run in 0.653 second using v1.01-cache-2.11-cpan-364913b4093 )