r491 - trunk/src/target/OM-2007/applications/openmoko-mainmenu/src

tongsong_li at gta01.hmw-consulting.de tongsong_li at gta01.hmw-consulting.de
Thu Jan 4 02:14:51 CET 2007


Author: tongsong_li
Date: 2007-01-04 02:14:43 +0100 (Thu, 04 Jan 2007)
New Revision: 491

Modified:
   trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/main.c
Log:
essage=

Modified: trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/main.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/main.c	2007-01-03 22:42:41 UTC (rev 490)
+++ trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/main.c	2007-01-04 01:14:43 UTC (rev 491)
@@ -20,10 +20,94 @@
 #include "callbacks.h"
 
 #include "main.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <signal.h>
 
+#define LOCK_FILE "/tmp/moko-mainmenu.lock"
+
+GtkWidget *main_window = NULL;
+
+static void 
+handle_sigusr1 (int value)
+{
+g_debug ("Call handle signal use main window = %x", main_window);
+
+if (!main_window)
+       return;
+  gtk_window_present (main_window);
+}
+
+static pid_t 
+testlock (char *fname)
+{
+  int fd;
+  struct flock fl;
+
+  fd = open (fname, O_WRONLY, S_IWUSR);
+  if (fd < 0)
+    {
+      if (errno == ENOENT)
+        {
+          return 0;
+        }
+      else
+        {
+          perror ("Test lock open file");
+          return -1;
+        }
+    }
+
+  fl.l_type = F_WRLCK;
+  fl.l_whence = SEEK_SET;
+  fl.l_start = 0;
+  fl.l_len = 0;
+
+  if (fcntl (fd, F_GETLK, &fl) < 0)
+    {
+      close (fd);
+      return -1;
+    }
+  close (fd);
+
+  if (fl.l_type == F_UNLCK)
+    return 0;
+
+  return fl.l_pid;
+}
+
+static void 
+setlock (char *fname)
+{
+  int fd;
+  struct flock fl;
+
+  fd = open (fname, O_WRONLY|O_CREAT, S_IWUSR);
+  if (fd < 0)
+    {
+      perror ("Set lock open file");
+      return ;
+    }
+
+  fl.l_type = F_WRLCK;
+  fl.l_whence = SEEK_SET;
+  fl.l_start = 0;
+  fl.l_len = 0;
+
+  if (fcntl (fd, F_SETLK, &fl) < 0)
+    {
+      perror ("Lock file");
+      close (fd);
+    }
+}
+
 int 
-main( int argc, char** argv ) {
+main( int argc, char** argv ) 
+{
     MokoMainmenuApp *mma;
+    pid_t lockapp;
     int i;
 
     mma = g_malloc0 (sizeof (MokoMainmenuApp));
@@ -34,6 +118,15 @@
     memset (mma, 0, sizeof (MokoMainmenuApp));
 
     gtk_init( &argc, &argv );
+
+    lockapp = testlock (LOCK_FILE);
+    g_debug ("lock app = %x", lockapp);
+    if (lockapp > 0)
+    {
+      kill (lockapp, SIGUSR1);
+      return 0;
+    }
+    setlock (LOCK_FILE);
     
     /* application object */
     mma->app = MOKO_APPLICATION(moko_application_get_instance());
@@ -42,6 +135,7 @@
     /* finger based window */
     mma->window = MOKO_FINGER_WINDOW(moko_finger_window_new());
     gtk_widget_show (GTK_WIDGET (mma->window));
+    main_window = mma->window;
 
     /* finger wheel object*/
     mma->wheel = moko_finger_window_get_wheel (mma->window);
@@ -94,6 +188,8 @@
     /*test code, delete later*/
     moko_sample_hisory_app_fill (mma->history[0]);
 
+    signal (SIGUSR1, handle_sigusr1);
+    
     gtk_main();
 
     if (mma)





More information about the commitlog mailing list