[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#288143: xsok: patch to support window manager close button



Package: xsok
Version: 1.02-13
Tags: patch
Followup-For: Bug #288143

This patch adds support for the WM_DELETE_WINDOW protocol, so that
closing xsok windows with the window manager's close button works
properly. No large changes were needed, I just added the required X
magic.

Peter De Wachter


-- System Information:
Debian Release: testing/unstable
Architecture: i386 (i686)
Kernel: Linux 2.6.9
Locale: LANG=nl_BE.UTF-8, LC_CTYPE=nl_BE.UTF-8

Versions of packages xsok depends on:
ii  libc6           2.3.2.ds1-13ubuntu2.2    GNU C Library: Shared libraries an
ii  libice6         4.3.0.dfsg.1-6ubuntu25.1 Inter-Client Exchange library
ii  libsm6          4.3.0.dfsg.1-6ubuntu25.1 X Window System Session Management
ii  libx11-6        6.8.1-1ubuntu10          X Window System protocol client li
ii  libxaw7         4.3.0.dfsg.1-6ubuntu25.1 X Athena widget set library
ii  libxext6        4.3.0.dfsg.1-6ubuntu25.1 X Window System miscellaneous exte
ii  libxmu6         4.3.0.dfsg.1-6ubuntu25.1 X Window System miscellaneous util
ii  libxpm4         4.3.0.dfsg.1-6ubuntu25.1 X pixmap library
ii  libxt6          4.3.0.dfsg.1-6ubuntu25.1 X Toolkit Intrinsics
ii  xlibs           4.3.0.dfsg.1-6ubuntu25.1 X Window System client libraries m

-- no debconf information
Only in xsok-hack/src: Makefile
diff -ur xsok-1.02/src/Xaw-help.c xsok-hack/src/Xaw-help.c
--- xsok-1.02/src/Xaw-help.c	1994-11-24 12:00:00.000000000 +0100
+++ xsok-hack/src/Xaw-help.c	2005-01-15 07:50:57.000000000 +0100
@@ -24,9 +24,12 @@
 #include <X11/Xaw/SmeBSB.h>
 
 static int help_active = 0;
-static Widget help, helppaned, helppanel, helptext, helpclose;
+Widget help;
+static Widget helppaned, helppanel, helptext, helpclose;
 extern const char *keyfilename;	/* from X-widget.c */
 
+static void popdown_help_cb(Widget w, XtPointer a, XtPointer b);
+
 static void selecttopic(Widget w, XtPointer number, XtPointer garbage) {
     char filename[200];
     const char *s = XtName(w);
@@ -51,7 +54,7 @@
     topicsbutton = XtCreateManagedWidget("Topic",       menuButtonWidgetClass, helppanel,    Args, 1);
     topicsmenu   = XtCreatePopupShell("topicsmenu",     simpleMenuWidgetClass, topicsbutton, NULL, ZERO);
     helpclose	 = XtCreateManagedWidget("Close Help",	commandWidgetClass,    helppanel,    NULL, ZERO);
-    XtAddCallback(helpclose, XtNcallback, popdown_help, NULL);
+    XtAddCallback(helpclose, XtNcallback, popdown_help_cb, NULL);
 
     XtSetArg(Args[0], XtNlabel, TXT_HELP_KEYS);
     w = XtCreateManagedWidget("Help0", smeBSBObjectClass, topicsmenu, Args, 1);
@@ -67,6 +70,7 @@
 	}
     }
 
+    XtRealizeWidget(help);
 }
 
 void popup_help(void) {
@@ -76,11 +80,15 @@
     XtPopup(help, XtGrabNone);
 }
 
