[Xfce4-commits] <xfce4-embed-plugin:master> Added command launching, optionally with socket id.

David Schneider noreply at xfce.org
Sun Jan 1 21:44:38 CET 2012


Updating branch refs/heads/master
         to cc9fae3e09f877f470a5131329f240cb38603f77 (commit)
       from 5a2c9e5e1d64e24490c46666111dd7bd0a33e64e (commit)

commit cc9fae3e09f877f470a5131329f240cb38603f77
Author: David Schneider <dnschneid at gmail.com>
Date:   Sat Dec 31 02:27:51 2011 -0500

    Added command launching, optionally with socket id.

 TODO                         |    2 -
 panel-plugin/embed-dialogs.c |   57 +++++++++++++++++++++++++++++++++++++----
 panel-plugin/embed.c         |   48 +++++++++++++++++++++++++++++++++--
 panel-plugin/embed.h         |    4 +++
 4 files changed, 100 insertions(+), 11 deletions(-)

diff --git a/TODO b/TODO
index 0dd630d..02654fc 100644
--- a/TODO
+++ b/TODO
@@ -1,5 +1,3 @@
-Launching with parameters, delayed relaunch
-    * Including %s or something with the GtkSocket id
 Fake socket no longer necessary?
     * Doesn't require manual plug size updates
     * Can create a socket at the start and don't need to replace it until the
diff --git a/panel-plugin/embed-dialogs.c b/panel-plugin/embed-dialogs.c
index acddb99..abec1ee 100644
--- a/panel-plugin/embed-dialogs.c
+++ b/panel-plugin/embed-dialogs.c
@@ -94,12 +94,12 @@ embed_entry_set_good (GtkEntry *edit, gboolean good)
 {
   if (good) {
     gtk_entry_set_icon_tooltip_text (edit, GTK_ENTRY_ICON_SECONDARY,
-                                     _("The REGEX is valid"));
+                                     _("Input is valid"));
     gtk_entry_set_icon_from_stock (edit, GTK_ENTRY_ICON_SECONDARY,
                                    GTK_STOCK_YES);
   } else {
     gtk_entry_set_icon_tooltip_text (edit, GTK_ENTRY_ICON_SECONDARY,
-                                     _("The REGEX is invalid"));
+                                     _("Input is invalid"));
     gtk_entry_set_icon_from_stock (edit, GTK_ENTRY_ICON_SECONDARY,
                                    GTK_STOCK_NO);
   }
@@ -132,6 +132,31 @@ embed_window_regex_changed (GtkEditable *edit, EmbedPlugin *embed)
 
 
 static void
