- 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;
+void init_panel()
+{
+ int i, j;
+ 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_launcher();
+ init_clock();
+#ifdef ENABLE_BATTERY
+ init_battery();
+#endif
+
+ // number of panels (one monitor or 'all' monitors)
+ if (panel_config.monitor >= 0)
+ nb_panel = 1;
+ else
+ nb_panel = server.nb_monitor;
+
+ panel1 = malloc(nb_panel * sizeof(Panel));
+ for (i=0 ; i < nb_panel ; i++) {
+ memcpy(&panel1[i], &panel_config, sizeof(Panel));
+ }
+
+ 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 = &panel1[i];
+
+ if (panel_config.monitor < 0)
+ p->monitor = i;
+ if ( p->area.bg == 0 )
+ p->area.bg = &g_array_index(backgrounds, Background, 0);
+ p->area.parent = p;
+ p->area.panel = p;
+ p->area.on_screen = 1;
+ p->area.resize = 1;
+ p->area.size_mode = SIZE_BY_LAYOUT;
+ 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
+ // TODO : should respect the order of 'panel_items' config parameter
+ if (launcher_enabled) {
+ init_launcher_panel(p);
+ p->area.list = g_slist_append(p->area.list, &p->launcher);
+ }
+ p->nb_desktop = server.nb_desktop;
+ p->taskbar = calloc(p->nb_desktop, sizeof(Taskbar));
+ for (j=0 ; j < p->nb_desktop ; j++) {
+ p->area.list = g_slist_append(p->area.list, &p->taskbar[j]);
+ }
+#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 (clock_enabled) {
+ init_clock_panel(p);
+ p->area.list = g_slist_append(p->area.list, &p->clock);
+ }
+
+ // 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);
+
+ 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 (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);
+ }
+
+ panel_refresh = 1;
+ init_taskbar();
+ visible_object();
+ task_refresh_tasklist();
+ active_task();