X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Ftint.c;h=ed65fa183c34536407a64cd65a6ddc4087ccddbb;hb=8a66c780e7fc932563b427999c3c6c2e923b232b;hp=c8521a04e584d74718fd29959eb297741133dbe9;hpb=080fb51e5d7f26a788f6fd85562807ca65ad5973;p=chaz%2Ftint2 diff --git a/src/tint.c b/src/tint.c index c8521a0..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); @@ -166,9 +174,10 @@ void get_snapshot(const char *path) { Panel *panel = &panel1[0]; - if (panel->temp_pmap) XFreePixmap(server.dsp, panel->temp_pmap); - panel->temp_pmap = XCreatePixmap(server.dsp, server.root_win, panel->area.width, panel->area.height, server.depth); + if (panel->area.width > server.monitor[0].width) + panel->area.width = server.monitor[0].width; + panel->temp_pmap = XCreatePixmap(server.dsp, server.root_win, panel->area.width, panel->area.height, server.depth); refresh(&panel->area); Imlib_Image img = NULL; @@ -176,6 +185,11 @@ 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(); } @@ -308,7 +322,7 @@ void event_button_motion_notify (XEvent *e) Panel * panel = get_panel(e->xany.window); if(!panel || !task_drag) return; - + // Find the taskbar on the event's location Taskbar * event_taskbar = click_taskbar(panel, e->xbutton.x, e->xbutton.y); if(event_taskbar == NULL) @@ -407,12 +421,6 @@ void event_button_release (XEvent *e) return; } - // switch desktop - if (panel_mode == MULTI_DESKTOP) { - if (tskbar->desktop != server.desktop && action != CLOSE && action != DESKTOP_LEFT && action != DESKTOP_RIGHT) - set_desktop (tskbar->desktop); - } - // drag and drop task if (task_dragged) { task_drag = 0; @@ -420,6 +428,12 @@ void event_button_release (XEvent *e) return; } + // switch desktop + if (panel_mode == MULTI_DESKTOP) { + if (tskbar->desktop != server.desktop && action != CLOSE && action != DESKTOP_LEFT && action != DESKTOP_RIGHT) + set_desktop (tskbar->desktop); + } + // action on task window_action( click_task(panel, e->xbutton.x, e->xbutton.y), action); @@ -610,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; } @@ -690,8 +700,10 @@ int main (int argc, char *argv[]) GSList *it; struct timeval* timeout; +start: init (argc, argv); - init_config(); + init_X11(); + i = 0; if (config_path) i = config_read_file (config_path); @@ -703,9 +715,7 @@ int main (int argc, char *argv[]) exit(1); } - init_X11(); init_panel(); - cleanup_config(); if (snapshot_path) { get_snapshot(snapshot_path); cleanup(); @@ -789,7 +799,7 @@ int main (int argc, char *argv[]) unsigned int button_mask = Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask; if (e.xmotion.state & button_mask) event_button_motion_notify (&e); - + if (!g_tooltip.enabled) break; Panel* panel = get_panel(e.xmotion.window); Area* area = click_area(panel, e.xmotion.x, e.xmotion.y); @@ -828,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) @@ -846,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) { @@ -884,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; + } } } }