+embed_launch_cmd_changed (GtkEditable *edit, EmbedPlugin *embed)
+{
+  const gchar *text;
+  gint argc;
+  gchar **argv;
+
+  /* Confirm that the command line is okay before saving. */
+  text = gtk_entry_get_text (GTK_ENTRY (edit));
+  if (*text) {
+    if (!g_shell_parse_argv (text, &argc, &argv, NULL)) {
+      embed_entry_set_good (GTK_ENTRY (edit), FALSE);
+      return;
+    }
+    g_strfreev (argv);
+  }
+
+  g_free (embed->launch_cmd);
+  embed->launch_cmd = g_strdup (text);
+  embed->criteria_updated = TRUE;
+  embed_entry_set_good (GTK_ENTRY (edit), TRUE);
+}
+
+
+
+static void
 embed_label_fmt_changed (GtkEditable *edit, EmbedPlugin *embed)
 {
   g_free (embed->label_fmt);
@@ -199,6 +224,9 @@ embed_configure (XfcePanelPlugin *plugin, EmbedPlugin *embed)
     tooltip = tooltiptext; \
     gtk_widget_set_tooltip_text (widgetA, tooltip); \
     gtk_widget_set_tooltip_text (widgetB, tooltip)
+#define LABEL(row, labeltext) \
+    widget = gtk_label_new (labeltext); \
+    gtk_table_attach_defaults (GTK_TABLE (table), widget, 0, 2, row, row+1)
 #define ENTRY(row, labeltext, tooltiptext, value, callback) \
     label = gtk_label_new_with_mnemonic (labeltext); \
     widget = gtk_entry_new (); \
@@ -238,20 +266,36 @@ embed_configure (XfcePanelPlugin *plugin, EmbedPlugin *embed)
     widget = xfce_gtk_frame_box_new_with_content (title, table); \
     gtk_box_pack_start_defaults (GTK_BOX (content), widget)
 
-  START_FRAME(_("Selection Criteria"), 3);
+  START_FRAME(_("Application Launching"), 2);
+  LABEL(0,
+      _("If a window is not found (or there are no criteria), a command can\n"
+        "optionally be launched. The command can either result in a window\n"
+        "that matches the below criteria, or it can use the socket ID passed\n"
+        "to it (" EMBED_LAUNCH_CMD_SOCKET ") to embed itself automatically."));
+  /* launch_cmd */
+  ENTRY(1, _("L_aunch command"),
+           _("Leave blank to not launch anything\n"
+           EMBED_LAUNCH_CMD_SOCKET " expands to the socket ID"),
+        embed->launch_cmd, embed_launch_cmd_changed);
+  embed_entry_set_good (GTK_ENTRY (widget), TRUE);
+
+  START_FRAME(_("Selection Criteria"), 4);
+  LABEL(0,
+      _("The window to embed must match all of the non-blank criteria.\n"
+        "Leave everything blank to rely on a launch command with socket ID."));
   /* proc_name */
-  ENTRY(0, _("_Process name"),
+  ENTRY(1, _("_Process name"),
            _("Match the window's application's process name\n"
              "Leave blank if it is not a criterion"),
         embed->proc_name, embed_proc_name_changed);
 
   /* window_class */
-  ENTRY(1, _("_Window class"), _("Match the window's class\n"
+  ENTRY(2, _("_Window class"), _("Match the window's class\n"
                                  "Leave blank if it is not a criterion"),
         embed->window_class, embed_window_class_changed);
 
   /* window_regex */
-  ENTRY(2, _("Window _title"), _("Match the window's title using a REGEX\n"
+  ENTRY(3, _("Window _title"), _("Match the window's title using a REGEX\n"
                                  "Leave blank if it is not a criterion"),
         embed->window_regex, embed_window_regex_changed);
   embed_entry_set_good (GTK_ENTRY (widget), TRUE);
@@ -289,6 +333,7 @@ embed_configure (XfcePanelPlugin *plugin, EmbedPlugin *embed)
 
 #undef ADD
 #undef TOOLTIP2
+#undef LABEL
 #undef ENTRY
 #undef FONTBUTTON
 #undef SPIN
diff --git a/panel-plugin/embed.c b/panel-plugin/embed.c
index 381f951..8b23a20 100644
--- a/panel-plugin/embed.c
+++ b/panel-plugin/embed.c
@@ -37,6 +37,7 @@
 #define DEFAULT_PROC_NAME    NULL
 #define DEFAULT_WINDOW_REGEX NULL
 #define DEFAULT_WINDOW_CLASS NULL
+#define DEFAULT_LAUNCH_CMD   NULL
 #define DEFAULT_LABEL_FMT    _("Embed")
 #define DEFAULT_LABEL_FONT   NULL
 #define DEFAULT_POLL_DELAY   0
@@ -90,6 +91,8 @@ embed_save (XfcePanelPlugin *plugin, EmbedPlugin *embed)
       xfce_rc_write_entry    (rc, "window_regex", embed->window_regex);
     if (embed->window_class)
       xfce_rc_write_entry    (rc, "window_class", embed->window_class);
+    if (embed->launch_cmd)
+      xfce_rc_write_entry    (rc, "launch_cmd",  embed->launch_cmd);
     if (embed->label_fmt)
       xfce_rc_write_entry    (rc, "label_fmt",   embed->label_fmt);
     if (embed->label_font)
@@ -130,6 +133,8 @@ embed_read (EmbedPlugin *embed)
                               "window_regex", DEFAULT_WINDOW_REGEX));
       embed->window_class = g_strdup (xfce_rc_read_entry (rc,
                               "window_class", DEFAULT_WINDOW_CLASS));
+      embed->launch_cmd = g_strdup (xfce_rc_read_entry (rc,
+                              "launch_cmd", DEFAULT_LAUNCH_CMD));
       embed->label_fmt = g_strdup (xfce_rc_read_entry (rc,
                               "label_fmt", DEFAULT_LABEL_FMT));
       embed->label_font = g_strdup (xfce_rc_read_entry (rc,
@@ -155,6 +160,7 @@ embed_read (EmbedPlugin *embed)
   embed->proc_name   = g_strdup (DEFAULT_PROC_NAME);
   embed->window_regex = g_strdup (DEFAULT_WINDOW_REGEX);
   embed->window_class = g_strdup (DEFAULT_WINDOW_CLASS);
+  embed->launch_cmd  = g_strdup (DEFAULT_LAUNCH_CMD);
   embed->label_fmt   = g_strdup (DEFAULT_LABEL_FMT);
   embed->label_font  = g_strdup (DEFAULT_LABEL_FONT);
   embed->poll_delay  = DEFAULT_POLL_DELAY;
@@ -264,6 +270,7 @@ embed_free (XfcePanelPlugin *plugin, EmbedPlugin *embed)
   g_free (embed->proc_name);
   g_free (embed->window_regex);
   g_free (embed->window_class);
+  g_free (embed->launch_cmd);
   g_free (embed->label_fmt);
   g_free (embed->label_font);
 
@@ -480,6 +487,36 @@ embed_search (EmbedPlugin *embed)
 
 
 
+/* Runs the desired command, if one is provided. */
+static void
+embed_launch_command (EmbedPlugin *embed)
+{
+  gchar *socketpos;
+  g_assert (embed->socket);
+  if (embed->launch_cmd && embed->launch_cmd[0]) {
+    /* See if we need to perform a substitution */
+    if ((socketpos = strstr (embed->launch_cmd, EMBED_LAUNCH_CMD_SOCKET))) {
+      /* Construct the launch command, replacing the EMBED_LAUNCH_CMD_SOCKET
+       * with the actual socket id. */
+      socketpos = g_strdup_printf ("%.*s%lu%s",
+          (gint)(socketpos - embed->launch_cmd), embed->launch_cmd,
+          (intptr_t)gtk_socket_get_id (GTK_SOCKET (embed->socket)),
+          socketpos + strlen (EMBED_LAUNCH_CMD_SOCKET));
+      if (!g_spawn_command_line_async (socketpos, NULL)) {
+        DBG ("launch failed");
+      }
+      g_free (socketpos);
+    } else {
+      /* Othewise just launch directly. */
+      if (!g_spawn_command_line_async (embed->launch_cmd, NULL)) {
+        DBG ("launch failed");
+      }
+    }
+  }
+}
+
+
+
 /* Starts the search for a viable plug. Does one initial search, and then sets
  * up X11 monitoring and possibly polling if no plug is found right away.
  * Does not start a search if there are no criteria, as that would be stupid. */
@@ -498,11 +535,13 @@ embed_start_search (GtkWidget *socket, EmbedPlugin *embed)
         (embed->window_class && embed->window_class[0])
        )) {
     DBG ("no search criteria specified");
+    /* Run the command if it is provided. */
+    embed_launch_command (embed);
     return;
   }
-  /* TODO: handle the case where we want to launch an application that will
-   * generate a plug */
+  /* See if we can't immediately find a window. */
   if (embed_search (embed)) {
+    /* Didn't find one. */
     /* Reset the _NET_CLIENT_LIST detector */
     embed->monitor_saw_net_client_list = FALSE;
     /* Watch for property changes (primarily the window list ones) on the root
@@ -516,6 +555,9 @@ embed_start_search (GtkWidget *socket, EmbedPlugin *embed)
     if (embed->poll_delay > 0)
       embed->search_timer = g_timeout_add (embed->poll_delay,
                                           (GSourceFunc)embed_search, embed);
+
+    /* Run the command if it is provided. */
+    embed_launch_command (embed);
   }
 }
 
@@ -831,7 +873,7 @@ void
 embed_search_again (EmbedPlugin *embed)
 {
   embed_popout (GTK_MENU_ITEM (embed->popout_menu), embed);
-  embed_embed_menu (GTK_MENU_ITEM (embed->embed_menu), embed);
+  embed->disable_search = FALSE;
 }
 
 
diff --git a/panel-plugin/embed.h b/panel-plugin/embed.h
index 5a919a2..3d2d462 100644
--- a/panel-plugin/embed.h
+++ b/panel-plugin/embed.h
@@ -57,6 +57,7 @@ typedef struct
     gchar           *proc_name;
     gchar           *window_regex;
     gchar           *window_class;
+    gchar           *launch_cmd;
     gchar           *label_fmt;
     gchar           *label_font;
     gint             poll_delay;
@@ -68,6 +69,9 @@ EmbedPlugin;
 /* Special values for EmbedPlugin::min_size */
 #define EMBED_MIN_SIZE_MATCH_WINDOW 0
 
+/* Special contents of launch_cmd */
+#define EMBED_LAUNCH_CMD_SOCKET "%s"
+
 /* Special contents of label_fmt */
 #define EMBED_LABEL_FMT_TITLE "%t"
 


More information about the Xfce4-commits mailing list