]> ToastFreeware Gitweb - gregoa/zavai.git/blobdiff - src/zavai-calendar.vala
Debugging
[gregoa/zavai.git] / src / zavai-calendar.vala
index 47aa551d0c024d539ba1ffa5dd1892ac7d710e01..5d34139fd11f470b3c43c4389402a284787de40f 100644 (file)
@@ -22,17 +22,46 @@ using GLib;
 
 //string VERSION = "0.1";
 
+static Posix.pid_t is_running()
+{
+       string pidfile = zavai.config.homedir + "/calendar.pid";
+       string contents;
+       try {
+               if (!FileUtils.get_contents(pidfile, out contents))
+                       return 0;
+       } catch (FileError e) {
+               return 0;
+       }
+       int val = contents.to_int();
+       string procdir = "/proc/%d".printf(val);
+       if (FileUtils.test(procdir, FileTest.IS_DIR))
+               return (Posix.pid_t)val;
+       else
+               return 0;
+}
+
+static void make_pidfile()
+{
+       string pidfile = zavai.config.homedir + "/calendar.pid";
+       FileUtils.set_contents(pidfile, "%d".printf(Posix.getpid()));
+}
+
+static void on_kill(int sig)
+{
+       Gtk.main_quit();
+}
+
 static int main (string[] args) {
-       string opt_popup = null;
+       bool opt_popup = false;
        GLib.OptionEntry[] entries = new GLib.OptionEntry[] {
                OptionEntry() {
                        long_name = "popup",
                        short_name = 'p',
                        flags = 0,
-                       arg = OptionArg.STRING,
+                       arg = OptionArg.NONE,
                        arg_data = &opt_popup,
                        description = "run as a popup at the specified location on screen",
-                       arg_description = "X,Y" },
+                       arg_description = null },
                OptionEntry()
        };
         Gtk.init_with_args(ref args, "", entries, null);
@@ -59,15 +88,30 @@ static int main (string[] args) {
        // User interface
        var calendar = new zavai.widgets.Calendar();
 
-       Gtk.WindowType wtype;
-       if (opt_popup == null)
-               wtype = Gtk.WindowType.TOPLEVEL;
-       else
+       Gtk.Window win = new Gtk.Window(Gtk.WindowType.TOPLEVEL);
+       if (opt_popup)
        {
-               wtype = Gtk.WindowType.POPUP;
+               Posix.pid_t pid = is_running();
+               if (pid != 0)
+               {
+                       // Kill a running calendar
+                       Posix.kill(pid, Posix.SIGINT);
+                       FileUtils.unlink(zavai.config.homedir + "/calendar.pid");
+                       return 0;
+               }
+
+               make_pidfile();
+
+               win.set_decorated(false);
+               //win.set_resizable(false);
+               win.set_border_width(5);
+               win.set_skip_taskbar_hint(true);
+               win.set_skip_pager_hint(true);
+               //    gtk_window_set_type_hint(GTK_WINDOW(win), GDK_WINDOW_TYPE_HINT_DOCK);
+               win.set_position(Gtk.WindowPosition.MOUSE);
+               win.stick();
        }
 
-       var win = new Gtk.Window(wtype);
        win.title = "Zavai calendar";
        win.destroy += Gtk.main_quit;
        win.add(calendar);
@@ -75,16 +119,13 @@ static int main (string[] args) {
        win.show_all();
        win.show();
 
-       // # Shutdown the main loop on SIGINT
-       // def on_kill(signum, frame):
-       //     gtk.main_quit()
-       // signal.signal(signal.SIGINT, on_kill)
-       // signal.signal(signal.SIGTERM, on_kill)
+       // Shutdown the main loop on SIGINT
+       Posix.signal(Posix.SIGINT, on_kill);
+       Posix.signal(Posix.SIGTERM, on_kill);
 
        Gtk.main();
 
-       // zavai.info("Shutting down")
-       //zavai.registry.shutdown();
+       calendar.flush();
 
        return 0;
 }