/**************************************************************************
*
* Tint2 panel
-*
+*
* Copyright (C) 2007 Pål Staurland (staura@gmail.com)
* Modified (C) 2008 thierry lorthiois (lorthiois@bbsoft.fr)
-*
+*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation.
panel.clock.area.draw_foreground = draw_foreground_clock;
g_task.area.draw_foreground = draw_foreground_task;
window.main_win = 0;
-
- // append full transparency background
- //Area *back = calloc(1, sizeof(Area));
- list_back = g_slist_append(0, calloc(1, sizeof(Area)));
-
+
server.dsp = XOpenDisplay (NULL);
if (!server.dsp) {
fprintf(stderr, "Could not open display.\n");
}
server_init_atoms ();
server.screen = DefaultScreen (server.dsp);
- server.root_win = RootWindow (server.dsp, server.screen);
+ server.root_win = RootWindow(server.dsp, server.screen);
server.depth = DefaultDepth (server.dsp, server.screen);
server.visual = DefaultVisual (server.dsp, server.screen);
server.desktop = server_get_current_desktop ();
//kde_init();
//net_init();
//printf("ici 4\n");
-
+
imlib_context_set_display (server.dsp);
imlib_context_set_visual (server.visual);
imlib_context_set_colormap (DefaultColormap (server.dsp, server.screen));
/* Catch events */
XSelectInput (server.dsp, server.root_win, PropertyChangeMask|StructureNotifyMask);
- setlocale(LC_ALL, "");
+ setlocale (LC_ALL, "");
}
void event_button_press (int x, int y)
-{
+{
if (panel.mode == SINGLE_DESKTOP) {
// drag and drop disabled
XLowerWindow (server.dsp, window.main_win);
return;
}
-
+
Taskbar *tskbar;
GSList *l0;
for (l0 = panel.area.list; l0 ; l0 = l0->next) {
}
}
}
-
+
XLowerWindow (server.dsp, window.main_win);
}
void event_button_release (int button, int x, int y)
{
int action = TOGGLE_ICONIFY;
+ // TODO: convert event_button_press(int x, int y) to area->event_button_press()
+ // if systray is ok
switch (button) {
case 2:
break;
}
- // TODO: ne pas afficher les taskbar invisibles
- //if (panel.mode != MULTI_DESKTOP && desktop != server.desktop) continue;
-
// search taskbar
Taskbar *tskbar;
GSList *l0;
// drag and drop task
if (panel.task_drag) {
if (tskbar != panel.task_drag->area.parent && action == TOGGLE_ICONIFY) {
- windows_set_desktop(panel.task_drag->win, tskbar->desktop);
- if (tskbar->desktop == server.desktop)
- set_active(panel.task_drag->win);
- panel.task_drag = 0;
+ if (!panel.task_drag->all_desktop && panel.mode == MULTI_DESKTOP) {
+ windows_set_desktop(panel.task_drag->win, tskbar->desktop);
+ if (tskbar->desktop == server.desktop)
+ set_active(panel.task_drag->win);
+ panel.task_drag = 0;
+ }
return;
}
else panel.task_drag = 0;
}
-
+
// switch desktop
if (panel.mode == MULTI_DESKTOP)
if (tskbar->desktop != server.desktop && action != CLOSE)
break;
}
}
-
+
// to keep window below
XLowerWindow (server.dsp, window.main_win);
}
void event_property_notify (Window win, Atom at)
-{
-
+{
+
if (win == server.root_win) {
if (!server.got_root_win) {
XSelectInput (server.dsp, server.root_win, PropertyChangeMask|StructureNotifyMask);
/* Change number of desktops */
else if (at == server.atom._NET_NUMBER_OF_DESKTOPS) {
config_taskbar();
- redraw(&panel.area);
- panel.refresh = 1;
+ visible_object();
}
/* Change desktop */
else if (at == server.atom._NET_CURRENT_DESKTOP) {
server.desktop = server_get_current_desktop ();
- if (panel.mode != MULTI_DESKTOP) panel.refresh = 1;
+ if (panel.mode != MULTI_DESKTOP) {
+ visible_object();
+ }
}
/* Window list */
else if (at == server.atom._NET_CLIENT_LIST) {
task_refresh_tasklist ();
panel.refresh = 1;
}
- /* Active */
+ /* Change active */
else if (at == server.atom._NET_ACTIVE_WINDOW) {
+ if (panel.task_active) {
+ if (panel.task_active->all_desktop) {
+ Task *tsk;
+ GSList *l0;
+ int i, nb;
+ nb = server.nb_desktop * server.nb_monitor;
+ for (i=0 ; i < nb ; i++) {
+ for (l0 = panel.taskbar[i].area.list; l0 ; l0 = l0->next) {
+ tsk = l0->data;
+ tsk->area.is_active = 0;
+ }
+ }
+ }
+ else
+ panel.task_active->area.is_active = 0;
+ panel.task_active = 0;
+ }
Window w1 = window_get_active ();
Task *t = task_get_task(w1);
- if (t) panel.task_active = t;
- else {
+ if (!t) {
Window w2;
if (XGetTransientForHint(server.dsp, w1, &w2) != 0)
- if (w2) panel.task_active = task_get_task(w2);
+ if (w2) t = task_get_task(w2);
}
+ if (t) {
+ if (t->all_desktop) {
+ Task *tsk;
+ GSList *l0;
+ int i, nb;
+ nb = server.nb_desktop * server.nb_monitor;
+ for (i=0 ; i < nb ; i++) {
+ for (l0 = panel.taskbar[i].area.list; l0 ; l0 = l0->next) {
+ tsk = l0->data;
+ if (tsk->win == t->win)
+ tsk->area.is_active = 1;
+ }
+ }
+ }
+ else
+ t->area.is_active = 1;
+ panel.task_active = t;
+ }
panel.refresh = 1;
}
/* Wallpaper changed */
else if (at == server.atom._XROOTPMAP_ID) {
- XFreePixmap (server.dsp, server.root_pmap);
- server.root_pmap = 0;
- redraw(&panel.area);
- panel.clock.area.redraw = 1;
+ XFreePixmap (server.dsp, panel.area.pix.pmap);
+ panel.area.pix.pmap = 0;
panel.refresh = 1;
}
}
/* Window title changed */
if (at == server.atom._NET_WM_VISIBLE_NAME || at == server.atom._NET_WM_NAME || at == server.atom.WM_NAME) {
- get_title(tsk);
- tsk->area.redraw = 1;
+ if (tsk->all_desktop) {
+ Task *tsk2;
+ GSList *l0;
+ int i, nb;
+ nb = server.nb_desktop * server.nb_monitor;
+ for (i=0 ; i < nb ; i++) {
+ for (l0 = panel.taskbar[i].area.list; l0 ; l0 = l0->next) {
+ tsk2 = l0->data;
+ if (tsk->win == tsk2->win) {
+ get_title(tsk2);
+ tsk2->area.redraw = 1;
+ }
+ }
+ }
+ }
+ else {
+ get_title(tsk);
+ tsk->area.redraw = 1;
+ }
panel.refresh = 1;
}
/* Iconic state */
else if (at == server.atom.WM_STATE) {
if (window_is_iconified (win))
- if (panel.task_active == tsk) panel.task_active = 0;
+ if (panel.task_active) {
+ if (panel.task_active->win == tsk->win) {
+ if (tsk->all_desktop) {
+ Task *tsk2;
+ GSList *l0;
+ int i, nb;
+ nb = server.nb_desktop * server.nb_monitor;
+ for (i=0 ; i < nb ; i++) {
+ for (l0 = panel.taskbar[i].area.list; l0 ; l0 = l0->next) {
+ tsk2 = l0->data;
+ tsk2->area.is_active = 0;
+ }
+ }
+ }
+ else
+ panel.task_active->area.is_active = 0;
+ panel.task_active = 0;
+ }
+ }
}
/* Window icon changed */
else if (at == server.atom._NET_WM_ICON) {
- if (tsk->icon_data != 0) XFree (tsk->icon_data);
+ if (tsk->icon_data) {
+ free (tsk->icon_data);
+ tsk->icon_data = 0;
+ }
tsk->area.redraw = 1;
- tsk->icon_data = 0;
panel.refresh = 1;
}
/* Window desktop changed */
else if (at == server.atom._NET_WM_DESKTOP) {
- add_task (tsk->win);
- remove_task (tsk);
+ remove_task (tsk);
+ add_task (win);
panel.refresh = 1;
}
void event_configure_notify (Window win)
-{
- Task *tsk;
+{
+ if (panel.mode != MULTI_MONITOR) return;
- tsk = task_get_task (win);
+ Task *tsk = task_get_task (win);
if (!tsk) return;
-/* TODO ??? voir ancien code !!
- Taskbar *tskbar;
- tskbar = tsk->area.parent;
- int new_monitor = window_get_monitor (win);
- int desktop = tskbar->desktop;
-
- // task on the same monitor
- if (tsk->id_taskbar == index(desktop, new_monitor)) return;
-
- add_task (tsk->win);
- remove_task (tsk);
- panel.refresh = 1;
- */
+ Taskbar *tskbar = tsk->area.parent;
+ if (tskbar->monitor != window_get_monitor (win)) {
+ // task on another monitor
+ remove_task (tsk);
+ add_task (win);
+ panel.refresh = 1;
+ }
}
struct timeval stv;
if (!panel.clock.time1_format) return;
-
+
if (gettimeofday(&stv, 0)) return;
-
+
if (abs(stv.tv_sec - panel.clock.clock.tv_sec) < panel.clock.time_precision) return;
-
+
// update clock
panel.clock.clock.tv_sec = stv.tv_sec;
panel.clock.clock.tv_sec -= panel.clock.clock.tv_sec % panel.clock.time_precision;
init ();
load_config:
- if (server.root_pmap) XFreePixmap (server.dsp, server.root_pmap);
- server.root_pmap = 0;
+ if (panel.area.pix.pmap) XFreePixmap (server.dsp, panel.area.pix.pmap);
+ panel.area.pix.pmap = 0;
+ // append full transparency background
+ list_back = g_slist_append(0, calloc(1, sizeof(Area)));
+
// read tint2rc config
i = 0;
if (c != -1)
exit(1);
}
config_finish ();
-
+
window_draw_panel ();
+ // BUG: refresh(clock) is needed here, but 'on the paper' it's not necessary.
+ refresh(&panel.clock.area);
+
x11_fd = ConnectionNumber (server.dsp);
XSync (server.dsp, False);
-
+
while (1) {
// thanks to AngryLlama for the timer
// Create a File Description Set containing x11_fd
tv.tv_usec = 500000;
tv.tv_sec = 0;
-
+
// Wait for X Event or a Timer
if (select(x11_fd+1, &fd, 0, 0, &tv)) {
while (XPending (server.dsp)) {
XNextEvent(server.dsp, &e);
-
+
switch (e.type) {
case ButtonPress:
if (e.xbutton.button == 1) event_button_press (e.xbutton.x, e.xbutton.y);
case ButtonRelease:
event_button_release (e.xbutton.button, e.xbutton.x, e.xbutton.y);
break;
-
+
case Expose:
- XCopyArea (server.dsp, server.pmap, window.main_win, server.gc, 0, 0, panel.area.width, panel.area.height, 0, 0);
+ XCopyArea (server.dsp, panel.area.pix.pmap, server.root_win, server.gc_root, 0, 0, panel.area.width, panel.area.height, server.posx, server.posy);
+ XCopyArea (server.dsp, server.pmap, window.main_win, server.gc, panel.area.paddingx, 0, panel.area.width-(2*panel.area.paddingx), panel.area.height, 0, 0);
break;
case PropertyNotify:
+ //printf("PropertyNotify\n");
event_property_notify (e.xproperty.window, e.xproperty.atom);
break;
if (e.xconfigure.window == server.root_win)
goto load_config;
else
- if (panel.mode == MULTI_MONITOR)
- event_configure_notify (e.xconfigure.window);
+ event_configure_notify (e.xconfigure.window);
break;
}
}
if (panel.refresh && !panel.sleep_mode) {
visual_refresh ();
//printf(" *** visual_refresh\n");
- }
+ }
}
}