-void popdown_help(Widget w, XtPointer a, XtPointer b) {
+void popdown_help(void) {
     if (!help_active)
 	return;		/* request pending => deny another one */
     help_active = 0;
     XtPopdown(help);
 }
 
+static void popdown_help_cb(Widget w, XtPointer a, XtPointer b) {
+    popdown_help();
+}
+
 #endif
diff -ur xsok-1.02/src/Xaw-main.c xsok-hack/src/Xaw-main.c
--- xsok-1.02/src/Xaw-main.c	1995-10-14 18:22:28.000000000 +0100
+++ xsok-hack/src/Xaw-main.c	2005-01-15 07:46:29.000000000 +0100
@@ -21,6 +21,8 @@
 static Widget messagebox, container, desktop;
 static Widget dialog, popup, paned;
 static Window mainwindow;
+static Atom atom_wm_protocols;
+static Atom atom_wm_delete_window;
 
 
 void show_message(const char *str, ...) {
@@ -112,6 +114,21 @@
     popup_confirm(prompt);
 }
 
+static void handle_wm_messages(Widget w, XtPointer client_data, XEvent *event, Boolean *cont) {
+    if (event->type == ClientMessage
+            && event->xclient.message_type == atom_wm_protocols
+            && event->xclient.data.l[0] == atom_wm_delete_window) {
+        if (w == toplevel)
+            rq_LeaveSok();
+        else if (w == popup)
+            cmd_Cancel();
+#ifdef ONLINE_HELP
+        else if (w == help)
+            popdown_help();
+#endif
+    }
+}
+
 static String fallback_resources[] = { 
     "*beNiceToColormap:			false",
     "*shapeStyle:			Rectangle",
@@ -325,23 +342,37 @@
     sound = XtCreateManagedWidget("Sound", toggleWidgetClass, buttonpanel, NULL, 0);
 #endif
 
+    graphic.width = graphic.height = 0;
+    graphic.autolayout = 1;
+    XtRealizeWidget(toplevel);
+    XSync(dpy, 0);
+    mainwindow = XtWindow(toplevel);
+    XSetIconName(dpy, mainwindow, "xsok");
+    SetTitle();
+    table  = XtWindow(desktop);
+
     /* OK. Now do the pop-up shells */
     popup = XtCreatePopupShell("prompt", transientShellWidgetClass, toplevel, NULL, 0);
     dialog = XtCreateManagedWidget("dialog", dialogWidgetClass, popup, NULL, 0);
     XawDialogAddButton(dialog, "ok",     Ok,     (XtPointer)dialog);
     XawDialogAddButton(dialog, "cancel", Cancel, (XtPointer)dialog);
+    XtRealizeWidget(popup);
 
 #ifdef ONLINE_HELP
     create_help();
 #endif
-    graphic.width = graphic.height = 0;
-    graphic.autolayout = 1;
-    XtRealizeWidget(toplevel);
-    XSync(dpy, 0);
-    mainwindow = XtWindow(toplevel);
-    XSetIconName(dpy, mainwindow, "xsok");
-    SetTitle();
-    table  = XtWindow(desktop);
+
+    /* WM_DELETE_WINDOW protocol */
+    atom_wm_protocols = XInternAtom(XtDisplay(toplevel), "WM_PROTOCOLS", False);
+    atom_wm_delete_window = XInternAtom(XtDisplay(toplevel), "WM_DELETE_WINDOW", False);
+    XtAddEventHandler(toplevel, NoEventMask, True, handle_wm_messages, NULL);
+    XSetWMProtocols(XtDisplay(toplevel), XtWindow(toplevel), &atom_wm_delete_window, 1);
+    XtAddEventHandler(popup, NoEventMask, True, handle_wm_messages, NULL);
+    XSetWMProtocols(XtDisplay(popup), XtWindow(popup), &atom_wm_delete_window, 1);
+#ifdef ONLINE_HELP
+    XtAddEventHandler(help, NoEventMask, True, handle_wm_messages, NULL);
+    XSetWMProtocols(XtDisplay(help), XtWindow(help), &atom_wm_delete_window, 1);
+#endif
 
     read_gametypes();
     {   const char **rp;
@@ -353,7 +384,6 @@
     }
 
     graphics_control(Enable);
-    XtRealizeWidget(popup);
     XtAppMainLoop(app_con);	/* does not return */
     return 0;			/* keep compiler happy */
 }
diff -ur xsok-1.02/src/xsok.h xsok-hack/src/xsok.h
--- xsok-1.02/src/xsok.h	1996-03-16 19:04:36.000000000 +0100
+++ xsok-hack/src/xsok.h	2005-01-15 07:47:37.000000000 +0100
@@ -282,7 +282,7 @@
 /*
 void create_help(Widget);
 void popup_help(void);
-void popdown_help(Widget, XtPointer, XtPointer);
+void popdown_help(void);
 */
 
 /* Xaw-main.c */
diff -ur xsok-1.02/src/X-sok.h xsok-hack/src/X-sok.h
--- xsok-1.02/src/X-sok.h	1996-03-16 17:58:58.000000000 +0100
+++ xsok-hack/src/X-sok.h	2005-01-15 07:47:47.000000000 +0100
@@ -45,6 +45,9 @@
 extern Display *dpy;
 extern Window table;
 extern Widget toplevel;
+#ifdef ONLINE_HELP
+extern Widget help;
+#endif
 
 #define DX	32	/* size of one square. we could even read this from the xpm file */
 #define DY	32
@@ -56,7 +59,7 @@
 #ifdef ONLINE_HELP
 void create_help(void);
 void popup_help(void);
-void popdown_help(Widget, XtPointer, XtPointer);
+void popdown_help(void);
 #endif
 
 /* Xaw-main.c */

Reply to: