wayland: Phase 70 — apply WIN_WORKSPACE macro to all frame->workspace reads

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 <noreply@anthropic.com>
This commit is contained in:
Levi Neely 2026-03-28 09:46:35 +01:00
parent 36aa1c5725
commit c2c4f699f3
10 changed files with 39 additions and 36 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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();

View File

@ -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)) {

View File

@ -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;
}

View File

@ -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 &&

View File

@ -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);
}

View File

@ -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);

View File

@ -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) &&

View File

@ -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.
#