use a ulong instead of void * for window handle

This commit is contained in:
Josh Holtrop 2020-07-08 11:05:53 -04:00
parent 84b67e99b1
commit ef036716b7
2 changed files with 26 additions and 19 deletions

View File

@ -96,9 +96,10 @@ static Bool wait_for_notify(Display * display, XEvent * event, XPointer arg)
return (event->type == MapNotify) && (event->xmap.window == (Window)arg); return (event->type == MapNotify) && (event->xmap.window == (Window)arg);
} }
void * jtk_window_create() bool jtk_window_create(uint64_t * window_handle)
{ {
XEvent event; XEvent event;
bool success;
XLockDisplay(g_display); XLockDisplay(g_display);
Window window = XCreateWindow(g_display, Window window = XCreateWindow(g_display,
@ -112,40 +113,42 @@ void * jtk_window_create()
/* Disable the window close button. */ /* Disable the window close button. */
Atom wm_delete_window_atom = XInternAtom(g_display, "WM_DELETE_WINDOW", False); Atom wm_delete_window_atom = XInternAtom(g_display, "WM_DELETE_WINDOW", False);
XSetWMProtocols(g_display, window, &wm_delete_window_atom, 1); XSetWMProtocols(g_display, window, &wm_delete_window_atom, 1);
success = true;
*window_handle = (uint64_t)window;
} }
else else
{ {
fprintf(stderr, "glXMakeCurrent() failure\n"); fprintf(stderr, "glXMakeCurrent() failure\n");
XDestroyWindow(g_display, window); XDestroyWindow(g_display, window);
window = NULL; success = false;
} }
XUnlockDisplay(g_display); XUnlockDisplay(g_display);
return (void *)window; return success;
} }
void jtk_window_swap_buffers(void * window) void jtk_window_swap_buffers(uint64_t window_handle)
{ {
XLockDisplay(g_display); XLockDisplay(g_display);
glXSwapBuffers(g_display, (Window)window); glXSwapBuffers(g_display, (Window)window_handle);
XUnlockDisplay(g_display); XUnlockDisplay(g_display);
} }
void jtk_window_close(void * window) void jtk_window_close(uint64_t window_handle)
{ {
XLockDisplay(g_display); XLockDisplay(g_display);
XDestroyWindow(g_display, (Window)window); XDestroyWindow(g_display, (Window)window_handle);
XUnlockDisplay(g_display); XUnlockDisplay(g_display);
} }
void jtk_window_set_title(void * window, const char * title) void jtk_window_set_title(uint64_t window_handle, const char * title)
{ {
XLockDisplay(g_display); XLockDisplay(g_display);
XTextProperty title_property; XTextProperty title_property;
if (XStringListToTextProperty((char **)&title, 1, &title_property) != 0) if (XStringListToTextProperty((char **)&title, 1, &title_property) != 0)
{ {
XSetTextProperty(g_display, (Window)window, &title_property, XA_WM_NAME); XSetTextProperty(g_display, (Window)window_handle, &title_property, XA_WM_NAME);
XFree(title_property.value); XFree(title_property.value);
} }
XUnlockDisplay(g_display); XUnlockDisplay(g_display);
@ -164,7 +167,7 @@ void jtk_window_set_title(void * window, const char * title)
* @param height * @param height
* Icon height. * Icon height.
*/ */
void jtk_window_set_icon(void * window, const uint8_t * data, void jtk_window_set_icon(uint64_t window_handle, const uint8_t * data,
size_t width, size_t height) size_t width, size_t height)
{ {
XLockDisplay(g_display); XLockDisplay(g_display);
@ -182,8 +185,9 @@ void jtk_window_set_icon(void * window, const uint8_t * data,
*dest++ = *src++; *dest++ = *src++;
} }
} }
XChangeProperty(g_display, (Window)window, net_wm_icon_atom, XA_CARDINAL, XChangeProperty(g_display, (Window)window_handle, net_wm_icon_atom,
32, PropModeReplace, (uint8_t *)property_data, property_size); XA_CARDINAL, 32, PropModeReplace, (uint8_t *)property_data,
property_size);
XFlush(g_display); XFlush(g_display);
free(property_data); free(property_data);
XUnlockDisplay(g_display); XUnlockDisplay(g_display);

View File

@ -2,20 +2,23 @@ module jtk.window;
import std.string; import std.string;
private extern(C) void * jtk_window_create(); private extern(C) bool jtk_window_create(ulong * window);
private extern(C) void jtk_window_swap_buffers(void * window); private extern(C) void jtk_window_swap_buffers(ulong window);
private extern(C) void jtk_window_close(void * window); private extern(C) void jtk_window_close(ulong window);
private extern(C) void jtk_window_set_title(void * window, const char * title); private extern(C) void jtk_window_set_title(ulong window, const char * title);
private extern(C) void jtk_window_set_icon(void * window, const ubyte * data, private extern(C) void jtk_window_set_icon(ulong window, const ubyte * data,
size_t width, size_t height); size_t width, size_t height);
class Window class Window
{ {
private void * m_window; private ulong m_window;
this() this()
{ {
m_window = jtk_window_create(); if (!jtk_window_create(&m_window))
{
/* TODO */
}
} }
void close() void close()