Levi Neely
4be05c799c
Phase 84: eliminate all backend guards from policy code
...
Remove every is_wayland / !is_wayland guard from WM policy files.
All backend-specific logic now lives exclusively in the backends:
- main.c: display_post_open vtable slot handles fatal check, visual ID,
display name, and multiHead parsing (X11) or no-ops (Wayland)
- event.c: EventLoop() unconditionally calls event_loop_run(); the X11
backend's implementation contains the WMNextEvent+inotify loop
- screen.c: screen_init_display vtable slot handles RContext/WMScreen/
color creation (each backend owns its full init path)
- monitor.c: show_crash_dialog vtable slot (X11 shows panel, Wayland
returns abort)
- startup.c: InitializeSwitchMenu called unconditionally (it's
backend-agnostic); defaults polling timer no longer guarded
- shutdown.c: wScreenSaveState called unconditionally
- window.c: client_reparent called unconditionally (Wayland no-ops);
dead frameless-window code removed
Policy code is now completely backend-agnostic. The only references to
is_wayland are the vtable field definitions in the two backend files.
2026-05-14 12:41:01 +02:00
Levi Neely
6d4fc32b28
Phase 80j: clean X11 from shutdown.c, framewin.c, properties.c
...
- shutdown.c: RestoreDesktop/wWipeDesktop/restoreWindows moved entirely
to x11_backend.c; policy file contains only vtable dispatch stubs
- framewin.c: wFrameWindowPaint restructured — policy logic stays,
X11 rendering (resizebar lines, titlebar pixmap ops) dispatched through
new frame_paint_resizebar/frame_paint_titlebar vtable slots
- properties.c: all 6 functions (PropGetProtocols, PropGetCheckProperty,
PropSetWMakerProtocols, PropSetIconTileHint, PropGetClientLeader,
PropGetWindowState, PropCleanUp) replaced with vtable dispatch stubs;
X11 implementations inlined into x11_backend.c
New vtable slots: frame_paint_resizebar, frame_paint_titlebar,
prop_get_client_leader, prop_get_window_state.
All three files verified X11-free with nm.
2026-05-13 11:18:19 +02:00
Levi Neely
553d2ca0ba
Phase 80: eliminate all 43 if(!dpy) return guards via vtable dispatch
...
Remove every 'if (!dpy) return' guard from policy files by moving
X11 mechanism code behind WMBackend vtable slots. Call sites now
dispatch through wm_backend->slot(), the X11 backend implements the
mechanism, and the Wayland backend provides no-ops or Wayland-native
implementations.
New vtable slots added to backend.h:
- Frame: frame_alloc_border_pixel, frame_update_texture, frame_paint_button
- NETWM: netwm_init, netwm_cleanup, netwm_update_desktop,
netwm_get_current_desktop, netwm_update_opacity, netwm_update_actions,
netwm_check_client_hints, netwm_check_initial_state, netwm_get_pid,
netwm_cleanup_frame_extents
- Properties: prop_get_protocols, prop_get_check_property,
prop_set_wmaker_protocols, prop_set_icon_tile, prop_cleanup
- Client: client_restore, client_set_state, client_send_protocol,
client_kill, client_get_colormap_windows
- Misc: eat_expose, move_window, slide_windows, get_text_selection,
get_shortcut_string, get_command_for_window
- Icon: icon_update_pixmap, icon_paint
- AppIcon: appicon_show, appicon_paint, appicon_bounce
- Shutdown: restore_desktop, wipe_desktop
- Resources: get_color_for_colormap, free_color, colormap_install
- Protocol: xdnd_init, motif_get_hints
- Startup: manage_all_windows
- Event: event_handle_signal_exit
Structural changes:
- MWMHints moved from motif.c local typedef to motif.h
- WProtocols given struct tag for forward declaration
- Static functions made non-static: wGetTextSelection, wGetCommandForWindow,
wGetMWMHints, wWipeDesktop, wManageAllWindows, wNETWMUpdateWindowOpacity
Verification: grep -rn 'if (!dpy)' src/*.c returns zero results.
nm wl_backend.o confirms no new X11 symbols in Wayland path.
2026-05-13 10:01:57 +02:00
Levi Neely
a486329b52
Wayland backend abstraction: WMBackend vtable (Phases 0–30)
...
Introduce a display-system-agnostic WMBackend vtable that routes all
display operations through function pointers, making the WM policy
layer independent of X11. The X11 implementation is preserved in
src/backend/x11/ and behaviour is unchanged.
Key structural changes
──────────────────────
• src/backend/backend_types.h — backend-neutral type definitions:
WNativeWindow, WKeyCode, WContextKey, WBackendScreen,
WBackendEvent (+typed fields), WNormalHints, WWMHints,
WNETWindowType, WHeadGeometry, WClientAttributes, WClientVisual,
WSegment, WPoint, WM_KEY_* keysym constants, WA_* atom IDs,
WKB_GROUP*_INDEX, WCUR_NONE
• src/backend/backend.h — WMBackend vtable (~100 function-pointer
slots) covering: frame/context lifecycle, stacking, focus, grabs,
pointer, keyboard, overlays, properties, ICCCM, EWMH/NETWM,
monitors, screen setup, cursors, extensions, error handlers.
No <X11/> headers remain in this file after Phase 30.
• src/backend/x11/ — X11 backend implementation:
x11_backend.c full vtable; all display calls confined here
x11_props.c WM_NORMAL_HINTS / WM_HINTS translation
x11_event.c XEvent → WBackendEvent translation
x11_monitor.c Xinerama / RandR monitor query
Policy files cleaned
────────────────────
All 47 files in WM_POLICY_CLEAN_FILES pass check-no-x11-policy
(no direct #include <X11/> anywhere). X11 types that still appear
in policy structs (Visual*, Colormap, Window, Atom …) arrive only
transitively via WINGs.h; the vtable boundary itself is X11-free.
Tests
─────
• tests/smoke-test.sh — full Xvfb lifecycle test (PASS)
• tests/test_geom.c — geometry / constraint unit tests
• tests/test_x11_event.c — WBackendEvent field extraction tests
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 19:20:00 +01:00