[Xfce4-commits] <xfce4-mixer:master> Make xfce4-mixer a singleton application (bug #5676)

Guido Berhoerster noreply at xfce.org
Thu Sep 27 16:46:22 CEST 2012


Updating branch refs/heads/master
         to 88fb4e4474e507575b5b7bf6b4486a04cf573e0f (commit)
       from 3dfd08968ee1653bc9fca9b4e2d9eadadb5fb626 (commit)

commit 88fb4e4474e507575b5b7bf6b4486a04cf573e0f
Author: Guido Berhoerster <guido+xfce at berhoerster.name>
Date:   Thu Sep 27 16:31:08 2012 +0200

    Make xfce4-mixer a singleton application (bug #5676)
    
    Make xfce4-mixer a singleton application using libunique, executing xfce4-mixer
    while another instance is already running brings the running instance to the
    foreground.

 NEWS                    |    3 ++
 configure.ac.in         |    1 +
 xfce4-mixer/Makefile.am |    2 +
 xfce4-mixer/main.c      |   73 ++++++++++++++++++++++++++++++++++++++++------
 4 files changed, 69 insertions(+), 10 deletions(-)

diff --git a/NEWS b/NEWS
index e5e133a..7cab556 100644
--- a/NEWS
+++ b/NEWS
@@ -31,6 +31,9 @@
 - Add a popup with a scale for setting the volume to the panel plugin which is
   opened on left click, allow running the uder-defined command previously bound
   to left click from the panel plugin context menu instead.
+- Make xfce4-mixer a singleton application, executing xfce4-mixer while another
+  instance is already running brings the running instance to the foreground
+  (bug #5676).
 
 
 4.8.0
diff --git a/configure.ac.in b/configure.ac.in
index 4baffdb..aa0b086 100644
--- a/configure.ac.in
+++ b/configure.ac.in
@@ -98,6 +98,7 @@ XDT_CHECK_PACKAGE([GTHREAD], [gthread-2.0], [2.24.0])
 XDT_CHECK_PACKAGE([DBUS_GLIB], [dbus-glib-1], [0.84])
 XDT_CHECK_PACKAGE([GST_PLUGINS_BASE], [gstreamer-plugins-base-0.10], [0.10.23])
 XDT_CHECK_PACKAGE([GTK], [gtk+-2.0], [2.20.0])
+XDT_CHECK_PACKAGE([UNIQUE], [unique-1.0], [1.1])
 XDT_CHECK_PACKAGE([LIBXFCE4UTIL], [libxfce4util-1.0], [4.10.0])
 XDT_CHECK_PACKAGE([LIBXFCE4UI], [libxfce4ui-1], [4.10.0])
 XDT_CHECK_PACKAGE([LIBXFCE4PANEL], [libxfce4panel-1.0], [4.10.0])
diff --git a/xfce4-mixer/Makefile.am b/xfce4-mixer/Makefile.am
index fd17aeb..e5a45f0 100644
--- a/xfce4-mixer/Makefile.am
+++ b/xfce4-mixer/Makefile.am
@@ -26,6 +26,7 @@ xfce4_mixer_CFLAGS = 							\
 	-DMIXER_DATADIR=\"$(pkgdatadir)\"				\
 	$(GLIB_CFLAGS)							\
 	$(GTK_CFLAGS)							\
+	$(UNIQUE_CFLAGS)						\
 	$(LIBXFCE4UTIL_CFLAGS)						\
 	$(LIBXFCE4UI_CFLAGS)						\
 	$(XFCONF_CFLAGS)						\
@@ -39,6 +40,7 @@ xfce4_mixer_LDFLAGS = 							\
 	$(GLIB_LIBS)							\
 	$(GTHREAD_LIBS)							\
 	$(GTK_LIBS)							\
+	$(UNIQUE_LIBS)							\
 	$(LIBXFCE4UTIL_LIBS)						\
 	$(LIBXFCE4UI_LIBS)						\
 	$(XFCONF_LIBS)							\
diff --git a/xfce4-mixer/main.c b/xfce4-mixer/main.c
index a4c32d7..5a65f0b 100644
--- a/xfce4-mixer/main.c
+++ b/xfce4-mixer/main.c
@@ -1,6 +1,7 @@
 /* vi:set expandtab sw=2 sts=2: */
 /*-
  * Copyright (c) 2008 Jannis Pohlmann <jannis at xfce.org>
+ * Copyright (c) 2012 Guido Berhoerster <guido+xfce at berhoerster.name>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,6 +29,9 @@
 
 #include <gst/gst.h>
 
+#include <gtk/gtk.h>
+#include <unique/unique.h>
+
 #include <libxfce4util/libxfce4util.h>
 #include <libxfce4ui/libxfce4ui.h>
 #include <xfconf/xfconf.h>
@@ -38,12 +42,42 @@
 
 
 
+static UniqueResponse
+message_received (UniqueApp         *app,
+                  UniqueCommand      command,
+                  UniqueMessageData *message,
+                  guint              time_,
+                  GtkWidget         *window)
+{
+  UniqueResponse response;
+
+  switch (command)
+    {
+      case UNIQUE_ACTIVATE:
+        /* Move window to the screen the command was started on */
+        gtk_window_set_screen (GTK_WINDOW (window), unique_message_data_get_screen (message));
+        /* Bring window to the foreground */
+        gtk_window_present_with_time (GTK_WINDOW (window), time_);
+        response = UNIQUE_RESPONSE_OK;
+        break;
+      default:
+        /* Invalid command */
+        response = UNIQUE_RESPONSE_FAIL;
+        break;
+    }
+
+  return response;
+}
+
+
+
 int 
 main (int    argc,
       char **argv)
 {
-  GtkWidget *window;
-  GError    *error = NULL;
+  UniqueApp     *app;
+  GtkWidget     *window;
+  GError        *error = NULL;
 
   /* Setup translation domain */
   xfce_textdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8");
@@ -96,17 +130,36 @@ main (int    argc,
       return EXIT_FAILURE;
     }
 
-  /* Create the mixer window */
-  window = xfce_mixer_window_new ();
+  /* Create unique application */
+  app = unique_app_new ("org.xfce.xfce4-mixer", NULL);
+  if (unique_app_is_running (app))
+    {
+      unique_app_send_message (app, UNIQUE_ACTIVATE, NULL);
+
+      g_object_unref (app);
+    }
+  else
+    {
+      /* Create the mixer window */
+      window = xfce_mixer_window_new ();
 
-  /* Display the mixer window */
-  gtk_widget_show (window);
+      /* Display the mixer window */
+      gtk_widget_show (window);
 
-  /* Enter the GTK+ main loop */
-  gtk_main ();
+      /* Watch mixer window */
+      unique_app_watch_window (app, GTK_WINDOW (window));
 
-  /* Destroy the window */
-  gtk_widget_destroy (window);
+      /* Handle messages */
+      g_signal_connect (app, "message-received", G_CALLBACK (message_received), window);
+
+      /* Enter the GTK+ main loop */
+      gtk_main ();
+
+      g_object_unref (app);
+
+      /* Destroy the window */
+      gtk_widget_destroy (window);
+    }
 
   /* Shutdown the mixer library */
   xfce_mixer_shutdown ();


More information about the Xfce4-commits mailing list