Thanks to all contributors!
]]>See https://wiki.archlinux.org/title/Arch_Testing_Team
Sign-offs are not mandatory. It's just a process to confirm that a package is working. As long as several people can confirm the new openbox works and the patch does not cause other issues, I will move the new openbox from [community-testing] to [community].
]]>I upgraded openbox from community-testing ( as per https://bugs.archlinux.org/task/77853 ). lf ordinary users can help with the testing/signoff process in some way, please point me to instructions. I didn't find anything after a quick search.
So far so good.. But with me it took some time for openbox and X to die; I could not reproduce it on demand. But it's hit me several times each day since last week, so if I go the day without a problem that will be significant.
Thank you thank you thank you
]]> for (; it; it = g_list_next(it)) {
if (window_layer(it->data) < OB_STACKING_LAYER_FULLSCREEN) break;
else if (WINDOW_IS_CLIENT(it->data) &&
!WINDOW_AS_CLIENT(it->data)->visited)
client_calc_layer_internal(it->data);
}
client_calc_layer_internal(it->data)
will call
client_calc_layer_recursive
which will (likely) taint the list w/
stacking_remove(CLIENT_AS_WINDOW(self)); stacking_add_nonintrusive(CLIENT_AS_WINDOW(self));
This is a bit clunky, but I guess we're not getting lambda support in this code
gboolean keep_running = TRUE;
while (keep_running) {
keep_running = FALSE;
/* skip over stuff above fullscreen layer */
for (it = stacking_list; it; it = g_list_next(it))
if (window_layer(it->data) <= OB_STACKING_LAYER_FULLSCREEN) break;
/* now recalc any windows in the fullscreen layer which have not
had their layer recalced already */
for (; it; it = g_list_next(it)) {
if (window_layer(it->data) < OB_STACKING_LAYER_FULLSCREEN) break;
else if (WINDOW_IS_CLIENT(it->data) &&
!WINDOW_AS_CLIENT(it->data)->visited) {
client_calc_layer_internal(it->data);
keep_running = TRUE;
break;
}
}
}
It repeatedly traverses the entire list until it's sanitized.
The "visited" flag should™ prevent any kind of enternal loop.
for the record, I had a constant repro when someone started screensharing with me using the zoom desktop app - that at least is fixed, but I'll need a bit more testing to be sure the fix holds in other use-cases.
]]>Thank you, your trick helped me with my problem with OpenBox and multiple screens.
]]>Do you have a complete stack trace?
Does client_calc_layer get called out of some client_unmanage?
Openbox-Debug: (FOCUS) Frame for 0x1400003 has focus: 1
Openbox-Debug: (FOCUS) focus_set_client 0x1400003
Openbox-Debug: it: 2045a410
Openbox-Debug: it->data: 206043d0
Openbox-Debug: it: 39d0f93f
How are you gentlemen? All your base are belong to us. (Openbox received signal 11)
Aborted
X connection to :1 broken (explicit kill or server shutdown).
so in the second loop iteration, client_calc_layer_internal makes it->data invalid somehow...
]]>…
for (; it; it = g_list_next(it)) {
printf('it: %x\n', it);
if (it)
printf('it->data: %x\n', it->data);
if (window_layer(it->data) < OB_STACKING_LAYER_FULLSCREEN) break;
else if (WINDOW_IS_CLIENT(it->data) &&
!WINDOW_AS_CLIENT(it->data)->visited)
client_calc_layer_internal(it->data);
}
…
]]>is "it" 0 or "it->data"? (or, worse: none and there's just a dangling pointer)?
When it reads it->data it crashes...
]]>