[Xfce4-commits] <xfce4-embed-plugin:master> Add "Close" menu item to close embedded windows.

David Schneider noreply at xfce.org
Sat Jan 26 21:04:01 CET 2013


Updating branch refs/heads/master
         to 3b067846974a3dfb2a9ba129b6e1a1e371f5ac43 (commit)
       from dde8d40b14e7cae05a3ef6d3b7b1633b3dd55423 (commit)

commit 3b067846974a3dfb2a9ba129b6e1a1e371f5ac43
Author: David Schneider <dnschneid at gmail.com>
Date:   Sat Jan 26 12:02:51 2013 -0800

    Add "Close" menu item to close embedded windows.

 panel-plugin/embed.c |   66 +++++++++++++++++++++++++++++++++++++++----------
 panel-plugin/embed.h |    3 +-
 panel-plugin/ewmh.c  |   19 ++++++++++++++
 panel-plugin/ewmh.h  |    1 +
 4 files changed, 74 insertions(+), 15 deletions(-)

diff --git a/panel-plugin/embed.c b/panel-plugin/embed.c
index 34fdef6..52f4743 100644
--- a/panel-plugin/embed.c
+++ b/panel-plugin/embed.c
@@ -59,6 +59,8 @@ embed_construct (XfcePanelPlugin *plugin);
 static void
 embed_popout (GtkMenuItem *popout_menu, EmbedPlugin *embed);
 static void
+embed_close (GtkMenuItem *close_menu, EmbedPlugin *embed);
+static void
 embed_destroyed (EmbedPlugin *embed);
 static void
 embed_add_socket (EmbedPlugin *embed, gboolean update_size);
@@ -240,11 +242,6 @@ embed_new (XfcePanelPlugin *plugin)
   /* socket */
   embed_add_socket (embed, FALSE);
 
-  /* pop out menu item, not shown by default */
-  embed->popout_menu = gtk_image_menu_item_new_with_mnemonic (_("Pop _Out"));
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (embed->popout_menu),
-    gtk_image_new_from_stock (GTK_STOCK_FULLSCREEN, GTK_ICON_SIZE_MENU));
-
   /* embed menu item, shown by default. */
   embed->embed_menu = gtk_image_menu_item_new_with_mnemonic (_("_Embed"));
   gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (embed->embed_menu),
@@ -256,6 +253,16 @@ embed_new (XfcePanelPlugin *plugin)
   gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (embed->focus_menu),
     gtk_image_new_from_stock (GTK_STOCK_EDIT, GTK_ICON_SIZE_MENU));
 
+  /* pop out menu item, not shown by default */
+  embed->popout_menu = gtk_image_menu_item_new_with_mnemonic (_("Pop _Out"));
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (embed->popout_menu),
+    gtk_image_new_from_stock (GTK_STOCK_FULLSCREEN, GTK_ICON_SIZE_MENU));
+
+  /* close menu item, not shown by default */
+  embed->close_menu = gtk_image_menu_item_new_with_mnemonic (_("_Close"));
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (embed->close_menu),
+    gtk_image_new_from_stock (GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU));
+
   return embed;
 }
 
@@ -690,8 +697,9 @@ embed_plug_added (GtkWidget *socket, EmbedPlugin *embed)
 
   /* Flip the menu items */
   gtk_widget_hide (embed->embed_menu);
-  gtk_widget_show (embed->popout_menu);
   gtk_widget_show (embed->focus_menu);
+  gtk_widget_show (embed->popout_menu);
+  gtk_widget_show (embed->close_menu);
   embed->has_plug = TRUE;
 
   /* Stop any searching that is going on */
@@ -781,9 +789,10 @@ embed_plug_removed (GtkWidget *socket, EmbedPlugin *embed)
   g_assert (embed->socket);
 
   /* Flip the menu items */
-  gtk_widget_hide (embed->popout_menu);
-  gtk_widget_hide (embed->focus_menu);
   gtk_widget_show (embed->embed_menu);
+  gtk_widget_hide (embed->focus_menu);
+  gtk_widget_hide (embed->popout_menu);
+  gtk_widget_hide (embed->close_menu);
   embed->has_plug = FALSE;
 
   /* If this was a GtkPlug, the plug has been destroyed and embed->plug is
@@ -998,6 +1007,29 @@ embed_popout (GtkMenuItem *popout_menu, EmbedPlugin *embed)
 
 
 
+/* Gracefully closes any plugs that are embedded. If auto-launch is set, this is
+ * akin to a manual pop-out; it won't launch the program and embed until "embed"
+ * is selected. If auto-launch is not set, then it resumes the search for
+ * windows to embed.
+ */
+static void
+embed_close (GtkMenuItem *close_menu, EmbedPlugin *embed)
+{
+  GtkWidget *socket;
+
+  DBG (".");
+
+  /* Don't enable searching for a new window if autolaunch is enabled. */
+  if (embed->launch_cmd && embed->launch_cmd[0]) {
+    embed->disable_search = TRUE;
+  }
+
+  /* Send a graceful close request. */
+  close_window (embed->disp, embed->plug);
+}
+
+
+
 /* Callback for when the plugin is single/double/triple-clicked.
  * Single-clicks focus the embedded window.
  * Double-clicks and triple-clicks toggle embed/popout. */
