- if (server.pmap) XFreePixmap (server.dsp, server.pmap);
- server.pmap = server_create_pixmap (panel.area.width, panel.area.height);
- XCopyArea (server.dsp, panel.area.pix.pmap, server.pmap, server.gc, 0, 0, panel.area.width, panel.area.height, 0, 0);
-
- // draw child object
- GSList *l = panel.area.list;
- for (; l ; l = l->next)
- refresh (l->data);
-
- // main_win doesn't include panel.area.paddingx, so we have WM capabilities on left and right.
- 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);
- XFlush (server.dsp);
- panel.refresh = 0;
+int panel_mode;
+int wm_menu;
+int panel_dock=0; // default not in the dock
+int panel_layer=BOTTOM_LAYER; // default is bottom layer
+int panel_position;
+int panel_horizontal;
+int panel_refresh;
+int task_dragged=0;
+
+int panel_autohide = 0;
+int panel_autohide_show_timeout = 0;
+int panel_autohide_hide_timeout = 0;
+int panel_autohide_height = 5; // for vertical panels this is of course the width
+int panel_strut_policy = STRUT_MINIMUM;
+
+Task *task_active;
+Task *task_drag;
+int max_tick_urgent;
+
+// panel's initial config
+Panel panel_config;
+// panels (one panel per monitor)
+Panel *panel1 = 0;
+int nb_panel = 0;
+
+GArray* backgrounds = 0;
+
+Imlib_Image default_icon = NULL;
+
+
+void autohide_hide(void* p);
+void autohide_show(void* p);
+
+
+void init_panel()
+{
+ int i, old_nb_panel;
+ Panel *new_panel, *p;
+
+ if (panel_config.monitor > (server.nb_monitor-1)) {
+ // server.nb_monitor minimum value is 1 (see get_monitors())
+ fprintf(stderr, "warning : monitor not found. tint2 default to all monitors.\n");
+ panel_config.monitor = 0;
+ }
+
+ init_tooltip();
+ init_systray();
+ init_clock();
+#ifdef ENABLE_BATTERY
+ init_battery();
+#endif
+
+ cleanup_taskbar();
+ for (i=0 ; i < nb_panel ; i++) {
+ autohide_show(&panel1[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 monitor used %d, nb desktop %d\n", server.nb_monitor, nb_panel, server.nb_desktop);
+ for (i=0 ; i < nb_panel ; i++) {
+ p = &new_panel[i];
+
+ if (panel_config.monitor < 0)
+ 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.area.parent = p;
+ p->g_taskbar.area.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
+ XSetWindowAttributes att = { .colormap=server.colormap, .background_pixel=0, .border_pixel=0 };
+ unsigned long mask = CWEventMask|CWColormap|CWBackPixel|CWBorderPixel;
+ p->main_win = XCreateWindow(server.dsp, server.root_win, p->posx, p->posy, p->area.width, p->area.height, 0, server.depth, InputOutput, server.visual, mask, &att);
+ }
+ else {
+ // old panel
+ XMoveResizeWindow(server.dsp, p->main_win, p->posx, p->posy, p->area.width, p->area.height);
+ }
+
+ long event_mask = ExposureMask|ButtonPressMask|ButtonReleaseMask|ButtonMotionMask;
+ if (g_tooltip.enabled)
+ event_mask |= PointerMotionMask|LeaveWindowMask;
+ if (panel_autohide)
+ event_mask |= LeaveWindowMask|EnterWindowMask;
+ XChangeWindowAttributes(server.dsp, p->main_win, CWEventMask, &(XSetWindowAttributes){.event_mask=event_mask});
+
+ if (!server.gc) {
+ XGCValues gcv;
+ server.gc = XCreateGC(server.dsp, p->main_win, 0, &gcv);
+ }
+ //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 && snapshot_path == 0) {
+ // if we are not in 'snapshot' mode then map new panel
+ XMapWindow (server.dsp, p->main_win);
+ }
+
+ if (panel_autohide)
+ add_timeout(panel_autohide_hide_timeout, 0, autohide_hide, p);
+ }
+
+ panel1 = new_panel;
+ panel_refresh = 1;
+ init_taskbar();
+ visible_object();
+ task_refresh_tasklist();
+ active_task();