Imported Upstream version 1.4
[debian/gsimplecal.git] / src / gsimplecal.cpp
1 #include <iostream>
2 #include <string.h>
3
4 #include <signal.h>
5 #include <gtk/gtk.h>
6
7 #include "config.h"
8 #include "MainWindow.hpp"
9 #include "Config.hpp"
10 #include "Unique.hpp"
11
12
13 MainWindow* main_window;
14
15
16 static void signal_handler(int signal_id)
17 {
18     if (signal_id == SIGTERM) {
19         gtk_main_quit();
20     } else if (signal_id == SIGUSR1) {
21         main_window->nextMonth();
22     } else if (signal_id == SIGUSR2) {
23         main_window->prevMonth();
24     }
25 }
26
27 static void destroy()
28 {
29     delete main_window;
30     gtk_main_quit();
31 }
32
33 static bool time_handler(GtkWidget *widget)
34 {
35     main_window->updateTime();
36     return true;
37 }
38
39 static void version()
40 {
41     std::cout << PACKAGE_STRING << std::endl;
42 }
43
44 static void usage(const char* const name)
45 {
46     std::cerr << "usage: " << name << " [options] [commands]\n"
47         << "\noptions:\n"
48         << "\t-h, --help\n\t\tprint this help text and quit\n"
49         << "\t-v, --version\n\t\tprint version info and quit\n"
50         << "\ncommands:\n"
51         << "\tnext_month, prev_month\n"
52         << "\t\tif program is running, switch the displayed month\n"
53         << "\t\totherwise simply run the program\n"
54         << "\tif no command is given\n"
55         << "\t\tif program is not running, start it\n"
56         << "\t\totherwise stop it\n"
57         ;
58 }
59
60 int main(int argc, char *argv[])
61 {
62     if (argc >= 2) {
63         if (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0) {
64             usage(argv[0]);
65             return 2;
66         } else if (strcmp(argv[1], "-v") == 0 || strcmp(argv[1], "--version") == 0) {
67             version();
68             return 0;
69         }
70     }
71
72     Unique* unique = new Unique();
73     if (unique->isRunning()) {
74         try {
75             if (argc >= 2 && strcmp(argv[1], "next_month") == 0) {
76                 unique->signal(SIGUSR1);
77             } else if (argc >= 2 && strcmp(argv[1], "prev_month") == 0) {
78                 unique->signal(SIGUSR2);
79             } else {
80                 unique->kill();
81                 unique->stop();
82             }
83             return 0;
84         } catch (UniqueException e) {
85             std::cerr << "Looks like gsimplecal crashed last time."
86                 << " Exception message is: " << e.what() << ". Cleaning up."
87                 << std::endl;
88             unique->stop();
89         }
90     }
91
92     unique->start();
93     signal(SIGTERM, &signal_handler);
94     signal(SIGUSR1, &signal_handler);
95     signal(SIGUSR2, &signal_handler);
96     signal(SIGCHLD, SIG_IGN);
97
98     gtk_init(&argc, &argv);
99     main_window = new MainWindow();
100
101     gtk_signal_connect(GTK_OBJECT(main_window->getWindow()), "destroy",
102                        GTK_SIGNAL_FUNC(destroy), NULL);
103
104     Config* config = Config::getInstance();
105     if (config->show_timezones) {
106         g_timeout_add(30000, (GSourceFunc)time_handler, NULL);
107     }
108     if (config->close_on_unfocus) {
109         g_signal_connect(G_OBJECT(main_window->getWindow()), "focus-out-event",
110                                   GTK_SIGNAL_FUNC(gtk_widget_destroy),
111                                   GTK_OBJECT(main_window->getWindow()));
112     }
113
114     gtk_main();
115
116     unique->stop();
117     return 0;
118 }