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