void set_taskbar_state(Taskbar *tskbar, int state) { tskbar->area.bg = panel1[0].g_taskbar.background[state]; tskbar->area.pix = tskbar->state_pix[state]; if (taskbarname_enabled) { tskbar->bar_name.area.bg = panel1[0].g_taskbar.background_name[state]; tskbar->bar_name.area.pix = tskbar->bar_name.state_pix[state]; } if (panel_mode != MULTI_DESKTOP) { if (state == TASKBAR_NORMAL) tskbar->area.on_screen = 0; else tskbar->area.on_screen = 1; } if (tskbar->area.on_screen == 1) { if (tskbar->state_pix[state] == 0) tskbar->area.redraw = 1; 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; if (taskbarname_enabled) l = l->next; for ( ; l ; l = l->next) set_task_redraw(l->data); } } panel_refresh = 1; }
void set_panel_background(Panel *p) { if (p->area.pix) XFreePixmap (server.dsp, p->area.pix); p->area.pix = XCreatePixmap (server.dsp, server.root_win, p->area.width, p->area.height, server.depth); int xoff=0, yoff=0; if (panel_horizontal && panel_position & BOTTOM) yoff = p->area.height-p->hidden_height; else if (!panel_horizontal && panel_position & RIGHT) xoff = p->area.width-p->hidden_width; if (server.real_transparency) { clear_pixmap(p->area.pix, 0, 0, p->area.width, p->area.height); } else { get_root_pixmap(); // copy background (server.root_pmap) in panel.area.pix Window dummy; int x, y; XTranslateCoordinates(server.dsp, p->main_win, server.root_win, 0, 0, &x, &y, &dummy); if (panel_autohide && p->is_hidden) { x -= xoff; y -= yoff; } XSetTSOrigin(server.dsp, server.gc, -x, -y); XFillRectangle(server.dsp, p->area.pix, server.gc, 0, 0, p->area.width, p->area.height); } // draw background panel cairo_surface_t *cs; cairo_t *c; cs = cairo_xlib_surface_create (server.dsp, p->area.pix, server.visual, p->area.width, p->area.height); c = cairo_create (cs); draw_background(&p->area, c); cairo_destroy (c); cairo_surface_destroy (cs); if (panel_autohide) { if (p->hidden_pixmap) XFreePixmap(server.dsp, p->hidden_pixmap); p->hidden_pixmap = XCreatePixmap(server.dsp, server.root_win, p->hidden_width, p->hidden_height, server.depth); XCopyArea(server.dsp, p->area.pix, p->hidden_pixmap, server.gc, xoff, yoff, p->hidden_width, p->hidden_height, 0, 0); } // redraw panel's object GSList *l0; Area *a; for (l0 = p->area.list; l0 ; l0 = l0->next) { a = l0->data; set_redraw(a); } // reset task 'state_pix' int i; Taskbar *tskbar; for (i=0 ; i < p->nb_desktop ; i++) { tskbar = &p->taskbar[i]; for (l0 = tskbar->area.list; l0 ; l0 = l0->next) { set_task_redraw((Task *)l0->data); } } }
void on_change_task (void *obj) { Task *tsk = obj; Panel *panel = (Panel*)tsk->area.panel; long value[] = { panel->posx+tsk->area.bounds.x, panel->posy+tsk->area.bounds.y, tsk->area.bounds.width, tsk->area.bounds.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); }
int get_title(Task *tsk) { Panel *panel = tsk->area.panel; char *title, *name; 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); if (!name || !strlen(name)) { name = server_get_property (tsk->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); if (!name || !strlen(name)) { name = calloc(10, 1); strcpy(name, "Untitled"); } } } // add space before title title = calloc(strlen(name)+2, 1); if (panel->g_task.icon) strcpy(title, " "); else title[0] = 0; strcat(title, name); if (name) XFree (name); if (tsk->title) { // check unecessary title change if (strcmp(tsk->title, title) == 0) { free(title); return 0; } else free(tsk->title); } tsk->title = title; GPtrArray* task_group = task_get_tasks(tsk->win); if (task_group) { for (size_t i = 0; i<task_group->len; ++i) { Task* tsk2 = g_ptr_array_index(task_group, i); tsk2->title = tsk->title; set_task_redraw(tsk2); } } return 1; }
void set_task_state(Task *tsk, int state) { if (tsk == 0 || 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_group) { for (size_t i=0; i<task_group->len; ++i) { Task* tsk1 = g_ptr_array_index(task_group, i); tsk1->current_state = state; tsk1->area.background = panel1[0].g_task.background[state]; tsk1->area.pixmap = tsk1->state_pix[state]; if (tsk1->state_pix[state] == 0) tsk1->area.redraw = 1; if (state == TASK_ACTIVE && g_slist_find(urgent_list, tsk1)) del_urgent(tsk1); // Show only the active task int hide = 0; if (hide_inactive_tasks) { if (state != TASK_ACTIVE) { hide = 1; } } if (window_get_monitor(tsk->win) != ((Panel*)tsk->area.panel)->monitor && (hide_task_diff_monitor || nb_panel > 1)) { hide = 1; } if (1 - hide != tsk1->area.visible) { tsk1->area.visible = 1 - hide; set_task_redraw(tsk1); Panel *p = (Panel*)tsk->area.panel; tsk->area.resize = 1; p->taskbar->area.resize = 1; p->area.resize = 1; } } panel_refresh = 1; } } }
void get_icon (Task *tsk) { Panel *panel = tsk->area.panel; if (!panel->g_task.icon) return; size_t 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]); imlib_free_image(); tsk->icon[k] = 0; } } data = server_get_property (tsk->win, server.atom._NET_WM_ICON, XA_CARDINAL, (int*)&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); #ifdef __x86_64__ DATA32 icon_data[w * h]; size_t 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); #else img = imlib_create_image_using_data (w, h, (DATA32*)tmp_data); #endif } else { // get Pixmap icon hints = XGetWMHints(server.dsp, tsk->win); if (hints) { if (hints->flags & IconPixmapHint && hints->icon_pixmap != 0) { // get width, height and depth for the pixmap Window root; int icon_x, icon_y; uint32_t border_width, bpp; uint32_t w, h; //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); } } } if (img == NULL) { imlib_context_set_image(default_icon); img = imlib_clone_image(); } // transform icons imlib_context_set_image(img); imlib_image_set_has_alpha(1); 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_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) { imlib_context_set_image(orig_image); tsk->icon[k] = imlib_clone_image(); imlib_context_set_image(tsk->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); imlib_image_put_back_data(data32); } } imlib_context_set_image(orig_image); imlib_free_image(); if (hints) XFree(hints); if (data) XFree (data); GPtrArray* task_group = task_get_tasks(tsk->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]; set_task_redraw(tsk2); } } }