X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Ftint.c;h=3eebf88dfe2cb5bf3f670b8949abfcd7dc8479ea;hb=5b867835741534d8d28e8d158b8f7de53e55018a;hp=b72b46eb4f16861c584cc81f7a5e31e529c61483;hpb=06f401f585a2c0f86dd2d8968f480039ca051122;p=chaz%2Ftint2 diff --git a/src/tint.c b/src/tint.c index b72b46e..3eebf88 100644 --- a/src/tint.c +++ b/src/tint.c @@ -103,13 +103,42 @@ void init (int argc, char *argv[]) XSelectInput (server.dsp, server.root_win, PropertyChangeMask|StructureNotifyMask); setlocale (LC_ALL, ""); + + // load default icon + int i; + char *path; + const gchar * const *data_dirs; + data_dirs = g_get_system_data_dirs (); + for (i = 0; data_dirs[i] != NULL; i++) { + path = g_build_filename(data_dirs[i], "tint2", "default_icon.png", NULL); + if (g_file_test (path, G_FILE_TEST_EXISTS)) + default_icon = imlib_load_image(path); + g_free(path); + } + + // get monitor and desktop config + get_monitors(); + get_desktops(); } void cleanup() { + cleanup_systray(); cleanup_panel(); + 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); @@ -142,16 +171,14 @@ Taskbar *click_taskbar (Panel *panel, int x, int y) if (panel_horizontal) { for (i=0; i < panel->nb_desktop ; i++) { tskbar = &panel->taskbar[i]; - if (!tskbar->area.on_screen) continue; - if (x >= tskbar->area.posx && x <= (tskbar->area.posx + tskbar->area.width)) + if (tskbar->area.on_screen && x >= tskbar->area.posx && x <= (tskbar->area.posx + tskbar->area.width)) return tskbar; } } else { for (i=0; i < panel->nb_desktop ; i++) { tskbar = &panel->taskbar[i]; - if (!tskbar->area.on_screen) continue; - if (y >= tskbar->area.posy && y <= (tskbar->area.posy + tskbar->area.height)) + if (tskbar->area.on_screen && y >= tskbar->area.posy && y <= (tskbar->area.posy + tskbar->area.height)) return tskbar; } } @@ -169,7 +196,7 @@ Task *click_task (Panel *panel, int x, int y) Task *tsk; for (l0 = tskbar->area.list; l0 ; l0 = l0->next) { tsk = l0->data; - if (x >= tsk->area.posx && x <= (tsk->area.posx + tsk->area.width)) { + if (tsk->area.on_screen && x >= tsk->area.posx && x <= (tsk->area.posx + tsk->area.width)) { return tsk; } } @@ -178,7 +205,7 @@ Task *click_task (Panel *panel, int x, int y) Task *tsk; for (l0 = tskbar->area.list; l0 ; l0 = l0->next) { tsk = l0->data; - if (y >= tsk->area.posy && y <= (tsk->area.posy + tsk->area.height)) { + if (tsk->area.on_screen && y >= tsk->area.posy && y <= (tsk->area.posy + tsk->area.height)) { return tsk; } } @@ -268,8 +295,7 @@ void event_button_press (XEvent *e) Panel *panel = get_panel(e->xany.window); if (!panel) return; - if (panel_mode == MULTI_DESKTOP) - task_drag = click_task(panel, e->xbutton.x, e->xbutton.y); + task_drag = click_task(panel, e->xbutton.x, e->xbutton.y); if (wm_menu && !task_drag && !click_clock(panel, e->xbutton.x, e->xbutton.y) && (e->xbutton.button != 1) ) { // forward the click to the desktop window (thanks conky) @@ -294,13 +320,6 @@ void event_button_release (XEvent *e) Panel *panel = get_panel(e->xany.window); if (!panel) return; - if (wm_menu && click_padding(panel, e->xbutton.x, e->xbutton.y)) { - // forward the click to the desktop window (thanks conky) - e->xbutton.window = server.root_win; - XSendEvent(server.dsp, e->xbutton.window, False, ButtonReleaseMask, e); - return; - } - int action = TOGGLE_ICONIFY; switch (e->xbutton.button) { case 2: @@ -393,53 +412,40 @@ void event_property_notify (XEvent *e) } // Change desktop else if (at == server.atom._NET_CURRENT_DESKTOP) { + int old_desktop = server.desktop; server.desktop = server_get_current_desktop (); - for (i = 0; i < nb_panel; i++) { + for (i=0 ; i < nb_panel ; i++) { Panel *panel = &panel1[i]; - if (panel_mode == MULTI_DESKTOP) { - Taskbar *tskbar, *tskbar_active; - GSList *l; - Task *tsk; - char redraw_tasks; - - tskbar_active = &panel->taskbar[server.desktop]; - if (panel->g_taskbar.use_active) { - tskbar_active->area.is_active = 1; - tskbar_active->area.redraw = 1; - } - - for (j = 0; j < panel->nb_desktop; j++) { - tskbar = &panel->taskbar[j]; - - // need to redraw tasks only on taskbar, which was active, or which became active - redraw_tasks = 0; - if (panel->g_taskbar.use_active && tskbar->area.is_active && tskbar != tskbar_active) { - tskbar->area.is_active = 0; - tskbar->area.redraw = 1; - redraw_tasks = 1; - } else if (panel->g_taskbar.use_active && tskbar == tskbar_active) { - redraw_tasks = 1; - } - - for (l = tskbar->area.list; l;) { - tsk = l->data; - l = l->next; - - if (redraw_tasks) tsk->area.redraw = 1; - - if (tsk->desktop == ALLDESKTOP && tskbar != tskbar_active) { - // move omnipresent tasks to current taskbar - tskbar->area.list = g_slist_remove(tskbar->area.list, tsk); - tskbar->area.resize = 1; - tsk->area.parent = tskbar_active; - tskbar_active->area.list = g_slist_append(tskbar_active->area.list, tsk); - tskbar_active->area.resize = 1; - } - } - } + 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[server.desktop].area.is_active = 1; + panel->taskbar[server.desktop].area.redraw = 1; panel_refresh = 1; - } - } + } + // check ALLDESKTOP task => resize taskbar + Taskbar *tskbar; + Task *tsk; + GSList *l; + tskbar = &panel->taskbar[old_desktop]; + for (l = tskbar->area.list; l ; l = l->next) { + tsk = l->data; + if (tsk->desktop == ALLDESKTOP) { + tsk->area.on_screen = 0; + tskbar->area.resize = 1; + panel_refresh = 1; + } + } + tskbar = &panel->taskbar[server.desktop]; + for (l = tskbar->area.list; l ; l = l->next) { + tsk = l->data; + if (tsk->desktop == ALLDESKTOP) { + tsk->area.on_screen = 1; + tskbar->area.resize = 1; + } + } + } if (panel_mode != MULTI_DESKTOP) { visible_object(); } @@ -540,27 +546,30 @@ void event_property_notify (XEvent *e) panel_refresh = 1; } } - else if (at == server.atom.WM_STATE) { - // Iconic state - // TODO : try to delete following code - if (window_is_iconified (win)) { - if (task_active) { - if (task_active->win == tsk->win) { - Task *tsk2; - GSList *l0; - 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) { - tsk2 = l0->data; - tsk2->area.is_active = 0; - } - } - } - task_active = 0; - } - } - } - } +// We do not check for the iconified state, since it only unsets our active window +// but in openbox a shaded window is considered iconified. So we would loose the active window +// property on unshading it again (commented 01.10.2009) +// else if (at == server.atom.WM_STATE) { +// // Iconic state +// // TODO : try to delete following code +// if (window_is_iconified (win)) { +// if (task_active) { +// if (task_active->win == tsk->win) { +// Task *tsk2; +// GSList *l0; +// 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) { +// tsk2 = l0->data; +// tsk2->area.is_active = 0; +// } +// } +// } +// task_active = 0; +// } +// } +// } +// } // Window icon changed else if (at == server.atom._NET_WM_ICON) { get_icon(tsk); @@ -629,7 +638,14 @@ void event_expose (XEvent *e) void event_configure_notify (Window win) { - // check 'win' move in systray + // change in root window (xrandr) + if (win == server.root_win) { + get_monitors(); + init_panel(); + return; + } + + // 'win' is a trayer icon TrayWindow *traywin; GSList *l; for (l = systray.list_icons; l ; l = l->next) { @@ -642,9 +658,8 @@ void event_configure_notify (Window win) } } - // check 'win' move in another monitor + // 'win' move in another monitor if (nb_panel == 1) return; - if (server.nb_monitor == 1) return; Task *tsk = task_get_task (win); if (!tsk) return; @@ -740,7 +755,7 @@ int main (int argc, char *argv[]) GSList *it; init (argc, argv); -load_config: + i = 0; init_config(); if (config_path) @@ -810,12 +825,7 @@ load_config: break; case ConfigureNotify: - //XMoveWindow(dpy, fen, pos_x, pos_y); - //XResizeWindow(dpy, fen, largeur, hauteur); - if (e.xconfigure.window == server.root_win) - goto load_config; - else - event_configure_notify (e.xconfigure.window); + event_configure_notify (e.xconfigure.window); break; case ReparentNotify: @@ -853,9 +863,13 @@ load_config: event_timer(); switch (signal_pending) { - case SIGUSR1: + case SIGUSR1: // reload config file signal_pending = 0; - goto load_config; + init_config(); + config_read_file (config_path); + init_panel(); + cleanup_config(); + break; case SIGINT: case SIGTERM: case SIGHUP: