Merge taskbar_alignment from branch
This commit is contained in:
parent
18b0ef2d1b
commit
df1f2d4e4b
13 changed files with 409 additions and 276 deletions
|
@ -544,6 +544,15 @@ void add_entry (char *key, char *value)
|
|||
taskbar_sort_method = TASKBAR_NOSORT;
|
||||
}
|
||||
}
|
||||
else if (strcmp (key, "task_align") == 0) {
|
||||
if (strcmp(value, "center") == 0) {
|
||||
taskbar_alignment = ALIGN_CENTER;
|
||||
} else if (strcmp(value, "right") == 0) {
|
||||
taskbar_alignment = ALIGN_RIGHT;
|
||||
} else {
|
||||
taskbar_alignment = ALIGN_LEFT;
|
||||
}
|
||||
}
|
||||
|
||||
/* Task */
|
||||
else if (strcmp (key, "task_text") == 0)
|
||||
|
|
22
src/panel.c
22
src/panel.c
|
@ -354,7 +354,7 @@ int resize_panel(void *obj)
|
|||
}
|
||||
|
||||
Taskbar *taskbar = &panel->taskbar[i];
|
||||
GSList *l;
|
||||
GList *l;
|
||||
for (l = taskbar->area.list; l; l = l->next) {
|
||||
Area *child = l->data;
|
||||
if (!child->on_screen)
|
||||
|
@ -389,7 +389,7 @@ int resize_panel(void *obj)
|
|||
|
||||
int requested_size = (2 * taskbar->area.bg->border.width) + (2 * taskbar->area.paddingxlr);
|
||||
int items = 0;
|
||||
GSList *l = taskbar->area.list;
|
||||
GList *l = taskbar->area.list;
|
||||
if (taskbarname_enabled)
|
||||
l = l->next;
|
||||
for (; l; l = l->next) {
|
||||
|
@ -482,29 +482,29 @@ void set_panel_items_order(Panel *p)
|
|||
int k, j;
|
||||
|
||||
if (p->area.list) {
|
||||
g_slist_free(p->area.list);
|
||||
g_list_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);
|
||||
p->area.list = g_list_append(p->area.list, &p->launcher);
|
||||
p->launcher.area.resize = 1;
|
||||
}
|
||||
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]);
|
||||
p->area.list = g_list_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);
|
||||
p->area.list = g_list_append(p->area.list, &p->battery);
|
||||
#endif
|
||||
int i = p - panel1;
|
||||
if (panel_items_order[k] == 'S' && systray_on_monitor(i, nb_panel)) {
|
||||
p->area.list = g_slist_append(p->area.list, &systray);
|
||||
p->area.list = g_list_append(p->area.list, &systray);
|
||||
}
|
||||
if (panel_items_order[k] == 'C')
|
||||
p->area.list = g_slist_append(p->area.list, &p->clock);
|
||||
p->area.list = g_list_append(p->area.list, &p->clock);
|
||||
}
|
||||
init_rendering(&p->area, 0);
|
||||
}
|
||||
|
@ -629,7 +629,7 @@ void set_panel_background(Panel *p)
|
|||
}
|
||||
|
||||
// redraw panel's object
|
||||
GSList *l0;
|
||||
GList *l0;
|
||||
Area *a;
|
||||
for (l0 = p->area.list; l0 ; l0 = l0->next) {
|
||||
a = l0->data;
|
||||
|
@ -695,7 +695,7 @@ Taskbar *click_taskbar (Panel *panel, int x, int y)
|
|||
|
||||
Task *click_task (Panel *panel, int x, int y)
|
||||
{
|
||||
GSList *l0;
|
||||
GList *l0;
|
||||
Taskbar *tskbar;
|
||||
|
||||
if ( (tskbar = click_taskbar(panel, x, y)) ) {
|
||||
|
@ -797,7 +797,7 @@ Area* click_area(Panel *panel, int x, int y)
|
|||
Area* new_result = result;
|
||||
do {
|
||||
result = new_result;
|
||||
GSList* it = result->list;
|
||||
GList* it = result->list;
|
||||
while (it) {
|
||||
Area* a = it->data;
|
||||
if (a->on_screen && x >= a->posx && x <= (a->posx + a->width)
|
||||
|
|
|
@ -111,7 +111,7 @@ Task *add_task (Window win)
|
|||
}
|
||||
new_tsk2->icon_width = new_tsk.icon_width;
|
||||
new_tsk2->icon_height = new_tsk.icon_height;
|
||||
tskbar->area.list = g_slist_append(tskbar->area.list, new_tsk2);
|
||||
tskbar->area.list = g_list_append(tskbar->area.list, new_tsk2);
|
||||
tskbar->area.resize = 1;
|
||||
g_ptr_array_add(task_group, new_tsk2);
|
||||
//printf("add_task panel %d, desktop %d, task %s\n", i, j, new_tsk2->title);
|
||||
|
@ -169,7 +169,7 @@ void remove_task (Task *tsk)
|
|||
for (i=0; i<task_group->len; ++i) {
|
||||
tsk2 = g_ptr_array_index(task_group, i);
|
||||
tskbar = tsk2->area.parent;
|
||||
tskbar->area.list = g_slist_remove(tskbar->area.list, tsk2);
|
||||
tskbar->area.list = g_list_remove(tskbar->area.list, tsk2);
|
||||
tskbar->area.resize = 1;
|
||||
if (tsk2 == task_active) task_active = 0;
|
||||
if (tsk2 == task_drag) task_drag = 0;
|
||||
|
@ -424,15 +424,13 @@ Task *find_active_task(Task *current_task, Task *active_task)
|
|||
if (active_task == NULL)
|
||||
return current_task;
|
||||
|
||||
GSList *l0;
|
||||
Task *tsk;
|
||||
Taskbar* tskbar = current_task->area.parent;
|
||||
|
||||
l0 = tskbar->area.list;
|
||||
GList *l0 = tskbar->area.list;
|
||||
if (taskbarname_enabled)
|
||||
l0 = l0->next;
|
||||
for (; l0 ; l0 = l0->next) {
|
||||
tsk = l0->data;
|
||||
Task *tsk = l0->data;
|
||||
if (tsk->win == active_task->win)
|
||||
return tsk;
|
||||
}
|
||||
|
@ -445,15 +443,13 @@ Task *next_task(Task *tsk)
|
|||
if (tsk == 0)
|
||||
return 0;
|
||||
|
||||
GSList *l0, *lfirst_tsk;
|
||||
Task *tsk1;
|
||||
Taskbar* tskbar = tsk->area.parent;
|
||||
|
||||
l0 = tskbar->area.list;
|
||||
GList *l0 = tskbar->area.list;
|
||||
if (taskbarname_enabled) l0 = l0->next;
|
||||
lfirst_tsk = l0;
|
||||
GList *lfirst_tsk = l0;
|
||||
for (; l0 ; l0 = l0->next) {
|
||||
tsk1 = l0->data;
|
||||
Task *tsk1 = l0->data;
|
||||
if (tsk1 == tsk) {
|
||||
if (l0->next == 0) l0 = lfirst_tsk;
|
||||
else l0 = l0->next;
|
||||
|
@ -469,19 +465,18 @@ Task *prev_task(Task *tsk)
|
|||
if (tsk == 0)
|
||||
return 0;
|
||||
|
||||
GSList *l0, *lfirst_tsk;
|
||||
Task *tsk1, *tsk2;
|
||||
Taskbar* tskbar = tsk->area.parent;
|
||||
|
||||
tsk2 = 0;
|
||||
l0 = tskbar->area.list;
|
||||
GList *l0 = tskbar->area.list;
|
||||
if (taskbarname_enabled) l0 = l0->next;
|
||||
lfirst_tsk = l0;
|
||||
GList *lfirst_tsk = l0;
|
||||
for (; l0 ; l0 = l0->next) {
|
||||
tsk1 = l0->data;
|
||||
if (tsk1 == tsk) {
|
||||
if (l0 == lfirst_tsk) {
|
||||
l0 = g_slist_last ( l0 );
|
||||
l0 = g_list_last ( l0 );
|
||||
tsk2 = l0->data;
|
||||
}
|
||||
return tsk2;
|
||||
|
|
|
@ -47,6 +47,7 @@ int taskbar_distribute_size;
|
|||
int hide_inactive_tasks;
|
||||
int hide_task_diff_monitor;
|
||||
int taskbar_sort_method;
|
||||
int taskbar_alignment;
|
||||
|
||||
guint win_hash(gconstpointer key) { return (guint)*((Window*)key); }
|
||||
gboolean win_compare(gconstpointer a, gconstpointer b) { return (*((Window*)a) == *((Window*)b)); }
|
||||
|
@ -63,6 +64,7 @@ void default_taskbar()
|
|||
hide_inactive_tasks = 0;
|
||||
hide_task_diff_monitor = 0;
|
||||
taskbar_sort_method = TASKBAR_NOSORT;
|
||||
taskbar_alignment = ALIGN_LEFT;
|
||||
default_taskbarname();
|
||||
}
|
||||
|
||||
|
@ -97,7 +99,7 @@ void cleanup_taskbar()
|
|||
}
|
||||
free_area(&tskbar->area);
|
||||
// remove taskbar from the panel
|
||||
panel->area.list = g_slist_remove(panel->area.list, tskbar);
|
||||
panel->area.list = g_list_remove(panel->area.list, tskbar);
|
||||
}
|
||||
if (panel->taskbar) {
|
||||
free(panel->taskbar);
|
||||
|
@ -153,6 +155,7 @@ void init_taskbar_panel(void *p)
|
|||
panel->g_taskbar.area.parent = panel;
|
||||
panel->g_taskbar.area.panel = panel;
|
||||
panel->g_taskbar.area.size_mode = SIZE_BY_LAYOUT;
|
||||
panel->g_taskbar.area.alignment = taskbar_alignment;
|
||||
panel->g_taskbar.area._resize = resize_taskbar;
|
||||
panel->g_taskbar.area._draw_foreground = draw_taskbar;
|
||||
panel->g_taskbar.area._on_change_layout = on_change_taskbar;
|
||||
|
@ -334,7 +337,7 @@ int resize_taskbar(void *obj)
|
|||
resize_by_layout(obj, panel->g_task.maximum_width);
|
||||
|
||||
text_width = panel->g_task.maximum_width;
|
||||
GSList *l = taskbar->area.list;
|
||||
GList *l = taskbar->area.list;
|
||||
if (taskbarname_enabled) l = l->next;
|
||||
for (; l != NULL; l = l->next) {
|
||||
if (((Task *)l->data)->area.on_screen) {
|
||||
|
@ -388,7 +391,7 @@ void set_taskbar_state(Taskbar *tskbar, int state)
|
|||
if (taskbarname_enabled && tskbar->bar_name.state_pix[state] == 0)
|
||||
tskbar->bar_name.area.redraw = 1;
|
||||
if (panel_mode == MULTI_DESKTOP && panel1[0].g_taskbar.background[TASKBAR_NORMAL] != panel1[0].g_taskbar.background[TASKBAR_ACTIVE]) {
|
||||
GSList *l = tskbar->area.list;
|
||||
GList *l = tskbar->area.list;
|
||||
if (taskbarname_enabled) l = l->next;
|
||||
for ( ; l ; l = l->next)
|
||||
set_task_redraw(l->data);
|
||||
|
@ -511,7 +514,7 @@ int taskbar_needs_sort(Taskbar *taskbar)
|
|||
if (taskbar_sort_method == TASKBAR_NOSORT)
|
||||
return 0;
|
||||
|
||||
GSList *i, *j;
|
||||
GList *i, *j;
|
||||
for (i = taskbar->area.list, j = i ? i->next : NULL; i && j; i = i->next, j = j->next) {
|
||||
if (compare_tasks(i->data, j->data, taskbar) > 0) {
|
||||
return 1;
|
||||
|
@ -528,7 +531,7 @@ void sort_tasks(Taskbar *taskbar)
|
|||
if (!taskbar_needs_sort(taskbar)) {
|
||||
return;
|
||||
}
|
||||
taskbar->area.list = g_slist_sort_with_data(taskbar->area.list, (GCompareDataFunc)compare_tasks, taskbar);
|
||||
taskbar->area.list = g_list_sort_with_data(taskbar->area.list, (GCompareDataFunc)compare_tasks, taskbar);
|
||||
taskbar->area.resize = 1;
|
||||
panel_refresh = 1;
|
||||
((Panel*)taskbar->area.panel)->area.resize = 1;
|
||||
|
|
|
@ -21,6 +21,7 @@ extern int hide_inactive_tasks;
|
|||
extern int hide_task_diff_monitor;
|
||||
enum { TASKBAR_NOSORT, TASKBAR_SORT_CENTER, TASKBAR_SORT_TITLE };
|
||||
extern int taskbar_sort_method;
|
||||
extern int taskbar_alignment;
|
||||
|
||||
typedef struct {
|
||||
// always start with area
|
||||
|
|
|
@ -76,7 +76,7 @@ void init_taskbarname_panel(void *p)
|
|||
tskbar->bar_name.name = g_strdup_printf("%d", j+1);
|
||||
|
||||
// append the name at the beginning of taskbar
|
||||
tskbar->area.list = g_slist_append(tskbar->area.list, &tskbar->bar_name);
|
||||
tskbar->area.list = g_list_append(tskbar->area.list, &tskbar->bar_name);
|
||||
}
|
||||
|
||||
for (l=list ; l ; l = l->next)
|
||||
|
@ -103,7 +103,7 @@ void cleanup_taskbarname()
|
|||
XFreePixmap(server.dsp, tskbar->bar_name.state_pix[k]);
|
||||
tskbar->bar_name.state_pix[k] = 0;
|
||||
}
|
||||
tskbar->area.list = g_slist_remove(tskbar->area.list, &tskbar->bar_name);
|
||||
tskbar->area.list = g_list_remove(tskbar->area.list, &tskbar->bar_name);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
15
src/tint.c
15
src/tint.c
|
@ -470,8 +470,8 @@ void event_button_motion_notify (XEvent *e)
|
|||
} else {
|
||||
// Swap the task_drag with the task on the event's location (if they differ)
|
||||
if(event_task && event_task != task_drag) {
|
||||
GSList * drag_iter = g_slist_find(event_taskbar->area.list, task_drag);
|
||||
GSList * task_iter = g_slist_find(event_taskbar->area.list, event_task);
|
||||
GList * drag_iter = g_list_find(event_taskbar->area.list, task_drag);
|
||||
GList * task_iter = g_list_find(event_taskbar->area.list, event_task);
|
||||
if(drag_iter && task_iter) {
|
||||
gpointer temp = task_iter->data;
|
||||
task_iter->data = drag_iter->data;
|
||||
|
@ -488,14 +488,14 @@ void event_button_motion_notify (XEvent *e)
|
|||
return;
|
||||
|
||||
Taskbar * drag_taskbar = (Taskbar*)task_drag->area.parent;
|
||||
drag_taskbar->area.list = g_slist_remove(drag_taskbar->area.list, task_drag);
|
||||
drag_taskbar->area.list = g_list_remove(drag_taskbar->area.list, task_drag);
|
||||
|
||||
if(event_taskbar->area.posx > drag_taskbar->area.posx || event_taskbar->area.posy > drag_taskbar->area.posy) {
|
||||
int i = (taskbarname_enabled) ? 1 : 0;
|
||||
event_taskbar->area.list = g_slist_insert(event_taskbar->area.list, task_drag, i);
|
||||
event_taskbar->area.list = g_list_insert(event_taskbar->area.list, task_drag, i);
|
||||
}
|
||||
else
|
||||
event_taskbar->area.list = g_slist_append(event_taskbar->area.list, task_drag);
|
||||
event_taskbar->area.list = g_list_append(event_taskbar->area.list, task_drag);
|
||||
|
||||
// Move task to other desktop (but avoid the 'Window desktop changed' code in 'event_property_notify')
|
||||
task_drag->area.parent = event_taskbar;
|
||||
|
@ -677,10 +677,9 @@ void event_property_notify (XEvent *e)
|
|||
// check ALLDESKTOP task => resize taskbar
|
||||
Taskbar *tskbar;
|
||||
Task *tsk;
|
||||
GSList *l;
|
||||
if (server.nb_desktop > old_desktop) {
|
||||
tskbar = &panel->taskbar[old_desktop];
|
||||
l = tskbar->area.list;
|
||||
GList *l = tskbar->area.list;
|
||||
if (taskbarname_enabled) l = l->next;
|
||||
for (; l ; l = l->next) {
|
||||
tsk = l->data;
|
||||
|
@ -694,7 +693,7 @@ void event_property_notify (XEvent *e)
|
|||
}
|
||||
}
|
||||
tskbar = &panel->taskbar[server.desktop];
|
||||
l = tskbar->area.list;
|
||||
GList *l = tskbar->area.list;
|
||||
if (taskbarname_enabled) l = l->next;
|
||||
for (; l ; l = l->next) {
|
||||
tsk = l->data;
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -47,7 +47,7 @@ GtkWidget *taskbar_hide_inactive_tasks, *taskbar_hide_diff_monitor;
|
|||
GtkWidget *taskbar_name_padding_x, *taskbar_name_padding_y, *taskbar_name_inactive_color, *taskbar_name_active_color, *taskbar_name_font;
|
||||
GtkWidget *taskbar_active_background, *taskbar_inactive_background;
|
||||
GtkWidget *taskbar_name_active_background, *taskbar_name_inactive_background;
|
||||
GtkWidget *taskbar_distribute_size, *taskbar_sort_order;
|
||||
GtkWidget *taskbar_distribute_size, *taskbar_sort_order, *taskbar_alignment;
|
||||
|
||||
// task
|
||||
GtkWidget *task_mouse_left, *task_mouse_middle, *task_mouse_right, *task_mouse_scroll_up, *task_mouse_scroll_down;
|
||||
|
@ -2317,6 +2317,24 @@ void create_taskbar(GtkWidget *parent)
|
|||
"'By title' means that tasks are sorted by their window titles. \n"
|
||||
"'By center' means that tasks are sorted geometrically by their window centers."), NULL);
|
||||
|
||||
row++;
|
||||
col = 2;
|
||||
label = gtk_label_new(_("Task alignment"));
|
||||
gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
|
||||
gtk_widget_show(label);
|
||||
gtk_table_attach(GTK_TABLE(table), label, col, col+1, row, row+1, GTK_FILL, 0, 0, 0);
|
||||
col++;
|
||||
|
||||
taskbar_alignment = gtk_combo_box_new_text();
|
||||
gtk_widget_show(taskbar_alignment);
|
||||
gtk_table_attach(GTK_TABLE(table), taskbar_alignment, col, col+1, row, row+1, GTK_FILL, 0, 0, 0);
|
||||
col++;
|
||||
gtk_combo_box_append_text(GTK_COMBO_BOX(taskbar_alignment), _("Left"));
|
||||
gtk_combo_box_append_text(GTK_COMBO_BOX(taskbar_alignment), _("Center"));
|
||||
gtk_combo_box_append_text(GTK_COMBO_BOX(taskbar_alignment), _("Right"));
|
||||
gtk_combo_box_set_active(GTK_COMBO_BOX(taskbar_alignment), 0);
|
||||
gtk_tooltips_set_tip(tooltips, taskbar_alignment, _("Specifies how tasks should be positioned on the taskbar."), NULL);
|
||||
|
||||
change_paragraph(parent);
|
||||
|
||||
label = gtk_label_new(_("<b>Appearance</b>"));
|
||||
|
|
|
@ -51,7 +51,7 @@ extern GtkWidget *taskbar_hide_inactive_tasks, *taskbar_hide_diff_monitor;
|
|||
extern GtkWidget *taskbar_name_padding_x, *taskbar_name_padding_y, *taskbar_name_inactive_color, *taskbar_name_active_color, *taskbar_name_font;
|
||||
extern GtkWidget *taskbar_active_background, *taskbar_inactive_background;
|
||||
extern GtkWidget *taskbar_name_active_background, *taskbar_name_inactive_background;
|
||||
extern GtkWidget *taskbar_distribute_size, *taskbar_sort_order;
|
||||
extern GtkWidget *taskbar_distribute_size, *taskbar_sort_order, *taskbar_alignment;
|
||||
|
||||
// task
|
||||
extern GtkWidget *task_mouse_left, *task_mouse_middle, *task_mouse_right, *task_mouse_scroll_up, *task_mouse_scroll_down;
|
||||
|
|
|
@ -272,6 +272,16 @@ void config_write_taskbar(FILE *fp)
|
|||
}
|
||||
fprintf(fp, "\n");
|
||||
|
||||
fprintf(fp, "task_align = ");
|
||||
if (gtk_combo_box_get_active(GTK_COMBO_BOX(taskbar_alignment)) <= 0) {
|
||||
fprintf(fp, "left");
|
||||
} else if (gtk_combo_box_get_active(GTK_COMBO_BOX(taskbar_alignment)) == 1) {
|
||||
fprintf(fp, "center");
|
||||
} else {
|
||||
fprintf(fp, "right");
|
||||
}
|
||||
fprintf(fp, "\n");
|
||||
|
||||
fprintf(fp, "\n");
|
||||
}
|
||||
|
||||
|
@ -998,6 +1008,16 @@ void add_entry(char *key, char *value)
|
|||
else
|
||||
gtk_combo_box_set_active(GTK_COMBO_BOX(taskbar_sort_order), 0);
|
||||
}
|
||||
else if (strcmp(key, "task_align") == 0) {
|
||||
if (strcmp(value, "left") == 0)
|
||||
gtk_combo_box_set_active(GTK_COMBO_BOX(taskbar_sort_order), 0);
|
||||
else if (strcmp(value, "center") == 0)
|
||||
gtk_combo_box_set_active(GTK_COMBO_BOX(taskbar_sort_order), 1);
|
||||
else if (strcmp(value, "right") == 0)
|
||||
gtk_combo_box_set_active(GTK_COMBO_BOX(taskbar_sort_order), 2);
|
||||
else
|
||||
gtk_combo_box_set_active(GTK_COMBO_BOX(taskbar_sort_order), 0);
|
||||
}
|
||||
else if (strcmp(key, "taskbar_padding") == 0) {
|
||||
extract_values(value, &value1, &value2, &value3);
|
||||
gtk_spin_button_set_value(GTK_SPIN_BUTTON(taskbar_padding_x), atoi(value1));
|
||||
|
|
165
src/util/area.c
165
src/util/area.c
|
@ -76,7 +76,7 @@ void init_rendering(void *obj, int pos)
|
|||
Area *a = (Area*)obj;
|
||||
|
||||
// initialize fixed position/size
|
||||
GSList *l;
|
||||
GList *l;
|
||||
for (l = a->list; l ; l = l->next) {
|
||||
Area *child = ((Area*)l->data);
|
||||
if (panel_horizontal) {
|
||||
|
@ -102,7 +102,7 @@ void rendering(void *obj)
|
|||
Panel *panel = (Panel*)obj;
|
||||
|
||||
size_by_content(&panel->area);
|
||||
size_by_layout(&panel->area, 0, 1);
|
||||
size_by_layout(&panel->area, 1);
|
||||
|
||||
refresh(&panel->area);
|
||||
}
|
||||
|
@ -111,10 +111,11 @@ void rendering(void *obj)
|
|||
void size_by_content (Area *a)
|
||||
{
|
||||
// don't resize hiden objects
|
||||
if (!a->on_screen) return;
|
||||
if (!a->on_screen)
|
||||
return;
|
||||
|
||||
// children node are resized before its parent
|
||||
GSList *l;
|
||||
GList *l;
|
||||
for (l = a->list; l ; l = l->next)
|
||||
size_by_content(l->data);
|
||||
|
||||
|
@ -134,14 +135,15 @@ void size_by_content (Area *a)
|
|||
}
|
||||
|
||||
|
||||
void size_by_layout (Area *a, int pos, int level)
|
||||
void size_by_layout (Area *a, int level)
|
||||
{
|
||||
// don't resize hiden objects
|
||||
if (!a->on_screen) return;
|
||||
if (!a->on_screen)
|
||||
return;
|
||||
|
||||
// parent node is resized before its children
|
||||
// calculate area's size
|
||||
GSList *l;
|
||||
GList *l;
|
||||
if (a->resize && a->size_mode == SIZE_BY_LAYOUT) {
|
||||
a->resize = 0;
|
||||
|
||||
|
@ -156,40 +158,103 @@ void size_by_layout (Area *a, int pos, int level)
|
|||
}
|
||||
}
|
||||
|
||||
// update position of childs
|
||||
pos += a->paddingxlr + a->bg->border.width;
|
||||
int i=0;
|
||||
for (l = a->list; l ; l = l->next) {
|
||||
Area *child = ((Area*)l->data);
|
||||
if (!child->on_screen) continue;
|
||||
i++;
|
||||
|
||||
if (panel_horizontal) {
|
||||
if (pos != child->posx) {
|
||||
// pos changed => redraw
|
||||
child->posx = pos;
|
||||
child->on_changed = 1;
|
||||
// update position of children
|
||||
if (a->list) {
|
||||
if (a->alignment == ALIGN_LEFT) {
|
||||
int pos = (panel_horizontal ? a->posx : a->posy) + a->bg->border.width + a->paddingxlr;
|
||||
|
||||
for (l = a->list; l ; l = l->next) {
|
||||
Area *child = ((Area*)l->data);
|
||||
if (!child->on_screen)
|
||||
continue;
|
||||
|
||||
if (panel_horizontal) {
|
||||
if (pos != child->posx) {
|
||||
// pos changed => redraw
|
||||
child->posx = pos;
|
||||
child->on_changed = 1;
|
||||
}
|
||||
} else {
|
||||
if (pos != child->posy) {
|
||||
// pos changed => redraw
|
||||
child->posy = pos;
|
||||
child->on_changed = 1;
|
||||
}
|
||||
}
|
||||
|
||||
size_by_layout(child, level+1);
|
||||
|
||||
pos += panel_horizontal ? child->width + a->paddingx : child->height + a->paddingx;
|
||||
}
|
||||
} else if (a->alignment == ALIGN_RIGHT) {
|
||||
int pos = (panel_horizontal ? a->posx + a->width : a->posy + a->height) - a->bg->border.width - a->paddingxlr;
|
||||
|
||||
for (l = g_list_last(a->list); l ; l = l->prev) {
|
||||
Area *child = ((Area*)l->data);
|
||||
if (!child->on_screen)
|
||||
continue;
|
||||
|
||||
pos -= panel_horizontal ? child->width : child->height;
|
||||
|
||||
if (panel_horizontal) {
|
||||
if (pos != child->posx) {
|
||||
// pos changed => redraw
|
||||
child->posx = pos;
|
||||
child->on_changed = 1;
|
||||
}
|
||||
} else {
|
||||
if (pos != child->posy) {
|
||||
// pos changed => redraw
|
||||
child->posy = pos;
|
||||
child->on_changed = 1;
|
||||
}
|
||||
}
|
||||
|
||||
size_by_layout(child, level+1);
|
||||
|
||||
pos -= a->paddingx;
|
||||
}
|
||||
} else if (a->alignment == ALIGN_CENTER) {
|
||||
|
||||
int children_size = 0;
|
||||
|
||||
for (l = a->list; l ; l = l->next) {
|
||||
Area *child = ((Area*)l->data);
|
||||
if (!child->on_screen)
|
||||
continue;
|
||||
|
||||
children_size += panel_horizontal ? child->width : child->height;
|
||||
children_size += (l == a->list) ? 0 : a->paddingx;
|
||||
}
|
||||
|
||||
int pos = (panel_horizontal ? a->posx : a->posy) + a->bg->border.width + a->paddingxlr;
|
||||
pos += ((panel_horizontal ? a->width : a->height) - children_size) / 2;
|
||||
|
||||
for (l = a->list; l ; l = l->next) {
|
||||
Area *child = ((Area*)l->data);
|
||||
if (!child->on_screen)
|
||||
continue;
|
||||
|
||||
if (panel_horizontal) {
|
||||
if (pos != child->posx) {
|
||||
// pos changed => redraw
|
||||
child->posx = pos;
|
||||
child->on_changed = 1;
|
||||
}
|
||||
} else {
|
||||
if (pos != child->posy) {
|
||||
// pos changed => redraw
|
||||
child->posy = pos;
|
||||
child->on_changed = 1;
|
||||
}
|
||||
}
|
||||
|
||||
size_by_layout(child, level+1);
|
||||
|
||||
pos += panel_horizontal ? child->width + a->paddingx : child->height + a->paddingx;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (pos != child->posy) {
|
||||
// pos changed => redraw
|
||||
child->posy = pos;
|
||||
child->on_changed = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/*// position of each visible object
|
||||
int k;
|
||||
for (k=0 ; k < level ; k++) printf(" ");
|
||||
printf("tree level %d, object %d, pos %d, %s\n", level, i, pos, (child->size_mode == SIZE_BY_LAYOUT) ? "SIZE_BY_LAYOUT" : "SIZE_BY_CONTENT");*/
|
||||
size_by_layout(child, pos, level+1);
|
||||
|
||||
if (panel_horizontal)
|
||||
pos += child->width + a->paddingx;
|
||||
else
|
||||
pos += child->height + a->paddingx;
|
||||
}
|
||||
}
|
||||
|
||||
if (a->on_changed) {
|
||||
// pos/size changed
|
||||
|
@ -209,7 +274,7 @@ void refresh (Area *a)
|
|||
if (a->redraw) {
|
||||
a->redraw = 0;
|
||||
// force redraw of child
|
||||
//GSList *l;
|
||||
//GList *l;
|
||||
//for (l = a->list ; l ; l = l->next)
|
||||
//((Area*)l->data)->redraw = 1;
|
||||
|
||||
|
@ -222,7 +287,7 @@ void refresh (Area *a)
|
|||
XCopyArea (server.dsp, a->pix, ((Panel *)a->panel)->temp_pmap, server.gc, 0, 0, a->width, a->height, a->posx, a->posy);
|
||||
|
||||
// and then refresh child object
|
||||
GSList *l;
|
||||
GList *l;
|
||||
for (l = a->list; l ; l = l->next)
|
||||
refresh(l->data);
|
||||
}
|
||||
|
@ -236,7 +301,7 @@ int resize_by_layout(void *obj, int maximum_size)
|
|||
if (panel_horizontal) {
|
||||
// detect free size for SIZE_BY_LAYOUT's Area
|
||||
size = a->width - (2 * (a->paddingxlr + a->bg->border.width));
|
||||
GSList *l;
|
||||
GList *l;
|
||||
for (l = a->list ; l ; l = l->next) {
|
||||
child = (Area*)l->data;
|
||||
if (child->on_screen && child->size_mode == SIZE_BY_CONTENT) {
|
||||
|
@ -278,7 +343,7 @@ int resize_by_layout(void *obj, int maximum_size)
|
|||
else {
|
||||
// detect free size for SIZE_BY_LAYOUT's Area
|
||||
size = a->height - (2 * (a->paddingxlr + a->bg->border.width));
|
||||
GSList *l;
|
||||
GList *l;
|
||||
for (l = a->list ; l ; l = l->next) {
|
||||
child = (Area*)l->data;
|
||||
if (child->on_screen && child->size_mode == SIZE_BY_CONTENT) {
|
||||
|
@ -291,7 +356,7 @@ int resize_by_layout(void *obj, int maximum_size)
|
|||
if (nb_by_content+nb_by_layout)
|
||||
size -= ((nb_by_content+nb_by_layout-1) * a->paddingx);
|
||||
|
||||
int height=0, modulo=0, old_height;
|
||||
int height=0, modulo=0;
|
||||
if (nb_by_layout) {
|
||||
height = size / nb_by_layout;
|
||||
modulo = size % nb_by_layout;
|
||||
|
@ -305,7 +370,7 @@ int resize_by_layout(void *obj, int maximum_size)
|
|||
for (l = a->list ; l ; l = l->next) {
|
||||
child = (Area*)l->data;
|
||||
if (child->on_screen && child->size_mode == SIZE_BY_LAYOUT) {
|
||||
old_height = child->height;
|
||||
int old_height = child->height;
|
||||
child->height = height;
|
||||
if (modulo) {
|
||||
child->height++;
|
||||
|
@ -324,7 +389,7 @@ void set_redraw (Area *a)
|
|||
{
|
||||
a->redraw = 1;
|
||||
|
||||
GSList *l;
|
||||
GList *l;
|
||||
for (l = a->list ; l ; l = l->next)
|
||||
set_redraw(l->data);
|
||||
}
|
||||
|
@ -438,7 +503,7 @@ void remove_area (Area *a)
|
|||
{
|
||||
Area *parent = (Area*)a->parent;
|
||||
|
||||
parent->list = g_slist_remove(parent->list, a);
|
||||
parent->list = g_list_remove(parent->list, a);
|
||||
set_redraw (parent);
|
||||
|
||||
}
|
||||
|
@ -448,7 +513,7 @@ void add_area (Area *a)
|
|||
{
|
||||
Area *parent = (Area*)a->parent;
|
||||
|
||||
parent->list = g_slist_append(parent->list, a);
|
||||
parent->list = g_list_append(parent->list, a);
|
||||
set_redraw (parent);
|
||||
|
||||
}
|
||||
|
@ -459,12 +524,12 @@ void free_area (Area *a)
|
|||
if (!a)
|
||||
return;
|
||||
|
||||
GSList *l0;
|
||||
GList *l0;
|
||||
for (l0 = a->list; l0 ; l0 = l0->next)
|
||||
free_area (l0->data);
|
||||
|
||||
if (a->list) {
|
||||
g_slist_free(a->list);
|
||||
g_list_free(a->list);
|
||||
a->list = 0;
|
||||
}
|
||||
if (a->pix) {
|
||||
|
|
|
@ -51,6 +51,7 @@ typedef struct
|
|||
// SIZE_BY_LAYOUT objects : taskbar and task
|
||||
// SIZE_BY_CONTENT objects : clock, battery, launcher, systray
|
||||
enum { SIZE_BY_LAYOUT, SIZE_BY_CONTENT };
|
||||
enum { ALIGN_LEFT = 0, ALIGN_CENTER = 1, ALIGN_RIGHT = 2 };
|
||||
|
||||
typedef struct {
|
||||
// coordinate relative to panel window
|
||||
|
@ -61,13 +62,15 @@ typedef struct {
|
|||
Background *bg;
|
||||
|
||||
// list of child : Area object
|
||||
GSList *list;
|
||||
GList *list;
|
||||
|
||||
// object visible on screen.
|
||||
// An object (like systray) could be enabled but hidden (because no tray icon).
|
||||
int on_screen;
|
||||
// way to calculate the size (SIZE_BY_CONTENT or SIZE_BY_LAYOUT)
|
||||
int size_mode;
|
||||
|
||||
int alignment;
|
||||
// need to calculate position and width
|
||||
int resize;
|
||||
// need redraw Pixmap
|
||||
|
@ -96,7 +99,7 @@ void init_rendering(void *obj, int pos);
|
|||
|
||||
void rendering(void *obj);
|
||||
void size_by_content (Area *a);
|
||||
void size_by_layout (Area *a, int pos, int level);
|
||||
void size_by_layout (Area *a, int level);
|
||||
// draw background and foreground
|
||||
void refresh (Area *a);
|
||||
|
||||
|
|
Loading…
Reference in a new issue