X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Ftint.c;h=ece6dbc5f4655996caf1e3a169ae2a8f90e33c76;hb=7a0fc200e711dea262ccabd7d07d53aa6d91c9df;hp=3eebf88dfe2cb5bf3f670b8949abfcd7dc8479ea;hpb=5b867835741534d8d28e8d158b8f7de53e55018a;p=chaz%2Ftint2 diff --git a/src/tint.c b/src/tint.c index 3eebf88..ece6dbc 100644 --- a/src/tint.c +++ b/src/tint.c @@ -49,21 +49,27 @@ void signal_handler(int sig) void init (int argc, char *argv[]) { - int c; + int i; // read options - while ((c = getopt(argc , argv, "c:j:v")) != -1) { - switch (c) { - case 'c': - config_path = strdup (optarg); - break; - case 'j': - thumbnail_path = strdup (optarg); - break; - case 'v': - printf("tint2 version 0.7-svn\n"); + for (i = 1; i < argc; ++i) { + if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) { + printf("Usage: tint2 [-c] \n"); exit(0); - break; + } + if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--version")) { + printf("tint2 version 0.7.svn\n"); + exit(0); + } + if (!strcmp(argv[i], "-c")) { + i++; + if (i < argc) + config_path = strdup(argv[i]); + } + if (!strcmp(argv[i], "-s")) { + i++; + if (i < argc) + snapshot_path = strdup(argv[i]); } } @@ -91,7 +97,7 @@ void init (int argc, char *argv[]) server.visual = DefaultVisual (server.dsp, server.screen); server.desktop = server_get_current_desktop (); XGCValues gcv; - server.gc = XCreateGC (server.dsp, server.root_win, (unsigned long)0, &gcv) ; + server.gc = XCreateGC (server.dsp, server.root_win, (unsigned long)0, &gcv); XSetErrorHandler ((XErrorHandler) server_catch_error); @@ -105,7 +111,6 @@ void init (int argc, char *argv[]) setlocale (LC_ALL, ""); // load default icon - int i; char *path; const gchar * const *data_dirs; data_dirs = g_get_system_data_dirs (); @@ -125,37 +130,20 @@ void init (int argc, char *argv[]) void cleanup() { cleanup_systray(); + stop_net(); cleanup_panel(); + cleanup_tooltip(); + cleanup_clock(); +#ifdef ENABLE_BATTERY + cleanup_battery(); +#endif if (default_icon) { imlib_context_set_image(default_icon); imlib_free_image(); } - if (g_tooltip.window) { - XDestroyWindow(server.dsp, g_tooltip.window); - g_tooltip.window = 0; - } - if (g_tooltip.font_desc) { - pango_font_description_free(g_tooltip.font_desc); - g_tooltip.font_desc = 0; - } - if (time1_font_desc) pango_font_description_free(time1_font_desc); - if (time2_font_desc) pango_font_description_free(time2_font_desc); - if (time1_format) g_free(time1_format); - if (time2_format) g_free(time2_format); -#ifdef ENABLE_BATTERY - if (bat1_font_desc) pango_font_description_free(bat1_font_desc); - if (bat2_font_desc) pango_font_description_free(bat2_font_desc); - if (battery_low_cmd) g_free(battery_low_cmd); - if (path_energy_now) g_free(path_energy_now); - if (path_energy_full) g_free(path_energy_full); - if (path_current_now) g_free(path_current_now); - if (path_status) g_free(path_status); -#endif - if (clock_lclick_command) g_free(clock_lclick_command); - if (clock_rclick_command) g_free(clock_rclick_command); if (config_path) g_free(config_path); - if (thumbnail_path) g_free(thumbnail_path); + if (snapshot_path) g_free(snapshot_path); if (server.monitor) free(server.monitor); XFreeGC(server.dsp, server.gc); @@ -163,6 +151,25 @@ void cleanup() } +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); + + refresh(&panel->area); + + Imlib_Image img = NULL; + imlib_context_set_drawable(panel->temp_pmap); + img = imlib_create_image_from_drawable(0, 0, 0, panel->area.width, panel->area.height, 0); + + imlib_context_set_image(img); + imlib_save_image(path); + imlib_free_image(); +} + + Taskbar *click_taskbar (Panel *panel, int x, int y) { Taskbar *tskbar; @@ -258,8 +265,10 @@ void window_action (Task *tsk, int action) XIconifyWindow (server.dsp, tsk->win, server.screen); break; case TOGGLE_ICONIFY: - if (tsk == task_active) XIconifyWindow (server.dsp, tsk->win, server.screen); - else set_active (tsk->win); + if (task_active && tsk->win == task_active->win) + XIconifyWindow (server.dsp, tsk->win, server.screen); + else + set_active (tsk->win); break; case SHADE: window_toggle_shade (tsk->win); @@ -303,10 +312,10 @@ void event_button_press (XEvent *e) e->xbutton.window = server.root_win; // icewm doesn't open under the mouse. // and xfce doesn't open at all. - //e->xbutton.x = e->xbutton.x_root; - //e->xbutton.y = e->xbutton.y_root; + e->xbutton.x = e->xbutton.x_root; + e->xbutton.y = e->xbutton.y_root; //printf("**** %d, %d\n", e->xbutton.x, e->xbutton.y); - XSetInputFocus(server.dsp, e->xbutton.window, RevertToParent, e->xbutton.time); + //XSetInputFocus(server.dsp, e->xbutton.window, RevertToParent, e->xbutton.time); XSendEvent(server.dsp, e->xbutton.window, False, ButtonPressMask, e); return; } @@ -419,9 +428,9 @@ void event_property_notify (XEvent *e) if (panel_mode == MULTI_DESKTOP && panel->g_taskbar.use_active) { // redraw both taskbar panel->taskbar[old_desktop].area.is_active = 0; - panel->taskbar[old_desktop].area.redraw = 1; + panel->taskbar[old_desktop].area.resize = 1; panel->taskbar[server.desktop].area.is_active = 1; - panel->taskbar[server.desktop].area.redraw = 1; + panel->taskbar[server.desktop].area.resize = 1; panel_refresh = 1; } // check ALLDESKTOP task => resize taskbar @@ -457,44 +466,7 @@ void event_property_notify (XEvent *e) } // Change active else if (at == server.atom._NET_ACTIVE_WINDOW) { - GSList *l0; - if (task_active) { - for (i=0 ; i < nb_panel ; i++) { - for (j=0 ; j < panel1[i].nb_desktop ; j++) { - for (l0 = panel1[i].taskbar[j].area.list; l0 ; l0 = l0->next) { - tsk = l0->data; - tsk->area.is_active = 0; - } - } - } - task_active = 0; - } - Window w1 = window_get_active (); - Task *t = task_get_task(w1); - if (!t) { - Window w2; - if (XGetTransientForHint(server.dsp, w1, &w2) != 0) - if (w2) t = task_get_task(w2); - } - if (task_urgent == t) { - init_precision(); - task_urgent = 0; - } - // put active state on all task (multi_desktop) - if (t) { - for (i=0 ; i < nb_panel ; i++) { - for (j=0 ; j < panel1[i].nb_desktop ; j++) { - for (l0 = panel1[i].taskbar[j].area.list; l0 ; l0 = l0->next) { - tsk = l0->data; - if (tsk->win == t->win) { - tsk->area.is_active = 1; - //printf("active monitor %d, task %s\n", panel1[i].monitor, tsk->title); - } - } - } - } - task_active = t; - } + active_task(); panel_refresh = 1; } else if (at == server.atom._XROOTPMAP_ID) { @@ -508,10 +480,15 @@ void event_property_notify (XEvent *e) else { tsk = task_get_task (win); if (!tsk) { - if ( at != server.atom._NET_WM_STATE) - return; - else if ( !(tsk = add_task(win)) ) + // some stupid wm send _NET_WM_STATE after the window was minimized to tray??? + if (at != server.atom._NET_WM_STATE) return; + else if (!window_is_skip_taskbar(win)) { + if (tsk = add_task(win)) + panel_refresh = 1; + else + return; + } } //printf("atom root_win = %s, %s\n", XGetAtomName(server.dsp, at), tsk->title); @@ -641,7 +618,10 @@ 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(); return; } @@ -699,7 +679,7 @@ void event_timer() // update battery #ifdef ENABLE_BATTERY - if (panel1[0].battery.area.on_screen) { + if (battery_enabled) { update_battery(); for (i=0 ; i < nb_panel ; i++) panel1[i].battery.area.resize = 1; @@ -767,10 +747,10 @@ int main (int argc, char *argv[]) cleanup(); exit(1); } - config_finish(); - if (thumbnail_path) { - // usage: tint2 -j for internal use - printf("file %s\n", thumbnail_path); + init_panel(); + cleanup_config(); + if (snapshot_path) { + get_snapshot(snapshot_path); cleanup(); exit(0); } @@ -803,6 +783,7 @@ int main (int argc, char *argv[]) break; case MotionNotify: { + if (!g_tooltip.enabled) break; Panel* panel = get_panel(e.xmotion.window); Task* task = click_task(panel, e.xmotion.x, e.xmotion.y); if (task) @@ -829,7 +810,7 @@ int main (int argc, char *argv[]) break; case ReparentNotify: - if (!systray.area.on_screen) + if (!systray_enabled) break; panel = (Panel*)systray.area.panel; if (e.xany.window == panel->main_win) // reparented to us