- server_refresh_root_pixmap ();
-
- draw (&panel.area);
- refresh (&panel.area);
-
- if (panel.clock.time1_format) {
- if (panel.clock.area.redraw)
- panel.refresh = 1;
- if (draw (&panel.clock.area)) {
- panel.clock.area.redraw = 1;
- draw (&panel.clock.area);
- resize_clock();
- resize_taskbar();
- redraw(&panel.area);
- }
- refresh (&panel.clock.area);
- }
-
- // TODO: ne pas afficher les taskbar invisibles
- //if (panel.mode != MULTI_DESKTOP && desktop != server.desktop) continue;
- Task *tsk;
- Taskbar *tskbar;
- GSList *l0;
- for (l0 = panel.area.list; l0 ; l0 = l0->next) {
- tskbar = l0->data;
- draw (&tskbar->area);
- refresh (&tskbar->area);
-
- GSList *l1;
- for (l1 = tskbar->area.list; l1 ; l1 = l1->next) {
- tsk = l1->data;
- draw(&tsk->area);
-
- if (tsk == panel.task_active) refresh (&tsk->area_active);
- else refresh (&tsk->area);
- }
- }
-
- XCopyArea (server.dsp, server.pmap, window.main_win, server.gc, 0, 0, panel.area.width, panel.area.height, 0, 0);
- XFlush(server.dsp);
- panel.refresh = 0;
+ int i, old_nb_panel;
+ Panel *new_panel, *p;
+
+ init_tooltip();
+ init_systray();
+ init_clock();
+#ifdef ENABLE_BATTERY
+ init_battery();
+#endif
+
+ cleanup_taskbar();
+ for (i=0 ; i < nb_panel ; i++) {
+ free_area(&panel1[i].area);
+ if (panel1[i].temp_pmap) {
+ XFreePixmap(server.dsp, panel1[i].temp_pmap);
+ panel1[i].temp_pmap = 0;
+ }
+ }
+
+ // number of panels
+ old_nb_panel = nb_panel;
+ if (panel_config.monitor >= 0)
+ nb_panel = 1;
+ else
+ nb_panel = server.nb_monitor;
+
+ // freed old panels
+ for (i=nb_panel ; i < old_nb_panel ; i++) {
+ if (panel1[i].main_win) {
+ XDestroyWindow(server.dsp, panel1[i].main_win);
+ panel1[i].main_win = 0;
+ }
+ }
+
+ // alloc & init new panel
+ Window old_win;
+ if (nb_panel != old_nb_panel)
+ new_panel = realloc(panel1, nb_panel * sizeof(Panel));
+ else
+ new_panel = panel1;
+ for (i=0 ; i < nb_panel ; i++) {
+ old_win = new_panel[i].main_win;
+ memcpy(&new_panel[i], &panel_config, sizeof(Panel));
+ new_panel[i].main_win = old_win;
+ }
+
+ fprintf(stderr, "tint2 : nb monitor %d, nb desktop %d\n", nb_panel, server.nb_desktop);
+ for (i=0 ; i < nb_panel ; i++) {
+ p = &new_panel[i];
+
+ p->monitor = i;
+ p->area.parent = p;
+ p->area.panel = p;
+ p->area.on_screen = 1;
+ p->area.resize = 1;
+ p->area._resize = resize_panel;
+ p->g_taskbar.parent = p;
+ p->g_taskbar.panel = p;
+ p->g_task.area.panel = p;
+ init_panel_size_and_position(p);
+
+ // add childs
+ if (clock_enabled) {
+ init_clock_panel(p);
+ p->area.list = g_slist_append(p->area.list, &p->clock);
+ }
+#ifdef ENABLE_BATTERY
+ if (battery_enabled) {
+ init_battery_panel(p);
+ p->area.list = g_slist_append(p->area.list, &p->battery);
+ }
+#endif
+ // systray only on first panel
+ if (systray.area.on_screen && i == 0) {
+ init_systray_panel(p);
+ p->area.list = g_slist_append(p->area.list, &systray);
+ refresh_systray = 1;
+ }
+
+ if (i >= old_nb_panel) {
+ // new panel : catch some events
+ long event_mask = ExposureMask|ButtonPressMask|ButtonReleaseMask;
+ if (g_tooltip.enabled)
+ event_mask |= PointerMotionMask|LeaveWindowMask;
+ XSetWindowAttributes att = { ParentRelative, 0L, 0, 0L, 0, 0, Always, 0L, 0L, False, event_mask, NoEventMask, False, 0, 0 };
+ p->main_win = XCreateWindow(server.dsp, server.root_win, p->posx, p->posy, p->area.width, p->area.height, 0, server.depth, InputOutput, CopyFromParent, CWEventMask, &att);
+ }
+ else {
+ // old panel
+ XMoveResizeWindow(server.dsp, p->main_win, p->posx, p->posy, p->area.width, p->area.height);
+ }
+
+ //printf("panel %d : %d, %d, %d, %d\n", i, p->posx, p->posy, p->area.width, p->area.height);
+ set_panel_properties(p);
+ set_panel_background(p);
+ if (i >= old_nb_panel) {
+ // map new panel
+ XMapWindow (server.dsp, p->main_win);
+ }
+ }
+
+ panel1 = new_panel;
+ panel_refresh = 1;
+ init_taskbar();
+ visible_object();
+ task_refresh_tasklist();
+ active_task();
+}
+
+
+void init_panel_size_and_position(Panel *panel)
+{
+ // detect panel size
+ if (panel_horizontal) {
+ if (panel->pourcentx)
+ panel->area.width = (float)server.monitor[panel->monitor].width * panel->area.width / 100;
+ if (panel->pourcenty)
+ panel->area.height = (float)server.monitor[panel->monitor].height * panel->area.height / 100;
+ if (panel->area.pix.border.rounded > panel->area.height/2)
+ panel->area.pix.border.rounded = panel->area.height/2;
+ }
+ else {
+ int old_panel_height = panel->area.height;
+ if (panel->pourcentx)
+ panel->area.height = (float)server.monitor[panel->monitor].height * panel->area.width / 100;
+ else
+ panel->area.height = panel->area.width;
+ if (panel->pourcenty)
+ panel->area.width = (float)server.monitor[panel->monitor].width * old_panel_height / 100;
+ else
+ panel->area.width = old_panel_height;
+ if (panel->area.pix.border.rounded > panel->area.width/2)
+ panel->area.pix.border.rounded = panel->area.width/2;
+ }
+
+ // panel position determined here
+ if (panel_position & LEFT) {
+ panel->posx = server.monitor[panel->monitor].x + panel->marginx;
+ }
+ else {
+ if (panel_position & RIGHT) {
+ panel->posx = server.monitor[panel->monitor].x + server.monitor[panel->monitor].width - panel->area.width - panel->marginx;
+ }
+ else {
+ if (panel_horizontal)
+ panel->posx = server.monitor[panel->monitor].x + ((server.monitor[panel->monitor].width - panel->area.width) / 2);
+ else
+ panel->posx = server.monitor[panel->monitor].x + panel->marginx;
+ }
+ }
+ if (panel_position & TOP) {
+ panel->posy = server.monitor[panel->monitor].y + panel->marginy;
+ }
+ else {
+ if (panel_position & BOTTOM) {
+ panel->posy = server.monitor[panel->monitor].y + server.monitor[panel->monitor].height - panel->area.height - panel->marginy;
+ }
+ else {
+ panel->posy = server.monitor[panel->monitor].y + ((server.monitor[panel->monitor].height - panel->area.height) / 2);
+ }
+ }
+ // printf("panel : posx %d, posy %d, width %d, height %d\n", panel->posx, panel->posy, panel->area.width, panel->area.height);
+}
+
+
+void cleanup_panel()
+{
+ if (!panel1) return;
+
+ task_active = 0;
+ task_drag = 0;
+ task_urgent = 0;
+ cleanup_taskbar();
+
+ int i;
+ Panel *p;
+ for (i=0 ; i < nb_panel ; i++) {
+ p = &panel1[i];
+
+ free_area(&p->area);
+
+ if (p->temp_pmap) {
+ XFreePixmap(server.dsp, p->temp_pmap);
+ p->temp_pmap = 0;
+ }
+ if (p->main_win) {
+ XDestroyWindow(server.dsp, p->main_win);
+ p->main_win = 0;
+ }
+ }
+
+ if (panel1) free(panel1);
+ panel1 = 0;