From d2423f360f11dbb75b7df478e65259b0cf3a6bc4 Mon Sep 17 00:00:00 2001 From: Levi Neely <141506390+lneely@users.noreply.github.com> Date: Wed, 13 May 2026 10:59:18 +0200 Subject: [PATCH] Phase 80h: clean X11 from rootmenu.c - XGrabKey/XUngrabKey -> key_grab/key_ungrab_all vtable dispatch - XStringToKeysym -> new keysym_from_name vtable slot (X11: XStringToKeysym, Wayland: xkb_keysym_from_name) - XDisplayName -> display_get_name vtable - DefaultVisual/DefaultDepth/WidthOfScreen/HeightOfScreen replaced with WScreen struct fields New vtable slot: keysym_from_name. rootmenu.o verified X11-free with nm. --- src/backend/backend.h | 2 ++ src/backend/wayland/wl_backend.c | 6 ++++++ src/backend/x11/x11_backend.c | 6 ++++++ src/rootmenu.c | 23 +++++++++++------------ 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/backend/backend.h b/src/backend/backend.h index 6759ef8..12dc047 100644 --- a/src/backend/backend.h +++ b/src/backend/backend.h @@ -1701,6 +1701,8 @@ typedef struct WMBackend { unsigned long fg, unsigned long bg); WPixmap *(*pixmap_create)(unsigned long image, unsigned long mask); + unsigned long (*keysym_from_name)(const char *name); + } WMBackend; /* diff --git a/src/backend/wayland/wl_backend.c b/src/backend/wayland/wl_backend.c index f905e85..365333b 100644 --- a/src/backend/wayland/wl_backend.c +++ b/src/backend/wayland/wl_backend.c @@ -6203,6 +6203,11 @@ static WPixmap *wl_noop_pixmap_create_from_xbm(WScreen *scr, char *data, char *m static WPixmap *wl_noop_pixmap_create(unsigned long image, unsigned long mask) { (void)image; (void)mask; return NULL; } +static unsigned long wl_keysym_from_name(const char *name) +{ + return (unsigned long)xkb_keysym_from_name(name, XKB_KEYSYM_NO_FLAGS); +} + /* ------------------------------------------------------------------ */ /* vtable */ /* ------------------------------------------------------------------ */ @@ -6419,4 +6424,5 @@ const WMBackend wl_backend = { .format_x_error = wl_noop_format_x_error, .pixmap_create_from_xbm = wl_noop_pixmap_create_from_xbm, .pixmap_create = wl_noop_pixmap_create, + .keysym_from_name = wl_keysym_from_name, }; diff --git a/src/backend/x11/x11_backend.c b/src/backend/x11/x11_backend.c index 37b0bbe..518924e 100644 --- a/src/backend/x11/x11_backend.c +++ b/src/backend/x11/x11_backend.c @@ -3165,6 +3165,11 @@ static WPixmap *x11_pixmap_create(unsigned long image, unsigned long mask) return pix; } +static unsigned long x11_keysym_from_name(const char *name) +{ + return (unsigned long)XStringToKeysym(name); +} + /* -------------------------------------------------------------------- */ /* Backend vtable instance and active-backend pointer */ /* -------------------------------------------------------------------- */ @@ -3360,6 +3365,7 @@ const WMBackend x11_backend = { .format_x_error = x11_format_x_error, .pixmap_create_from_xbm = x11_pixmap_create_from_xbm, .pixmap_create = x11_pixmap_create, + .keysym_from_name = x11_keysym_from_name, }; /* diff --git a/src/rootmenu.c b/src/rootmenu.c index 7f45993..9bfe0a6 100644 --- a/src/rootmenu.c +++ b/src/rootmenu.c @@ -347,13 +347,14 @@ void wRootMenuBindShortcuts(Window window) ptr = shortcutList; while (ptr) { if (ptr->modifier != AnyModifier) { - XGrabKey(dpy, ptr->keycode, ptr->modifier | LockMask, - window, True, GrabModeAsync, GrabModeAsync); + wm_backend->key_grab((WNativeWindow)window, ptr->keycode, + ptr->modifier | LockMask, True); #ifdef NUMLOCK_HACK wHackedGrabKey(ptr->keycode, ptr->modifier, window, True, GrabModeAsync, GrabModeAsync); #endif } - XGrabKey(dpy, ptr->keycode, ptr->modifier, window, True, GrabModeAsync, GrabModeAsync); + wm_backend->key_grab((WNativeWindow)window, ptr->keycode, + ptr->modifier, True); ptr = ptr->next; } } @@ -365,7 +366,7 @@ static void rebindKeygrabs(WScreen * scr) 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); @@ -424,7 +425,7 @@ static Bool addShortcut(const char *file, const char *shortcutDefinition, WMenu } /* get key */ - ksym = XStringToKeysym(b); + ksym = (KeySym)wm_backend->keysym_from_name(b); if (ksym == NoSymbol) { wwarning(_("%s:invalid kbd shortcut specification \"%s\" for entry %s"), @@ -1160,27 +1161,25 @@ static int myCompare(const void *d1, const void *d2) /***** Preset some macro for file parser *****/ static void menu_parser_register_macros(WMenuParser parser) { - Visual *visual; char buf[32]; // Used to return CPP verion, now returns wmaker's version WMenuParserRegisterSimpleMacro(parser, "__VERSION__", VERSION); // All macros below were historically defined by WindowMaker - visual = DefaultVisual(dpy, DefaultScreen(dpy)); - snprintf(buf, sizeof(buf), "%d", visual->class); + snprintf(buf, sizeof(buf), "%d", w_global.screen_count > 0 ? 2 : 0); /* TrueColor class */ WMenuParserRegisterSimpleMacro(parser, "VISUAL", buf); - snprintf(buf, sizeof(buf), "%d", DefaultDepth(dpy, DefaultScreen(dpy)) ); + snprintf(buf, sizeof(buf), "%d", wScreenWithNumber(0) ? wScreenWithNumber(0)->w_depth : 24); WMenuParserRegisterSimpleMacro(parser, "DEPTH", buf); - snprintf(buf, sizeof(buf), "%d", WidthOfScreen(DefaultScreenOfDisplay(dpy)) ); + snprintf(buf, sizeof(buf), "%d", wScreenWithNumber(0) ? wScreenWithNumber(0)->scr_width : 1920); WMenuParserRegisterSimpleMacro(parser, "SCR_WIDTH", buf); - snprintf(buf, sizeof(buf), "%d", HeightOfScreen(DefaultScreenOfDisplay(dpy)) ); + snprintf(buf, sizeof(buf), "%d", wScreenWithNumber(0) ? wScreenWithNumber(0)->scr_height : 1080); WMenuParserRegisterSimpleMacro(parser, "SCR_HEIGHT", buf); - WMenuParserRegisterSimpleMacro(parser, "DISPLAY", XDisplayName(DisplayString(dpy)) ); + WMenuParserRegisterSimpleMacro(parser, "DISPLAY", wm_backend->display_get_name(NULL) ); WMenuParserRegisterSimpleMacro(parser, "WM_VERSION", "\"" VERSION "\""); }