//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);
// 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);
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;
}