[Cogl] [PATCH 5/7] examples/cogl-x11-tfp.c: Handle WM_DELETE_WINDOW

otaylor at redhat.com otaylor at redhat.com
Thu Jun 12 11:11:42 PDT 2014


From: "Owen W. Taylor" <otaylor at fishsoup.net>

Clean up cleanly when closed rather than dying with an X Error -
we do this by advertising support for the WM_DELETE_WINDOW protocol
and handling the client message.
---
 examples/cogl-x11-tfp.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/examples/cogl-x11-tfp.c b/examples/cogl-x11-tfp.c
index 7d4d756..6a24b27 100644
--- a/examples/cogl-x11-tfp.c
+++ b/examples/cogl-x11-tfp.c
@@ -56,6 +56,8 @@ main (int argc, char **argv)
   XSetWindowAttributes xattr;
   unsigned long mask;
   Window xwin;
+  Atom atom_wm_protocols;
+  Atom atom_wm_delete_window;
   int screen;
   Window tfp_xwin;
   Pixmap pixmap;
@@ -160,6 +162,10 @@ main (int argc, char **argv)
                         xvisinfo->visual,
                         mask, &xattr);
 
+  atom_wm_protocols = XInternAtom (xdpy, "WM_PROTOCOLS", False);
+  atom_wm_delete_window = XInternAtom (xdpy, "WM_DELETE_WINDOW", False);
+  XSetWMProtocols (xdpy, xwin, &atom_wm_delete_window, 1);
+
   XFree (xvisinfo);
 
   cogl_x11_onscreen_set_foreign_window_xid (onscreen, xwin,
@@ -216,6 +222,12 @@ main (int argc, char **argv)
               keysym = XLookupKeysym (&event.xkey, 0);
               if (keysym == XK_q || keysym == XK_Q || keysym == XK_Escape)
                 return 0;
+              break;
+            case ClientMessage:
+              if (event.xclient.message_type == atom_wm_protocols &&
+                  event.xclient.data.l[0] == atom_wm_delete_window)
+                goto out;
+              break;
             }
           cogl_xlib_renderer_handle_event (renderer, &event);
         }
-- 
1.9.3



More information about the Cogl mailing list