@@ -1144,12 +1176,6 @@ embed_construct (XfcePanelPlugin *plugin)
   g_signal_connect (G_OBJECT (plugin), "button-press-event",
                     G_CALLBACK (embed_click), embed);
 
-  /* Add the "pop out" menu item */
-  xfce_panel_plugin_menu_insert_item (plugin,
-                                      GTK_MENU_ITEM (embed->popout_menu));
-  g_signal_connect (G_OBJECT (embed->popout_menu), "activate",
-                    G_CALLBACK (embed_popout), embed);
-
   /* Add the "embed" menu item */
   xfce_panel_plugin_menu_insert_item (plugin,
                                       GTK_MENU_ITEM (embed->embed_menu));
@@ -1162,6 +1188,18 @@ embed_construct (XfcePanelPlugin *plugin)
   g_signal_connect (G_OBJECT (embed->focus_menu), "activate",
                     G_CALLBACK (embed_focus_menu), embed);
 
+  /* Add the "pop out" menu item */
+  xfce_panel_plugin_menu_insert_item (plugin,
+                                      GTK_MENU_ITEM (embed->popout_menu));
+  g_signal_connect (G_OBJECT (embed->popout_menu), "activate",
+                    G_CALLBACK (embed_popout), embed);
+
+  /* Add the "close" menu item */
+  xfce_panel_plugin_menu_insert_item (plugin,
+                                      GTK_MENU_ITEM (embed->close_menu));
+  g_signal_connect (G_OBJECT (embed->close_menu), "activate",
+                    G_CALLBACK (embed_close), embed);
+
 
   /* show the configure menu item and connect signal */
   xfce_panel_plugin_menu_show_configure (plugin);
diff --git a/panel-plugin/embed.h b/panel-plugin/embed.h
index ff0dd87..9343437 100644
--- a/panel-plugin/embed.h
+++ b/panel-plugin/embed.h
@@ -31,9 +31,10 @@ typedef struct
     GtkWidget       *hvbox;
     GtkWidget       *label;
     GtkWidget       *socket;
-    GtkWidget       *popout_menu;
     GtkWidget       *embed_menu;
     GtkWidget       *focus_menu;
+    GtkWidget       *popout_menu;
+    GtkWidget       *close_menu;
 
     /* panel data */
     gboolean         has_plug;
diff --git a/panel-plugin/ewmh.c b/panel-plugin/ewmh.c
index f728bbf..1197c25 100644
--- a/panel-plugin/ewmh.c
+++ b/panel-plugin/ewmh.c
@@ -276,3 +276,22 @@ void focus_window (Display *disp, Window win)
     XSetInputFocus (disp, win, RevertToNone, CurrentTime);
     XFlush (disp);
 }
+
+void close_window (Display *disp, Window win)
+{
+    XEvent event;
+    event.xclient.type = ClientMessage;
+    event.xclient.serial = 0;
+    event.xclient.send_event = False;
+    event.xclient.message_type = XInternAtom(disp, "WM_PROTOCOLS", False);
+    event.xclient.window = win;
+    event.xclient.format = 32;
+    event.xclient.data.l[0] = XInternAtom(disp, "WM_DELETE_WINDOW", False);
+    event.xclient.data.l[1] = 0;
+    event.xclient.data.l[2] = 0;
+    event.xclient.data.l[3] = 0;
+    event.xclient.data.l[4] = 0;
+    if (!XSendEvent(disp, win, False, NoEventMask, &event))
+        DBG("Cannot send WM_DELETE_WINDOW event.");
+    XSync (disp, False);
+}
diff --git a/panel-plugin/ewmh.h b/panel-plugin/ewmh.h
index 81ccc84..dca9e13 100644
--- a/panel-plugin/ewmh.h
+++ b/panel-plugin/ewmh.h
@@ -34,6 +34,7 @@ void reparent_window (Display *disp, Window win, Window parent,
 void resize_window (Display *disp, Window win, gint width, gint height);
 void show_window (Display *disp, Window win);
 void focus_window (Display *disp, Window win);
+void close_window (Display *disp, Window win);
 
 G_END_DECLS
 


More information about the Xfce4-commits mailing list