This patch fixes a problem with recently unmapped windows.
If fvwm receives a message from a module to modify a window which FVWM
has un-mapped, it does 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/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-01-13 13:33:10.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-01-13 13:33:10.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-01-13 13:33:10.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-01-13 13:33:10.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-01-13 13:33:10.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;
        }

Reply via email to