diff --git a/src/backend/backend.h b/src/backend/backend.h index 6cb5b7e..f69e1ea 100644 --- a/src/backend/backend.h +++ b/src/backend/backend.h @@ -1719,6 +1719,12 @@ typedef struct WMBackend { unsigned int *nchildren_out); WScreen *(*screen_for_window)(WNativeWindow window); + int (*parse_color)(WScreen *scr, const char *name, XColor *color_out); + int (*cursor_create_from_files)(WScreen *scr, const char *bitmap_path, + const char *mask_path, Cursor *cursor_out); + void (*cursor_free)(Cursor cursor); + void (*cursor_set)(WNativeWindow window, Cursor cursor); + } WMBackend; /* diff --git a/src/backend/wayland/wl_backend.c b/src/backend/wayland/wl_backend.c index f184235..39beaf0 100644 --- a/src/backend/wayland/wl_backend.c +++ b/src/backend/wayland/wl_backend.c @@ -6234,6 +6234,14 @@ static void wl_noop_query_tree(WNativeWindow root, WNativeWindow **children_out, static WScreen *wl_noop_screen_for_window(WNativeWindow window) { (void)window; return wScreenWithNumber(0); } +static int wl_noop_parse_color(WScreen *scr, const char *name, XColor *color_out) +{ (void)scr; (void)name; (void)color_out; return 0; } +static int wl_noop_cursor_create_from_files(WScreen *scr, const char *bitmap_path, + const char *mask_path, Cursor *cursor_out) +{ (void)scr; (void)bitmap_path; (void)mask_path; (void)cursor_out; return 0; } +static void wl_noop_cursor_free(Cursor cursor) { (void)cursor; } +static void wl_noop_cursor_set(WNativeWindow window, Cursor cursor) { (void)window; (void)cursor; } + /* ------------------------------------------------------------------ */ /* vtable */ /* ------------------------------------------------------------------ */ @@ -6461,4 +6469,8 @@ const WMBackend wl_backend = { .context_init = wl_context_init, .query_tree = wl_noop_query_tree, .screen_for_window = wl_noop_screen_for_window, + .parse_color = wl_noop_parse_color, + .cursor_create_from_files = wl_noop_cursor_create_from_files, + .cursor_free = wl_noop_cursor_free, + .cursor_set = wl_noop_cursor_set, }; diff --git a/src/backend/x11/x11_backend.c b/src/backend/x11/x11_backend.c index ae09c5f..30dcfc6 100644 --- a/src/backend/x11/x11_backend.c +++ b/src/backend/x11/x11_backend.c @@ -3040,6 +3040,46 @@ static WScreen *x11_screen_for_window(WNativeWindow window) return NULL; } +static int x11_parse_color(WScreen *scr, const char *name, XColor *color_out) +{ + return XParseColor(dpy, scr->w_colormap, name, color_out); +} + +static int x11_cursor_create_from_files(WScreen *scr, const char *bitmap_path, + const char *mask_path, Cursor *cursor_out) +{ + Pixmap bitmap = None, mask = None; + unsigned int w, h; + int x, y; + XColor fg, bg; + + if (XReadBitmapFile(dpy, scr->w_win, bitmap_path, &w, &h, &bitmap, &x, &y) != BitmapSuccess) + return 0; + if (XReadBitmapFile(dpy, scr->w_win, mask_path, &w, &h, &mask, &x, &y) != BitmapSuccess) { + XFreePixmap(dpy, bitmap); + return 0; + } + fg.pixel = scr->black_pixel; + bg.pixel = scr->white_pixel; + XQueryColor(dpy, scr->w_colormap, &fg); + XQueryColor(dpy, scr->w_colormap, &bg); + *cursor_out = XCreatePixmapCursor(dpy, bitmap, mask, &fg, &bg, x, y); + XFreePixmap(dpy, bitmap); + XFreePixmap(dpy, mask); + return 1; +} + +static void x11_cursor_free(Cursor cursor) +{ + if (cursor != None) + XFreeCursor(dpy, cursor); +} + +static void x11_cursor_set(WNativeWindow window, Cursor cursor) +{ + XDefineCursor(dpy, (Window)window, cursor); +} + /* -------------------------------------------------------------------- */ /* Client operations (Phase 80) */ /* -------------------------------------------------------------------- */ @@ -3750,6 +3790,10 @@ const WMBackend x11_backend = { .context_init = x11_context_init, .query_tree = x11_query_tree, .screen_for_window = x11_screen_for_window, + .parse_color = x11_parse_color, + .cursor_create_from_files = x11_cursor_create_from_files, + .cursor_free = x11_cursor_free, + .cursor_set = x11_cursor_set, }; /* diff --git a/src/defaults.c b/src/defaults.c index c42d0d1..c80e52e 100644 --- a/src/defaults.c +++ b/src/defaults.c @@ -1672,7 +1672,7 @@ static WTexture *parse_texture(WScreen * scr, WMPropList * pl) return NULL; val = WMGetFromPLString(elem); - if (!XParseColor(dpy, scr->w_colormap, val, &color)) { + if (!wm_backend->parse_color(scr, val, &color)) { wwarning(_("\"%s\" is not a valid color name"), val); return NULL; } @@ -1702,7 +1702,7 @@ static WTexture *parse_texture(WScreen * scr, WMPropList * pl) return NULL; val = WMGetFromPLString(elem); - if (!XParseColor(dpy, scr->w_colormap, val, &xcolor)) { + if (!wm_backend->parse_color(scr, val, &xcolor)) { wwarning(_("\"%s\" is not a valid color name"), val); return NULL; } @@ -1718,7 +1718,7 @@ static WTexture *parse_texture(WScreen * scr, WMPropList * pl) } val = WMGetFromPLString(elem); - if (!XParseColor(dpy, scr->w_colormap, val, &xcolor)) { + if (!wm_backend->parse_color(scr, val, &xcolor)) { wwarning(_("\"%s\" is not a valid color name"), val); return NULL; } @@ -1747,7 +1747,7 @@ static WTexture *parse_texture(WScreen * scr, WMPropList * pl) return NULL; val = WMGetFromPLString(elem); - if (!XParseColor(dpy, scr->w_colormap, val, &xcolor)) { + if (!wm_backend->parse_color(scr, val, &xcolor)) { wwarning(_("\"%s\" is not a valid color name"), val); return NULL; } @@ -1769,7 +1769,7 @@ static WTexture *parse_texture(WScreen * scr, WMPropList * pl) return NULL; val = WMGetFromPLString(elem); - if (!XParseColor(dpy, scr->w_colormap, val, &xcolor)) { + if (!wm_backend->parse_color(scr, val, &xcolor)) { wwarning(_("\"%s\" is not a valid color name"), val); return NULL; } @@ -1820,7 +1820,7 @@ static WTexture *parse_texture(WScreen * scr, WMPropList * pl) } val = WMGetFromPLString(elem); - if (!XParseColor(dpy, scr->w_colormap, val, &color)) { + if (!wm_backend->parse_color(scr, val, &color)) { wwarning(_("\"%s\" is not a valid color name"), val); for (--i; i >= 0; --i) { wfree(colors[i]); @@ -1859,7 +1859,7 @@ static WTexture *parse_texture(WScreen * scr, WMPropList * pl) } val = WMGetFromPLString(elem); - if (!XParseColor(dpy, scr->w_colormap, val, &color)) { + if (!wm_backend->parse_color(scr, val, &color)) { wwarning(_("\"%s\" is not a valid color name"), val); return NULL; } @@ -1896,7 +1896,7 @@ static WTexture *parse_texture(WScreen * scr, WMPropList * pl) return NULL; val = WMGetFromPLString(elem); - if (!XParseColor(dpy, scr->w_colormap, val, &xcolor)) { + if (!wm_backend->parse_color(scr, val, &xcolor)) { wwarning(_("\"%s\" is not a valid color name"), val); return NULL; } @@ -1912,7 +1912,7 @@ static WTexture *parse_texture(WScreen * scr, WMPropList * pl) } val = WMGetFromPLString(elem); - if (!XParseColor(dpy, scr->w_colormap, val, &xcolor)) { + if (!wm_backend->parse_color(scr, val, &xcolor)) { wwarning(_("\"%s\" is not a valid color name"), val); return NULL; } @@ -2218,7 +2218,7 @@ static int getKeybind(WScreen * scr, WDefaultEntry * entry, WMPropList * value, } /* get key */ - ksym = XStringToKeysym(b); + ksym = (KeySym)wm_backend->keysym_from_name(b); if (ksym == NoSymbol) { wwarning(_("%s:invalid kbd shortcut specification \"%s\""), entry->key, val); @@ -2366,18 +2366,9 @@ static int parse_cursor(WScreen * scr, WMPropList * pl, Cursor * cursor) wwarning(_("could not find cursor bitmap file \"%s\""), val); return (status); } - mask_status = XReadBitmapFile(dpy, scr->w_win, mask_name, &w, &h, &mask, &x, &y); - bitmap_status = XReadBitmapFile(dpy, scr->w_win, bitmap_name, &w, &h, &bitmap, &x, &y); - if ((BitmapSuccess == bitmap_status) && (BitmapSuccess == mask_status)) { - fg.pixel = scr->black_pixel; - bg.pixel = scr->white_pixel; - XQueryColor(dpy, scr->w_colormap, &fg); - XQueryColor(dpy, scr->w_colormap, &bg); - *cursor = XCreatePixmapCursor(dpy, bitmap, mask, &fg, &bg, x, y); + mask_status = wm_backend->cursor_create_from_files(scr, bitmap_name, mask_name, cursor); + if (mask_status) status = 1; - } - check_bitmap_status(bitmap_status, bitmap_name, bitmap); - check_bitmap_status(mask_status, mask_name, mask); wfree(bitmap_name); wfree(mask_name); } @@ -3140,7 +3131,7 @@ static int setKeyGrab(WScreen * scr, WDefaultEntry * entry, void *tdata, void *e wwin = scr->focused_window; while (wwin != NULL) { - XUngrabKey(dpy, AnyKey, AnyModifier, wwin->frame->core->window); + wm_backend->key_ungrab_all((WNativeWindow)wwin->frame->core->window); if (!WFLAGP(wwin, no_bind_keys)) { wWindowSetKeyGrabs(wwin); @@ -3434,13 +3425,13 @@ static int setCursor(WScreen * scr, WDefaultEntry * entry, void *tdata, void *ex (void) entry; if (wPreferences.cursor[widx] != None) { - XFreeCursor(dpy, wPreferences.cursor[widx]); + wm_backend->cursor_free(wPreferences.cursor[widx]); } wPreferences.cursor[widx] = *cursor; if (widx == WCUR_ROOT && *cursor != None) { - XDefineCursor(dpy, scr->root_win, *cursor); + wm_backend->cursor_set((WNativeWindow)scr->root_win, *cursor); } return 0;