On Wed, 18 Oct 2023, Stuart Henderson wrote: > CC'ing maintainer. > > Not tested yet but I think this should do the trick. > If it works it would make sense to commit to 7.4-stable too.
Hi Stuart, hi all I'm an Openbox user myself. The fix for this specific problem is ok, but here's a patch incorporating all the relevant bugfixes from the Debian package: Index: x11/openbox/Makefile =================================================================== RCS file: /cvs/ports/x11/openbox/Makefile,v retrieving revision 1.91 diff -u -p -u -p -r1.91 Makefile --- x11/openbox/Makefile 27 Sep 2023 20:37:19 -0000 1.91 +++ x11/openbox/Makefile 18 Oct 2023 08:54:58 -0000 @@ -1,7 +1,7 @@ COMMENT = small, fast & usable window manager V = 3.6.1 -REVISION = 11 +REVISION = 12 DISTNAME = openbox-${V} SHARED_LIBS += obrender 12.0 # 32.0 SHARED_LIBS += obt 1.1 # 2.2 @@ -15,7 +15,7 @@ MAINTAINER = Benoit Lecocq <benoit@openb # GPLv2 PERMIT_PACKAGE = Yes -WANTLIB += ICE Imlib2 SM X11 X11-xcb Xau Xcursor Xext Xfixes Xft +WANTLIB += ICE Imlib2 SM X11 X11-xcb Xau Xcursor Xext Xfixes Xft Xi WANTLIB += Xinerama Xrandr Xrender c cairo cairo-gobject expat ffi WANTLIB += fontconfig freetype fribidi gdk_pixbuf-2.0 gio-2.0 glib-2.0 WANTLIB += gmodule-2.0 gobject-2.0 graphite2 harfbuzz iconv Index: x11/openbox/patches/patch-configure =================================================================== RCS file: x11/openbox/patches/patch-configure diff -N x11/openbox/patches/patch-configure --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ x11/openbox/patches/patch-configure 18 Oct 2023 08:54:58 -0000 @@ -0,0 +1,50 @@ +Fix for Openbox not showing startup notifications. +Debian bug: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=719620 + +Index: configure +--- configure.orig ++++ configure +@@ -14647,12 +14647,12 @@ if test -n "$LIBSN_CFLAGS"; then + pkg_cv_LIBSN_CFLAGS="$LIBSN_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ +- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libstartup-notification-1.0 >= 0.8\""; } >&5 +- ($PKG_CONFIG --exists --print-errors "libstartup-notification-1.0 >= 0.8") 2>&5 ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libstartup-notification-1.0 >= 0.8 xi\""; } >&5 ++ ($PKG_CONFIG --exists --print-errors "libstartup-notification-1.0 >= 0.8 xi") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then +- pkg_cv_LIBSN_CFLAGS=`$PKG_CONFIG --cflags "libstartup-notification-1.0 >= 0.8" 2>/dev/null` ++ pkg_cv_LIBSN_CFLAGS=`$PKG_CONFIG --cflags "libstartup-notification-1.0 >= 0.8 xi" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes + else + pkg_failed=yes +@@ -14664,12 +14664,12 @@ if test -n "$LIBSN_LIBS"; then + pkg_cv_LIBSN_LIBS="$LIBSN_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ +- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libstartup-notification-1.0 >= 0.8\""; } >&5 +- ($PKG_CONFIG --exists --print-errors "libstartup-notification-1.0 >= 0.8") 2>&5 ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libstartup-notification-1.0 >= 0.8 xi\""; } >&5 ++ ($PKG_CONFIG --exists --print-errors "libstartup-notification-1.0 >= 0.8 xi") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then +- pkg_cv_LIBSN_LIBS=`$PKG_CONFIG --libs "libstartup-notification-1.0 >= 0.8" 2>/dev/null` ++ pkg_cv_LIBSN_LIBS=`$PKG_CONFIG --libs "libstartup-notification-1.0 >= 0.8 xi" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes + else + pkg_failed=yes +@@ -14690,9 +14690,9 @@ else + _pkg_short_errors_supported=no + fi + if test $_pkg_short_errors_supported = yes; then +- LIBSN_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libstartup-notification-1.0 >= 0.8" 2>&1` ++ LIBSN_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libstartup-notification-1.0 >= 0.8 xi" 2>&1` + else +- LIBSN_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libstartup-notification-1.0 >= 0.8" 2>&1` ++ LIBSN_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libstartup-notification-1.0 >= 0.8 xi" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBSN_PKG_ERRORS" >&5 Index: x11/openbox/patches/patch-obrender_theme_c =================================================================== RCS file: x11/openbox/patches/patch-obrender_theme_c diff -N x11/openbox/patches/patch-obrender_theme_c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ x11/openbox/patches/patch-obrender_theme_c 18 Oct 2023 08:54:58 -0000 @@ -0,0 +1,33 @@ +Fix for toggled hover and pressed images masks not loaded. +Toggled hover and pressed images masks in Openbox themes are not loaded +which broke many existing themes. +Debian bug: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=887908 + +Index: obrender/theme.c +--- obrender/theme.c.orig ++++ obrender/theme.c +@@ -1494,8 +1494,10 @@ static void read_button_styles(XrmDatabase db, const R + READ_BUTTON_MASK_COPY(disabled, btn->unpressed_mask); + READ_BUTTON_MASK_COPY(hover, btn->unpressed_mask); + if (toggled_mask) { +- READ_BUTTON_MASK_COPY(pressed_toggled, btn->unpressed_toggled_mask); +- READ_BUTTON_MASK_COPY(hover_toggled, btn->unpressed_toggled_mask); ++ g_snprintf(name, 128, "%s_toggled_pressed.xbm", btnname); ++ READ_MASK_COPY(name, btn->pressed_toggled_mask, btn->unpressed_toggled_mask); ++ g_snprintf(name, 128, "%s_toggled_hover.xbm", btnname); ++ READ_MASK_COPY(name, btn->hover_toggled_mask, btn->unpressed_toggled_mask); + } + + #define READ_BUTTON_APPEARANCE(typedots, type, fallback) \ +@@ -1532,8 +1534,8 @@ static void read_button_styles(XrmDatabase db, const R + READ_BUTTON_APPEARANCE("disabled", disabled, 0); + READ_BUTTON_APPEARANCE("hover", hover, 0); + if (toggled_mask) { +- READ_BUTTON_APPEARANCE("unpressed.toggled", unpressed_toggled, 1); +- READ_BUTTON_APPEARANCE("pressed.toggled", pressed_toggled, 0); +- READ_BUTTON_APPEARANCE("hover.toggled", hover_toggled, 0); ++ READ_BUTTON_APPEARANCE("toggled.unpressed", unpressed_toggled, 1); ++ READ_BUTTON_APPEARANCE("toggled.pressed", pressed_toggled, 0); ++ READ_BUTTON_APPEARANCE("toggled.hover", hover_toggled, 0); + } + } Index: x11/openbox/patches/patch-openbox_client_c =================================================================== RCS file: /cvs/ports/x11/openbox/patches/patch-openbox_client_c,v retrieving revision 1.4 diff -u -p -u -p -r1.4 patch-openbox_client_c --- x11/openbox/patches/patch-openbox_client_c 11 Mar 2022 20:16:51 -0000 1.4 +++ x11/openbox/patches/patch-openbox_client_c 18 Oct 2023 08:54:58 -0000 @@ -3,6 +3,14 @@ Java GUI applications. From https://bugzilla.icculus.org/show_bug.cgi?id=5277 via Arch Linux. +Fix list traversal issue in client_calc_layer. +The calls to client_calc_layer_internal can modify stacking_list, which +can cause us to follow dangling ->next pointers (either by the pointer +itself already being freed, or it pointing to a freed area). +Avoid this by copying the list first, the goal is to visit every client +in the list once so this should be fine. +From upstream via Debian: http://git.openbox.org/?p=mikachu/openbox.git;a=commit;h=d41128e5a1002af41c976c8860f8299cfcd3cd72 + Index: openbox/client.c --- openbox/client.c.orig +++ openbox/client.c @@ -15,3 +23,35 @@ Index: openbox/client.c !g_pattern_match(app->title, strlen(self->title), self->title, NULL)) match = FALSE; +@@ -2702,9 +2702,12 @@ static void client_calc_layer_internal(ObClient *self) + void client_calc_layer(ObClient *self) + { + GList *it; ++ /* the client_calc_layer_internal calls below modify stacking_list, ++ so we have to make a copy to iterate over */ ++ GList *list = g_list_copy(stacking_list); + + /* skip over stuff above fullscreen layer */ +- for (it = stacking_list; it; it = g_list_next(it)) ++ for (it = list; it; it = g_list_next(it)) + if (window_layer(it->data) <= OB_STACKING_LAYER_FULLSCREEN) break; + + /* find the windows in the fullscreen layer, and mark them not-visited */ +@@ -2717,7 +2720,7 @@ void client_calc_layer(ObClient *self) + client_calc_layer_internal(self); + + /* skip over stuff above fullscreen layer */ +- for (it = stacking_list; it; it = g_list_next(it)) ++ for (it = 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 +@@ -2728,6 +2731,8 @@ void client_calc_layer(ObClient *self) + !WINDOW_AS_CLIENT(it->data)->visited) + client_calc_layer_internal(it->data); + } ++ ++ g_list_free(it); + } + + gboolean client_should_show(ObClient *self) Index: x11/openbox/patches/patch-openbox_screen_c =================================================================== RCS file: x11/openbox/patches/patch-openbox_screen_c diff -N x11/openbox/patches/patch-openbox_screen_c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ x11/openbox/patches/patch-openbox_screen_c 18 Oct 2023 08:54:58 -0000 @@ -0,0 +1,61 @@ +Fix for Openbox not showing startup notifications. +Debian bug: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=719620 + +Fix collision between iterator and throw-away argument to XQueryPointer(). +Without this, Openbox is unstable on any setup with more than 2 X screens, +as the collision can make the loop infinitely call XQueryPointer() +on X screen 1. +Debian bug: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=983882 + +Index: openbox/screen.c +--- openbox/screen.c.orig ++++ openbox/screen.c +@@ -40,6 +40,7 @@ + #include "obt/prop.h" + + #include <X11/Xlib.h> ++#include <X11/extensions/XInput2.h> + #ifdef HAVE_UNISTD_H + # include <sys/types.h> + # include <unistd.h> +@@ -1878,12 +1879,15 @@ const Rect* screen_physical_area_primary(gboolean fixe + + void screen_set_root_cursor(void) + { ++ int pointer_id; ++ if (!XIGetClientPointer(obt_display, None, &pointer_id)) ++ return; + if (sn_app_starting()) +- XDefineCursor(obt_display, obt_root(ob_screen), +- ob_cursor(OB_CURSOR_BUSYPOINTER)); ++ XIDefineCursor(obt_display, pointer_id, obt_root(ob_screen), ++ ob_cursor(OB_CURSOR_BUSYPOINTER)); + else +- XDefineCursor(obt_display, obt_root(ob_screen), +- ob_cursor(OB_CURSOR_POINTER)); ++ XIDefineCursor(obt_display, pointer_id, obt_root(ob_screen), ++ ob_cursor(OB_CURSOR_POINTER)); + } + + guint screen_find_monitor_point(guint x, guint y) +@@ -1904,16 +1908,16 @@ guint screen_monitor_pointer() + gboolean screen_pointer_pos(gint *x, gint *y) + { + Window w; +- gint i; ++ gint i, scrnindex; + guint u; + gboolean ret; + + ret = !!XQueryPointer(obt_display, obt_root(ob_screen), + &w, &w, x, y, &i, &i, &u); + if (!ret) { +- for (i = 0; i < ScreenCount(obt_display); ++i) +- if (i != ob_screen) +- if (XQueryPointer(obt_display, obt_root(i), ++ for (scrnindex = 0; scrnindex < ScreenCount(obt_display); ++scrnindex) ++ if (scrnindex != ob_screen) ++ if (XQueryPointer(obt_display, obt_root(scrnindex), + &w, &w, x, y, &i, &i, &u)) + break; + }