[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