X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Ftint.c;h=f88b57fd7f3cb7fb1e549d25fbca40f205ae45d2;hb=e050df33d29de6f7890b7111f6ea871aa5247743;hp=235c2e2763ac44ffeaf65fab4b06345d4122b1d6;hpb=e92c129cb3795408bcb0a305e4d52c03e39af56b;p=chaz%2Ftint2 diff --git a/src/tint.c b/src/tint.c index 235c2e2..f88b57f 100644 --- a/src/tint.c +++ b/src/tint.c @@ -42,6 +42,7 @@ #include "tooltip.h" #include "timer.h" + void signal_handler(int sig) { // signal handler is light as it should be @@ -53,6 +54,17 @@ void init (int argc, char *argv[]) { int i; + // set global data + default_config(); + default_timeout(); + default_systray(); + memset(&server, 0, sizeof(Server_global)); + default_battery(); + default_clock(); + default_taskbar(); + default_tooltip(); + default_panel(); + // read options for (i = 1; i < argc; ++i) { if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) { @@ -75,6 +87,7 @@ void init (int argc, char *argv[]) } } // Set signal handler + signal_pending = 0; struct sigaction sa = { .sa_handler = signal_handler }; sigaction(SIGUSR1, &sa, 0); sigaction(SIGINT, &sa, 0); @@ -91,10 +104,6 @@ void init (int argc, char *argv[]) // sigaddset(&block_mask, SIGHUP); // sigaddset(&block_mask, SIGUSR1); // sigprocmask(SIG_BLOCK, &block_mask, 0); - - // set global data - memset(&server, 0, sizeof(Server_global)); - memset(&systray, 0, sizeof(Systraybar)); } void init_X11() @@ -140,7 +149,7 @@ void init_X11() void cleanup() { - stop_all_timeouts(); + cleanup_timeout(); cleanup_systray(); stop_net(); cleanup_panel(); @@ -149,13 +158,13 @@ void cleanup() #ifdef ENABLE_BATTERY cleanup_battery(); #endif + cleanup_config(); if (default_icon) { imlib_context_set_image(default_icon); imlib_free_image(); } - if (config_path) g_free(config_path); - if (snapshot_path) g_free(snapshot_path); + imlib_context_disconnect_display(); cleanup_server(); if (server.dsp) XCloseDisplay(server.dsp); @@ -177,9 +186,13 @@ void get_snapshot(const char *path) img = imlib_create_image_from_drawable(0, 0, 0, panel->area.width, panel->area.height, 0); imlib_context_set_image(img); + if (!panel_horizontal) { + // rotate 90° vertical panel + imlib_image_flip_horizontal(); + imlib_image_flip_diagonal(); + } imlib_save_image(path); imlib_free_image(); - XFreePixmap(server.dsp, panel->temp_pmap); } @@ -612,11 +625,7 @@ void event_configure_notify (Window win) { // change in root window (xrandr) if (win == server.root_win) { - get_monitors(); - init_config(); - config_read_file (config_path); - init_panel(); - cleanup_config(); + signal_pending = SIGUSR1; return; } @@ -692,8 +701,8 @@ int main (int argc, char *argv[]) GSList *it; struct timeval* timeout; +start: init (argc, argv); - init_config(); init_X11(); i = 0; @@ -708,7 +717,6 @@ int main (int argc, char *argv[]) } init_panel(); - cleanup_config(); if (snapshot_path) { get_snapshot(snapshot_path); cleanup(); @@ -887,19 +895,18 @@ int main (int argc, char *argv[]) callback_timeout_expired(); - switch (signal_pending) { - case SIGUSR1: // reload config file - signal_pending = 0; - init_config(); - config_read_file (config_path); - init_panel(); - cleanup_config(); - break; - case SIGINT: - case SIGTERM: - case SIGHUP: - cleanup (); - return 0; + if (signal_pending) { + cleanup(); + if (signal_pending == SIGUSR1) { + // restart tint2 + // SIGUSR1 used when : user's signal, composite manager stop/start or xrandr + FD_CLR (x11_fd, &fdset); + goto start; + } + else { + // SIGINT, SIGTERM, SIGHUP + return 0; + } } } }