changeset 9:0e50d3652326

use libunique to ensure that only a single instance of pk-update-icon can be run
author Guido Berhoerster <guido@berhoerster.name>
date Tue, 11 Oct 2011 17:07:49 +0200
parents 58a3312a1c59
children fe1a21ab4f69
files Makefile main.c
diffstat 2 files changed, 19 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile	Tue Oct 11 17:07:49 2011 +0200
+++ b/Makefile	Tue Oct 11 17:07:49 2011 +0200
@@ -15,16 +15,18 @@
 xdgautostartdir ?=	$(sysconfdir)/xdg/autostart
 
 PACKAGE =	pk-update-icon
+APP_NAME =	org.opensuse.pk-update-icon
 VERSION =	0.1
 OBJS =		main.o notify.o packagekit.o
 AUTOSTART_FILE =	$(PACKAGE).desktop
 MOFILES :=	$(patsubst %.po,%.mo,$(wildcard po/*.po))
 POTFILE =	po/$(PACKAGE).pot
-CPPFLAGS :=	$(shell pkg-config --cflags gtk+-2.0 libnotify packagekit-glib2) \
+CPPFLAGS := 	$(shell pkg-config --cflags gtk+-2.0 unique-1.0 libnotify packagekit-glib2) \
 		-DI_KNOW_THE_PACKAGEKIT_GLIB2_API_IS_SUBJECT_TO_CHANGE \
 		-DPACKAGE="\"$(PACKAGE)\"" \
+		-DAPP_NAME=\"$(APP_NAME)\" \
 		-DLOCALEDIR="\"$(localedir)\""
-LDLIBS :=	$(shell pkg-config --libs gtk+-2.0 libnotify packagekit-glib2)
+LDLIBS :=	$(shell pkg-config --libs gtk+-2.0 unique-1.0 libnotify packagekit-glib2)
 
 .DEFAULT_TARGET = all
 
--- a/main.c	Tue Oct 11 17:07:49 2011 +0200
+++ b/main.c	Tue Oct 11 17:07:49 2011 +0200
@@ -25,6 +25,7 @@
 #include <locale.h>
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
+#include <unique/unique.h>
 
 struct UpdatesInfo info;
 
@@ -86,6 +87,8 @@
 int main(int argc, char **argv)
 {
 	GtkStatusIcon *tray_icon;
+	UniqueApp *app;
+	int exitval = 0;
 
 	setlocale(LC_ALL, "");
 	bindtextdomain(PACKAGE, LOCALEDIR);
@@ -93,6 +96,12 @@
 	textdomain(PACKAGE);
 
 	gtk_init(&argc, &argv);
+	app = unique_app_new(APP_NAME, NULL);
+	if (unique_app_is_running(app)) {
+		g_printerr("Another instance of pk-update-icon is already running. Exiting.\n");
+		exitval = 1;
+		goto out;
+	}
 	tray_icon = create_tray_icon();
 	init_notify();
 
@@ -103,5 +112,10 @@
 
 	gtk_main();
 
-	return 0;
+	g_object_unref(tray_icon);
+
+out:
+	g_object_unref(app);
+
+	return exitval;
 }