Cleanup indentation with clang-format and changed a few variable names
This commit is contained in:
@@ -35,180 +35,184 @@
|
||||
#include "tooltip.h"
|
||||
#include "timer.h"
|
||||
|
||||
timeout* urgent_timeout;
|
||||
GSList* urgent_list;
|
||||
timeout *urgent_timeout;
|
||||
GSList *urgent_list;
|
||||
|
||||
char* task_get_tooltip(void* obj)
|
||||
char *task_get_tooltip(void *obj)
|
||||
{
|
||||
Task* t = obj;
|
||||
Task *t = (Task *)obj;
|
||||
return strdup(t->title);
|
||||
}
|
||||
|
||||
|
||||
Task *add_task (Window win)
|
||||
Task *add_task(Window win)
|
||||
{
|
||||
if (!win) return 0;
|
||||
if (window_is_hidden(win)) return 0;
|
||||
if (!win)
|
||||
return 0;
|
||||
if (window_is_hidden(win))
|
||||
return 0;
|
||||
|
||||
XSelectInput(server.dsp, win, PropertyChangeMask|StructureNotifyMask);
|
||||
XSelectInput(server.dsp, win, PropertyChangeMask | StructureNotifyMask);
|
||||
XFlush(server.dsp);
|
||||
|
||||
int monitor;
|
||||
if (nb_panel > 1) {
|
||||
monitor = window_get_monitor (win);
|
||||
if (monitor >= nb_panel) monitor = 0;
|
||||
}
|
||||
else monitor = 0;
|
||||
if (num_panels > 1) {
|
||||
monitor = get_window_monitor(win);
|
||||
if (monitor >= num_panels)
|
||||
monitor = 0;
|
||||
} else
|
||||
monitor = 0;
|
||||
|
||||
Task new_tsk;
|
||||
memset(&new_tsk, 0, sizeof(new_tsk));
|
||||
new_tsk.area.has_mouse_over_effect = 1;
|
||||
new_tsk.area.has_mouse_press_effect = 1;
|
||||
new_tsk.win = win;
|
||||
new_tsk.desktop = window_get_desktop (win);
|
||||
new_tsk.area.panel = &panel1[monitor];
|
||||
new_tsk.current_state = window_is_iconified(win) ? TASK_ICONIFIED : TASK_NORMAL;
|
||||
window_get_coordinates(win, &new_tsk.win_x, &new_tsk.win_y, &new_tsk.win_w, &new_tsk.win_h);
|
||||
Task new_task;
|
||||
memset(&new_task, 0, sizeof(new_task));
|
||||
new_task.area.has_mouse_over_effect = 1;
|
||||
new_task.area.has_mouse_press_effect = 1;
|
||||
new_task.win = win;
|
||||
new_task.desktop = get_window_desktop(win);
|
||||
new_task.area.panel = &panels[monitor];
|
||||
new_task.current_state = window_is_iconified(win) ? TASK_ICONIFIED : TASK_NORMAL;
|
||||
get_window_coordinates(win, &new_task.win_x, &new_task.win_y, &new_task.win_w, &new_task.win_h);
|
||||
|
||||
// allocate only one title and one icon
|
||||
// even with task_on_all_desktop and with task_on_all_panel
|
||||
new_tsk.title = 0;
|
||||
new_task.title = 0;
|
||||
int k;
|
||||
for (k=0; k<TASK_STATE_COUNT; ++k) {
|
||||
new_tsk.icon[k] = 0;
|
||||
new_tsk.state_pix[k] = 0;
|
||||
for (k = 0; k < TASK_STATE_COUNT; ++k) {
|
||||
new_task.icon[k] = 0;
|
||||
new_task.state_pix[k] = 0;
|
||||
}
|
||||
get_title(&new_tsk);
|
||||
get_icon(&new_tsk);
|
||||
get_title(&new_task);
|
||||
get_icon(&new_task);
|
||||
|
||||
//printf("new task %s win %u: desktop %d, monitor %d\n", new_tsk.title, win, new_tsk.desktop, monitor);
|
||||
// printf("new task %s win %u: desktop %d, monitor %d\n", new_task.title, win, new_task.desktop, monitor);
|
||||
|
||||
GPtrArray* task_group = g_ptr_array_new();
|
||||
Taskbar *tskbar;
|
||||
Task *new_tsk2=0;
|
||||
GPtrArray *task_group = g_ptr_array_new();
|
||||
Taskbar *taskbar;
|
||||
Task *new_task2 = 0;
|
||||
int j;
|
||||
for (j=0 ; j < panel1[monitor].nb_desktop ; j++) {
|
||||
if (new_tsk.desktop != ALLDESKTOP && new_tsk.desktop != j) continue;
|
||||
for (j = 0; j < panels[monitor].num_desktops; j++) {
|
||||
if (new_task.desktop != ALLDESKTOP && new_task.desktop != j)
|
||||
continue;
|
||||
|
||||
tskbar = &panel1[monitor].taskbar[j];
|
||||
new_tsk2 = calloc(1, sizeof(Task));
|
||||
memcpy(&new_tsk2->area, &panel1[monitor].g_task.area, sizeof(Area));
|
||||
new_tsk2->area.parent = tskbar;
|
||||
new_tsk2->area.has_mouse_over_effect = 1;
|
||||
new_tsk2->area.has_mouse_press_effect = 1;
|
||||
new_tsk2->win = new_tsk.win;
|
||||
new_tsk2->desktop = new_tsk.desktop;
|
||||
new_tsk2->win_x = new_tsk.win_x;
|
||||
new_tsk2->win_y = new_tsk.win_y;
|
||||
new_tsk2->win_w = new_tsk.win_w;
|
||||
new_tsk2->win_h = new_tsk.win_h;
|
||||
new_tsk2->current_state = -1; // to update the current state later in set_task_state...
|
||||
if (new_tsk2->desktop == ALLDESKTOP && server.desktop != j) {
|
||||
taskbar = &panels[monitor].taskbar[j];
|
||||
new_task2 = calloc(1, sizeof(Task));
|
||||
memcpy(&new_task2->area, &panels[monitor].g_task.area, sizeof(Area));
|
||||
new_task2->area.parent = taskbar;
|
||||
new_task2->area.has_mouse_over_effect = 1;
|
||||
new_task2->area.has_mouse_press_effect = 1;
|
||||
new_task2->win = new_task.win;
|
||||
new_task2->desktop = new_task.desktop;
|
||||
new_task2->win_x = new_task.win_x;
|
||||
new_task2->win_y = new_task.win_y;
|
||||
new_task2->win_w = new_task.win_w;
|
||||
new_task2->win_h = new_task.win_h;
|
||||
new_task2->current_state = -1; // to update the current state later in set_task_state...
|
||||
if (new_task2->desktop == ALLDESKTOP && server.desktop != j) {
|
||||
// hide ALLDESKTOP task on non-current desktop
|
||||
new_tsk2->area.on_screen = 0;
|
||||
new_task2->area.on_screen = FALSE;
|
||||
}
|
||||
new_tsk2->title = new_tsk.title;
|
||||
if (panel1[monitor].g_task.tooltip_enabled)
|
||||
new_tsk2->area._get_tooltip_text = task_get_tooltip;
|
||||
for (k=0; k<TASK_STATE_COUNT; ++k) {
|
||||
new_tsk2->icon[k] = new_tsk.icon[k];
|
||||
new_tsk2->icon_hover[k] = new_tsk.icon_hover[k];
|
||||
new_tsk2->icon_press[k] = new_tsk.icon_press[k];
|
||||
new_tsk2->state_pix[k] = 0;
|
||||
new_task2->title = new_task.title;
|
||||
if (panels[monitor].g_task.tooltip_enabled)
|
||||
new_task2->area._get_tooltip_text = task_get_tooltip;
|
||||
for (k = 0; k < TASK_STATE_COUNT; ++k) {
|
||||
new_task2->icon[k] = new_task.icon[k];
|
||||
new_task2->icon_hover[k] = new_task.icon_hover[k];
|
||||
new_task2->icon_press[k] = new_task.icon_press[k];
|
||||
new_task2->state_pix[k] = 0;
|
||||
}
|
||||
new_tsk2->icon_width = new_tsk.icon_width;
|
||||
new_tsk2->icon_height = new_tsk.icon_height;
|
||||
tskbar->area.children = g_list_append(tskbar->area.children, new_tsk2);
|
||||
tskbar->area.resize_needed = 1;
|
||||
g_ptr_array_add(task_group, new_tsk2);
|
||||
//printf("add_task panel %d, desktop %d, task %s\n", i, j, new_tsk2->title);
|
||||
new_task2->icon_width = new_task.icon_width;
|
||||
new_task2->icon_height = new_task.icon_height;
|
||||
taskbar->area.children = g_list_append(taskbar->area.children, new_task2);
|
||||
taskbar->area.resize_needed = 1;
|
||||
g_ptr_array_add(task_group, new_task2);
|
||||
// printf("add_task panel %d, desktop %d, task %s\n", i, j, new_task2->title);
|
||||
}
|
||||
Window* key = calloc(1, sizeof(Window));
|
||||
*key = new_tsk.win;
|
||||
Window *key = calloc(1, sizeof(Window));
|
||||
*key = new_task.win;
|
||||
g_hash_table_insert(win_to_task_table, key, task_group);
|
||||
set_task_state(new_tsk2, new_tsk.current_state);
|
||||
set_task_state(new_task2, new_task.current_state);
|
||||
|
||||
sort_taskbar_for_win(win);
|
||||
|
||||
if (panel_mode == MULTI_DESKTOP) {
|
||||
Panel *panel = new_tsk2->area.panel;
|
||||
if (taskbar_mode == MULTI_DESKTOP) {
|
||||
Panel *panel = new_task2->area.panel;
|
||||
panel->area.resize_needed = 1;
|
||||
}
|
||||
|
||||
if (window_is_urgent(win)) {
|
||||
add_urgent(new_tsk2);
|
||||
add_urgent(new_task2);
|
||||
}
|
||||
|
||||
return new_tsk2;
|
||||
return new_task2;
|
||||
}
|
||||
|
||||
|
||||
void remove_task (Task *tsk)
|
||||
void remove_task(Task *task)
|
||||
{
|
||||
if (!tsk) return;
|
||||
if (!task)
|
||||
return;
|
||||
|
||||
if (panel_mode == MULTI_DESKTOP) {
|
||||
Panel *panel = tsk->area.panel;
|
||||
if (taskbar_mode == MULTI_DESKTOP) {
|
||||
Panel *panel = task->area.panel;
|
||||
panel->area.resize_needed = 1;
|
||||
}
|
||||
|
||||
Window win = tsk->win;
|
||||
Window win = task->win;
|
||||
|
||||
// free title and icon just for the first task
|
||||
// even with task_on_all_desktop and with task_on_all_panel
|
||||
//printf("remove_task %s %d\n", tsk->title, tsk->desktop);
|
||||
if (tsk->title)
|
||||
free (tsk->title);
|
||||
// printf("remove_task %s %d\n", task->title, task->desktop);
|
||||
if (task->title)
|
||||
free(task->title);
|
||||
int k;
|
||||
for (k=0; k<TASK_STATE_COUNT; ++k) {
|
||||
if (tsk->icon[k]) {
|
||||
imlib_context_set_image(tsk->icon[k]);
|
||||
for (k = 0; k < TASK_STATE_COUNT; ++k) {
|
||||
if (task->icon[k]) {
|
||||
imlib_context_set_image(task->icon[k]);
|
||||
imlib_free_image();
|
||||
tsk->icon[k] = 0;
|
||||
task->icon[k] = 0;
|
||||
}
|
||||
if (tsk->icon_hover[k]) {
|
||||
imlib_context_set_image(tsk->icon_hover[k]);
|
||||
if (task->icon_hover[k]) {
|
||||
imlib_context_set_image(task->icon_hover[k]);
|
||||
imlib_free_image();
|
||||
tsk->icon_hover[k] = 0;
|
||||
task->icon_hover[k] = 0;
|
||||
}
|
||||
if (tsk->icon_press[k]) {
|
||||
imlib_context_set_image(tsk->icon_press[k]);
|
||||
if (task->icon_press[k]) {
|
||||
imlib_context_set_image(task->icon_press[k]);
|
||||
imlib_free_image();
|
||||
tsk->icon_press[k] = 0;
|
||||
task->icon_press[k] = 0;
|
||||
}
|
||||
if (tsk->state_pix[k]) XFreePixmap(server.dsp, tsk->state_pix[k]);
|
||||
if (task->state_pix[k])
|
||||
XFreePixmap(server.dsp, task->state_pix[k]);
|
||||
}
|
||||
|
||||
int i;
|
||||
Task *tsk2;
|
||||
GPtrArray* task_group = g_hash_table_lookup(win_to_task_table, &win);
|
||||
for (i=0; i<task_group->len; ++i) {
|
||||
tsk2 = g_ptr_array_index(task_group, i);
|
||||
if (tsk2 == task_active) task_active = 0;
|
||||
if (tsk2 == task_drag) task_drag = 0;
|
||||
if (g_slist_find(urgent_list, tsk2)) del_urgent(tsk2);
|
||||
remove_area((Area*)tsk2);
|
||||
free(tsk2);
|
||||
Task *task2;
|
||||
GPtrArray *task_group = g_hash_table_lookup(win_to_task_table, &win);
|
||||
for (i = 0; i < task_group->len; ++i) {
|
||||
task2 = g_ptr_array_index(task_group, i);
|
||||
if (task2 == task_active)
|
||||
task_active = 0;
|
||||
if (task2 == task_drag)
|
||||
task_drag = 0;
|
||||
if (g_slist_find(urgent_list, task2))
|
||||
del_urgent(task2);
|
||||
remove_area((Area *)task2);
|
||||
free(task2);
|
||||
}
|
||||
g_hash_table_remove(win_to_task_table, &win);
|
||||
}
|
||||
|
||||
|
||||
int get_title(Task *tsk)
|
||||
gboolean get_title(Task *task)
|
||||
{
|
||||
Panel *panel = tsk->area.panel;
|
||||
Panel *panel = task->area.panel;
|
||||
char *title, *name;
|
||||
|
||||
if (!panel->g_task.text &&
|
||||
!panel->g_task.tooltip_enabled &&
|
||||
taskbar_sort_method != TASKBAR_SORT_TITLE)
|
||||
if (!panel->g_task.text && !panel->g_task.tooltip_enabled && taskbar_sort_method != TASKBAR_SORT_TITLE)
|
||||
return 0;
|
||||
|
||||
name = server_get_property (tsk->win, server.atom._NET_WM_VISIBLE_NAME, server.atom.UTF8_STRING, 0);
|
||||
name = server_get_property(task->win, server.atom._NET_WM_VISIBLE_NAME, server.atom.UTF8_STRING, 0);
|
||||
if (!name || !strlen(name)) {
|
||||
name = server_get_property (tsk->win, server.atom._NET_WM_NAME, server.atom.UTF8_STRING, 0);
|
||||
name = server_get_property(task->win, server.atom._NET_WM_NAME, server.atom.UTF8_STRING, 0);
|
||||
if (!name || !strlen(name)) {
|
||||
name = server_get_property (tsk->win, server.atom.WM_NAME, XA_STRING, 0);
|
||||
name = server_get_property(task->win, server.atom.WM_NAME, XA_STRING, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -217,70 +221,68 @@ int get_title(Task *tsk)
|
||||
} else {
|
||||
title = strdup("Untitled");
|
||||
}
|
||||
if (name) XFree (name);
|
||||
|
||||
if (tsk->title) {
|
||||
if (name)
|
||||
XFree(name);
|
||||
|
||||
if (task->title) {
|
||||
// check unecessary title change
|
||||
if (strcmp(tsk->title, title) == 0) {
|
||||
if (strcmp(task->title, title) == 0) {
|
||||
free(title);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
free(tsk->title);
|
||||
}
|
||||
} else
|
||||
free(task->title);
|
||||
}
|
||||
|
||||
tsk->title = title;
|
||||
GPtrArray* task_group = task_get_tasks(tsk->win);
|
||||
task->title = title;
|
||||
GPtrArray *task_group = task_get_tasks(task->win);
|
||||
if (task_group) {
|
||||
int i;
|
||||
for (i=0; i<task_group->len; ++i) {
|
||||
Task* tsk2 = g_ptr_array_index(task_group, i);
|
||||
tsk2->title = tsk->title;
|
||||
set_task_redraw(tsk2);
|
||||
for (i = 0; i < task_group->len; ++i) {
|
||||
Task *task2 = g_ptr_array_index(task_group, i);
|
||||
task2->title = task->title;
|
||||
set_task_redraw(task2);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
void get_icon (Task *tsk)
|
||||
void get_icon(Task *task)
|
||||
{
|
||||
Panel *panel = tsk->area.panel;
|
||||
if (!panel->g_task.icon) return;
|
||||
Panel *panel = task->area.panel;
|
||||
if (!panel->g_task.icon)
|
||||
return;
|
||||
int i;
|
||||
Imlib_Image img = NULL;
|
||||
XWMHints *hints = 0;
|
||||
gulong *data = 0;
|
||||
|
||||
int k;
|
||||
for (k=0; k<TASK_STATE_COUNT; ++k) {
|
||||
if (tsk->icon[k]) {
|
||||
imlib_context_set_image(tsk->icon[k]);
|
||||
for (int k = 0; k < TASK_STATE_COUNT; ++k) {
|
||||
if (task->icon[k]) {
|
||||
imlib_context_set_image(task->icon[k]);
|
||||
imlib_free_image();
|
||||
tsk->icon[k] = 0;
|
||||
task->icon[k] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
data = server_get_property (tsk->win, server.atom._NET_WM_ICON, XA_CARDINAL, &i);
|
||||
data = server_get_property(task->win, server.atom._NET_WM_ICON, XA_CARDINAL, &i);
|
||||
if (data) {
|
||||
// get ARGB icon
|
||||
int w, h;
|
||||
gulong *tmp_data;
|
||||
|
||||
tmp_data = get_best_icon (data, get_icon_count (data, i), i, &w, &h, panel->g_task.icon_size1);
|
||||
tmp_data = get_best_icon(data, get_icon_count(data, i), i, &w, &h, panel->g_task.icon_size1);
|
||||
#ifdef __x86_64__
|
||||
DATA32 icon_data[w * h];
|
||||
int length = w * h;
|
||||
for (i = 0; i < length; ++i)
|
||||
icon_data[i] = tmp_data[i];
|
||||
img = imlib_create_image_using_copied_data (w, h, icon_data);
|
||||
img = imlib_create_image_using_copied_data(w, h, icon_data);
|
||||
#else
|
||||
img = imlib_create_image_using_data (w, h, (DATA32*)tmp_data);
|
||||
img = imlib_create_image_using_data(w, h, (DATA32 *)tmp_data);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
// get Pixmap icon
|
||||
hints = XGetWMHints(server.dsp, tsk->win);
|
||||
hints = XGetWMHints(server.dsp, task->win);
|
||||
if (hints) {
|
||||
if (hints->flags & IconPixmapHint && hints->icon_pixmap != 0) {
|
||||
// get width, height and depth for the pixmap
|
||||
@@ -289,7 +291,7 @@ void get_icon (Task *tsk)
|
||||
uint border_width, bpp;
|
||||
uint w, h;
|
||||
|
||||
//printf(" get pixmap\n");
|
||||
// printf(" get pixmap\n");
|
||||
XGetGeometry(server.dsp, hints->icon_pixmap, &root, &icon_x, &icon_y, &w, &h, &border_width, &bpp);
|
||||
imlib_context_set_drawable(hints->icon_pixmap);
|
||||
img = imlib_create_image_from_drawable(hints->icon_mask, 0, 0, w, h, 0);
|
||||
@@ -307,25 +309,37 @@ void get_icon (Task *tsk)
|
||||
int w, h;
|
||||
w = imlib_image_get_width();
|
||||
h = imlib_image_get_height();
|
||||
Imlib_Image orig_image = imlib_create_cropped_scaled_image(0, 0, w, h, panel->g_task.icon_size1, panel->g_task.icon_size1);
|
||||
Imlib_Image orig_image =
|
||||
imlib_create_cropped_scaled_image(0, 0, w, h, panel->g_task.icon_size1, panel->g_task.icon_size1);
|
||||
imlib_free_image();
|
||||
|
||||
imlib_context_set_image(orig_image);
|
||||
tsk->icon_width = imlib_image_get_width();
|
||||
tsk->icon_height = imlib_image_get_height();
|
||||
for (k=0; k<TASK_STATE_COUNT; ++k) {
|
||||
task->icon_width = imlib_image_get_width();
|
||||
task->icon_height = imlib_image_get_height();
|
||||
for (int k = 0; k < TASK_STATE_COUNT; ++k) {
|
||||
imlib_context_set_image(orig_image);
|
||||
tsk->icon[k] = imlib_clone_image();
|
||||
imlib_context_set_image(tsk->icon[k]);
|
||||
task->icon[k] = imlib_clone_image();
|
||||
imlib_context_set_image(task->icon[k]);
|
||||
DATA32 *data32;
|
||||
if (panel->g_task.alpha[k] != 100 || panel->g_task.saturation[k] != 0 || panel->g_task.brightness[k] != 0) {
|
||||
data32 = imlib_image_get_data();
|
||||
adjust_asb(data32, tsk->icon_width, tsk->icon_height, panel->g_task.alpha[k], (float)panel->g_task.saturation[k]/100, (float)panel->g_task.brightness[k]/100);
|
||||
adjust_asb(data32,
|
||||
task->icon_width,
|
||||
task->icon_height,
|
||||
panel->g_task.alpha[k],
|
||||
(float)panel->g_task.saturation[k] / 100,
|
||||
(float)panel->g_task.brightness[k] / 100);
|
||||
imlib_image_put_back_data(data32);
|
||||
}
|
||||
if (panel_config.mouse_effects) {
|
||||
tsk->icon_hover[k] = adjust_icon(tsk->icon[k], panel_config.mouse_over_alpha, panel_config.mouse_over_saturation, panel_config.mouse_over_brightness);
|
||||
tsk->icon_press[k] = adjust_icon(tsk->icon[k], panel_config.mouse_pressed_alpha, panel_config.mouse_pressed_saturation, panel_config.mouse_pressed_brightness);
|
||||
task->icon_hover[k] = adjust_icon(task->icon[k],
|
||||
panel_config.mouse_over_alpha,
|
||||
panel_config.mouse_over_saturation,
|
||||
panel_config.mouse_over_brightness);
|
||||
task->icon_press[k] = adjust_icon(task->icon[k],
|
||||
panel_config.mouse_pressed_alpha,
|
||||
panel_config.mouse_pressed_saturation,
|
||||
panel_config.mouse_pressed_brightness);
|
||||
}
|
||||
}
|
||||
imlib_context_set_image(orig_image);
|
||||
@@ -334,116 +348,123 @@ void get_icon (Task *tsk)
|
||||
if (hints)
|
||||
XFree(hints);
|
||||
if (data)
|
||||
XFree (data);
|
||||
XFree(data);
|
||||
|
||||
GPtrArray* task_group = task_get_tasks(tsk->win);
|
||||
GPtrArray *task_group = task_get_tasks(task->win);
|
||||
if (task_group) {
|
||||
for (i=0; i<task_group->len; ++i) {
|
||||
Task* tsk2 = g_ptr_array_index(task_group, i);
|
||||
tsk2->icon_width = tsk->icon_width;
|
||||
tsk2->icon_height = tsk->icon_height;
|
||||
int k;
|
||||
for (k=0; k<TASK_STATE_COUNT; ++k) {
|
||||
tsk2->icon[k] = tsk->icon[k];
|
||||
tsk2->icon_hover[k] = tsk->icon_hover[k];
|
||||
tsk2->icon_press[k] = tsk->icon_press[k];
|
||||
for (i = 0; i < task_group->len; ++i) {
|
||||
Task *task2 = g_ptr_array_index(task_group, i);
|
||||
task2->icon_width = task->icon_width;
|
||||
task2->icon_height = task->icon_height;
|
||||
for (int k = 0; k < TASK_STATE_COUNT; ++k) {
|
||||
task2->icon[k] = task->icon[k];
|
||||
task2->icon_hover[k] = task->icon_hover[k];
|
||||
task2->icon_press[k] = task->icon_press[k];
|
||||
}
|
||||
set_task_redraw(tsk2);
|
||||
set_task_redraw(task2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TODO icons look too large when the panel is large
|
||||
void draw_task_icon (Task *tsk, int text_width)
|
||||
void draw_task_icon(Task *task, int text_width)
|
||||
{
|
||||
if (tsk->icon[tsk->current_state] == 0) return;
|
||||
if (!task->icon[task->current_state])
|
||||
return;
|
||||
|
||||
// Find pos
|
||||
int pos_x;
|
||||
Panel *panel = (Panel*)tsk->area.panel;
|
||||
Panel *panel = (Panel *)task->area.panel;
|
||||
if (panel->g_task.centered) {
|
||||
if (panel->g_task.text)
|
||||
pos_x = (tsk->area.width - text_width - panel->g_task.icon_size1) / 2;
|
||||
pos_x = (task->area.width - text_width - panel->g_task.icon_size1) / 2;
|
||||
else
|
||||
pos_x = (tsk->area.width - panel->g_task.icon_size1) / 2;
|
||||
}
|
||||
else pos_x = panel->g_task.area.paddingxlr + tsk->area.bg->border.width;
|
||||
pos_x = (task->area.width - panel->g_task.icon_size1) / 2;
|
||||
} else
|
||||
pos_x = panel->g_task.area.paddingxlr + task->area.bg->border.width;
|
||||
|
||||
// Render
|
||||
|
||||
Imlib_Image image;
|
||||
// Render
|
||||
if (panel_config.mouse_effects) {
|
||||
if (tsk->area.mouse_state == MOUSE_OVER)
|
||||
image = tsk->icon_hover[tsk->current_state];
|
||||
else if (tsk->area.mouse_state == MOUSE_DOWN)
|
||||
image = tsk->icon_press[tsk->current_state];
|
||||
if (task->area.mouse_state == MOUSE_OVER)
|
||||
image = task->icon_hover[task->current_state];
|
||||
else if (task->area.mouse_state == MOUSE_DOWN)
|
||||
image = task->icon_press[task->current_state];
|
||||
else
|
||||
image = tsk->icon[tsk->current_state];
|
||||
image = task->icon[task->current_state];
|
||||
} else {
|
||||
image = tsk->icon[tsk->current_state];
|
||||
image = task->icon[task->current_state];
|
||||
}
|
||||
|
||||
imlib_context_set_image(image);
|
||||
render_image(tsk->area.pix, pos_x, panel->g_task.icon_posy);
|
||||
render_image(task->area.pix, pos_x, panel->g_task.icon_posy);
|
||||
}
|
||||
|
||||
|
||||
void draw_task (void *obj, cairo_t *c)
|
||||
void draw_task(void *obj, cairo_t *c)
|
||||
{
|
||||
Task *tsk = obj;
|
||||
Task *task = obj;
|
||||
if (!panel_config.mouse_effects)
|
||||
tsk->state_pix[tsk->current_state] = tsk->area.pix;
|
||||
task->state_pix[task->current_state] = task->area.pix;
|
||||
PangoLayout *layout;
|
||||
Color *config_text;
|
||||
int width=0, height;
|
||||
Panel *panel = (Panel*)tsk->area.panel;
|
||||
//printf("draw_task %d %d\n", tsk->area.posx, tsk->area.posy);
|
||||
int width = 0, height;
|
||||
Panel *panel = (Panel *)task->area.panel;
|
||||
// printf("draw_task %d %d\n", task->area.posx, task->area.posy);
|
||||
|
||||
if (panel->g_task.text) {
|
||||
/* Layout */
|
||||
layout = pango_cairo_create_layout (c);
|
||||
pango_layout_set_font_description (layout, panel->g_task.font_desc);
|
||||
pango_layout_set_text(layout, tsk->title, -1);
|
||||
layout = pango_cairo_create_layout(c);
|
||||
pango_layout_set_font_description(layout, panel->g_task.font_desc);
|
||||
pango_layout_set_text(layout, task->title, -1);
|
||||
|
||||
/* Drawing width and Cut text */
|
||||
// pango use U+22EF or U+2026
|
||||
pango_layout_set_width(layout, ((Taskbar*)tsk->area.parent)->text_width * PANGO_SCALE);
|
||||
pango_layout_set_width(layout, ((Taskbar *)task->area.parent)->text_width * PANGO_SCALE);
|
||||
pango_layout_set_height(layout, panel->g_task.text_height * PANGO_SCALE);
|
||||
pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
|
||||
pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END);
|
||||
pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END);
|
||||
|
||||
/* Center text */
|
||||
if (panel->g_task.centered) pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
|
||||
else pango_layout_set_alignment (layout, PANGO_ALIGN_LEFT);
|
||||
if (panel->g_task.centered)
|
||||
pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER);
|
||||
else
|
||||
pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
|
||||
|
||||
pango_layout_get_pixel_size (layout, &width, &height);
|
||||
pango_layout_get_pixel_size(layout, &width, &height);
|
||||
|
||||
config_text = &panel->g_task.font[tsk->current_state];
|
||||
config_text = &panel->g_task.font[task->current_state];
|
||||
|
||||
double text_posy = (panel->g_task.area.height - height) / 2.0;
|
||||
|
||||
draw_text(layout, c, panel->g_task.text_posx, text_posy, config_text, panel->font_shadow);
|
||||
|
||||
g_object_unref (layout);
|
||||
g_object_unref(layout);
|
||||
}
|
||||
|
||||
if (panel->g_task.icon) {
|
||||
draw_task_icon (tsk, width);
|
||||
draw_task_icon(task, width);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void on_change_task (void *obj)
|
||||
void on_change_task(void *obj)
|
||||
{
|
||||
Task *tsk = obj;
|
||||
Panel *panel = (Panel*)tsk->area.panel;
|
||||
Task *task = obj;
|
||||
Panel *panel = (Panel *)task->area.panel;
|
||||
|
||||
long value[] = {panel->posx + task->area.posx, panel->posy + task->area.posy, task->area.width, task->area.height};
|
||||
XChangeProperty(server.dsp,
|
||||
task->win,
|
||||
server.atom._NET_WM_ICON_GEOMETRY,
|
||||
XA_CARDINAL,
|
||||
32,
|
||||
PropModeReplace,
|
||||
(unsigned char *)value,
|
||||
4);
|
||||
|
||||
long value[] = { panel->posx+tsk->area.posx, panel->posy+tsk->area.posy, tsk->area.width, tsk->area.height };
|
||||
XChangeProperty (server.dsp, tsk->win, server.atom._NET_WM_ICON_GEOMETRY, XA_CARDINAL, 32, PropModeReplace, (unsigned char*)value, 4);
|
||||
|
||||
// reset Pixmap when position/size changed
|
||||
set_task_redraw(tsk);
|
||||
set_task_redraw(task);
|
||||
}
|
||||
|
||||
// Given a pointer to the active task (active_task) and a pointer
|
||||
@@ -454,35 +475,35 @@ Task *find_active_task(Task *current_task, Task *active_task)
|
||||
if (active_task == NULL)
|
||||
return current_task;
|
||||
|
||||
Taskbar* tskbar = current_task->area.parent;
|
||||
Taskbar *taskbar = current_task->area.parent;
|
||||
|
||||
GList *l0 = tskbar->area.children;
|
||||
GList *l0 = taskbar->area.children;
|
||||
if (taskbarname_enabled)
|
||||
l0 = l0->next;
|
||||
for (; l0 ; l0 = l0->next) {
|
||||
Task *tsk = l0->data;
|
||||
if (tsk->win == active_task->win)
|
||||
return tsk;
|
||||
for (; l0; l0 = l0->next) {
|
||||
Task *task = l0->data;
|
||||
if (task->win == active_task->win)
|
||||
return task;
|
||||
}
|
||||
|
||||
return current_task;
|
||||
}
|
||||
|
||||
Task *next_task(Task *tsk)
|
||||
Task *next_task(Task *task)
|
||||
{
|
||||
if (tsk == 0)
|
||||
if (!task)
|
||||
return 0;
|
||||
|
||||
Taskbar* tskbar = tsk->area.parent;
|
||||
Taskbar *taskbar = task->area.parent;
|
||||
|
||||
GList *l0 = tskbar->area.children;
|
||||
if (taskbarname_enabled) l0 = l0->next;
|
||||
GList *lfirst_tsk = l0;
|
||||
for (; l0 ; l0 = l0->next) {
|
||||
Task *tsk1 = l0->data;
|
||||
if (tsk1 == tsk) {
|
||||
if (l0->next == 0) l0 = lfirst_tsk;
|
||||
else l0 = l0->next;
|
||||
GList *l0 = taskbar->area.children;
|
||||
if (taskbarname_enabled)
|
||||
l0 = l0->next;
|
||||
GList *lfirst_task = l0;
|
||||
for (; l0; l0 = l0->next) {
|
||||
Task *task1 = l0->data;
|
||||
if (task1 == task) {
|
||||
l0 = l0->next ? l0->next : lfirst_task;
|
||||
return l0->data;
|
||||
}
|
||||
}
|
||||
@@ -490,34 +511,33 @@ Task *next_task(Task *tsk)
|
||||
return 0;
|
||||
}
|
||||
|
||||
Task *prev_task(Task *tsk)
|
||||
Task *prev_task(Task *task)
|
||||
{
|
||||
if (tsk == 0)
|
||||
if (!task)
|
||||
return 0;
|
||||
|
||||
Task *tsk1, *tsk2;
|
||||
Taskbar* tskbar = tsk->area.parent;
|
||||
Taskbar *taskbar = task->area.parent;
|
||||
|
||||
tsk2 = 0;
|
||||
GList *l0 = tskbar->area.children;
|
||||
if (taskbarname_enabled) l0 = l0->next;
|
||||
GList *lfirst_tsk = l0;
|
||||
for (; l0 ; l0 = l0->next) {
|
||||
tsk1 = l0->data;
|
||||
if (tsk1 == tsk) {
|
||||
if (l0 == lfirst_tsk) {
|
||||
l0 = g_list_last ( l0 );
|
||||
tsk2 = l0->data;
|
||||
Task *task2 = NULL;
|
||||
GList *l0 = taskbar->area.children;
|
||||
if (taskbarname_enabled)
|
||||
l0 = l0->next;
|
||||
GList *lfirst_task = l0;
|
||||
for (; l0; l0 = l0->next) {
|
||||
Task *task1 = l0->data;
|
||||
if (task1 == task) {
|
||||
if (l0 == lfirst_task) {
|
||||
l0 = g_list_last(l0);
|
||||
task2 = l0->data;
|
||||
}
|
||||
return tsk2;
|
||||
return task2;
|
||||
}
|
||||
tsk2 = tsk1;
|
||||
task2 = task1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void active_task()
|
||||
{
|
||||
if (task_active) {
|
||||
@@ -525,8 +545,8 @@ void active_task()
|
||||
task_active = 0;
|
||||
}
|
||||
|
||||
Window w1 = window_get_active();
|
||||
//printf("Change active task %ld\n", w1);
|
||||
Window w1 = get_active_window();
|
||||
// printf("Change active task %ld\n", w1);
|
||||
|
||||
if (w1) {
|
||||
if (!task_get_tasks(w1)) {
|
||||
@@ -538,32 +558,31 @@ void active_task()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void set_task_state(Task *tsk, int state)
|
||||
void set_task_state(Task *task, TaskState state)
|
||||
{
|
||||
if (tsk == 0 || state < 0 || state >= TASK_STATE_COUNT)
|
||||
if (!task || state < 0 || state >= TASK_STATE_COUNT)
|
||||
return;
|
||||
|
||||
if (tsk->current_state != state || hide_task_diff_monitor) {
|
||||
GPtrArray* task_group = task_get_tasks(tsk->win);
|
||||
if (task->current_state != state || hide_task_diff_monitor) {
|
||||
GPtrArray *task_group = task_get_tasks(task->win);
|
||||
if (task_group) {
|
||||
int i;
|
||||
for (i=0; i<task_group->len; ++i) {
|
||||
Task* tsk1 = g_ptr_array_index(task_group, i);
|
||||
tsk1->current_state = state;
|
||||
tsk1->area.bg = panel1[0].g_task.background[state];
|
||||
for (i = 0; i < task_group->len; ++i) {
|
||||
Task *task1 = g_ptr_array_index(task_group, i);
|
||||
task1->current_state = state;
|
||||
task1->area.bg = panels[0].g_task.background[state];
|
||||
if (!panel_config.mouse_effects) {
|
||||
tsk1->area.pix = tsk1->state_pix[state];
|
||||
if (!tsk1->area.pix)
|
||||
tsk1->area.redraw_needed = 1;
|
||||
task1->area.pix = task1->state_pix[state];
|
||||
if (!task1->area.pix)
|
||||
task1->area.redraw_needed = TRUE;
|
||||
} else {
|
||||
tsk1->area.redraw_needed = 1;
|
||||
task1->area.redraw_needed = TRUE;
|
||||
}
|
||||
if (state == TASK_ACTIVE && g_slist_find(urgent_list, tsk1))
|
||||
del_urgent(tsk1);
|
||||
if (state == TASK_ACTIVE && g_slist_find(urgent_list, task1))
|
||||
del_urgent(task1);
|
||||
int hide = 0;
|
||||
Taskbar *taskbar = (Taskbar *)tsk1->area.parent;
|
||||
if (tsk->desktop == ALLDESKTOP && server.desktop != taskbar->desktop) {
|
||||
Taskbar *taskbar = (Taskbar *)task1->area.parent;
|
||||
if (task->desktop == ALLDESKTOP && server.desktop != taskbar->desktop) {
|
||||
// Hide ALLDESKTOP task on non-current desktop
|
||||
hide = 1;
|
||||
}
|
||||
@@ -573,43 +592,42 @@ void set_task_state(Task *tsk, int state)
|
||||
hide = 1;
|
||||
}
|
||||
}
|
||||
if (window_get_monitor(tsk->win) != ((Panel*)tsk->area.panel)->monitor &&
|
||||
(hide_task_diff_monitor || nb_panel > 1)) {
|
||||
if (get_window_monitor(task->win) != ((Panel *)task->area.panel)->monitor &&
|
||||
(hide_task_diff_monitor || num_panels > 1)) {
|
||||
hide = 1;
|
||||
}
|
||||
if (1 - hide != tsk1->area.on_screen) {
|
||||
tsk1->area.on_screen = 1 - hide;
|
||||
set_task_redraw(tsk1);
|
||||
Panel *p = (Panel*)tsk->area.panel;
|
||||
tsk->area.resize_needed = 1;
|
||||
if (1 - hide != task1->area.on_screen) {
|
||||
task1->area.on_screen = TRUE - hide;
|
||||
set_task_redraw(task1);
|
||||
Panel *p = (Panel *)task->area.panel;
|
||||
task->area.resize_needed = 1;
|
||||
p->taskbar->area.resize_needed = 1;
|
||||
p->area.resize_needed = 1;
|
||||
}
|
||||
}
|
||||
panel_refresh = 1;
|
||||
panel_refresh = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void set_task_redraw(Task* tsk)
|
||||
void set_task_redraw(Task *task)
|
||||
{
|
||||
int k;
|
||||
for (k=0; k<TASK_STATE_COUNT; ++k) {
|
||||
if (tsk->state_pix[k]) XFreePixmap(server.dsp, tsk->state_pix[k]);
|
||||
tsk->state_pix[k] = 0;
|
||||
for (k = 0; k < TASK_STATE_COUNT; ++k) {
|
||||
if (task->state_pix[k])
|
||||
XFreePixmap(server.dsp, task->state_pix[k]);
|
||||
task->state_pix[k] = 0;
|
||||
}
|
||||
tsk->area.pix = 0;
|
||||
tsk->area.redraw_needed = 1;
|
||||
task->area.pix = 0;
|
||||
task->area.redraw_needed = TRUE;
|
||||
}
|
||||
|
||||
|
||||
void blink_urgent(void* arg)
|
||||
void blink_urgent(void *arg)
|
||||
{
|
||||
GSList* urgent_task = urgent_list;
|
||||
GSList *urgent_task = urgent_list;
|
||||
while (urgent_task) {
|
||||
Task* t = urgent_task->data;
|
||||
if ( t->urgent_tick < max_tick_urgent) {
|
||||
Task *t = urgent_task->data;
|
||||
if (t->urgent_tick < max_tick_urgent) {
|
||||
if (t->urgent_tick++ % 2)
|
||||
set_task_state(t, TASK_URGENT);
|
||||
else
|
||||
@@ -617,39 +635,37 @@ void blink_urgent(void* arg)
|
||||
}
|
||||
urgent_task = urgent_task->next;
|
||||
}
|
||||
panel_refresh = 1;
|
||||
panel_refresh = TRUE;
|
||||
}
|
||||
|
||||
|
||||
void add_urgent(Task *tsk)
|
||||
void add_urgent(Task *task)
|
||||
{
|
||||
if (!tsk)
|
||||
if (!task)
|
||||
return;
|
||||
|
||||
// some programs set urgency hint although they are active
|
||||
if ( task_active && task_active->win == tsk->win )
|
||||
if (task_active && task_active->win == task->win)
|
||||
return;
|
||||
|
||||
tsk = task_get_task(tsk->win); // always add the first tsk for a task group (omnipresent windows)
|
||||
tsk->urgent_tick = 0;
|
||||
if (g_slist_find(urgent_list, tsk))
|
||||
task = task_get_task(task->win); // always add the first task for a task group (omnipresent windows)
|
||||
task->urgent_tick = 0;
|
||||
if (g_slist_find(urgent_list, task))
|
||||
return;
|
||||
|
||||
// not yet in the list, so we have to add it
|
||||
urgent_list = g_slist_prepend(urgent_list, tsk);
|
||||
urgent_list = g_slist_prepend(urgent_list, task);
|
||||
|
||||
if (!urgent_timeout)
|
||||
urgent_timeout = add_timeout(10, 1000, blink_urgent, 0, &urgent_timeout);
|
||||
|
||||
Panel *panel = tsk->area.panel;
|
||||
Panel *panel = task->area.panel;
|
||||
if (panel->is_hidden)
|
||||
autohide_show(panel);
|
||||
}
|
||||
|
||||
|
||||
void del_urgent(Task *tsk)
|
||||
void del_urgent(Task *task)
|
||||
{
|
||||
urgent_list = g_slist_remove(urgent_list, tsk);
|
||||
urgent_list = g_slist_remove(urgent_list, task);
|
||||
if (!urgent_list) {
|
||||
stop_timeout(urgent_timeout);
|
||||
urgent_timeout = NULL;
|
||||
|
||||
@@ -13,19 +13,25 @@
|
||||
#include "common.h"
|
||||
#include "timer.h"
|
||||
|
||||
typedef enum TaskState {
|
||||
TASK_NORMAL = 0,
|
||||
TASK_ACTIVE,
|
||||
TASK_ICONIFIED,
|
||||
TASK_URGENT,
|
||||
TASK_STATE_COUNT,
|
||||
} TaskState;
|
||||
|
||||
enum { TASK_NORMAL, TASK_ACTIVE, TASK_ICONIFIED, TASK_URGENT, TASK_STATE_COUNT };
|
||||
extern timeout* urgent_timeout;
|
||||
extern GSList* urgent_list;
|
||||
extern timeout *urgent_timeout;
|
||||
extern GSList *urgent_list;
|
||||
|
||||
// --------------------------------------------------
|
||||
// global task parameter
|
||||
typedef struct {
|
||||
typedef struct GlobalTask {
|
||||
Area area;
|
||||
|
||||
int text;
|
||||
int icon;
|
||||
int centered;
|
||||
gboolean text;
|
||||
gboolean icon;
|
||||
gboolean centered;
|
||||
|
||||
int icon_posy;
|
||||
int icon_size1;
|
||||
@@ -35,7 +41,7 @@ typedef struct {
|
||||
int saturation[TASK_STATE_COUNT];
|
||||
int brightness[TASK_STATE_COUNT];
|
||||
int config_asb_mask;
|
||||
Background* background[TASK_STATE_COUNT];
|
||||
Background *background[TASK_STATE_COUNT];
|
||||
int config_background_mask;
|
||||
// starting position for text ~ task_padding + task_border + icon_size
|
||||
double text_posx, text_height;
|
||||
@@ -43,10 +49,8 @@ typedef struct {
|
||||
PangoFontDescription *font_desc;
|
||||
Color font[TASK_STATE_COUNT];
|
||||
int config_font_mask;
|
||||
int tooltip_enabled;
|
||||
} Global_task;
|
||||
|
||||
|
||||
gboolean tooltip_enabled;
|
||||
} GlobalTask;
|
||||
|
||||
typedef struct {
|
||||
// always start with area
|
||||
@@ -54,8 +58,8 @@ typedef struct {
|
||||
|
||||
// TODO: group task with list of windows here
|
||||
Window win;
|
||||
int desktop;
|
||||
int current_state;
|
||||
int desktop;
|
||||
TaskState current_state;
|
||||
Imlib_Image icon[TASK_STATE_COUNT];
|
||||
Imlib_Image icon_hover[TASK_STATE_COUNT];
|
||||
Imlib_Image icon_press[TASK_STATE_COUNT];
|
||||
@@ -71,25 +75,23 @@ typedef struct {
|
||||
int win_h;
|
||||
} Task;
|
||||
|
||||
Task *add_task(Window win);
|
||||
void remove_task(Task *task);
|
||||
|
||||
Task *add_task (Window win);
|
||||
void remove_task (Task *tsk);
|
||||
void draw_task(void *obj, cairo_t *c);
|
||||
void on_change_task(void *obj);
|
||||
|
||||
void draw_task (void *obj, cairo_t *c);
|
||||
void on_change_task (void *obj);
|
||||
|
||||
void get_icon (Task *tsk);
|
||||
int get_title(Task *tsk);
|
||||
void get_icon(Task *task);
|
||||
gboolean get_title(Task *task);
|
||||
void active_task();
|
||||
void set_task_state(Task* tsk, int state);
|
||||
void set_task_redraw(Task* tsk);
|
||||
void set_task_state(Task *task, TaskState state);
|
||||
void set_task_redraw(Task *task);
|
||||
|
||||
Task *find_active_task(Task *current_task, Task *active_task);
|
||||
Task *next_task (Task *tsk);
|
||||
Task *prev_task (Task *tsk);
|
||||
Task *next_task(Task *task);
|
||||
Task *prev_task(Task *task);
|
||||
|
||||
void add_urgent(Task *tsk);
|
||||
void del_urgent(Task *tsk);
|
||||
void add_urgent(Task *task);
|
||||
void del_urgent(Task *task);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -33,26 +33,33 @@
|
||||
#include "panel.h"
|
||||
#include "strnatcmp.h"
|
||||
|
||||
|
||||
/* win_to_task_table holds for every Window an array of tasks. Usually the array contains only one
|
||||
element. However for omnipresent windows (windows which are visible in every taskbar) the array
|
||||
contains to every Task* on each panel a pointer (i.e. GPtrArray.len == server.nb_desktop)
|
||||
contains to every Task* on each panel a pointer (i.e. GPtrArray.len == server.num_desktops)
|
||||
*/
|
||||
GHashTable* win_to_task_table;
|
||||
GHashTable *win_to_task_table;
|
||||
|
||||
Task *task_active;
|
||||
Task *task_drag;
|
||||
int taskbar_enabled;
|
||||
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)); }
|
||||
void free_ptr_array(gpointer data) { g_ptr_array_free(data, 1); }
|
||||
gboolean taskbar_enabled;
|
||||
gboolean taskbar_distribute_size;
|
||||
gboolean hide_inactive_tasks;
|
||||
gboolean hide_task_diff_monitor;
|
||||
TaskbarSortMethod taskbar_sort_method;
|
||||
Alignment taskbar_alignment;
|
||||
|
||||
guint win_hash(gconstpointer key)
|
||||
{
|
||||
return (guint) * ((const Window *)key);
|
||||
}
|
||||
gboolean win_compare(gconstpointer a, gconstpointer b)
|
||||
{
|
||||
return (*((const Window *)a) == *((const Window *)b));
|
||||
}
|
||||
void free_ptr_array(gpointer data)
|
||||
{
|
||||
g_ptr_array_free(data, 1);
|
||||
}
|
||||
|
||||
void default_taskbar()
|
||||
{
|
||||
@@ -71,7 +78,7 @@ void default_taskbar()
|
||||
void cleanup_taskbar()
|
||||
{
|
||||
Panel *panel;
|
||||
Taskbar *tskbar;
|
||||
Taskbar *taskbar;
|
||||
int i, j, k;
|
||||
|
||||
cleanup_taskbarname();
|
||||
@@ -88,18 +95,18 @@ void cleanup_taskbar()
|
||||
g_hash_table_destroy(win_to_task_table);
|
||||
win_to_task_table = NULL;
|
||||
}
|
||||
for (i = 0 ; i < nb_panel; i++) {
|
||||
panel = &panel1[i];
|
||||
for (j = 0; j < panel->nb_desktop; j++) {
|
||||
tskbar = &panel->taskbar[j];
|
||||
for (i = 0; i < num_panels; i++) {
|
||||
panel = &panels[i];
|
||||
for (j = 0; j < panel->num_desktops; j++) {
|
||||
taskbar = &panel->taskbar[j];
|
||||
for (k = 0; k < TASKBAR_STATE_COUNT; ++k) {
|
||||
if (tskbar->state_pix[k])
|
||||
XFreePixmap(server.dsp, tskbar->state_pix[k]);
|
||||
tskbar->state_pix[k] = 0;
|
||||
if (taskbar->state_pix[k])
|
||||
XFreePixmap(server.dsp, taskbar->state_pix[k]);
|
||||
taskbar->state_pix[k] = 0;
|
||||
}
|
||||
free_area(&tskbar->area);
|
||||
free_area(&taskbar->area);
|
||||
// remove taskbar from the panel
|
||||
remove_area((Area*)tskbar);
|
||||
remove_area((Area *)taskbar);
|
||||
}
|
||||
if (panel->taskbar) {
|
||||
free(panel->taskbar);
|
||||
@@ -113,33 +120,31 @@ void cleanup_taskbar()
|
||||
stop_timeout(urgent_timeout);
|
||||
}
|
||||
|
||||
|
||||
void init_taskbar()
|
||||
{
|
||||
if (win_to_task_table == 0)
|
||||
if (!win_to_task_table)
|
||||
win_to_task_table = g_hash_table_new_full(win_hash, win_compare, free, free_ptr_array);
|
||||
|
||||
task_active = 0;
|
||||
task_drag = 0;
|
||||
}
|
||||
|
||||
|
||||
void init_taskbar_panel(void *p)
|
||||
{
|
||||
Panel *panel =(Panel*)p;
|
||||
Panel *panel = (Panel *)p;
|
||||
int j;
|
||||
|
||||
if (panel->g_taskbar.background[TASKBAR_NORMAL] == 0) {
|
||||
if (!panel->g_taskbar.background[TASKBAR_NORMAL]) {
|
||||
panel->g_taskbar.background[TASKBAR_NORMAL] = &g_array_index(backgrounds, Background, 0);
|
||||
panel->g_taskbar.background[TASKBAR_ACTIVE] = &g_array_index(backgrounds, Background, 0);
|
||||
}
|
||||
if (panel->g_taskbar.background_name[TASKBAR_NORMAL] == 0) {
|
||||
if (!panel->g_taskbar.background_name[TASKBAR_NORMAL]) {
|
||||
panel->g_taskbar.background_name[TASKBAR_NORMAL] = &g_array_index(backgrounds, Background, 0);
|
||||
panel->g_taskbar.background_name[TASKBAR_ACTIVE] = &g_array_index(backgrounds, Background, 0);
|
||||
}
|
||||
if (!panel->g_task.font_desc)
|
||||
panel->g_task.font_desc = pango_font_description_from_string(DEFAULT_FONT);
|
||||
if (panel->g_task.area.bg == 0)
|
||||
if (!panel->g_task.area.bg)
|
||||
panel->g_task.area.bg = &g_array_index(backgrounds, Background, 0);
|
||||
|
||||
// taskbar name
|
||||
@@ -149,7 +154,7 @@ void init_taskbar_panel(void *p)
|
||||
panel->g_taskbar.area_name._draw_foreground = draw_taskbarname;
|
||||
panel->g_taskbar.area_name._on_change_layout = 0;
|
||||
panel->g_taskbar.area_name.resize_needed = 1;
|
||||
panel->g_taskbar.area_name.on_screen = 1;
|
||||
panel->g_taskbar.area_name.on_screen = TRUE;
|
||||
|
||||
// taskbar
|
||||
panel->g_taskbar.area.parent = panel;
|
||||
@@ -160,14 +165,13 @@ void init_taskbar_panel(void *p)
|
||||
panel->g_taskbar.area._draw_foreground = draw_taskbar;
|
||||
panel->g_taskbar.area._on_change_layout = on_change_taskbar;
|
||||
panel->g_taskbar.area.resize_needed = 1;
|
||||
panel->g_taskbar.area.on_screen = 1;
|
||||
panel->g_taskbar.area.on_screen = TRUE;
|
||||
if (panel_horizontal) {
|
||||
panel->g_taskbar.area.posy = panel->area.bg->border.width + panel->area.paddingy;
|
||||
panel->g_taskbar.area.height = panel->area.height - (2 * panel->g_taskbar.area.posy);
|
||||
panel->g_taskbar.area_name.posy = panel->g_taskbar.area.posy;
|
||||
panel->g_taskbar.area_name.height = panel->g_taskbar.area.height;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
panel->g_taskbar.area.posx = panel->area.bg->border.width + panel->area.paddingy;
|
||||
panel->g_taskbar.area.width = panel->area.width - (2 * panel->g_taskbar.area.posx);
|
||||
panel->g_taskbar.area_name.posx = panel->g_taskbar.area.posx;
|
||||
@@ -180,60 +184,81 @@ void init_taskbar_panel(void *p)
|
||||
panel->g_task.area._draw_foreground = draw_task;
|
||||
panel->g_task.area._on_change_layout = on_change_task;
|
||||
panel->g_task.area.resize_needed = 1;
|
||||
panel->g_task.area.on_screen = 1;
|
||||
if ((panel->g_task.config_asb_mask & (1<<TASK_NORMAL)) == 0) {
|
||||
panel->g_task.area.on_screen = TRUE;
|
||||
if ((panel->g_task.config_asb_mask & (1 << TASK_NORMAL)) == 0) {
|
||||
panel->g_task.alpha[TASK_NORMAL] = 100;
|
||||
panel->g_task.saturation[TASK_NORMAL] = 0;
|
||||
panel->g_task.brightness[TASK_NORMAL] = 0;
|
||||
}
|
||||
if ((panel->g_task.config_asb_mask & (1<<TASK_ACTIVE)) == 0) {
|
||||
if ((panel->g_task.config_asb_mask & (1 << TASK_ACTIVE)) == 0) {
|
||||
panel->g_task.alpha[TASK_ACTIVE] = panel->g_task.alpha[TASK_NORMAL];
|
||||
panel->g_task.saturation[TASK_ACTIVE] = panel->g_task.saturation[TASK_NORMAL];
|
||||
panel->g_task.brightness[TASK_ACTIVE] = panel->g_task.brightness[TASK_NORMAL];
|
||||
}
|
||||
if ((panel->g_task.config_asb_mask & (1<<TASK_ICONIFIED)) == 0) {
|
||||
if ((panel->g_task.config_asb_mask & (1 << TASK_ICONIFIED)) == 0) {
|
||||
panel->g_task.alpha[TASK_ICONIFIED] = panel->g_task.alpha[TASK_NORMAL];
|
||||
panel->g_task.saturation[TASK_ICONIFIED] = panel->g_task.saturation[TASK_NORMAL];
|
||||
panel->g_task.brightness[TASK_ICONIFIED] = panel->g_task.brightness[TASK_NORMAL];
|
||||
}
|
||||
if ((panel->g_task.config_asb_mask & (1<<TASK_URGENT)) == 0) {
|
||||
if ((panel->g_task.config_asb_mask & (1 << TASK_URGENT)) == 0) {
|
||||
panel->g_task.alpha[TASK_URGENT] = panel->g_task.alpha[TASK_ACTIVE];
|
||||
panel->g_task.saturation[TASK_URGENT] = panel->g_task.saturation[TASK_ACTIVE];
|
||||
panel->g_task.brightness[TASK_URGENT] = panel->g_task.brightness[TASK_ACTIVE];
|
||||
}
|
||||
if ((panel->g_task.config_font_mask & (1<<TASK_NORMAL)) == 0) panel->g_task.font[TASK_NORMAL] = (Color){{0, 0, 0}, 0};
|
||||
if ((panel->g_task.config_font_mask & (1<<TASK_ACTIVE)) == 0) panel->g_task.font[TASK_ACTIVE] = panel->g_task.font[TASK_NORMAL];
|
||||
if ((panel->g_task.config_font_mask & (1<<TASK_ICONIFIED)) == 0) panel->g_task.font[TASK_ICONIFIED] = panel->g_task.font[TASK_NORMAL];
|
||||
if ((panel->g_task.config_font_mask & (1<<TASK_URGENT)) == 0) panel->g_task.font[TASK_URGENT] = panel->g_task.font[TASK_ACTIVE];
|
||||
if ((panel->g_task.config_background_mask & (1<<TASK_NORMAL)) == 0) panel->g_task.background[TASK_NORMAL] = &g_array_index(backgrounds, Background, 0);
|
||||
if ((panel->g_task.config_background_mask & (1<<TASK_ACTIVE)) == 0) panel->g_task.background[TASK_ACTIVE] = panel->g_task.background[TASK_NORMAL];
|
||||
if ((panel->g_task.config_background_mask & (1<<TASK_ICONIFIED)) == 0) panel->g_task.background[TASK_ICONIFIED] = panel->g_task.background[TASK_NORMAL];
|
||||
if ((panel->g_task.config_background_mask & (1<<TASK_URGENT)) == 0) panel->g_task.background[TASK_URGENT] = panel->g_task.background[TASK_ACTIVE];
|
||||
if ((panel->g_task.config_font_mask & (1 << TASK_NORMAL)) == 0)
|
||||
panel->g_task.font[TASK_NORMAL] = (Color){{0, 0, 0}, 0};
|
||||
if ((panel->g_task.config_font_mask & (1 << TASK_ACTIVE)) == 0)
|
||||
panel->g_task.font[TASK_ACTIVE] = panel->g_task.font[TASK_NORMAL];
|
||||
if ((panel->g_task.config_font_mask & (1 << TASK_ICONIFIED)) == 0)
|
||||
panel->g_task.font[TASK_ICONIFIED] = panel->g_task.font[TASK_NORMAL];
|
||||
if ((panel->g_task.config_font_mask & (1 << TASK_URGENT)) == 0)
|
||||
panel->g_task.font[TASK_URGENT] = panel->g_task.font[TASK_ACTIVE];
|
||||
if ((panel->g_task.config_background_mask & (1 << TASK_NORMAL)) == 0)
|
||||
panel->g_task.background[TASK_NORMAL] = &g_array_index(backgrounds, Background, 0);
|
||||
if ((panel->g_task.config_background_mask & (1 << TASK_ACTIVE)) == 0)
|
||||
panel->g_task.background[TASK_ACTIVE] = panel->g_task.background[TASK_NORMAL];
|
||||
if ((panel->g_task.config_background_mask & (1 << TASK_ICONIFIED)) == 0)
|
||||
panel->g_task.background[TASK_ICONIFIED] = panel->g_task.background[TASK_NORMAL];
|
||||
if ((panel->g_task.config_background_mask & (1 << TASK_URGENT)) == 0)
|
||||
panel->g_task.background[TASK_URGENT] = panel->g_task.background[TASK_ACTIVE];
|
||||
|
||||
if (panel_horizontal) {
|
||||
panel->g_task.area.posy = panel->g_taskbar.area.posy + panel->g_taskbar.background[TASKBAR_NORMAL]->border.width + panel->g_taskbar.area.paddingy;
|
||||
panel->g_task.area.posy = panel->g_taskbar.area.posy +
|
||||
panel->g_taskbar.background[TASKBAR_NORMAL]->border.width +
|
||||
panel->g_taskbar.area.paddingy;
|
||||
panel->g_task.area.height = panel->area.height - (2 * panel->g_task.area.posy);
|
||||
}
|
||||
else {
|
||||
panel->g_task.area.posx = panel->g_taskbar.area.posx + panel->g_taskbar.background[TASKBAR_NORMAL]->border.width + panel->g_taskbar.area.paddingy;
|
||||
} else {
|
||||
panel->g_task.area.posx = panel->g_taskbar.area.posx +
|
||||
panel->g_taskbar.background[TASKBAR_NORMAL]->border.width +
|
||||
panel->g_taskbar.area.paddingy;
|
||||
panel->g_task.area.width = panel->area.width - (2 * panel->g_task.area.posx);
|
||||
panel->g_task.area.height = panel->g_task.maximum_height;
|
||||
}
|
||||
|
||||
for (j=0; j<TASK_STATE_COUNT; ++j) {
|
||||
if (panel->g_task.background[j] == 0)
|
||||
for (j = 0; j < TASK_STATE_COUNT; ++j) {
|
||||
if (!panel->g_task.background[j])
|
||||
panel->g_task.background[j] = &g_array_index(backgrounds, Background, 0);
|
||||
if (panel->g_task.background[j]->border.radius > panel->g_task.area.height/2) {
|
||||
printf("task%sbackground_id has a too large rounded value. Please fix your tint2rc\n", j==0 ? "_" : j==1 ? "_active_" : j==2 ? "_iconified_" : "_urgent_");
|
||||
if (panel->g_task.background[j]->border.radius > panel->g_task.area.height / 2) {
|
||||
printf("task%sbackground_id has a too large rounded value. Please fix your tint2rc\n",
|
||||
j == 0 ? "_" : j == 1 ? "_active_" : j == 2 ? "_iconified_" : "_urgent_");
|
||||
g_array_append_val(backgrounds, *panel->g_task.background[j]);
|
||||
panel->g_task.background[j] = &g_array_index(backgrounds, Background, backgrounds->len-1);
|
||||
panel->g_task.background[j]->border.radius = panel->g_task.area.height/2;
|
||||
panel->g_task.background[j] = &g_array_index(backgrounds, Background, backgrounds->len - 1);
|
||||
panel->g_task.background[j]->border.radius = panel->g_task.area.height / 2;
|
||||
}
|
||||
}
|
||||
|
||||
// compute vertical position : text and icon
|
||||
int height_ink, height, width;
|
||||
get_text_size2(panel->g_task.font_desc, &height_ink, &height, &width, panel->area.height, panel->area.width, "TAjpg", 5, PANGO_WRAP_WORD_CHAR, PANGO_ELLIPSIZE_END);
|
||||
get_text_size2(panel->g_task.font_desc,
|
||||
&height_ink,
|
||||
&height,
|
||||
&width,
|
||||
panel->area.height,
|
||||
panel->area.width,
|
||||
"TAjpg",
|
||||
5,
|
||||
PANGO_WRAP_WORD_CHAR,
|
||||
PANGO_ELLIPSIZE_END);
|
||||
|
||||
if (!panel->g_task.maximum_width && panel_horizontal)
|
||||
panel->g_task.maximum_width = server.monitor[panel->monitor].width;
|
||||
@@ -245,41 +270,38 @@ void init_taskbar_panel(void *p)
|
||||
panel->g_task.text_posx += panel->g_task.icon_size1 + panel->g_task.area.paddingx;
|
||||
panel->g_task.icon_posy = (panel->g_task.area.height - panel->g_task.icon_size1) / 2;
|
||||
}
|
||||
//printf("monitor %d, task_maximum_width %d\n", panel->monitor, panel->g_task.maximum_width);
|
||||
// printf("monitor %d, task_maximum_width %d\n", panel->monitor, panel->g_task.maximum_width);
|
||||
|
||||
Taskbar *tskbar;
|
||||
panel->nb_desktop = server.nb_desktop;
|
||||
panel->taskbar = calloc(server.nb_desktop, sizeof(Taskbar));
|
||||
for (j=0 ; j < panel->nb_desktop ; j++) {
|
||||
tskbar = &panel->taskbar[j];
|
||||
memcpy(&tskbar->area, &panel->g_taskbar.area, sizeof(Area));
|
||||
tskbar->desktop = j;
|
||||
Taskbar *taskbar;
|
||||
panel->num_desktops = server.num_desktops;
|
||||
panel->taskbar = calloc(server.num_desktops, sizeof(Taskbar));
|
||||
for (j = 0; j < panel->num_desktops; j++) {
|
||||
taskbar = &panel->taskbar[j];
|
||||
memcpy(&taskbar->area, &panel->g_taskbar.area, sizeof(Area));
|
||||
taskbar->desktop = j;
|
||||
if (j == server.desktop)
|
||||
tskbar->area.bg = panel->g_taskbar.background[TASKBAR_ACTIVE];
|
||||
taskbar->area.bg = panel->g_taskbar.background[TASKBAR_ACTIVE];
|
||||
else
|
||||
tskbar->area.bg = panel->g_taskbar.background[TASKBAR_NORMAL];
|
||||
taskbar->area.bg = panel->g_taskbar.background[TASKBAR_NORMAL];
|
||||
}
|
||||
init_taskbarname_panel(panel);
|
||||
}
|
||||
|
||||
|
||||
void taskbar_remove_task(gpointer key, gpointer value, gpointer user_data)
|
||||
{
|
||||
remove_task(task_get_task(*(Window*)key));
|
||||
remove_task(task_get_task(*(Window *)key));
|
||||
}
|
||||
|
||||
|
||||
Task *task_get_task (Window win)
|
||||
Task *task_get_task(Window win)
|
||||
{
|
||||
GPtrArray* task_group = task_get_tasks(win);
|
||||
GPtrArray *task_group = task_get_tasks(win);
|
||||
if (task_group)
|
||||
return g_ptr_array_index(task_group, 0);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
GPtrArray* task_get_tasks(Window win)
|
||||
GPtrArray *task_get_tasks(Window win)
|
||||
{
|
||||
if (win_to_task_table && taskbar_enabled)
|
||||
return g_hash_table_lookup(win_to_task_table, &win);
|
||||
@@ -287,21 +309,22 @@ GPtrArray* task_get_tasks(Window win)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void task_refresh_tasklist ()
|
||||
void task_refresh_tasklist()
|
||||
{
|
||||
Window *win;
|
||||
int num_results, i;
|
||||
|
||||
if (!taskbar_enabled) return;
|
||||
win = server_get_property (server.root_win, server.atom._NET_CLIENT_LIST, XA_WINDOW, &num_results);
|
||||
if (!win) return;
|
||||
if (!taskbar_enabled)
|
||||
return;
|
||||
win = server_get_property(server.root_win, server.atom._NET_CLIENT_LIST, XA_WINDOW, &num_results);
|
||||
if (!win)
|
||||
return;
|
||||
|
||||
GList* win_list = g_hash_table_get_keys(win_to_task_table);
|
||||
GList* it;
|
||||
for (it=win_list; it; it=it->next) {
|
||||
GList *win_list = g_hash_table_get_keys(win_to_task_table);
|
||||
GList *it;
|
||||
for (it = win_list; it; it = it->next) {
|
||||
for (i = 0; i < num_results; i++)
|
||||
if (*((Window*)it->data) == win[i])
|
||||
if (*((Window *)it->data) == win[i])
|
||||
break;
|
||||
if (i == num_results)
|
||||
taskbar_remove_task(it->data, 0, 0);
|
||||
@@ -310,122 +333,121 @@ void task_refresh_tasklist ()
|
||||
|
||||
// Add any new
|
||||
for (i = 0; i < num_results; i++)
|
||||
if (!task_get_task (win[i]))
|
||||
add_task (win[i]);
|
||||
if (!task_get_task(win[i]))
|
||||
add_task(win[i]);
|
||||
|
||||
XFree (win);
|
||||
XFree(win);
|
||||
}
|
||||
|
||||
|
||||
void draw_taskbar (void *obj, cairo_t *c)
|
||||
void draw_taskbar(void *obj, cairo_t *c)
|
||||
{
|
||||
Taskbar *taskbar = obj;
|
||||
Taskbar *taskbar = (Taskbar *)obj;
|
||||
int state = (taskbar->desktop == server.desktop) ? TASKBAR_ACTIVE : TASKBAR_NORMAL;
|
||||
|
||||
|
||||
taskbar->state_pix[state] = taskbar->area.pix;
|
||||
}
|
||||
|
||||
|
||||
int resize_taskbar(void *obj)
|
||||
gboolean resize_taskbar(void *obj)
|
||||
{
|
||||
Taskbar *taskbar = (Taskbar*)obj;
|
||||
Panel *panel = (Panel*)taskbar->area.panel;
|
||||
Taskbar *taskbar = (Taskbar *)obj;
|
||||
Panel *panel = (Panel *)taskbar->area.panel;
|
||||
int text_width;
|
||||
|
||||
//printf("resize_taskbar %d %d\n", taskbar->area.posx, taskbar->area.posy);
|
||||
// printf("resize_taskbar %d %d\n", taskbar->area.posx, taskbar->area.posy);
|
||||
if (panel_horizontal) {
|
||||
relayout_with_constraint(&taskbar->area, panel->g_task.maximum_width);
|
||||
|
||||
|
||||
text_width = panel->g_task.maximum_width;
|
||||
GList *l = taskbar->area.children;
|
||||
if (taskbarname_enabled) l = l->next;
|
||||
if (taskbarname_enabled)
|
||||
l = l->next;
|
||||
for (; l != NULL; l = l->next) {
|
||||
if (((Task *)l->data)->area.on_screen) {
|
||||
text_width = ((Task *)l->data)->area.width;
|
||||
break;
|
||||
}
|
||||
}
|
||||
taskbar->text_width = text_width - panel->g_task.text_posx - panel->g_task.area.bg->border.width - panel->g_task.area.paddingxlr;
|
||||
}
|
||||
else {
|
||||
taskbar->text_width =
|
||||
text_width - panel->g_task.text_posx - panel->g_task.area.bg->border.width - panel->g_task.area.paddingxlr;
|
||||
} else {
|
||||
relayout_with_constraint(&taskbar->area, panel->g_task.maximum_height);
|
||||
|
||||
taskbar->text_width = taskbar->area.width - (2 * panel->g_taskbar.area.paddingy) - panel->g_task.text_posx - panel->g_task.area.bg->border.width - panel->g_task.area.paddingxlr;
|
||||
|
||||
taskbar->text_width = taskbar->area.width - (2 * panel->g_taskbar.area.paddingy) - panel->g_task.text_posx -
|
||||
panel->g_task.area.bg->border.width - panel->g_task.area.paddingxlr;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void on_change_taskbar (void *obj)
|
||||
void on_change_taskbar(void *obj)
|
||||
{
|
||||
Taskbar *tskbar = obj;
|
||||
Taskbar *taskbar = (Taskbar *)obj;
|
||||
int k;
|
||||
|
||||
// reset Pixmap when position/size changed
|
||||
for (k=0; k<TASKBAR_STATE_COUNT; ++k) {
|
||||
if (tskbar->state_pix[k]) XFreePixmap(server.dsp, tskbar->state_pix[k]);
|
||||
tskbar->state_pix[k] = 0;
|
||||
for (k = 0; k < TASKBAR_STATE_COUNT; ++k) {
|
||||
if (taskbar->state_pix[k])
|
||||
XFreePixmap(server.dsp, taskbar->state_pix[k]);
|
||||
taskbar->state_pix[k] = 0;
|
||||
}
|
||||
tskbar->area.pix = 0;
|
||||
tskbar->area.redraw_needed = 1;
|
||||
taskbar->area.pix = 0;
|
||||
taskbar->area.redraw_needed = TRUE;
|
||||
}
|
||||
|
||||
|
||||
void set_taskbar_state(Taskbar *tskbar, int state)
|
||||
void set_taskbar_state(Taskbar *taskbar, TaskbarState state)
|
||||
{
|
||||
tskbar->area.bg = panel1[0].g_taskbar.background[state];
|
||||
tskbar->area.pix = tskbar->state_pix[state];
|
||||
taskbar->area.bg = panels[0].g_taskbar.background[state];
|
||||
taskbar->area.pix = taskbar->state_pix[state];
|
||||
if (taskbarname_enabled) {
|
||||
tskbar->bar_name.area.bg = panel1[0].g_taskbar.background_name[state];
|
||||
taskbar->bar_name.area.bg = panels[0].g_taskbar.background_name[state];
|
||||
if (!panel_config.mouse_effects) {
|
||||
tskbar->bar_name.area.pix = tskbar->bar_name.state_pix[state];
|
||||
taskbar->bar_name.area.pix = taskbar->bar_name.state_pix[state];
|
||||
}
|
||||
}
|
||||
if (panel_mode != MULTI_DESKTOP) {
|
||||
if (taskbar_mode != MULTI_DESKTOP) {
|
||||
if (state == TASKBAR_NORMAL)
|
||||
tskbar->area.on_screen = 0;
|
||||
taskbar->area.on_screen = FALSE;
|
||||
else
|
||||
tskbar->area.on_screen = 1;
|
||||
taskbar->area.on_screen = TRUE;
|
||||
}
|
||||
if (tskbar->area.on_screen == 1) {
|
||||
if (tskbar->state_pix[state] == 0)
|
||||
tskbar->area.redraw_needed = 1;
|
||||
if (taskbar->area.on_screen) {
|
||||
if (!taskbar->state_pix[state])
|
||||
taskbar->area.redraw_needed = TRUE;
|
||||
if (taskbarname_enabled) {
|
||||
if (!panel_config.mouse_effects) {
|
||||
if (tskbar->bar_name.state_pix[state] == 0)
|
||||
tskbar->bar_name.area.redraw_needed = 1;
|
||||
if (!taskbar->bar_name.state_pix[state])
|
||||
taskbar->bar_name.area.redraw_needed = TRUE;
|
||||
} else {
|
||||
tskbar->bar_name.area.redraw_needed = 1;
|
||||
taskbar->bar_name.area.redraw_needed = TRUE;
|
||||
}
|
||||
}
|
||||
if (panel_mode == MULTI_DESKTOP && panel1[0].g_taskbar.background[TASKBAR_NORMAL] != panel1[0].g_taskbar.background[TASKBAR_ACTIVE]) {
|
||||
GList *l = tskbar->area.children;
|
||||
if (taskbarname_enabled) l = l->next;
|
||||
for ( ; l ; l = l->next)
|
||||
if (taskbar_mode == MULTI_DESKTOP &&
|
||||
panels[0].g_taskbar.background[TASKBAR_NORMAL] != panels[0].g_taskbar.background[TASKBAR_ACTIVE]) {
|
||||
GList *l = taskbar->area.children;
|
||||
if (taskbarname_enabled)
|
||||
l = l->next;
|
||||
for (; l; l = l->next)
|
||||
set_task_redraw(l->data);
|
||||
}
|
||||
}
|
||||
panel_refresh = 1;
|
||||
panel_refresh = TRUE;
|
||||
}
|
||||
|
||||
|
||||
void visible_taskbar(void *p)
|
||||
{
|
||||
Panel *panel =(Panel*)p;
|
||||
Panel *panel = (Panel *)p;
|
||||
int j;
|
||||
|
||||
Taskbar *taskbar;
|
||||
for (j=0 ; j < panel->nb_desktop ; j++) {
|
||||
for (j = 0; j < panel->num_desktops; j++) {
|
||||
taskbar = &panel->taskbar[j];
|
||||
if (panel_mode != MULTI_DESKTOP && taskbar->desktop != server.desktop) {
|
||||
if (taskbar_mode != MULTI_DESKTOP && taskbar->desktop != server.desktop) {
|
||||
// SINGLE_DESKTOP and not current desktop
|
||||
taskbar->area.on_screen = 0;
|
||||
}
|
||||
else {
|
||||
taskbar->area.on_screen = 1;
|
||||
taskbar->area.on_screen = FALSE;
|
||||
} else {
|
||||
taskbar->area.on_screen = TRUE;
|
||||
}
|
||||
}
|
||||
panel_refresh = 1;
|
||||
panel_refresh = TRUE;
|
||||
}
|
||||
|
||||
#define NONTRIVIAL 2
|
||||
@@ -444,9 +466,7 @@ gint compare_tasks_trivial(Task *a, Task *b, Taskbar *taskbar)
|
||||
|
||||
gint contained_within(Task *a, Task *b)
|
||||
{
|
||||
if ((a->win_x <= b->win_x) &&
|
||||
(a->win_y <= b->win_y) &&
|
||||
(a->win_x + a->win_w >= b->win_x + b->win_w) &&
|
||||
if ((a->win_x <= b->win_x) && (a->win_y <= b->win_y) && (a->win_x + a->win_w >= b->win_x + b->win_w) &&
|
||||
(a->win_y + a->win_h >= b->win_y + b->win_h)) {
|
||||
return 1;
|
||||
}
|
||||
@@ -461,10 +481,7 @@ gint compare_task_centers(Task *a, Task *b, Taskbar *taskbar)
|
||||
|
||||
// If a window has the same coordinates and size as the other,
|
||||
// they are considered to be equal in the comparison.
|
||||
if ((a->win_x == b->win_x) &&
|
||||
(a->win_y == b->win_y) &&
|
||||
(a->win_w == b->win_w) &&
|
||||
(a->win_h == b->win_h)) {
|
||||
if ((a->win_x == b->win_x) && (a->win_y == b->win_y) && (a->win_w == b->win_w) && (a->win_h == b->win_h)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -536,35 +553,34 @@ void sort_tasks(Taskbar *taskbar)
|
||||
{
|
||||
if (!taskbar)
|
||||
return;
|
||||
if (!taskbar_needs_sort(taskbar)) {
|
||||
if (!taskbar_needs_sort(taskbar))
|
||||
return;
|
||||
}
|
||||
|
||||
taskbar->area.children = g_list_sort_with_data(taskbar->area.children, (GCompareDataFunc)compare_tasks, taskbar);
|
||||
taskbar->area.resize_needed = 1;
|
||||
panel_refresh = 1;
|
||||
((Panel*)taskbar->area.panel)->area.resize_needed = 1;
|
||||
panel_refresh = TRUE;
|
||||
((Panel *)taskbar->area.panel)->area.resize_needed = 1;
|
||||
}
|
||||
|
||||
|
||||
void sort_taskbar_for_win(Window win)
|
||||
{
|
||||
if (taskbar_sort_method == TASKBAR_NOSORT)
|
||||
return;
|
||||
|
||||
GPtrArray* task_group = task_get_tasks(win);
|
||||
GPtrArray *task_group = task_get_tasks(win);
|
||||
if (task_group) {
|
||||
int i;
|
||||
Task* tsk0 = g_ptr_array_index(task_group, 0);
|
||||
if (tsk0) {
|
||||
window_get_coordinates(win, &tsk0->win_x, &tsk0->win_y, &tsk0->win_w, &tsk0->win_h);
|
||||
Task *task0 = g_ptr_array_index(task_group, 0);
|
||||
if (task0) {
|
||||
get_window_coordinates(win, &task0->win_x, &task0->win_y, &task0->win_w, &task0->win_h);
|
||||
}
|
||||
for (i = 0; i < task_group->len; ++i) {
|
||||
Task* tsk = g_ptr_array_index(task_group, i);
|
||||
tsk->win_x = tsk0->win_x;
|
||||
tsk->win_y = tsk0->win_y;
|
||||
tsk->win_w = tsk0->win_w;
|
||||
tsk->win_h = tsk0->win_h;
|
||||
sort_tasks(tsk->area.parent);
|
||||
Task *task = g_ptr_array_index(task_group, i);
|
||||
task->win_x = task0->win_x;
|
||||
task->win_y = task0->win_y;
|
||||
task->win_w = task0->win_w;
|
||||
task->win_h = task0->win_h;
|
||||
sort_tasks(task->area.parent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,49 +11,51 @@
|
||||
#include "task.h"
|
||||
#include "taskbarname.h"
|
||||
|
||||
enum { TASKBAR_NORMAL, TASKBAR_ACTIVE, TASKBAR_STATE_COUNT };
|
||||
typedef enum TaskbarState {
|
||||
TASKBAR_NORMAL = 0,
|
||||
TASKBAR_ACTIVE,
|
||||
TASKBAR_STATE_COUNT,
|
||||
} TaskbarState;
|
||||
|
||||
typedef enum TaskbarSortMethod {
|
||||
TASKBAR_NOSORT = 0,
|
||||
TASKBAR_SORT_CENTER,
|
||||
TASKBAR_SORT_TITLE,
|
||||
} TaskbarSortMethod;
|
||||
|
||||
extern GHashTable *win_to_task_table;
|
||||
extern Task *task_active;
|
||||
extern Task *task_drag;
|
||||
extern int taskbar_enabled;
|
||||
extern int taskbar_distribute_size;
|
||||
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;
|
||||
extern gboolean taskbar_enabled;
|
||||
extern gboolean taskbar_distribute_size;
|
||||
extern gboolean hide_inactive_tasks;
|
||||
extern gboolean hide_task_diff_monitor;
|
||||
extern TaskbarSortMethod taskbar_sort_method;
|
||||
extern Alignment taskbar_alignment;
|
||||
|
||||
typedef struct {
|
||||
// always start with area
|
||||
Area area;
|
||||
Pixmap state_pix[TASKBAR_STATE_COUNT];
|
||||
|
||||
gchar *name;
|
||||
int posy;
|
||||
int posy;
|
||||
} Taskbarname;
|
||||
|
||||
// tint2 use one taskbar per desktop.
|
||||
typedef struct {
|
||||
// always start with area
|
||||
Area area;
|
||||
|
||||
int desktop;
|
||||
Pixmap state_pix[TASKBAR_STATE_COUNT];
|
||||
|
||||
int desktop;
|
||||
Taskbarname bar_name;
|
||||
|
||||
// task parameters
|
||||
int text_width;
|
||||
} Taskbar;
|
||||
|
||||
typedef struct {
|
||||
//always start with area
|
||||
typedef struct GlobalTaskbar {
|
||||
// always start with area
|
||||
Area area;
|
||||
Area area_name;
|
||||
Background* background[TASKBAR_STATE_COUNT];
|
||||
Background* background_name[TASKBAR_STATE_COUNT];
|
||||
} Global_taskbar;
|
||||
|
||||
Background *background[TASKBAR_STATE_COUNT];
|
||||
Background *background_name[TASKBAR_STATE_COUNT];
|
||||
} GlobalTaskbar;
|
||||
|
||||
// default global data
|
||||
void default_taskbar();
|
||||
@@ -64,15 +66,15 @@ void cleanup_taskbar();
|
||||
void init_taskbar();
|
||||
void init_taskbar_panel(void *p);
|
||||
|
||||
void draw_taskbar (void *obj, cairo_t *c);
|
||||
void draw_taskbar(void *obj, cairo_t *c);
|
||||
void taskbar_remove_task(gpointer key, gpointer value, gpointer user_data);
|
||||
Task *task_get_task (Window win);
|
||||
GPtrArray* task_get_tasks(Window win);
|
||||
void task_refresh_tasklist ();
|
||||
Task *task_get_task(Window win);
|
||||
GPtrArray *task_get_tasks(Window win);
|
||||
void task_refresh_tasklist();
|
||||
|
||||
int resize_taskbar(void *obj);
|
||||
void on_change_taskbar (void *obj);
|
||||
void set_taskbar_state(Taskbar *tskbar, int state);
|
||||
gboolean resize_taskbar(void *obj);
|
||||
void on_change_taskbar(void *obj);
|
||||
void set_taskbar_state(Taskbar *taskbar, TaskbarState state);
|
||||
|
||||
// show/hide taskbar according to current desktop
|
||||
void visible_taskbar(void *p);
|
||||
@@ -81,4 +83,3 @@ void sort_taskbar_for_win(Window win);
|
||||
void sort_tasks(Taskbar *taskbar);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -37,81 +37,76 @@ PangoFontDescription *taskbarname_font_desc;
|
||||
Color taskbarname_font;
|
||||
Color taskbarname_active_font;
|
||||
|
||||
|
||||
void default_taskbarname()
|
||||
{
|
||||
taskbarname_enabled = 0;
|
||||
taskbarname_font_desc = NULL;
|
||||
}
|
||||
|
||||
|
||||
void init_taskbarname_panel(void *p)
|
||||
{
|
||||
Panel *panel =(Panel*)p;
|
||||
Taskbar *tskbar;
|
||||
Panel *panel = (Panel *)p;
|
||||
Taskbar *taskbar;
|
||||
int j;
|
||||
|
||||
|
||||
if (!taskbarname_enabled)
|
||||
return;
|
||||
|
||||
if (!panel_config.taskbarname_font_desc)
|
||||
panel_config.taskbarname_font_desc = pango_font_description_from_string(DEFAULT_FONT);
|
||||
|
||||
GSList *l, *list = server_get_name_of_desktop();
|
||||
for (j=0, l=list ; j < panel->nb_desktop ; j++) {
|
||||
tskbar = &panel->taskbar[j];
|
||||
memcpy(&tskbar->bar_name.area, &panel->g_taskbar.area_name, sizeof(Area));
|
||||
tskbar->bar_name.area.parent = tskbar;
|
||||
tskbar->bar_name.area.has_mouse_over_effect = 1;
|
||||
tskbar->bar_name.area.has_mouse_press_effect = 1;
|
||||
GSList *l, *list = get_desktop_names();
|
||||
for (j = 0, l = list; j < panel->num_desktops; j++) {
|
||||
taskbar = &panel->taskbar[j];
|
||||
memcpy(&taskbar->bar_name.area, &panel->g_taskbar.area_name, sizeof(Area));
|
||||
taskbar->bar_name.area.parent = taskbar;
|
||||
taskbar->bar_name.area.has_mouse_over_effect = 1;
|
||||
taskbar->bar_name.area.has_mouse_press_effect = 1;
|
||||
if (j == server.desktop)
|
||||
tskbar->bar_name.area.bg = panel->g_taskbar.background_name[TASKBAR_ACTIVE];
|
||||
taskbar->bar_name.area.bg = panel->g_taskbar.background_name[TASKBAR_ACTIVE];
|
||||
else
|
||||
tskbar->bar_name.area.bg = panel->g_taskbar.background_name[TASKBAR_NORMAL];
|
||||
taskbar->bar_name.area.bg = panel->g_taskbar.background_name[TASKBAR_NORMAL];
|
||||
|
||||
// use desktop number if name is missing
|
||||
if (l) {
|
||||
tskbar->bar_name.name = g_strdup(l->data);
|
||||
taskbar->bar_name.name = g_strdup(l->data);
|
||||
l = l->next;
|
||||
}
|
||||
else
|
||||
tskbar->bar_name.name = g_strdup_printf("%d", j+1);
|
||||
|
||||
} else
|
||||
taskbar->bar_name.name = g_strdup_printf("%d", j + 1);
|
||||
|
||||
// append the name at the beginning of taskbar
|
||||
tskbar->area.children = g_list_append(tskbar->area.children, &tskbar->bar_name);
|
||||
taskbar->area.children = g_list_append(taskbar->area.children, &taskbar->bar_name);
|
||||
}
|
||||
|
||||
for (l=list ; l ; l = l->next)
|
||||
for (l = list; l; l = l->next)
|
||||
g_free(l->data);
|
||||
g_slist_free(list);
|
||||
}
|
||||
|
||||
|
||||
void cleanup_taskbarname()
|
||||
{
|
||||
int i, j, k;
|
||||
Panel *panel;
|
||||
Taskbar *tskbar;
|
||||
Taskbar *taskbar;
|
||||
|
||||
for (i = 0; i < nb_panel; i++) {
|
||||
panel = &panel1[i];
|
||||
for (j = 0; j < panel->nb_desktop; j++) {
|
||||
tskbar = &panel->taskbar[j];
|
||||
g_free(tskbar->bar_name.name);
|
||||
tskbar->bar_name.name = NULL;
|
||||
free_area(&tskbar->bar_name.area);
|
||||
for (i = 0; i < num_panels; i++) {
|
||||
panel = &panels[i];
|
||||
for (j = 0; j < panel->num_desktops; j++) {
|
||||
taskbar = &panel->taskbar[j];
|
||||
g_free(taskbar->bar_name.name);
|
||||
taskbar->bar_name.name = NULL;
|
||||
free_area(&taskbar->bar_name.area);
|
||||
for (k = 0; k < TASKBAR_STATE_COUNT; ++k) {
|
||||
if (tskbar->bar_name.state_pix[k])
|
||||
XFreePixmap(server.dsp, tskbar->bar_name.state_pix[k]);
|
||||
tskbar->bar_name.state_pix[k] = 0;
|
||||
if (taskbar->bar_name.state_pix[k])
|
||||
XFreePixmap(server.dsp, taskbar->bar_name.state_pix[k]);
|
||||
taskbar->bar_name.state_pix[k] = 0;
|
||||
}
|
||||
remove_area((Area*)&tskbar->bar_name);
|
||||
remove_area((Area *)&taskbar->bar_name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void draw_taskbarname (void *obj, cairo_t *c)
|
||||
void draw_taskbarname(void *obj, cairo_t *c)
|
||||
{
|
||||
Taskbarname *taskbar_name = obj;
|
||||
Taskbar *taskbar = taskbar_name->area.parent;
|
||||
@@ -121,54 +116,58 @@ void draw_taskbarname (void *obj, cairo_t *c)
|
||||
int state = (taskbar->desktop == server.desktop) ? TASKBAR_ACTIVE : TASKBAR_NORMAL;
|
||||
if (!panel_config.mouse_effects)
|
||||
taskbar_name->state_pix[state] = taskbar_name->area.pix;
|
||||
|
||||
|
||||
// draw content
|
||||
layout = pango_cairo_create_layout (c);
|
||||
pango_layout_set_font_description (layout, panel_config.taskbarname_font_desc);
|
||||
pango_layout_set_width (layout, taskbar_name->area.width * PANGO_SCALE);
|
||||
pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
|
||||
layout = pango_cairo_create_layout(c);
|
||||
pango_layout_set_font_description(layout, panel_config.taskbarname_font_desc);
|
||||
pango_layout_set_width(layout, taskbar_name->area.width * PANGO_SCALE);
|
||||
pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER);
|
||||
pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
|
||||
pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_NONE);
|
||||
pango_layout_set_text (layout, taskbar_name->name, strlen(taskbar_name->name));
|
||||
pango_layout_set_text(layout, taskbar_name->name, strlen(taskbar_name->name));
|
||||
|
||||
cairo_set_source_rgba (c, config_text->rgb[0], config_text->rgb[1], config_text->rgb[2], config_text->alpha);
|
||||
cairo_set_source_rgba(c, config_text->rgb[0], config_text->rgb[1], config_text->rgb[2], config_text->alpha);
|
||||
|
||||
pango_cairo_update_layout (c, layout);
|
||||
draw_text(layout, c, 0, taskbar_name->posy, config_text, ((Panel*)taskbar_name->area.panel)->font_shadow);
|
||||
pango_cairo_update_layout(c, layout);
|
||||
draw_text(layout, c, 0, taskbar_name->posy, config_text, ((Panel *)taskbar_name->area.panel)->font_shadow);
|
||||
|
||||
g_object_unref (layout);
|
||||
//printf("draw_taskbarname %s ******************************\n", taskbar_name->name);
|
||||
g_object_unref(layout);
|
||||
// printf("draw_taskbarname %s ******************************\n", taskbar_name->name);
|
||||
}
|
||||
|
||||
|
||||
int resize_taskbarname(void *obj)
|
||||
gboolean resize_taskbarname(void *obj)
|
||||
{
|
||||
Taskbarname *taskbar_name = obj;
|
||||
Panel *panel = taskbar_name->area.panel;
|
||||
int name_height, name_width, name_height_ink;
|
||||
int ret = 0;
|
||||
|
||||
taskbar_name->area.redraw_needed = 1;
|
||||
get_text_size2(panel_config.taskbarname_font_desc, &name_height_ink, &name_height, &name_width, panel->area.height, panel->area.width, taskbar_name->name, strlen(taskbar_name->name),
|
||||
taskbar_name->area.redraw_needed = TRUE;
|
||||
get_text_size2(panel_config.taskbarname_font_desc,
|
||||
&name_height_ink,
|
||||
&name_height,
|
||||
&name_width,
|
||||
panel->area.height,
|
||||
panel->area.width,
|
||||
taskbar_name->name,
|
||||
strlen(taskbar_name->name),
|
||||
PANGO_WRAP_WORD_CHAR,
|
||||
PANGO_ELLIPSIZE_NONE);
|
||||
|
||||
if (panel_horizontal) {
|
||||
int new_size = name_width + (2* (taskbar_name->area.paddingxlr + taskbar_name->area.bg->border.width));
|
||||
int new_size = name_width + (2 * (taskbar_name->area.paddingxlr + taskbar_name->area.bg->border.width));
|
||||
if (new_size != taskbar_name->area.width) {
|
||||
taskbar_name->area.width = new_size;
|
||||
taskbar_name->posy = (taskbar_name->area.height - name_height) / 2;
|
||||
ret = 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
int new_size = name_height + (2 * (taskbar_name->area.paddingxlr + taskbar_name->area.bg->border.width));
|
||||
if (new_size != taskbar_name->area.height) {
|
||||
taskbar_name->area.height = new_size;
|
||||
taskbar_name->area.height = new_size;
|
||||
taskbar_name->posy = (taskbar_name->area.height - name_height) / 2;
|
||||
ret = 1;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#include "common.h"
|
||||
#include "area.h"
|
||||
|
||||
extern int taskbarname_enabled;
|
||||
extern gboolean taskbarname_enabled;
|
||||
extern Color taskbarname_font;
|
||||
extern Color taskbarname_active_font;
|
||||
|
||||
@@ -19,8 +19,6 @@ void init_taskbarname_panel(void *p);
|
||||
|
||||
void draw_taskbarname(void *obj, cairo_t *c);
|
||||
|
||||
int resize_taskbarname(void *obj);
|
||||
|
||||
gboolean resize_taskbarname(void *obj);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user