This patch fixes a problem with recently unmapped windows. If fvwm receives a message from a module to modify a window which FVWM has just un-mapped, it does not honor the request in the module message.
This only affects window id's which are sent as a request from a module. Rich diff -urNp fvwm.orig/ChangeLog fvwm.cvs/ChangeLog --- fvwm.orig/ChangeLog 2010-02-25 05:28:44.000000000 -0600 +++ fvwm.cvs/ChangeLog 2010-02-25 06:11:19.000000000 -0600 @@ -1,3 +1,16 @@ +2010-02-25 Rich Coe <[email protected]> + * fvwm/add_window.c + * fvwm/externs.h + * fvwm/fvwm.c + * fvwm/icons.c + * fvwm/module_interface.c + + This patch fixes a problem with recently unmapped windows. + If fvwm receives a message from a module to modify a window which FVWM + has just un-mapped, it does not honor the request in the module message. + + This only affects window id's which are sent as a request from a module. + 2010-02-06 Thomas Adam <[email protected]> * fvwm/style.c (check_window_style_change): * fvwm/update.c (apply_window_updates): diff -urNp fvwm.orig/fvwm/add_window.c fvwm.cvs/fvwm/add_window.c --- fvwm.orig/fvwm/add_window.c 2009-08-02 10:04:08.000000000 -0500 +++ fvwm.cvs/fvwm/add_window.c 2010-02-25 06:01:23.000000000 -0600 @@ -123,6 +123,7 @@ static void delete_client_context(FvwmWi XCNOENT && cw == fw) { XDeleteContext(dpy, FW_W(fw), FvwmContext); + XSaveContext(dpy, FW_W(fw), LruFvwmContext, (caddr_t) None); } return; @@ -853,6 +854,8 @@ static void setup_frame_window( InputOutput, visual, valuemask, &attributes); XSaveContext(dpy, FW_W(fw), FvwmContext, (caddr_t) fw); XSaveContext(dpy, FW_W_FRAME(fw), FvwmContext, (caddr_t) fw); + XDeleteContext(dpy, FW_W(fw), LruFvwmContext); + XDeleteContext(dpy, FW_W_FRAME(fw), LruFvwmContext); return; } @@ -868,6 +871,7 @@ static void setup_title_window( dpy, FW_W_FRAME(fw), 0, 0, 1, 1, 0, Pdepth, InputOutput, Pvisual, valuemask, pattributes); XSaveContext(dpy, FW_W_TITLE(fw), FvwmContext, (caddr_t) fw); + XDeleteContext(dpy, FW_W_TITLE(fw), LruFvwmContext); return; } @@ -880,6 +884,7 @@ static void destroy_title_window(FvwmWin FW_W_TITLE(fw) = None; } XDeleteContext(dpy, FW_W_TITLE(fw), FvwmContext); + XSaveContext(dpy, FW_W_TITLE(fw), LruFvwmContext, (caddr_t) None); XFlush(dpy); FW_W_TITLE(fw) = None; @@ -928,12 +933,14 @@ static void setup_button_windows( XSaveContext( dpy, FW_W_BUTTON(fw, i), FvwmContext, (caddr_t)fw); + XDeleteContext(dpy, FW_W_BUTTON(fw, i), LruFvwmContext); } else if (FW_W_BUTTON(fw, i) != None && !has_button) { /* destroy the current button window */ XDestroyWindow(dpy, FW_W_BUTTON(fw, i)); XDeleteContext(dpy, FW_W_BUTTON(fw, i), FvwmContext); + XSaveContext(dpy, FW_W_BUTTON(fw, i), LruFvwmContext, (caddr_t) None); is_deleted = True; FW_W_BUTTON(fw, i) = None; } @@ -961,6 +968,7 @@ static void destroy_button_windows(FvwmW FW_W_BUTTON(fw, i) = None; } XDeleteContext(dpy, FW_W_BUTTON(fw, i), FvwmContext); + XSaveContext(dpy, FW_W_BUTTON(fw, i), LruFvwmContext, (caddr_t) None); is_deleted = True; FW_W_BUTTON(fw, i) = None; } @@ -1016,6 +1024,7 @@ static void setup_parent_window(FvwmWind &attributes); XSaveContext(dpy, FW_W_PARENT(fw), FvwmContext, (caddr_t) fw); + XDeleteContext(dpy, FW_W_PARENT(fw), LruFvwmContext); return; } @@ -1091,11 +1100,13 @@ static void setup_resize_handle_windows( InputOutput, Pvisual, valuemask, &attributes); XSaveContext( dpy, FW_W_CORNER(fw, i), FvwmContext, (caddr_t)fw); + XDeleteContext(dpy, FW_W_CORNER(fw, i), LruFvwmContext); attributes.win_gravity = s_grav[i]; FW_W_SIDE(fw, i) = XCreateWindow( dpy, FW_W_FRAME(fw), -1, -1, 1, 1, 0, Pdepth, InputOutput, Pvisual, valuemask, &attributes); XSaveContext(dpy, FW_W_SIDE(fw, i), FvwmContext, (caddr_t)fw); + XDeleteContext(dpy, FW_W_SIDE(fw, i), LruFvwmContext); } setup_resize_handle_cursors(fw); @@ -1111,6 +1122,8 @@ static void destroy_resize_handle_window { XDeleteContext(dpy, FW_W_SIDE(fw, i), FvwmContext); XDeleteContext(dpy, FW_W_CORNER(fw, i), FvwmContext); + XSaveContext(dpy, FW_W_SIDE(fw, i), LruFvwmContext, (caddr_t) None); + XSaveContext(dpy, FW_W_CORNER(fw, i), LruFvwmContext, (caddr_t) None); if (!do_only_delete_context) { XDestroyWindow(dpy, FW_W_SIDE(fw, i)); @@ -1259,6 +1272,8 @@ static void destroy_auxiliary_windows( { XDeleteContext(dpy, FW_W_FRAME(fw), FvwmContext); XDeleteContext(dpy, FW_W_PARENT(fw), FvwmContext); + XSaveContext(dpy, FW_W_FRAME(fw), LruFvwmContext, (caddr_t) None); + XSaveContext(dpy, FW_W_PARENT(fw), LruFvwmContext, (caddr_t) None); delete_client_context(fw); XDestroyWindow(dpy, FW_W_FRAME(fw)); } @@ -1397,6 +1412,7 @@ static void destroy_icon(FvwmWindow *fw) { XDestroyWindow(dpy, FW_W_ICON_TITLE(fw)); XDeleteContext(dpy, FW_W_ICON_TITLE(fw), FvwmContext); + XSaveContext(dpy, FW_W_ICON_TITLE(fw), LruFvwmContext, (caddr_t) None); XFlush(dpy); } if (FW_W_ICON_PIXMAP(fw) != None) @@ -1410,6 +1426,7 @@ static void destroy_icon(FvwmWindow *fw) XUnmapWindow(dpy, FW_W_ICON_PIXMAP(fw)); } XDeleteContext(dpy, FW_W_ICON_PIXMAP(fw), FvwmContext); + XSaveContext(dpy, FW_W_ICON_PIXMAP(fw), LruFvwmContext, (caddr_t) None); } clear_icon(fw); XFlush(dpy); diff -urNp fvwm.orig/fvwm/externs.h fvwm.cvs/fvwm/externs.h --- fvwm.orig/fvwm/externs.h 2009-03-17 12:09:15.000000000 -0500 +++ fvwm.cvs/fvwm/externs.h 2010-02-25 06:01:23.000000000 -0600 @@ -42,6 +42,7 @@ extern int master_pid; extern Display *dpy; extern int x_fd; extern XContext FvwmContext; +extern XContext LruFvwmContext; extern Bool fFvwmInStartup; extern Bool DoingCommandLine; extern Bool debugging; diff -urNp fvwm.orig/fvwm/fvwm.c fvwm.cvs/fvwm/fvwm.c --- fvwm.orig/fvwm/fvwm.c 2009-12-31 11:35:47.000000000 -0600 +++ fvwm.cvs/fvwm/fvwm.c 2010-02-25 06:01:23.000000000 -0600 @@ -156,6 +156,7 @@ Bool fFvwmInStartup = True; /* Set t Bool DoingCommandLine = False; /* Set True before each cmd line arg */ XContext FvwmContext; /* context for fvwm windows */ +XContext LruFvwmContext; /* context for LRU fvwm windows */ XContext MenuContext; /* context for fvwm menus */ int JunkX = 0, JunkY = 0; @@ -1105,6 +1106,7 @@ static void CreateGCs(void) static void InitVariables(void) { FvwmContext = XUniqueContext(); + LruFvwmContext = XUniqueContext(); MenuContext = XUniqueContext(); /* initialize some lists */ diff -urNp fvwm.orig/fvwm/icons.c fvwm.cvs/fvwm/icons.c --- fvwm.orig/fvwm/icons.c 2007-07-26 03:00:43.000000000 -0500 +++ fvwm.cvs/fvwm/icons.c 2010-02-25 06:01:23.000000000 -0600 @@ -631,6 +631,7 @@ void CreateIconWindow(FvwmWindow *fw, in XDeleteContext(dpy, FW_W_ICON_TITLE(fw), FvwmContext); XDestroyWindow(dpy, FW_W_ICON_TITLE(fw)); XFlush(dpy); + XSaveContext(dpy, FW_W_ICON_TITLE(fw), LruFvwmContext, (caddr_t) None); FW_W_ICON_TITLE(fw) = None; } } @@ -740,6 +741,7 @@ void CreateIconWindow(FvwmWindow *fw, in XDestroyWindow(dpy, old_icon_pixmap_w); XDeleteContext(dpy, old_icon_pixmap_w, FvwmContext); XFlush(dpy); + XSaveContext(dpy, old_icon_pixmap_w, LruFvwmContext, (caddr_t) None); is_old_icon_shaped = False; } @@ -782,6 +784,7 @@ void CreateIconWindow(FvwmWindow *fw, in { XSaveContext( dpy, FW_W_ICON_TITLE(fw), FvwmContext, (caddr_t)fw); + XDeleteContext(dpy, FW_W_ICON_TITLE(fw), LruFvwmContext); XDefineCursor( dpy, FW_W_ICON_TITLE(fw), Scr.FvwmCursors[CRS_DEFAULT]); GrabAllWindowKeysAndButtons( @@ -798,6 +801,7 @@ void CreateIconWindow(FvwmWindow *fw, in { XSaveContext( dpy, FW_W_ICON_PIXMAP(fw), FvwmContext, (caddr_t)fw); + XDeleteContext(dpy, FW_W_ICON_PIXMAP(fw), LruFvwmContext); XDefineCursor( dpy, FW_W_ICON_PIXMAP(fw), Scr.FvwmCursors[CRS_DEFAULT]); diff -urNp fvwm.orig/fvwm/module_interface.c fvwm.cvs/fvwm/module_interface.c --- fvwm.orig/fvwm/module_interface.c 2007-08-06 06:32:40.000000000 -0500 +++ fvwm.cvs/fvwm/module_interface.c 2010-02-25 06:01:23.000000000 -0600 @@ -660,9 +660,15 @@ void module_input_execute(struct fmodule int flags; memset(&e, 0, sizeof(e)); + if (None == input->window) { + ecc.w.fw = NULL; + } else if (XFindContext(dpy, input->window, FvwmContext, (caddr_t *)&ecc.w.fw) == XCNOENT) { + if (XCNOENT != XFindContext(dpy, input->window, LruFvwmContext, (caddr_t *) &ecc.w.fw)) + return; /* input->window is a recently destroyed Window */ + ecc.w.fw = NULL; input->window = None; }
