X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Ftint.c;h=ed65fa183c34536407a64cd65a6ddc4087ccddbb;hb=8a66c780e7fc932563b427999c3c6c2e923b232b;hp=235c2e2763ac44ffeaf65fab4b06345d4122b1d6;hpb=e92c129cb3795408bcb0a305e4d52c03e39af56b;p=chaz%2Ftint2 diff --git a/src/tint.c b/src/tint.c index 235c2e2..ed65fa1 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,22 +149,21 @@ void init_X11() void cleanup() { - stop_all_timeouts(); + cleanup_timeout(); cleanup_systray(); - stop_net(); cleanup_panel(); cleanup_tooltip(); cleanup_clock(); #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 +185,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 +624,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 +700,8 @@ int main (int argc, char *argv[]) GSList *it; struct timeval* timeout; +start: init (argc, argv); - init_config(); init_X11(); i = 0; @@ -708,7 +716,6 @@ int main (int argc, char *argv[]) } init_panel(); - cleanup_config(); if (snapshot_path) { get_snapshot(snapshot_path); cleanup(); @@ -831,8 +838,8 @@ int main (int argc, char *argv[]) case UnmapNotify: case DestroyNotify: if (e.xany.window == server.composite_manager) { - // TODO: Stop real_transparency - //signal_pending = SIGUSR2; + // Stop real_transparency + signal_pending = SIGUSR1; break; } if (e.xany.window == g_tooltip.window || !systray.area.on_screen) @@ -849,13 +856,11 @@ int main (int argc, char *argv[]) ev = &e.xclient; if (ev->data.l[1] == server.atom._NET_WM_CM_S0) { if (ev->data.l[2] == None) - // TODO: Stop real_transparency - //signal_pending = SIGUSR2; - ; + // Stop real_transparency + signal_pending = SIGUSR1; else - // TODO: Start real_transparency - //signal_pending = SIGUSR2; - ; + // Start real_transparency + signal_pending = SIGUSR1; } if (!systray.area.on_screen) break; if (e.xclient.message_type == server.atom._NET_SYSTEM_TRAY_OPCODE && e.xclient.format == 32 && e.xclient.window == net_sel_win) { @@ -887,19 +892,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); // not sure if needed + goto start; + } + else { + // SIGINT, SIGTERM, SIGHUP + return 0; + } } } }