void init_panel()
{
- int i;
+ int i, j;
Panel *p;
if (panel_config.monitor > (server.nb_monitor-1)) {
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);
+ // 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) {
p->area.list = g_slist_append(p->area.list, &p->battery);
}
#endif
- if (launcher_enabled) {
- init_launcher_panel(p);
- p->area.list = g_slist_append(p->area.list, &p->launcher);
- }
// 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 };
int resize_panel(void *obj)
{
Panel *panel = (Panel*)obj;
-//printf("resize_panel : taskbar\n");
-
- if (panel_horizontal) {
- int taskbar_width, modulo_width = 0;
-
- taskbar_width = panel->area.width - (2 * panel->area.paddingxlr) - (2 * panel->area.bg->border.width);
- if (panel->clock.area.on_screen && panel->clock.area.width)
- taskbar_width -= (panel->clock.area.width + panel->area.paddingx);
- if (panel->launcher.area.on_screen && panel->launcher.area.width)
- taskbar_width -= (panel->launcher.area.width + panel->area.paddingx);
- #ifdef ENABLE_BATTERY
- if (panel->battery.area.on_screen && panel->battery.area.width)
- taskbar_width -= (panel->battery.area.width + panel->area.paddingx);
- #endif
- // TODO : systray only on first panel. search better implementation !
- if (systray.area.on_screen && systray.area.width && panel == &panel1[0])
- taskbar_width -= (systray.area.width + panel->area.paddingx);
-
- if (panel_mode == MULTI_DESKTOP) {
- int width = taskbar_width - ((panel->nb_desktop-1) * panel->area.paddingx);
- taskbar_width = width / panel->nb_desktop;
- modulo_width = width % panel->nb_desktop;
+ int size, nb_by_content=0, nb_by_layout=0;
+ Area *a = (Area*)obj;
+ int paddingx = a->paddingx;;
+
+ if (panel_horizontal) {
+ // detect free size for SIZE_BY_LAYOUT's Area
+ size = a->width - (2 * a->paddingxlr) - (2 * a->bg->border.width);
+ GSList *l;
+ for (l = ((Area*)obj)->list ; l ; l = l->next) {
+ a = (Area*)l->data;
+ if (a->on_screen && a->width && a->size_mode == SIZE_BY_CONTENT) {
+ size -= a->width;
+ nb_by_content++;
+ }
+ if (a->on_screen && a->size_mode == SIZE_BY_LAYOUT)
+ nb_by_layout++;
+ }
+ if (nb_by_content+nb_by_layout)
+ size -= ((nb_by_content+nb_by_layout-1) * paddingx);
+ //printf("resize_panel : size_panel %d, size_layout %d\n", panel->area.width, size);
+
+ int width=0, modulo=0;
+ if (nb_by_layout) {
+ width = size / nb_by_layout;
+ modulo = size % nb_by_layout;
}
+ //printf(" content %d, layout %d, width %d, modulo %d\n", nb_by_content, nb_by_layout, width, modulo);
// change posx and width for all taskbar
int i, posx;
posx += (panel->launcher.area.width + panel->area.paddingx);
for (i=0 ; i < panel->nb_desktop ; i++) {
panel->taskbar[i].area.posx = posx;
- panel->taskbar[i].area.width = taskbar_width;
+ panel->taskbar[i].area.width = width;
panel->taskbar[i].area.resize = 1;
- if (modulo_width) {
+ if (modulo) {
panel->taskbar[i].area.width++;
- modulo_width--;
+ modulo--;
}
+ //printf(" width %d\n", panel->taskbar[i].area.width);
//printf("taskbar %d : posx %d, width, %d, posy %d\n", i, posx, panel->taskbar[i].area.width, posx + panel->taskbar[i].area.width);
if (panel_mode == MULTI_DESKTOP)
posx += panel->taskbar[i].area.width + panel->area.paddingx;
}
}
else {
- int taskbar_height, modulo_height = 0;
- int i, posy;
+ // detect free size for SIZE_BY_LAYOUT's Area
+ size = a->height - (2 * a->paddingxlr) - (2 * a->bg->border.width);
+ GSList *l;
+ for (l = ((Area*)obj)->list ; l ; l = l->next) {
+ a = (Area*)l->data;
+ if (a->on_screen && a->height && a->size_mode == SIZE_BY_CONTENT) {
+ size -= a->height;
+ nb_by_content++;
+ }
+ if (a->on_screen && a->size_mode == SIZE_BY_LAYOUT)
+ nb_by_layout++;
+ }
+ if (nb_by_content+nb_by_layout)
+ size -= ((nb_by_content+nb_by_layout-1) * paddingx);
- taskbar_height = panel->area.height - (2 * panel->area.paddingxlr) - (2 * panel->area.bg->border.width);
- if (panel->clock.area.on_screen && panel->clock.area.height)
- taskbar_height -= (panel->clock.area.height + panel->area.paddingx);
- if (panel->launcher.area.on_screen && panel->launcher.area.height)
- taskbar_height -= (panel->launcher.area.height + panel->area.paddingx);
- #ifdef ENABLE_BATTERY
- if (panel->battery.area.on_screen && panel->battery.area.height)
- taskbar_height -= (panel->battery.area.height + panel->area.paddingx);
- #endif
- // TODO : systray only on first panel. search better implementation !
- if (systray.area.on_screen && systray.area.height && panel == &panel1[0])
- taskbar_height -= (systray.area.height + panel->area.paddingx);
-
- posy = panel->area.height - panel->area.bg->border.width - panel->area.paddingxlr - taskbar_height;
- if (panel->launcher.area.on_screen && panel->launcher.area.height)
- posy -= (panel->launcher.area.height + panel->area.paddingx);
- if (panel_mode == MULTI_DESKTOP) {
- int height = taskbar_height - ((panel->nb_desktop-1) * panel->area.paddingx);
- taskbar_height = height / panel->nb_desktop;
- modulo_height = height % panel->nb_desktop;
+ int width=0, modulo=0;
+ if (nb_by_layout) {
+ width = size / nb_by_layout;
+ modulo = size % nb_by_layout;
}
// change posy and height for all taskbar
+ int i, posy;
for (i=0 ; i < panel->nb_desktop ; i++) {
panel->taskbar[i].area.posy = posy;
- panel->taskbar[i].area.height = taskbar_height;
+ panel->taskbar[i].area.height = width;
panel->taskbar[i].area.resize = 1;
- if (modulo_height) {
+ if (modulo) {
panel->taskbar[i].area.height++;
- modulo_height--;
+ modulo--;
}
if (panel_mode == MULTI_DESKTOP)
posy += panel->taskbar[i].area.height + panel->area.paddingx;
}
}
- return 0;
+ return 1;
}