+void update_strut(Panel* p)
+{
+ if (panel_strut_policy == STRUT_NONE) {
+ XDeleteProperty(server.dsp, p->main_win, server.atom._NET_WM_STRUT);
+ XDeleteProperty(server.dsp, p->main_win, server.atom._NET_WM_STRUT_PARTIAL);
+ return;
+ }
+
+ // Reserved space
+ unsigned int d1, screen_width, screen_height;
+ Window d2;
+ int d3;
+ XGetGeometry(server.dsp, server.root_win, &d2, &d3, &d3, &screen_width, &screen_height, &d1, &d1);
+ Monitor monitor = server.monitor[p->monitor];
+ long struts [12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+ if (panel_horizontal) {
+ int height = p->area.height + p->marginy;
+ if (panel_strut_policy == STRUT_MINIMUM || (panel_strut_policy == STRUT_FOLLOW_SIZE && p->is_hidden))
+ height = p->hidden_height;
+ if (panel_position & TOP) {
+ struts[2] = height + monitor.y;
+ struts[8] = p->posx;
+ // p->area.width - 1 allowed full screen on monitor 2
+ struts[9] = p->posx + p->area.width - 1;
+ }
+ else {
+ struts[3] = height + screen_height - monitor.y - monitor.height;
+ struts[10] = p->posx;
+ // p->area.width - 1 allowed full screen on monitor 2
+ struts[11] = p->posx + p->area.width - 1;
+ }
+ }
+ else {
+ int width = p->area.width + p->marginx;
+ if (panel_strut_policy == STRUT_MINIMUM || (panel_strut_policy == STRUT_FOLLOW_SIZE && p->is_hidden))
+ width = p->hidden_width;
+ if (panel_position & LEFT) {
+ struts[0] = width + monitor.x;
+ struts[4] = p->posy;
+ // p->area.width - 1 allowed full screen on monitor 2
+ struts[5] = p->posy + p->area.height - 1;
+ }
+ else {
+ struts[1] = width + screen_width - monitor.x - monitor.width;
+ struts[6] = p->posy;
+ // p->area.width - 1 allowed full screen on monitor 2
+ struts[7] = p->posy + p->area.height - 1;
+ }
+ }
+ // Old specification : fluxbox need _NET_WM_STRUT.
+ XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_STRUT, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &struts, 4);
+ XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_STRUT_PARTIAL, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &struts, 12);
+}
+
+
+void set_panel_items_order(Panel *p)
+{
+ int k, j;
+
+ if (p->area.list) {
+ g_slist_free(p->area.list);
+ p->area.list = 0;
+ }
+
+ for (k=0 ; k < strlen(panel_items_order) ; k++) {
+ if (panel_items_order[k] == 'L')
+ p->area.list = g_slist_append(p->area.list, &p->launcher);
+ if (panel_items_order[k] == 'T') {
+ for (j=0 ; j < p->nb_desktop ; j++)
+ p->area.list = g_slist_append(p->area.list, &p->taskbar[j]);
+ }
+#ifdef ENABLE_BATTERY
+ if (panel_items_order[k] == 'B')
+ p->area.list = g_slist_append(p->area.list, &p->battery);
+#endif
+ if (panel_items_order[k] == 'S') {
+ // TODO : check systray is only on 1 panel
+ p->area.list = g_slist_append(p->area.list, &systray);
+ }
+ if (panel_items_order[k] == 'C')
+ p->area.list = g_slist_append(p->area.list, &p->clock);
+ }
+ init_rendering(&p->area, 0);
+}
+