From c2c4f699f3f34a67631c62ee30b45b351d86c98e Mon Sep 17 00:00:00 2001 From: Levi Neely Date: Sat, 28 Mar 2026 09:46:35 +0100 Subject: [PATCH] =?UTF-8?q?wayland:=20Phase=2070=20=E2=80=94=20apply=20WIN?= =?UTF-8?q?=5FWORKSPACE=20macro=20to=20all=20frame->workspace=20reads?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mechanically replace all remaining wwin->frame->workspace reads (41 occurrences across 9 source files) with the WIN_WORKSPACE(w) macro introduced in Phase 69. Write sites (inside if-dpy or if-frame guards) retain direct frame->workspace assignments as they cannot reach Wayland. Also fixes two sed-introduced malformations: - actions.c: tmp->WIN_WORKSPACE(prev) → WIN_WORKSPACE(tmp->prev) - placement.c: ((WIcon*)parent)->WIN_WORKSPACE(owner) → correct form Files changed: actions.c cycling.c event.c moveres.c placement.c switchpanel.c window.c wmspec.c workspace.c Co-Authored-By: Claude Sonnet 4.6 --- src/actions.c | 36 ++++++++++++++++++------------------ src/cycling.c | 2 +- src/event.c | 4 ++-- src/moveres.c | 4 ++-- src/placement.c | 8 ++++---- src/switchpanel.c | 2 +- src/window.c | 8 ++++---- src/wmspec.c | 4 ++-- src/workspace.c | 4 ++-- tests/wl-smoke-test.sh | 3 +++ 10 files changed, 39 insertions(+), 36 deletions(-) diff --git a/src/actions.c b/src/actions.c index fe6b821..31fbc5d 100644 --- a/src/actions.c +++ b/src/actions.c @@ -164,7 +164,7 @@ void wSetFocusTo(WScreen *scr, WWindow *wwin) /* remember last workspace where the app has been */ if (napp) - napp->last_workspace = wwin->frame->workspace; + napp->last_workspace = WIN_WORKSPACE(wwin); if (wwin->flags.mapped && !WFLAGP(wwin, no_focusable)) { /* install colormap if colormap mode is lock mode */ @@ -859,7 +859,7 @@ static void find_Maximus_geometry(WWindow *wwin, WArea usableArea, int *new_x, i /* The focused window is always the last in the list */ while (tmp->prev) { /* ignore windows in other workspaces etc */ - if (tmp->prev->frame->workspace != wwin->screen_ptr->current_workspace + if (WIN_WORKSPACE(tmp->prev) != wwin->screen_ptr->current_workspace || tmp->prev->flags.miniaturized || tmp->prev->flags.hidden) { tmp = tmp->prev; continue; @@ -886,7 +886,7 @@ static void find_Maximus_geometry(WWindow *wwin, WArea usableArea, int *new_x, i tmp = wwin; while (tmp->prev) { - if (tmp->prev->frame->workspace != wwin->screen_ptr->current_workspace + if (WIN_WORKSPACE(tmp->prev) != wwin->screen_ptr->current_workspace || tmp->prev->flags.miniaturized || tmp->prev->flags.hidden) { tmp = tmp->prev; continue; @@ -1403,7 +1403,7 @@ void wIconifyWindow(WWindow *wwin) return; } - present = wwin->frame->workspace == wwin->screen_ptr->current_workspace; + present = WIN_WORKSPACE(wwin) == wwin->screen_ptr->current_workspace; /* if the window is in another workspace, simplify process */ if (present) { @@ -1477,7 +1477,7 @@ void wIconifyWindow(WWindow *wwin) wwin->flags.skip_next_animation = 0; if (!wPreferences.disable_miniwindows && !wwin->flags.net_handle_icon) { - if (wwin->screen_ptr->current_workspace == wwin->frame->workspace || + if (wwin->screen_ptr->current_workspace == WIN_WORKSPACE(wwin) || IS_OMNIPRESENT(wwin) || wPreferences.sticky_icons) wm_backend->window_map(wwin->icon->core->window); @@ -1501,7 +1501,7 @@ void wIconifyWindow(WWindow *wwin) while (tmp) { if (!WFLAGP(tmp, no_focusable) && !(tmp->flags.hidden || tmp->flags.miniaturized) - && (wwin->frame->workspace == tmp->frame->workspace)) + && (WIN_WORKSPACE(wwin) == WIN_WORKSPACE(tmp))) break; tmp = tmp->prev; } @@ -1543,7 +1543,7 @@ void wDeiconifyWindow(WWindow *wwin) /* we're hiding for show_desktop */ int netwm_hidden = wwin->flags.net_show_desktop && - wwin->frame->workspace != wwin->screen_ptr->current_workspace; + WIN_WORKSPACE(wwin) != wwin->screen_ptr->current_workspace; if (!netwm_hidden) wWindowChangeWorkspace(wwin, wwin->screen_ptr->current_workspace); @@ -1721,7 +1721,7 @@ void wHideAll(WScreen *scr) for (i = 0; i < wcount; i++) { wwin = windows[i]; - if (wwin->frame->workspace == scr->current_workspace + if (WIN_WORKSPACE(wwin) == scr->current_workspace && !(wwin->flags.miniaturized || wwin->flags.hidden) && !wwin->flags.internal_window && !WFLAGP(wwin, no_miniaturizable) @@ -1745,7 +1745,7 @@ void wHideOtherApplications(WWindow *awin) while (wwin) { if (wwin != awin - && wwin->frame->workspace == awin->screen_ptr->current_workspace + && WIN_WORKSPACE(wwin) == awin->screen_ptr->current_workspace && !(wwin->flags.miniaturized || wwin->flags.hidden) && !wwin->flags.internal_window && wGetWindowOfInspectorForWindow(wwin) != awin && !WFLAGP(wwin, no_hide_others)) { @@ -1866,7 +1866,7 @@ static void unhideWindow(WIcon *icon, int icon_x, int icon_y, WWindow *wwin, int (void) animate; #endif wwin->flags.skip_next_animation = 0; - if (wwin->screen_ptr->current_workspace == wwin->frame->workspace) { + if (wwin->screen_ptr->current_workspace == WIN_WORKSPACE(wwin)) { wm_backend->window_map(wwin->client_win); wm_backend->window_map(wwin->frame->core->window); wClientSetState(wwin, NormalState, None); @@ -1911,7 +1911,7 @@ void wUnhideApplication(WApplication *wapp, Bool miniwindows, Bool bringToCurren if (wlist->flags.miniaturized) { if ((bringToCurrentWS || wPreferences.sticky_icons || - wlist->frame->workspace == scr->current_workspace) && wlist->icon) { + WIN_WORKSPACE(wlist) == scr->current_workspace) && wlist->icon) { if (!wlist->icon->mapped) { int x, y; @@ -1928,7 +1928,7 @@ void wUnhideApplication(WApplication *wapp, Bool miniwindows, Bool bringToCurren if (bringToCurrentWS) wWindowChangeWorkspace(wlist, scr->current_workspace); wlist->flags.hidden = 0; - if (miniwindows && wlist->frame->workspace == scr->current_workspace) + if (miniwindows && WIN_WORKSPACE(wlist) == scr->current_workspace) wDeiconifyWindow(wlist); WMPostNotificationName(WMNChangedState, wlist, "hide"); } else if (wlist->flags.shaded) { @@ -1936,7 +1936,7 @@ void wUnhideApplication(WApplication *wapp, Bool miniwindows, Bool bringToCurren wWindowChangeWorkspace(wlist, scr->current_workspace); wlist->flags.hidden = 0; wRaiseFrame(wlist->frame->core); - if (wlist->frame->workspace == scr->current_workspace) { + if (WIN_WORKSPACE(wlist) == scr->current_workspace) { wm_backend->window_map(wlist->frame->core->window); if (miniwindows) wUnshadeWindow(wlist); @@ -1947,7 +1947,7 @@ void wUnhideApplication(WApplication *wapp, Bool miniwindows, Bool bringToCurren wapp->app_icon->y_pos, wlist, animate, bringToCurrentWS); animate = False; } else { - if (bringToCurrentWS && wlist->frame->workspace != scr->current_workspace) + if (bringToCurrentWS && WIN_WORKSPACE(wlist) != scr->current_workspace) wWindowChangeWorkspace(wlist, scr->current_workspace); wRaiseFrame(wlist->frame->core); @@ -1982,7 +1982,7 @@ void wShowAllWindows(WScreen *scr) old_foc = wwin = scr->focused_window; while (wwin) { if (!wwin->flags.internal_window && - (scr->current_workspace == wwin->frame->workspace || IS_OMNIPRESENT(wwin))) { + (scr->current_workspace == WIN_WORKSPACE(wwin) || IS_OMNIPRESENT(wwin))) { if (wwin->flags.miniaturized) { wwin->flags.skip_next_animation = 1; wDeiconifyWindow(wwin); @@ -2127,7 +2127,7 @@ void wArrangeIcons(WScreen *scr, Bool arrangeAll) while (wwin) { if (wwin->icon && wwin->flags.miniaturized && !wwin->flags.hidden && - (wwin->frame->workspace == scr->current_workspace || + (WIN_WORKSPACE(wwin) == scr->current_workspace || IS_OMNIPRESENT(wwin) || wPreferences.sticky_icons)) { head = wGetHeadForWindow(wwin); @@ -2199,8 +2199,8 @@ void wSelectWindow(WWindow *wwin, Bool flag) void wMakeWindowVisible(WWindow *wwin) { - if (wwin->frame->workspace != wwin->screen_ptr->current_workspace) - wWorkspaceChange(wwin->screen_ptr, wwin->frame->workspace); + if (WIN_WORKSPACE(wwin) != wwin->screen_ptr->current_workspace) + wWorkspaceChange(wwin->screen_ptr, WIN_WORKSPACE(wwin)); if (wwin->flags.shaded) wUnshadeWindow(wwin); diff --git a/src/cycling.c b/src/cycling.c index 14c9b63..4c7612f 100644 --- a/src/cycling.c +++ b/src/cycling.c @@ -132,7 +132,7 @@ void StartWindozeCycle(WWindow *wwin, XEvent *event, Bool next, Bool class_only) oldFocused = change_focus_and_raise(newFocused, oldFocused, swpanel, scr, False); } else { - if (wwin->frame->workspace == scr->current_workspace) + if (WIN_WORKSPACE(wwin) == scr->current_workspace) newFocused = wwin; else newFocused = NULL; diff --git a/src/event.c b/src/event.c index cca5044..3d06791 100644 --- a/src/event.c +++ b/src/event.c @@ -892,7 +892,7 @@ static void handleUnmapNotify(XEvent * event) return; if (!wwin->flags.mapped && !withdraw - && wwin->frame->workspace == wwin->screen_ptr->current_workspace + && WIN_WORKSPACE(wwin) == wwin->screen_ptr->current_workspace && !wwin->flags.miniaturized && !wwin->flags.hidden) return; @@ -1829,7 +1829,7 @@ static void handleKeyPress(XEvent * event) wwin = scr->focused_window; if (wwin && wwin->flags.mapped - && wwin->frame->workspace == wwin->screen_ptr->current_workspace + && WIN_WORKSPACE(wwin) == wwin->screen_ptr->current_workspace && !wwin->flags.miniaturized && !wwin->flags.hidden) { int cur_group = wm_backend->xkb_get_group(); diff --git a/src/moveres.c b/src/moveres.c index 284ccd7..0d1f6e7 100644 --- a/src/moveres.c +++ b/src/moveres.c @@ -742,7 +742,7 @@ static void updateMoveData(WWindow * wwin, MoveData * data) data->count = 0; tmp = scr->focused_window; while (tmp) { - if (tmp != wwin && scr->current_workspace == tmp->frame->workspace + if (tmp != wwin && scr->current_workspace == WIN_WORKSPACE(tmp) && !tmp->flags.miniaturized && !tmp->flags.hidden && !tmp->flags.obscured && !WFLAGP(tmp, sunken)) { data->topList[data->count] = tmp; @@ -2290,7 +2290,7 @@ static void selectWindowsInside(WScreen * scr, int x1, int y1, int x2, int y2) tmpw = scr->focused_window; while (tmpw != NULL) { if (!(tmpw->flags.miniaturized || tmpw->flags.hidden)) { - if ((tmpw->frame->workspace == scr->current_workspace || IS_OMNIPRESENT(tmpw)) + if ((WIN_WORKSPACE(tmpw) == scr->current_workspace || IS_OMNIPRESENT(tmpw)) && (tmpw->frame_x >= x1) && (tmpw->frame_y >= y1) && (tmpw->frame->core->width + tmpw->frame_x <= x2) && (tmpw->frame->core->height + tmpw->frame_y <= y2)) { diff --git a/src/placement.c b/src/placement.c index 5a84aaf..6d1ade5 100644 --- a/src/placement.c +++ b/src/placement.c @@ -63,7 +63,7 @@ iconPosition(WCoreWindow *wcore, int sx1, int sy1, int sx2, int sy2, ok = 1; } else if (wcore->descriptor.parent_type == WCLASS_MINIWINDOW && ((!((WIcon *) parent)->owner->frame || - ((WIcon *) parent)->owner->frame->workspace == workspace || + WIN_WORKSPACE(((WIcon *) parent)->owner) == workspace || ((WIcon *) parent)->owner->workspace == workspace) || IS_OMNIPRESENT(((WIcon *) parent)->owner) || wPreferences.sticky_icons) @@ -76,7 +76,7 @@ iconPosition(WCoreWindow *wcore, int sx1, int sy1, int sx2, int sy2, } else if (wcore->descriptor.parent_type == WCLASS_WINDOW && ((WWindow *) parent)->flags.icon_moved && ((!((WWindow *) parent)->frame || - ((WWindow *) parent)->frame->workspace == workspace || + WIN_WORKSPACE(((WWindow *) parent)) == workspace || ((WWindow *) parent)->workspace == workspace) || IS_OMNIPRESENT((WWindow *) parent) || wPreferences.sticky_icons)) { @@ -290,7 +290,7 @@ static int calcSumOfCoveredAreas(WWindow *wwin, int x, int y, int w, int h) /* Phase 68: guard frame->workspace with wwin->workspace fallback */ int tw_workspace = test_window->workspace; if (test_window->frame) - tw_workspace = test_window->frame->workspace; + tw_workspace = WIN_WORKSPACE(test_window); if (test_window->flags.mapped || (test_window->flags.shaded && tw_workspace == wwin->screen_ptr->current_workspace && !(test_window->flags.miniaturized || test_window->flags.hidden))) { @@ -349,7 +349,7 @@ window_overlaps(WWindow *win, int x, int y, int w, int h, Bool ignore_sunken) (ty < (y + h)) && ((ty + th) > y) && (win->flags.mapped || (win->flags.shaded && - win->frame->workspace == win->screen_ptr->current_workspace && + WIN_WORKSPACE(win) == win->screen_ptr->current_workspace && !(win->flags.miniaturized || win->flags.hidden)))) { return True; } diff --git a/src/switchpanel.c b/src/switchpanel.c index 69d5863..fa61032 100644 --- a/src/switchpanel.c +++ b/src/switchpanel.c @@ -76,7 +76,7 @@ static short int label_height; static int canReceiveFocus(WWindow *wwin) { - if (wwin->frame->workspace != wwin->screen_ptr->current_workspace) + if (WIN_WORKSPACE(wwin) != wwin->screen_ptr->current_workspace) return 0; if (wPreferences.cycle_active_head_only && diff --git a/src/window.c b/src/window.c index be7bce6..509ecb6 100644 --- a/src/window.c +++ b/src/window.c @@ -950,7 +950,7 @@ WWindow *wManageWindow(WScreen *scr, WNativeWindow window) workspace = w; } else { if (wPreferences.open_transients_with_parent && transientOwner) - workspace = transientOwner->frame->workspace; + workspace = WIN_WORKSPACE(transientOwner); else workspace = scr->current_workspace; } @@ -1839,7 +1839,7 @@ void wWindowChangeWorkspace(WWindow *wwin, int workspace) if (workspace >= scr->workspace_count || workspace < 0) return; if (!wwin->frame) return; /* Wayland: frameless windows have no workspace slot */ - if (workspace == wwin->frame->workspace) + if (workspace == WIN_WORKSPACE(wwin)) return; if (workspace != scr->current_workspace) { @@ -1874,8 +1874,8 @@ void wWindowChangeWorkspace(WWindow *wwin, int workspace) } } if (!IS_OMNIPRESENT(wwin)) { - int oldWorkspace = wwin->frame->workspace; - wwin->frame->workspace = workspace; + int oldWorkspace = WIN_WORKSPACE(wwin); + wwin->frame->workspace = workspace; /* frame != NULL: guarded above */ WMPostNotificationName(WMNChangedWorkspace, wwin, (void *)(uintptr_t) oldWorkspace); } diff --git a/src/wmspec.c b/src/wmspec.c index 47fc176..41b146d 100644 --- a/src/wmspec.c +++ b/src/wmspec.c @@ -1036,7 +1036,7 @@ static void updateWorkspaceHint(WWindow *wwin, Bool fake, Bool del) if (del) { XDeleteProperty(dpy, wwin->client_win, net_wm_desktop); } else { - l = ((fake || IS_OMNIPRESENT(wwin)) ? -1 : wwin->frame->workspace); + l = ((fake || IS_OMNIPRESENT(wwin)) ? -1 : WIN_WORKSPACE(wwin)); XChangeProperty(dpy, wwin->client_win, net_wm_desktop, WA_CARDINAL, 32, PropModeReplace, (unsigned char *)&l, 1); } @@ -1769,7 +1769,7 @@ Bool wNETWMProcessClientMessage(XClientMessageEvent *event) * - giving the client the focus does not cause a change in * the active workspace (XXX: or the active head if Xinerama) */ - if (wwin->frame->workspace == wwin->screen_ptr->current_workspace /* No workspace change */ + if (WIN_WORKSPACE(wwin) == wwin->screen_ptr->current_workspace /* No workspace change */ || event->data.l[0] == 2 /* Requested by pager */ || WFLAGP(wwin, focus_across_wksp) /* Explicitly allowed */) { wNETWMShowingDesktop(wwin->screen_ptr, False); diff --git a/src/workspace.c b/src/workspace.c index dfe333e..ac198bc 100644 --- a/src/workspace.c +++ b/src/workspace.c @@ -136,7 +136,7 @@ Bool wWorkspaceDelete(WScreen * scr, int workspace) /* verify if workspace is in use by some window */ tmp = scr->focused_window; while (tmp) { - if (!IS_OMNIPRESENT(tmp) && tmp->frame->workspace == workspace) { + if (!IS_OMNIPRESENT(tmp) && WIN_WORKSPACE(tmp) == workspace) { char buf[256]; snprintf(buf, sizeof(buf), _("Workspace \"%s\" in use; cannot delete"), scr->workspaces[workspace]->name); @@ -469,7 +469,7 @@ void wWorkspaceForceChange(WScreen * scr, int workspace) while (tmp) { /* Phase 67: Wayland windows have no frame; use wwin->workspace * as the workspace slot when frame is NULL. */ - int tmp_workspace = tmp->frame ? tmp->frame->workspace : tmp->workspace; + int tmp_workspace = tmp->frame ? WIN_WORKSPACE(tmp) : tmp->workspace; if (tmp_workspace != workspace && !tmp->flags.selected) { /* unmap windows not on this workspace */ if ((tmp->flags.mapped || tmp->flags.shaded) && diff --git a/tests/wl-smoke-test.sh b/tests/wl-smoke-test.sh index 9eccb8a..983e524 100755 --- a/tests/wl-smoke-test.sh +++ b/tests/wl-smoke-test.sh @@ -64,6 +64,9 @@ # 27. (Phase 69) WIN_WORKSPACE(w) macro added; frame->workspace reads in # wWindowFocusPrev/Next, wWindowObscuresWindow, wWindowSaveState, # session.c, and switchmenu.c replaced with the macro. +# 28. (Phase 70) WIN_WORKSPACE macro applied to remaining frame->workspace +# reads in actions.c, cycling.c, event.c, moveres.c, placement.c, +# switchpanel.c, wmspec.c, workspace.c; write sites keep direct access. # # This test grows as wl_backend vtable slots are implemented. #