Commit Graph

9 Commits

Author SHA1 Message Date
Levi Neely 803666fd5e WIP: Pure Wayland WINGs screen init (no X11 in WM path)
- WMCreateScreenWithRContext: add Wayland path that skips all X11 calls
  (no GCs, no atoms, no XListProperties, no XCreateGC)
- screen.c: skip RCreateContext in Wayland mode (pass NULL rcontext)
- Wayland path initializes: font/event/render backends, colors, fonts

Current issue: W_RealizeView tries to create X11 windows for WINGs
widgets. Need to make view realization work without X11 (views should
be pixman buffers in Wayland mode, not X windows).

The grey background + cursor render correctly. Startup reaches
WINGs init but crashes when widgets try to realize without a display.
2026-05-13 07:38:38 +02:00
Levi Neely 74647423c5 Fix screen init: create RContext + WINGs screen on XWayland in Wayland mode
- wScreenInit Wayland fast path now creates RContext on XWayland display
  (needed for wTextureRenderImage and wraster image loading)
- Also creates WINGs screen (wmscreen) so WMDrawString/WMFontHeight work
- Add wl_get_x_display() accessor for screen.c to get XWayland Display*
- Remove if(dpy) guard around wScreenRestoreState in startup.c so dock,
  clip, menus, and window management run in Wayland mode

Status: startup reaches menu creation but hangs in wMenuCreate due to
Xlib operations on XWayland during WINGs font/screen init. The pump
thread is running but something in the menu creation path is spinning.
Next step: identify and eliminate the remaining XWayland dependency in
the menu creation path.
2026-05-13 07:33:25 +02:00
Levi Neely 9b2448dd7f WIP: Wayland backend - fix atoms, OR surface compositing, frame/window ops
Key changes in wl_backend.c:
- wl_atom_intern: call XInternAtom on XWayland display (was returning 0)
- Add wl_or_view struct to track override_redirect XWayland surfaces
- handle_xwayland_new_surface: composite OR surfaces via scene graph
- frame_create_toplevel/child: create real X11 windows on XWayland
- frame_destroy/configure: delegate to Xlib
- window_map/unmap/move/resize: fall through to Xlib for frame windows
- stacking_raise/lower: update scene graph + Xlib fallback
- event_flush/sync: call XFlush/XSync on XWayland display
- window_set_border/border_width/clear: delegate to Xlib
- window_get_rect: query XWayland geometry for non-toplevel windows

Note: frame creation via XWayland is a temporary bridge. The correct
architectural approach is native scene-buffer rendering with pixman.
2026-05-13 07:05:22 +02:00
Levi Neely 00deab12f2 wayland: WMBackend vtable — port policy files off direct X11
Move X11-specific calls in policy code behind the wm_backend dispatch
table so the same code paths work with both X11 and Wayland backends.

  backend.h    — extend WMBackend vtable with new entry points
  event.c      — route input events through backend dispatch
  framewin.c   — title-bar rendering via backend surface ops
  icon.c       — icon pixmap handling via backend abstraction
  main.c       — backend selection + initialisation at startup
  misc.c       — miscellaneous X11 helpers moved behind vtable
  pixmap.c     — pixmap creation/destruction via backend ops
  resources.c  — resource loading abstracted over backend
  screen.c     — screen setup routed through WMBackend vtable
  startup.c    — startup sequence uses backend entry points
  texture.c    — texture rendering abstracted for both backends

No functional change on X11; Wayland backend stubs return safe no-ops.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 13:34:05 +02:00
Levi Neely 6764c14863 wayland: Phase 62 — mapped flag, focus lifecycle, and keyboard clear-focus
Three related fixes to make the WM focus lifecycle work end-to-end in
the Wayland path:

1. window.c: set wwin->flags.mapped=1 for Wayland windows (the
   wWindowMap call in wManageWindow is guarded by if(wwin->frame)
   which is NULL in Wayland, leaving mapped=0 and causing wSetFocusTo
   to take the no-focus branch immediately).

2. screen.c: call screen_create_internals in the Wayland goto path;
   this was skipped by goto screen_done but is needed to set
   auto_focus=1 and clear initial keyboard focus via wlr_seat.

3. wl_backend.c: implement wl_screen_create_internals (sets
   no_focus_win=WNATIVE_NONE, auto_focus=1, clears seat focus);
   wl_focus_set now calls wlr_seat_keyboard_clear_focus and logs
   "focus_clear" when win==WNATIVE_NONE; remove the redundant direct
   wl_focus_set call from handle_toplevel_map since wManageWindow now
   handles focus via wSetFocusTo.

Smoke test: add check 20 verifying "focus_clear" is logged after the
last managed window unmaps.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-28 09:11:56 +01:00
Levi Neely 04f8a46ae5 wayland: Phase 61 — allocate workspace 0 in Wayland screen init
wScreenInit skips wWorkspaceNew (which calls wDockCreate, an X11
operation) via goto screen_done.  This left workspace_count=0, causing
a divide-by-zero in wManageWindow when a window carries saved state
(workspace % scr->workspace_count).  Allocate a minimal WWorkspace
directly before the goto so the Wayland path always has exactly one
workspace.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-28 08:57:52 +01:00
Levi Neely f7dfc50f26 wayland: Phase 33 — event_loop_run/atom_intern vtable; wmaker starts and exits cleanly under Wayland
Add display_default_screen, atom_intern, and event_loop_run vtable slots.
Guard all X11-only paths in startup.c/screen.c/shutdown.c/event.c/xdnd.c
with if (!dpy) so the Wayland path reaches wl_display_run() and exits
cleanly (exit 0) on SIGTERM.  wl-smoke-test.sh now PASSES.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 23:02:26 +01: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
Levi Neely fcee811b99 WindowMaker 0.96.0 upstream source 2026-03-26 15:38:49 +01:00