From 3f12a587406ddc975bff3fe505924e62cd125ff6 Mon Sep 17 00:00:00 2001 From: Thierry Lorthiois Date: Sat, 17 Jan 2009 14:07:56 +0000 Subject: [PATCH] fixed bug with active task --- src/Makefile | 5 +- src/clock/clock.c | 32 +++---- src/config.c | 191 +++++++++++++++++++++--------------------- src/panel.c | 38 ++++----- src/server.c | 16 ++-- src/taskbar/task.c | 142 +++++++++++-------------------- src/taskbar/task.h | 12 +-- src/taskbar/taskbar.c | 50 ++++++----- src/tint.c | 88 ++++++++++--------- src/tint2 | Bin 55716 -> 47528 bytes src/util/area.c | 96 +++++++++++---------- src/util/area.h | 59 +++++++------ 12 files changed, 356 insertions(+), 373 deletions(-) diff --git a/src/Makefile b/src/Makefile index 31fe027..b0cd6c4 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,5 +1,6 @@ -#CFLAGS="-O2" -FLAGS=-Wall -g `pkg-config --cflags --libs cairo pangocairo x11 xinerama imlib2 glib-2.0` +CFLAGS= -O2 +CC = gcc +FLAGS=-W -Wall -g `pkg-config --cflags --libs cairo pangocairo x11 xinerama imlib2 glib-2.0` PROGNAME=tint2 FILES=tint.c server.c panel.c config.c taskbar/task.c taskbar/taskbar.c clock/clock.c systray/docker.c systray/icons.c systray/kde.c systray/net.c systray/xproperty.c util/window.c util/area.c diff --git a/src/clock/clock.c b/src/clock/clock.c index 1b76ec3..2ec86a4 100644 --- a/src/clock/clock.c +++ b/src/clock/clock.c @@ -1,9 +1,9 @@ /************************************************************************** * * Tint2 : clock -* +* * Copyright (C) 2008 thierry lorthiois (lorthiois@bbsoft.fr) -* +* * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version 2 * as published by the Free Software Foundation. @@ -37,27 +37,27 @@ void init_clock(Clock *clock, int panel_height) int time_height, time_height_ink, date_height, date_height_ink; if (!clock->time1_format) return; - + if (strchr(clock->time1_format, 'S') == NULL) clock->time_precision = 60; else clock->time_precision = 1; - - clock->area.posy = panel.area.border.width + panel.area.paddingy; + + clock->area.posy = panel.area.pix.border.width + panel.area.paddingy; clock->area.height = panel.area.height - (2 * clock->area.posy); - clock->area.redraw = 1; + clock->area.redraw = 1; gettimeofday(&clock->clock, 0); clock->clock.tv_sec -= clock->clock.tv_sec % clock->time_precision; - + strftime(buf_time, sizeof(buf_time), clock->time1_format, localtime(&clock->clock.tv_sec)); if (clock->time2_format) strftime(buf_date, sizeof(buf_date), clock->time2_format, localtime(&clock->clock.tv_sec)); - + get_text_size(clock->time1_font_desc, &time_height_ink, &time_height, panel_height, buf_time, strlen(buf_time)); clock->time1_posy = (clock->area.height - time_height) / 2; - if (clock->time2_format) { + if (clock->time2_format) { get_text_size(clock->time2_font_desc, &date_height_ink, &date_height, panel_height, buf_date, strlen(buf_date)); - + clock->time1_posy -= ((date_height_ink + 2) / 2); clock->time2_posy = clock->time1_posy + time_height + 2 - (time_height - time_height_ink)/2 - (date_height - date_height_ink)/2; } @@ -94,14 +94,14 @@ redraw: } if (time_width > date_width) new_width = time_width; else new_width = date_width; - new_width += (2*clock->area.paddingx) + (2*clock->area.border.width); - + new_width += (2*clock->area.paddingx) + (2*clock->area.pix.border.width); + if (new_width > clock->area.width || (new_width != clock->area.width && date_width > time_width)) { //printf("clock_width %d, new_width %d\n", clock->area.width, new_width); // resize clock clock->area.width = new_width; - panel.clock.area.posx = panel.area.width - panel.clock.area.width - panel.area.paddingx - panel.area.border.width; - + panel.clock.area.posx = panel.area.width - panel.clock.area.width - panel.area.paddingx - panel.area.pix.border.width; + g_object_unref (layout); resize_taskbar(); goto redraw; @@ -124,12 +124,12 @@ redraw: pango_layout_set_indent(layout, 0); pango_layout_set_text (layout, buf_date, strlen(buf_date)); pango_layout_set_width (layout, clock->area.width * PANGO_SCALE); - + pango_cairo_update_layout (c, layout); cairo_move_to (c, 0, clock->time2_posy); pango_cairo_show_layout (c, layout); } - + g_object_unref (layout); } diff --git a/src/config.c b/src/config.c index 9bcc84c..741e12e 100644 --- a/src/config.c +++ b/src/config.c @@ -44,11 +44,11 @@ #include "window.h" -void cleanup_taskbar() -{ +void cleanup_taskbar() +{ GSList *l0; Task *tsk; - + int i, nb; nb = panel.nb_desktop * panel.nb_monitor; for (i=0 ; i < nb ; i++) { @@ -59,13 +59,13 @@ void cleanup_taskbar() // careful : remove_task change l0->next remove_task (tsk); } - + free_area (&panel.taskbar[i].area); } free(panel.taskbar); panel.taskbar = 0; - + free_area(&panel.area); } @@ -92,12 +92,12 @@ void copy_file(const char *pathSrc, const char *pathDest) fileSrc = fopen(pathSrc, "rb"); if (fileSrc == NULL) return; - + fileDest = fopen(pathDest, "wb"); if (fileDest == NULL) return; - + while ((nb = fread(line, 1, 100, fileSrc)) > 0) fwrite(line, 1, nb, fileDest); - + fclose (fileDest); fclose (fileSrc); } @@ -109,7 +109,7 @@ void extract_values (const char *value, char **value1, char **value2) if (*value1) free (*value1); if (*value2) free (*value2); - + if ((b = strchr (value, ' '))) { b[0] = '\0'; b++; @@ -117,7 +117,7 @@ void extract_values (const char *value, char **value1, char **value2) g_strstrip(*value2); } else *value2 = 0; - + *value1 = strdup (value); g_strstrip(*value1); } @@ -126,7 +126,7 @@ void extract_values (const char *value, char **value1, char **value2) int hex_char_to_int (char c) { int r; - + if (c >= '0' && c <= '9') r = c - '0'; else if (c >= 'a' && c <= 'f') r = c - 'a' + 10; else if (c >= 'A' && c <= 'F') r = c - 'A' + 10; @@ -199,27 +199,27 @@ void add_entry (char *key, char *value) /* Background and border */ if (strcmp (key, "rounded") == 0) { // 'rounded' is the first parameter => alloc a new background - Area *back = calloc(1, sizeof(Area)); - back->border.rounded = atoi (value); - list_back = g_slist_append(list_back, back); + Area *a = calloc(1, sizeof(Area)); + a->pix.border.rounded = atoi (value); + list_back = g_slist_append(list_back, a); } else if (strcmp (key, "border_width") == 0) { - Area *back = g_slist_last(list_back)->data; - back->border.width = atoi (value); + Area *a = g_slist_last(list_back)->data; + a->pix.border.width = atoi (value); } else if (strcmp (key, "background_color") == 0) { - Area *back = g_slist_last(list_back)->data; + Area *a = g_slist_last(list_back)->data; extract_values(value, &value1, &value2); - get_color (value1, back->back.color); - if (value2) back->back.alpha = (atoi (value2) / 100.0); - else back->back.alpha = 0.5; + get_color (value1, a->pix.back.color); + if (value2) a->pix.back.alpha = (atoi (value2) / 100.0); + else a->pix.back.alpha = 0.5; } else if (strcmp (key, "border_color") == 0) { - Area *back = g_slist_last(list_back)->data; + Area *a = g_slist_last(list_back)->data; extract_values(value, &value1, &value2); - get_color (value1, back->border.color); - if (value2) back->border.alpha = (atoi (value2) / 100.0); - else back->border.alpha = 0.5; + get_color (value1, a->pix.border.color); + if (value2) a->pix.border.alpha = (atoi (value2) / 100.0); + else a->pix.border.alpha = 0.5; } /* Panel */ @@ -260,9 +260,9 @@ void add_entry (char *key, char *value) g_task.font_shadow = atoi (value); else if (strcmp (key, "panel_background_id") == 0) { int id = atoi (value); - Area *back = g_slist_nth_data(list_back, id); - memcpy(&panel.area.back, &back->back, sizeof(Color)); - memcpy(&panel.area.border, &back->border, sizeof(Border)); + Area *a = g_slist_nth_data(list_back, id); + memcpy(&panel.area.pix.back, &a->pix.back, sizeof(Color)); + memcpy(&panel.area.pix.border, &a->pix.border, sizeof(Border)); } /* Clock */ @@ -297,11 +297,11 @@ void add_entry (char *key, char *value) } else if (strcmp (key, "clock_background_id") == 0) { int id = atoi (value); - Area *back = g_slist_nth_data(list_back, id); - memcpy(&panel.clock.area.back, &back->back, sizeof(Color)); - memcpy(&panel.clock.area.border, &back->border, sizeof(Border)); + Area *a = g_slist_nth_data(list_back, id); + memcpy(&panel.clock.area.pix.back, &a->pix.back, sizeof(Color)); + memcpy(&panel.clock.area.pix.border, &a->pix.border, sizeof(Border)); } - + /* Taskbar */ else if (strcmp (key, "taskbar_mode") == 0) { if (strcmp (value, "multi_desktop") == 0) panel.mode = MULTI_DESKTOP; @@ -315,9 +315,9 @@ void add_entry (char *key, char *value) } else if (strcmp (key, "taskbar_background_id") == 0) { int id = atoi (value); - Area *back = g_slist_nth_data(list_back, id); - memcpy(&g_taskbar.back, &back->back, sizeof(Color)); - memcpy(&g_taskbar.border, &back->border, sizeof(Border)); + Area *a = g_slist_nth_data(list_back, id); + memcpy(&g_taskbar.pix.back, &a->pix.back, sizeof(Color)); + memcpy(&g_taskbar.pix.border, &a->pix.border, sizeof(Border)); } /* Task */ @@ -332,10 +332,8 @@ void add_entry (char *key, char *value) else if (strcmp (key, "task_padding") == 0) { extract_values(value, &value1, &value2); g_task.area.paddingx = atoi (value1); - g_task.area_active.paddingx = atoi (value1); if (value2) { g_task.area.paddingy = atoi (value2); - g_task.area_active.paddingy = atoi (value2); } } else if (strcmp (key, "task_font") == 0) { @@ -356,15 +354,15 @@ void add_entry (char *key, char *value) } else if (strcmp (key, "task_background_id") == 0) { int id = atoi (value); - Area *back = g_slist_nth_data(list_back, id); - memcpy(&g_task.area.back, &back->back, sizeof(Color)); - memcpy(&g_task.area.border, &back->border, sizeof(Border)); + Area *a = g_slist_nth_data(list_back, id); + memcpy(&g_task.area.pix.back, &a->pix.back, sizeof(Color)); + memcpy(&g_task.area.pix.border, &a->pix.border, sizeof(Border)); } else if (strcmp (key, "task_active_background_id") == 0) { int id = atoi (value); - Area *back = g_slist_nth_data(list_back, id); - memcpy(&g_task.area_active.back, &back->back, sizeof(Color)); - memcpy(&g_task.area_active.border, &back->border, sizeof(Border)); + Area *a = g_slist_nth_data(list_back, id); + memcpy(&g_task.area.pix_active.back, &a->pix.back, sizeof(Color)); + memcpy(&g_task.area.pix_active.border, &a->pix.border, sizeof(Border)); } /* Mouse actions */ @@ -405,25 +403,25 @@ void add_entry (char *key, char *value) else if (strcmp (key, "panel_background") == 0) panel.old_panel_background = atoi (value); else if (strcmp (key, "panel_background_alpha") == 0) - panel.area.back.alpha = (atoi (value) / 100.0); + panel.area.pix.back.alpha = (atoi (value) / 100.0); else if (strcmp (key, "panel_border_alpha") == 0) - panel.area.border.alpha = (atoi (value) / 100.0); + panel.area.pix.border.alpha = (atoi (value) / 100.0); else if (strcmp (key, "task_icon") == 0) panel.old_task_icon = atoi (value); else if (strcmp (key, "task_background") == 0) panel.old_task_background = atoi (value); else if (strcmp (key, "task_background_alpha") == 0) - g_task.area.back.alpha = (atoi (value) / 100.0); + g_task.area.pix.back.alpha = (atoi (value) / 100.0); else if (strcmp (key, "task_active_background_alpha") == 0) - g_task.area_active.back.alpha = (atoi (value) / 100.0); + g_task.area.pix_active.back.alpha = (atoi (value) / 100.0); else if (strcmp (key, "task_border_alpha") == 0) - g_task.area.border.alpha = (atoi (value) / 100.0); + g_task.area.pix.border.alpha = (atoi (value) / 100.0); else if (strcmp (key, "task_active_border_alpha") == 0) - g_task.area_active.border.alpha = (atoi (value) / 100.0); + g_task.area.pix_active.border.alpha = (atoi (value) / 100.0); // disabled parameters else if (strcmp (key, "task_active_border_width") == 0) ; else if (strcmp (key, "task_active_rounded") == 0) ; - + else fprintf(stderr, "Invalid option: \"%s\", correct your config file\n", key); @@ -465,11 +463,11 @@ void config_taskbar() { int i, j; - if (g_task.area.border.rounded > g_task.area.height/2) { - g_task.area.border.rounded = g_task.area.height/2; - g_task.area_active.border.rounded = g_task.area.border.rounded; + if (g_task.area.pix.border.rounded > g_task.area.height/2) { + g_task.area.pix.border.rounded = g_task.area.height/2; + g_task.area.pix_active.border.rounded = g_task.area.pix.border.rounded; } - + for (i=0 ; i < 15 ; i++) { server.nb_desktop = server_get_number_of_desktop (); if (server.nb_desktop > 0) break; @@ -481,7 +479,7 @@ void config_taskbar() } if (panel.taskbar) cleanup_taskbar(); - + panel.nb_desktop = server.nb_desktop; if (panel.mode == MULTI_MONITOR) panel.nb_monitor = server.nb_monitor; else panel.nb_monitor = 1; @@ -496,14 +494,14 @@ void config_taskbar() memcpy(&tskbar->area, &g_taskbar, sizeof(Area)); tskbar->desktop = i; tskbar->monitor = j; - + // TODO: redefinir panel.area.list en fonction des objets visibles panel.area.list = g_slist_append(panel.area.list, tskbar); } } if (panel.clock.time1_format) panel.area.list = g_slist_append(panel.area.list, &panel.clock); - + //printf("taskbar (desktop x monitor) : (%d x %d)\n", panel.nb_desktop, panel.nb_monitor); resize_taskbar(); task_refresh_tasklist (); @@ -514,7 +512,7 @@ void config_taskbar() void config_finish () { int height_ink, height; - + if (panel.old_config_file) save_config(); // get monitor's configuration @@ -527,29 +525,28 @@ void config_finish () else { panel.sleep_mode = 0; //printf("tint2 wake up on monitor %d\n", panel.monitor+1); - if (!server.monitor[panel.monitor].width || !server.monitor[panel.monitor].height) + if (!server.monitor[panel.monitor].width || !server.monitor[panel.monitor].height) fprintf(stderr, "tint2 error : invalid monitor size.\n"); } if (!panel.area.width) panel.area.width = server.monitor[panel.monitor].width; - + // taskbar - g_taskbar.posy = panel.area.border.width + panel.area.paddingy; + g_taskbar.posy = panel.area.pix.border.width + panel.area.paddingy; g_taskbar.height = panel.area.height - (2 * g_taskbar.posy); g_taskbar.redraw = 1; - + // task - g_task.area.posy = g_taskbar.posy + g_taskbar.border.width + g_taskbar.paddingy; - g_task.area_active.posy = g_task.area.posy; + g_task.area.posy = g_taskbar.posy + g_taskbar.pix.border.width + g_taskbar.paddingy; g_task.area.height = panel.area.height - (2 * g_task.area.posy); - g_task.area_active.height = g_task.area.height; + g_task.area.use_active = 1; g_task.area.redraw = 1; if (!g_task.maximum_width) g_task.maximum_width = server.monitor[panel.monitor].width; - - if (panel.area.border.rounded > panel.area.height/2) - panel.area.border.rounded = panel.area.height/2; + + if (panel.area.pix.border.rounded > panel.area.height/2) + panel.area.pix.border.rounded = panel.area.height/2; // clock init_clock(&panel.clock, panel.area.height); @@ -559,13 +556,13 @@ void config_finish () g_task.text_posy = (g_task.area.height - height) / 2.0; // add task_icon_size - g_task.text_posx = g_task.area.paddingx + g_task.area.border.width; + g_task.text_posx = g_task.area.paddingx + g_task.area.pix.border.width; if (g_task.icon) { g_task.icon_size1 = g_task.area.height - (2 * g_task.area.paddingy); g_task.text_posx += g_task.icon_size1; g_task.icon_posy = (g_task.area.height - g_task.icon_size1) / 2; } - + config_taskbar(); visible_object(); @@ -588,23 +585,23 @@ int config_read () // check tint2rc file according to XDG specification path1 = g_build_filename (g_get_user_config_dir(), "tint2", "tint2rc", NULL); if (!g_file_test (path1, G_FILE_TEST_EXISTS)) { - + path2 = 0; system_dirs = g_get_system_config_dirs(); for (i = 0; system_dirs[i]; i++) { path2 = g_build_filename(system_dirs[i], "tint2", "tint2rc", NULL); - + if (g_file_test(path2, G_FILE_TEST_EXISTS)) break; g_free (path2); path2 = 0; } - + if (path2) { // copy file in user directory (path1) dir = g_build_filename (g_get_user_config_dir(), "tint2", NULL); if (!g_file_test (dir, G_FILE_TEST_IS_DIR)) g_mkdir(dir, 0777); g_free(dir); - + copy_file(path2, path1); g_free(path2); } @@ -620,9 +617,9 @@ int config_read_file (const char *path) { FILE *fp; char line[80]; - + if ((fp = fopen(path, "r")) == NULL) return 0; - + while (fgets(line, sizeof(line), fp) != NULL) parse_line (line); @@ -636,17 +633,17 @@ void save_config () fprintf(stderr, "tint2 warning : convert user's config file\n"); panel.area.paddingx = panel.area.paddingy = panel.marginx; panel.marginx = panel.marginy = 0; - + if (panel.old_task_icon == 0) g_task.icon_size1 = 0; - if (panel.old_panel_background == 0) panel.area.back.alpha = 0; + if (panel.old_panel_background == 0) panel.area.pix.back.alpha = 0; if (panel.old_task_background == 0) { - g_task.area.back.alpha = 0; - g_task.area_active.back.alpha = 0; + g_task.area.pix.back.alpha = 0; + g_task.area.pix_active.back.alpha = 0; } - g_task.area.border.rounded = g_task.area.border.rounded / 2; - g_task.area_active.border.rounded = g_task.area.border.rounded; - panel.area.border.rounded = panel.area.border.rounded / 2; - + g_task.area.pix.border.rounded = g_task.area.pix.border.rounded / 2; + g_task.area.pix_active.border.rounded = g_task.area.pix.border.rounded; + panel.area.pix.border.rounded = panel.area.pix.border.rounded / 2; + char *path; FILE *fp; @@ -654,7 +651,7 @@ void save_config () fp = fopen(path, "w"); g_free(path); if (fp == NULL) return; - + fputs("#---------------------------------------------\n", fp); fputs("# TINT CONFIG FILE\n", fp); fputs("#---------------------------------------------\n\n", fp); @@ -677,11 +674,11 @@ void save_config () fputs("\n#---------------------------------------------\n", fp); fputs("# PANEL BACKGROUND AND BORDER\n", fp); fputs("#---------------------------------------------\n", fp); - fprintf(fp, "panel_rounded = %d\n", panel.area.border.rounded); - fprintf(fp, "panel_border_width = %d\n", panel.area.border.width); - fprintf(fp, "panel_background_color = #%02x%02x%02x %d\n", (int)(panel.area.back.color[0]*255), (int)(panel.area.back.color[1]*255), (int)(panel.area.back.color[2]*255), (int)(panel.area.back.alpha*100)); - fprintf(fp, "panel_border_color = #%02x%02x%02x %d\n", (int)(panel.area.border.color[0]*255), (int)(panel.area.border.color[1]*255), (int)(panel.area.border.color[2]*255), (int)(panel.area.border.alpha*100)); - + fprintf(fp, "panel_rounded = %d\n", panel.area.pix.border.rounded); + fprintf(fp, "panel_border_width = %d\n", panel.area.pix.border.width); + fprintf(fp, "panel_background_color = #%02x%02x%02x %d\n", (int)(panel.area.pix.back.color[0]*255), (int)(panel.area.pix.back.color[1]*255), (int)(panel.area.pix.back.color[2]*255), (int)(panel.area.pix.back.alpha*100)); + fprintf(fp, "panel_border_color = #%02x%02x%02x %d\n", (int)(panel.area.pix.border.color[0]*255), (int)(panel.area.pix.border.color[1]*255), (int)(panel.area.pix.border.color[2]*255), (int)(panel.area.pix.border.alpha*100)); + fputs("\n#---------------------------------------------\n", fp); fputs("# TASKS\n", fp); fputs("#---------------------------------------------\n", fp); @@ -696,12 +693,12 @@ void save_config () fputs("\n#---------------------------------------------\n", fp); fputs("# TASK BACKGROUND AND BORDER\n", fp); fputs("#---------------------------------------------\n", fp); - fprintf(fp, "task_rounded = %d\n", g_task.area.border.rounded); - fprintf(fp, "task_background_color = #%02x%02x%02x %d\n", (int)(g_task.area.back.color[0]*255), (int)(g_task.area.back.color[1]*255), (int)(g_task.area.back.color[2]*255), (int)(g_task.area.back.alpha*100)); - fprintf(fp, "task_active_background_color = #%02x%02x%02x %d\n", (int)(g_task.area_active.back.color[0]*255), (int)(g_task.area_active.back.color[1]*255), (int)(g_task.area_active.back.color[2]*255), (int)(g_task.area_active.back.alpha*100)); - fprintf(fp, "task_border_width = %d\n", g_task.area.border.width); - fprintf(fp, "task_border_color = #%02x%02x%02x %d\n", (int)(g_task.area.border.color[0]*255), (int)(g_task.area.border.color[1]*255), (int)(g_task.area.border.color[2]*255), (int)(g_task.area.border.alpha*100)); - fprintf(fp, "task_active_border_color = #%02x%02x%02x %d\n", (int)(g_task.area_active.border.color[0]*255), (int)(g_task.area_active.border.color[1]*255), (int)(g_task.area_active.border.color[2]*255), (int)(g_task.area_active.border.alpha*100)); + fprintf(fp, "task_rounded = %d\n", g_task.area.pix.border.rounded); + fprintf(fp, "task_background_color = #%02x%02x%02x %d\n", (int)(g_task.area.pix.back.color[0]*255), (int)(g_task.area.pix.back.color[1]*255), (int)(g_task.area.pix.back.color[2]*255), (int)(g_task.area.pix.back.alpha*100)); + fprintf(fp, "task_active_background_color = #%02x%02x%02x %d\n", (int)(g_task.area.pix_active.back.color[0]*255), (int)(g_task.area.pix_active.back.color[1]*255), (int)(g_task.area.pix_active.back.color[2]*255), (int)(g_task.area.pix_active.back.alpha*100)); + fprintf(fp, "task_border_width = %d\n", g_task.area.pix.border.width); + fprintf(fp, "task_border_color = #%02x%02x%02x %d\n", (int)(g_task.area.pix.border.color[0]*255), (int)(g_task.area.pix.border.color[1]*255), (int)(g_task.area.pix.border.color[2]*255), (int)(g_task.area.pix.border.alpha*100)); + fprintf(fp, "task_active_border_color = #%02x%02x%02x %d\n", (int)(g_task.area.pix_active.border.color[0]*255), (int)(g_task.area.pix_active.border.color[1]*255), (int)(g_task.area.pix_active.border.color[2]*255), (int)(g_task.area.pix_active.border.alpha*100)); fputs("\n#---------------------------------------------\n", fp); fputs("# CLOCK\n", fp); @@ -728,14 +725,14 @@ void save_config () else if (panel.mouse_right == ICONIFY) fputs("mouse_right = iconify\n", fp); else if (panel.mouse_right == SHADE) fputs("mouse_right = shade\n", fp); else fputs("mouse_right = toggle_iconify\n", fp); - + if (panel.mouse_scroll_up == NONE) fputs("mouse_scroll_up = none\n", fp); else if (panel.mouse_scroll_up == CLOSE) fputs("mouse_scroll_up = close\n", fp); else if (panel.mouse_scroll_up == TOGGLE) fputs("mouse_scroll_up = toggle\n", fp); else if (panel.mouse_scroll_up == ICONIFY) fputs("mouse_scroll_up = iconify\n", fp); else if (panel.mouse_scroll_up == SHADE) fputs("mouse_scroll_up = shade\n", fp); else fputs("mouse_scroll_up = toggle_iconify\n", fp); - + if (panel.mouse_scroll_down == NONE) fputs("mouse_scroll_down = none\n", fp); else if (panel.mouse_scroll_down == CLOSE) fputs("mouse_scroll_down = close\n", fp); else if (panel.mouse_scroll_down == TOGGLE) fputs("mouse_scroll_down = toggle\n", fp); diff --git a/src/panel.c b/src/panel.c index 6dc2c8c..6e0b45c 100644 --- a/src/panel.c +++ b/src/panel.c @@ -31,12 +31,12 @@ void visual_refresh () { - if (!panel.area.pmap) - set_panel_background(); - + if (!panel.area.pix.pmap) + set_panel_background(); + if (server.pmap) XFreePixmap (server.dsp, server.pmap); server.pmap = server_create_pixmap (panel.area.width, panel.area.height); - XCopyArea (server.dsp, panel.area.pmap, server.pmap, server.gc, 0, 0, panel.area.width, panel.area.height, 0, 0); + XCopyArea (server.dsp, panel.area.pix.pmap, server.pmap, server.gc, 0, 0, panel.area.width, panel.area.height, 0, 0); // draw child object GSList *l = panel.area.list; @@ -61,7 +61,7 @@ void set_panel_properties (Window win) XChangeProperty(server.dsp, win, server.atom._NET_WM_NAME, server.atom.UTF8_STRING, 8, PropModeReplace, (unsigned char *) name, (int) len); g_free(name); } - + // Dock long val = server.atom._NET_WM_WINDOW_TYPE_DOCK; XChangeProperty (server.dsp, win, server.atom._NET_WM_WINDOW_TYPE, XA_ATOM, 32, PropModeReplace, (unsigned char *) &val, 1); @@ -81,7 +81,7 @@ void set_panel_properties (Window win) // Old specification : fluxbox need _NET_WM_STRUT. XChangeProperty (server.dsp, win, server.atom._NET_WM_STRUT, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &struts, 4); XChangeProperty (server.dsp, win, server.atom._NET_WM_STRUT_PARTIAL, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &struts, 12); - + // Sticky and below other window val = 0xFFFFFFFF; XChangeProperty (server.dsp, win, server.atom._NET_WM_DESKTOP, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &val, 1); @@ -90,19 +90,19 @@ void set_panel_properties (Window win) state[1] = server.atom._NET_WM_STATE_SKIP_TASKBAR; state[2] = server.atom._NET_WM_STATE_STICKY; state[3] = server.atom._NET_WM_STATE_BELOW; - XChangeProperty (server.dsp, win, server.atom._NET_WM_STATE, XA_ATOM, 32, PropModeReplace, (unsigned char *) state, 4); - + XChangeProperty (server.dsp, win, server.atom._NET_WM_STATE, XA_ATOM, 32, PropModeReplace, (unsigned char *) state, 4); + // Fixed position XSizeHints size_hints; size_hints.flags = PPosition; XChangeProperty (server.dsp, win, XA_WM_NORMAL_HINTS, XA_WM_SIZE_HINTS, 32, PropModeReplace, (unsigned char *) &size_hints, sizeof (XSizeHints) / 4); - + // Unfocusable XWMHints wmhints; wmhints.flags = InputHint; wmhints.input = False; XChangeProperty (server.dsp, win, XA_WM_HINTS, XA_WM_HINTS, 32, PropModeReplace, (unsigned char *) &wmhints, sizeof (XWMHints) / 4); - + // Undecorated long prop[5] = { 2, 0, 0, 0, 0 }; XChangeProperty(server.dsp, win, server.atom._MOTIF_WM_HINTS, server.atom._MOTIF_WM_HINTS, 32, PropModeReplace, (unsigned char *) prop, 5); @@ -124,7 +124,7 @@ void window_draw_panel () /* Catch some events */ XSetWindowAttributes att = { ParentRelative, 0L, 0, 0L, 0, 0, Always, 0L, 0L, False, ExposureMask|ButtonPressMask|ButtonReleaseMask, NoEventMask, False, 0, 0 }; - + // XCreateWindow(display, parent, x, y, w, h, border, depth, class, visual, mask, attrib) // main_win doesn't include panel.area.paddingx, so we have WM capabilities on left and right. if (window.main_win) XDestroyWindow(server.dsp, window.main_win); @@ -149,7 +149,7 @@ void visible_object() { if (panel.area.list) { g_slist_free(panel.area.list); - panel.area.list = 0; + panel.area.list = 0; } // list of visible objects @@ -163,7 +163,7 @@ void visible_object() for (j=0 ; j < panel.nb_monitor ; j++) { taskbar = &panel.taskbar[index(i,j)]; if (panel.mode != MULTI_DESKTOP && taskbar->desktop != server.desktop) continue; - + panel.area.list = g_slist_append(panel.area.list, taskbar); } } @@ -176,24 +176,24 @@ void set_panel_background() { Pixmap wall = get_root_pixmap(); - panel.area.pmap = server_create_pixmap (panel.area.width, panel.area.height); + panel.area.pix.pmap = server_create_pixmap (panel.area.width, panel.area.height); // add layer of root pixmap - XCopyArea (server.dsp, wall, panel.area.pmap, server.gc, server.posx, server.posy, panel.area.width, panel.area.height, 0, 0); + XCopyArea (server.dsp, wall, panel.area.pix.pmap, server.gc, server.posx, server.posy, panel.area.width, panel.area.height, 0, 0); // draw background panel cairo_surface_t *cs; cairo_t *c; - cs = cairo_xlib_surface_create (server.dsp, panel.area.pmap, server.visual, panel.area.width, panel.area.height); + cs = cairo_xlib_surface_create (server.dsp, panel.area.pix.pmap, server.visual, panel.area.width, panel.area.height); c = cairo_create (cs); - draw_background (&panel.area, c); - + draw_background (&panel.area, c, 0); + cairo_destroy (c); cairo_surface_destroy (cs); // copy background panel on desktop window - XCopyArea (server.dsp, panel.area.pmap, server.root_win, server.gc_root, 0, 0, panel.area.width, panel.area.height, server.posx, server.posy); + XCopyArea (server.dsp, panel.area.pix.pmap, server.root_win, server.gc_root, 0, 0, panel.area.width, panel.area.height, server.posx, server.posy); set_redraw (&panel.area); } diff --git a/src/server.c b/src/server.c index 82f51b8..aaa1863 100644 --- a/src/server.c +++ b/src/server.c @@ -1,10 +1,10 @@ /************************************************************************** * * Tint2 panel -* +* * Copyright (C) 2007 Pål Staurland (staura@gmail.com) * Modified (C) 2008 thierry lorthiois (lorthiois@bbsoft.fr) -* +* * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version 2 * as published by the Free Software Foundation. @@ -146,7 +146,7 @@ Pixmap get_root_pixmap () Pixmap ret; Window root = RootWindow(server.dsp, server.screen); - ret = None; + ret = None; int act_format, c = 2 ; u_long nitems ; u_long bytes_after ; @@ -176,7 +176,7 @@ Pixmap get_root_pixmap () Pixmap root_pixmap; unsigned long *res; - server.root_win = window_get_root(); + server.root_win = window_get_root(); res = server_get_property (server.root_win, server.atom._XROOTPMAP_ID, XA_PIXMAP, 0); if (res) { @@ -189,7 +189,7 @@ Pixmap get_root_pixmap () // try _XSETROOT_ID } return 0; -} +} */ @@ -198,20 +198,20 @@ void get_monitors() if (server.monitor) free(server.monitor); server.nb_monitor = 0; server.monitor = 0; - + if (XineramaIsActive(server.dsp)) { XineramaScreenInfo *info = XineramaQueryScreens(server.dsp, &server.nb_monitor); if (info) { int i; - + server.monitor = calloc(server.nb_monitor, sizeof(Monitor)); for (i = 0; i < server.nb_monitor; i++) { server.monitor[i].x = info[i].x_org; server.monitor[i].y = info[i].y_org; server.monitor[i].width = info[i].width; server.monitor[i].height = info[i].height; - } + } XFree(info); } } diff --git a/src/taskbar/task.c b/src/taskbar/task.c index 1bac2f6..7b52391 100644 --- a/src/taskbar/task.c +++ b/src/taskbar/task.c @@ -1,10 +1,10 @@ /************************************************************************** * * Tint2 : task -* +* * Copyright (C) 2007 Pål Staurland (staura@gmail.com) * Modified (C) 2008 thierry lorthiois (lorthiois@bbsoft.fr) -* +* * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version 2 * as published by the Free Software Foundation. @@ -45,20 +45,19 @@ void add_task (Window win) new_tsk->win = win; new_tsk->title = 0; new_tsk->icon_data = 0; - + get_icon(new_tsk); get_title(new_tsk); memcpy(&new_tsk->area, &g_task.area, sizeof(Area)); - memcpy(&new_tsk->area_active, &g_task.area_active, sizeof(Area)); desktop = window_get_desktop (new_tsk->win); monitor = window_get_monitor (new_tsk->win); - + //if (panel.mode == MULTI_MONITOR) monitor = window_get_monitor (new_tsk->win); //else monitor = 0; //printf("task %s : desktop %d, monitor %d\n", new_tsk->title, desktop, monitor); - + XSelectInput (server.dsp, new_tsk->win, PropertyChangeMask|StructureNotifyMask); - + if (desktop == 0xFFFFFFFF) { if (new_tsk->title) { free (new_tsk->title); @@ -72,10 +71,10 @@ void add_task (Window win) fprintf(stderr, "task on all desktop : ignored\n"); return; } - + //printf("add_task %d %s\n", index(desktop, monitor), new_tsk->title); Taskbar *tskbar; - tskbar = &panel.taskbar[index(desktop, monitor)]; + tskbar = &panel.taskbar[index(desktop, monitor)]; new_tsk->area.parent = tskbar; tskbar->area.list = g_slist_append(tskbar->area.list, new_tsk); @@ -87,7 +86,7 @@ void add_task (Window win) void remove_task (Task *tsk) { if (!tsk) return; - + Taskbar *tskbar; tskbar = (Taskbar*)tsk->area.parent; tskbar->area.list = g_slist_remove(tskbar->area.list, tsk); @@ -103,8 +102,8 @@ void remove_task (Task *tsk) free (tsk->icon_data); tsk->icon_data = 0; } - XFreePixmap (server.dsp, tsk->area.pmap); - XFreePixmap (server.dsp, tsk->area_active.pmap); + XFreePixmap (server.dsp, tsk->area.pix.pmap); + XFreePixmap (server.dsp, tsk->area.pix_active.pmap); free(tsk); } @@ -128,7 +127,7 @@ void get_title(Task *tsk) } // add space before title - title = malloc(strlen(name)+2); + title = malloc(strlen(name)+2); if (g_task.icon) strcpy(title, " "); else title[0] = 0; strcat(title, name); @@ -143,7 +142,7 @@ void get_title(Task *tsk) void get_icon (Task *tsk) { if (!g_task.icon) return; - + long *data; int num; @@ -159,7 +158,7 @@ void get_icon (Task *tsk) tsk->icon_height = h; tsk->icon_data = malloc (w * h * sizeof (long)); memcpy (tsk->icon_data, tmp_data, w * h * sizeof (long)); - + XFree (data); } else { @@ -180,11 +179,8 @@ void draw_task_icon (Task *tsk, int text_width, int active) if (tsk->icon_data == 0) get_icon (tsk); if (tsk->icon_data == 0) return; - Pixmap *pmap; - - if (active) pmap = &tsk->area_active.pmap; - else pmap = &tsk->area.pmap; - + Pixmap *pmap = (active == 0) ? (&tsk->area.pix.pmap) : (&tsk->area.pix_active.pmap); + /* Find pos */ int pos_x; if (g_task.centered) { @@ -193,8 +189,8 @@ void draw_task_icon (Task *tsk, int text_width, int active) else pos_x = (tsk->area.width - g_task.icon_size1) / 2; } - else pos_x = g_task.area.paddingx + g_task.area.border.width; - + else pos_x = g_task.area.paddingx + g_task.area.pix.border.width; + /* Render */ Imlib_Image icon; Imlib_Color_Modifier cmod; @@ -211,7 +207,7 @@ void draw_task_icon (Task *tsk, int text_width, int active) data[i] = tsk->icon_data[i]; } else data = (DATA32 *) tsk->icon_data; - + icon = imlib_create_image_using_data (tsk->icon_width, tsk->icon_height, data); imlib_context_set_image (icon); imlib_context_set_drawable (*pmap); @@ -222,59 +218,59 @@ void draw_task_icon (Task *tsk, int text_width, int active) imlib_get_color_modifier_tables (red, green, blue, alpha); int i, opacity; - if (active) opacity = 255*g_task.font_active.alpha; - else opacity = 255*g_task.font.alpha; - for(i = 127; i < 256; i++) alpha[i] = opacity; - + opacity = (active == 0) ? (255*g_task.font.alpha) : (255*g_task.font_active.alpha); + for (i = 127; i < 256; i++) alpha[i] = opacity; + imlib_set_color_modifier_tables (red, green, blue, alpha); - + //imlib_render_image_on_drawable (pos_x, pos_y); imlib_render_image_on_drawable_at_size (pos_x, g_task.icon_posy, g_task.icon_size1, g_task.icon_size1); - + imlib_free_color_modifier (); imlib_free_image (); if (sizeof(long) != 4) free(data); } -void draw_task_title (cairo_t *c, Task *tsk, int active) +void draw_foreground_task (void *obj, cairo_t *c, int active) { + Task *tsk = obj; PangoLayout *layout; config_color *config_text; int width, height; - + if (g_task.text) { - /* Layout */ - layout = pango_cairo_create_layout (c); - pango_layout_set_font_description (layout, g_task.font_desc); - pango_layout_set_text (layout, tsk->title, -1); + /* Layout */ + layout = pango_cairo_create_layout (c); + pango_layout_set_font_description (layout, g_task.font_desc); + pango_layout_set_text (layout, tsk->title, -1); - /* Drawing width and Cut text */ - pango_layout_set_width (layout, ((Taskbar*)tsk->area.parent)->text_width * PANGO_SCALE); - pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END); + /* Drawing width and Cut text */ + pango_layout_set_width (layout, ((Taskbar*)tsk->area.parent)->text_width * PANGO_SCALE); + pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END); - /* Center text */ - if (g_task.centered) pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER); - else pango_layout_set_alignment (layout, PANGO_ALIGN_LEFT); + /* Center text */ + if (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); - if (active) config_text = &g_task.font_active; - else config_text = &g_task.font; + if (active) config_text = &g_task.font_active; + else config_text = &g_task.font; - cairo_set_source_rgba (c, config_text->color[0], config_text->color[1], config_text->color[2], config_text->alpha); + cairo_set_source_rgba (c, config_text->color[0], config_text->color[1], config_text->color[2], config_text->alpha); - pango_cairo_update_layout (c, layout); - cairo_move_to (c, g_task.text_posx, g_task.text_posy); - pango_cairo_show_layout (c, layout); + pango_cairo_update_layout (c, layout); + cairo_move_to (c, g_task.text_posx, g_task.text_posy); + pango_cairo_show_layout (c, layout); - if (g_task.font_shadow) { - cairo_set_source_rgba (c, 0.0, 0.0, 0.0, 0.5); - pango_cairo_update_layout (c, layout); - cairo_move_to (c, g_task.text_posx + 1, g_task.text_posy + 1); - pango_cairo_show_layout (c, layout); - } - g_object_unref (layout); + if (g_task.font_shadow) { + cairo_set_source_rgba (c, 0.0, 0.0, 0.0, 0.5); + pango_cairo_update_layout (c, layout); + cairo_move_to (c, g_task.text_posx + 1, g_task.text_posy + 1); + pango_cairo_show_layout (c, layout); + } + g_object_unref (layout); } if (g_task.icon) { @@ -283,39 +279,3 @@ void draw_task_title (cairo_t *c, Task *tsk, int active) } } - -void draw_background_task (void *obj, cairo_t *c) -{ - Task *tsk = obj; - - draw_background (&tsk->area_active, c); - draw_background (&tsk->area_inactive, c); -} - - -void draw_foreground_task (void *obj, cairo_t *c) -{ - Task *tsk = obj; - cairo_surface_t *cs; - cairo_t *ca; - //printf(" draw_foreground_task\n"); - - draw_task_title (c, tsk, 0); - - // draw active pmap - if (tsk->area_active.pmap) XFreePixmap (server.dsp, tsk->area_active.pmap); - tsk->area_active.pmap = server_create_pixmap (tsk->area.width, tsk->area.height); - - // add layer of root pixmap - XCopyArea (server.dsp, server.pmap, tsk->area_active.pmap, server.gc, tsk->area.posx, tsk->area.posy, tsk->area.width, tsk->area.height, 0, 0); - - cs = cairo_xlib_surface_create (server.dsp, tsk->area_active.pmap, server.visual, tsk->area.width, tsk->area.height); - ca = cairo_create (cs); - - // redraw task - draw_task_title (ca, tsk, 1); - - cairo_destroy (ca); - cairo_surface_destroy (cs); -} - diff --git a/src/taskbar/task.h b/src/taskbar/task.h index 054eb80..ec1544d 100644 --- a/src/taskbar/task.h +++ b/src/taskbar/task.h @@ -1,6 +1,6 @@ /************************************************************************** -* task : -* - +* task : +* - * **************************************************************************/ @@ -16,9 +16,7 @@ // global task parameter typedef struct { Area area; - Area area_active; - Area area_inactive; - + int text; int icon; int icon_size1; @@ -41,8 +39,6 @@ typedef struct { typedef struct { // always start with area Area area; - Area area_active; - Area area_inactive; // TODO: group task with list of windows here Window win; @@ -59,7 +55,7 @@ Global_task g_task; void add_task (Window win); void remove_task (Task *tsk); -void draw_foreground_task (void *obj, cairo_t *c); +void draw_foreground_task (void *obj, cairo_t *c, int active); void get_icon (Task *tsk); void get_title(Task *tsk); diff --git a/src/taskbar/taskbar.c b/src/taskbar/taskbar.c index 9367ddc..7118182 100644 --- a/src/taskbar/taskbar.c +++ b/src/taskbar/taskbar.c @@ -1,9 +1,9 @@ /************************************************************************** * * Tint2 : taskbar -* +* * Copyright (C) 2008 thierry lorthiois (lorthiois@bbsoft.fr) -* +* * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version 2 * as published by the Free Software Foundation. @@ -38,7 +38,7 @@ Task *task_get_task (Window win) Task *tsk; GSList *l0; int i, nb; - + nb = panel.nb_desktop * panel.nb_monitor; for (i=0 ; i < nb ; i++) { for (l0 = panel.taskbar[i].area.list; l0 ; l0 = l0->next) { @@ -60,9 +60,13 @@ void task_refresh_tasklist () win = server_get_property (server.root_win, server.atom._NET_CLIENT_LIST, XA_WINDOW, &num_results); if (!win) return; - + // Remove any old and set active win active_win = window_get_active (); + if (panel.task_active) { + panel.task_active->area.is_active = 0; + panel.task_active = 0; + } nb = panel.nb_desktop * panel.nb_monitor; for (i=0 ; i < nb ; i++) { @@ -71,8 +75,11 @@ void task_refresh_tasklist () tsk = l0->data; l0 = l0->next; - if (tsk->win == active_win) panel.task_active = tsk; - + if (tsk->win == active_win) { + tsk->area.is_active = 1; + panel.task_active = tsk; + } + for (j = 0; j < num_results; j++) { if (tsk->win == win[j]) break; } @@ -82,8 +89,8 @@ void task_refresh_tasklist () } // Add any new - for (i = 0; i < num_results; i++) - if (!task_get_task (win[i])) + for (i = 0; i < num_results; i++) + if (!task_get_task (win[i])) add_task (win[i]); XFree (win); @@ -101,7 +108,7 @@ int resize_tasks (Taskbar *taskbar) task_count = g_slist_length(taskbar->area.list); if (!task_count) pixel_width = g_task.maximum_width; else { - taskbar_width = taskbar->area.width - (2 * g_taskbar.border.width) - ((task_count+1) * g_taskbar.paddingx); + taskbar_width = taskbar->area.width - (2 * g_taskbar.pix.border.width) - ((task_count+1) * g_taskbar.paddingx); pixel_width = taskbar_width / task_count; if (pixel_width > g_task.maximum_width) pixel_width = g_task.maximum_width; @@ -115,20 +122,17 @@ int resize_tasks (Taskbar *taskbar) ret = 1; taskbar->task_width = pixel_width; taskbar->task_modulo = modulo_width; - taskbar->text_width = pixel_width - g_task.text_posx - g_task.area.border.width - g_task.area.paddingx; + taskbar->text_width = pixel_width - g_task.text_posx - g_task.area.pix.border.width - g_task.area.paddingx; } - + // change pos_x and width for all tasks - x = taskbar->area.posx + taskbar->area.border.width + taskbar->area.paddingx; + x = taskbar->area.posx + taskbar->area.pix.border.width + taskbar->area.paddingx; for (l = taskbar->area.list; l ; l = l->next) { tsk = l->data; tsk->area.posx = x; - tsk->area_active.posx = x; tsk->area.width = pixel_width; - tsk->area_active.width = pixel_width; if (modulo_width) { tsk->area.width++; - tsk->area_active.width++; modulo_width--; } @@ -145,22 +149,22 @@ void resize_taskbar() if (panel.mode == MULTI_DESKTOP) taskbar_on_screen = panel.nb_desktop; else taskbar_on_screen = panel.nb_monitor; - - taskbar_width = panel.area.width - (2 * panel.area.paddingx) - (2 * panel.area.border.width); - if (panel.clock.time1_format) + + taskbar_width = panel.area.width - (2 * panel.area.paddingx) - (2 * panel.area.pix.border.width); + if (panel.clock.time1_format) taskbar_width -= (panel.clock.area.width + panel.area.paddingx); taskbar_width = (taskbar_width - ((taskbar_on_screen-1) * panel.area.paddingx)) / taskbar_on_screen; if (taskbar_on_screen > 1) modulo_width = (taskbar_width - ((taskbar_on_screen-1) * panel.area.paddingx)) % taskbar_on_screen; - else + else modulo_width = 0; - - int posx, modulo, i, nb; + + int i, nb, modulo=0, posx=0; nb = panel.nb_desktop * panel.nb_monitor; for (i=0 ; i < nb ; i++) { if ((i % taskbar_on_screen) == 0) { - posx = panel.area.border.width + panel.area.paddingx; + posx = panel.area.pix.border.width + panel.area.paddingx; modulo = modulo_width; } else posx += taskbar_width + panel.area.paddingx; @@ -171,7 +175,7 @@ void resize_taskbar() panel.taskbar[i].area.width++; modulo--; } - + resize_tasks(&panel.taskbar[i]); } } diff --git a/src/tint.c b/src/tint.c index 8bf2127..badfa7f 100644 --- a/src/tint.c +++ b/src/tint.c @@ -1,10 +1,10 @@ /************************************************************************** * * Tint2 panel -* +* * Copyright (C) 2007 Pål Staurland (staura@gmail.com) * Modified (C) 2008 thierry lorthiois (lorthiois@bbsoft.fr) -* +* * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version 2 * as published by the Free Software Foundation. @@ -63,7 +63,7 @@ void init () panel.clock.area.draw_foreground = draw_foreground_clock; g_task.area.draw_foreground = draw_foreground_task; window.main_win = 0; - + server.dsp = XOpenDisplay (NULL); if (!server.dsp) { fprintf(stderr, "Could not open display.\n"); @@ -85,7 +85,7 @@ void init () //kde_init(); //net_init(); //printf("ici 4\n"); - + imlib_context_set_display (server.dsp); imlib_context_set_visual (server.visual); imlib_context_set_colormap (DefaultColormap (server.dsp, server.screen)); @@ -121,13 +121,13 @@ void window_action (Task *tsk, int action) void event_button_press (int x, int y) -{ +{ if (panel.mode == SINGLE_DESKTOP) { // drag and drop disabled XLowerWindow (server.dsp, window.main_win); return; } - + Taskbar *tskbar; GSList *l0; for (l0 = panel.area.list; l0 ; l0 = l0->next) { @@ -146,7 +146,7 @@ void event_button_press (int x, int y) } } } - + XLowerWindow (server.dsp, window.main_win); } @@ -171,7 +171,7 @@ void event_button_release (int button, int x, int y) action = panel.mouse_scroll_down; break; } - + // search taskbar Taskbar *tskbar; GSList *l0; @@ -191,14 +191,14 @@ suite: if (panel.task_drag) { if (tskbar != panel.task_drag->area.parent && action == TOGGLE_ICONIFY) { windows_set_desktop(panel.task_drag->win, tskbar->desktop); - if (tskbar->desktop == server.desktop) + if (tskbar->desktop == server.desktop) set_active(panel.task_drag->win); panel.task_drag = 0; return; } else panel.task_drag = 0; } - + // switch desktop if (panel.mode == MULTI_DESKTOP) if (tskbar->desktop != server.desktop && action != CLOSE) @@ -214,15 +214,15 @@ suite: break; } } - + // to keep window below XLowerWindow (server.dsp, window.main_win); } void event_property_notify (Window win, Atom at) -{ - +{ + if (win == server.root_win) { if (!server.got_root_win) { XSelectInput (server.dsp, server.root_win, PropertyChangeMask|StructureNotifyMask); @@ -246,22 +246,29 @@ void event_property_notify (Window win, Atom at) task_refresh_tasklist (); panel.refresh = 1; } - /* Active */ + /* Change active */ else if (at == server.atom._NET_ACTIVE_WINDOW) { + if (panel.task_active) { + panel.task_active->area.is_active = 0; + panel.task_active = 0; + } Window w1 = window_get_active (); Task *t = task_get_task(w1); - if (t) panel.task_active = t; - else { + if (!t) { Window w2; if (XGetTransientForHint(server.dsp, w1, &w2) != 0) - if (w2) panel.task_active = task_get_task(w2); + if (w2) t = task_get_task(w2); } + if (t) { + t->area.is_active = 1; + panel.task_active = t; + } panel.refresh = 1; } /* Wallpaper changed */ else if (at == server.atom._XROOTPMAP_ID) { - XFreePixmap (server.dsp, panel.area.pmap); - panel.area.pmap = 0; + XFreePixmap (server.dsp, panel.area.pix.pmap); + panel.area.pix.pmap = 0; panel.refresh = 1; } } @@ -280,7 +287,10 @@ void event_property_notify (Window win, Atom at) /* Iconic state */ else if (at == server.atom.WM_STATE) { if (window_is_iconified (win)) - if (panel.task_active == tsk) panel.task_active = 0; + if (panel.task_active == tsk) { + tsk->area.is_active = 0; + panel.task_active = 0; + } } /* Window icon changed */ else if (at == server.atom._NET_WM_ICON) { @@ -294,7 +304,7 @@ void event_property_notify (Window win, Atom at) /* Window desktop changed */ else if (at == server.atom._NET_WM_DESKTOP) { add_task (tsk->win); - remove_task (tsk); + remove_task (tsk); panel.refresh = 1; } @@ -304,14 +314,14 @@ void event_property_notify (Window win, Atom at) void event_configure_notify (Window win) -{ +{ Task *tsk; tsk = task_get_task (win); if (!tsk) return; - + Taskbar *tskbar = tsk->area.parent; - if (tskbar->monitor != window_get_monitor (win)) { + if (tskbar->monitor != window_get_monitor (win)) { // task on another monitor add_task (tsk->win); remove_task (tsk); @@ -325,11 +335,11 @@ void event_timer() struct timeval stv; if (!panel.clock.time1_format) return; - + if (gettimeofday(&stv, 0)) return; - + if (abs(stv.tv_sec - panel.clock.clock.tv_sec) < panel.clock.time_precision) return; - + // update clock panel.clock.clock.tv_sec = stv.tv_sec; panel.clock.clock.tv_sec -= panel.clock.clock.tv_sec % panel.clock.time_precision; @@ -349,8 +359,8 @@ int main (int argc, char *argv[]) init (); load_config: - if (panel.area.pmap) XFreePixmap (server.dsp, panel.area.pmap); - panel.area.pmap = 0; + if (panel.area.pix.pmap) XFreePixmap (server.dsp, panel.area.pix.pmap); + panel.area.pix.pmap = 0; // append full transparency background list_back = g_slist_append(0, calloc(1, sizeof(Area))); @@ -366,15 +376,15 @@ load_config: exit(1); } config_finish (); - + window_draw_panel (); - + // BUG: refresh(clock) is needed here, but 'on the paper' it's not necessary. refresh(&panel.clock.area); x11_fd = ConnectionNumber (server.dsp); XSync (server.dsp, False); - + while (1) { // thanks to AngryLlama for the timer // Create a File Description Set containing x11_fd @@ -383,12 +393,12 @@ load_config: tv.tv_usec = 500000; tv.tv_sec = 0; - + // Wait for X Event or a Timer if (select(x11_fd+1, &fd, 0, 0, &tv)) { while (XPending (server.dsp)) { XNextEvent(server.dsp, &e); - + switch (e.type) { case ButtonPress: if (e.xbutton.button == 1) event_button_press (e.xbutton.x, e.xbutton.y); @@ -397,9 +407,9 @@ load_config: case ButtonRelease: event_button_release (e.xbutton.button, e.xbutton.x, e.xbutton.y); break; - + case Expose: - XCopyArea (server.dsp, panel.area.pmap, server.root_win, server.gc_root, 0, 0, panel.area.width, panel.area.height, server.posx, server.posy); + XCopyArea (server.dsp, panel.area.pix.pmap, server.root_win, server.gc_root, 0, 0, panel.area.width, panel.area.height, server.posx, server.posy); XCopyArea (server.dsp, server.pmap, window.main_win, server.gc, panel.area.paddingx, 0, panel.area.width-(2*panel.area.paddingx), panel.area.height, 0, 0); break; @@ -412,8 +422,8 @@ load_config: if (e.xconfigure.window == server.root_win) goto load_config; else - if (panel.mode == MULTI_MONITOR) - event_configure_notify (e.xconfigure.window); + if (panel.mode == MULTI_MONITOR) + event_configure_notify (e.xconfigure.window); break; } } @@ -432,7 +442,7 @@ load_config: if (panel.refresh && !panel.sleep_mode) { visual_refresh (); //printf(" *** visual_refresh\n"); - } + } } } diff --git a/src/tint2 b/src/tint2 index 4384d3479fbaf88af98a6a57fb9401aab663cd29..6bdf2d3e1c6d292f836a86f1c9969cd12e0e6b91 100755 GIT binary patch literal 47528 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 Q9cx^{Cs(Z=F$f#n8w)|LQ~&?~ literal 55716 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 { - if (a->draw) - a->draw(a); - else - draw(a); - } - - XCopyArea (server.dsp, a->pmap, server.pmap, server.gc, 0, 0, a->width, a->height, a->posx, a->posy); - + //printf("draw pix\n"); + draw(a, 0); + if (a->use_active) + draw(a, 1); + a->redraw = 0; + //printf("end draw pix\n"); + } + + Pixmap *pmap = (a->is_active == 0) ? (&a->pix.pmap) : (&a->pix_active.pmap); + + // draw current Area + XCopyArea (server.dsp, *pmap, server.pmap, server.gc, 0, 0, a->width, a->height, a->posx, a->posy); + + // and then refresh child object GSList *l = a->list; - // refresh child object (after refreshing parent) for (; l ; l = l->next) refresh(l->data); - - //printf("end refresh area\n"); } void set_redraw (Area *a) { a->redraw = 1; - + GSList *l; - for (l = a->list ; l ; l = l->next) + for (l = a->list ; l ; l = l->next) set_redraw(l->data); } -void draw (Area *a) +void draw (Area *a, int active) { - cairo_surface_t *cs; - cairo_t *c; - + Pixmap *pmap = (active == 0) ? (&a->pix.pmap) : (&a->pix_active.pmap); + //printf("begin draw area\n"); - if (a->pmap) XFreePixmap (server.dsp, a->pmap); - a->pmap = server_create_pixmap (a->width, a->height); + if (*pmap) XFreePixmap (server.dsp, *pmap); + *pmap = server_create_pixmap (a->width, a->height); // add layer of root pixmap - XCopyArea (server.dsp, server.pmap, a->pmap, server.gc, a->posx, a->posy, a->width, a->height, 0, 0); + XCopyArea (server.dsp, server.pmap, *pmap, server.gc, a->posx, a->posy, a->width, a->height, 0, 0); - cs = cairo_xlib_surface_create (server.dsp, a->pmap, server.visual, a->width, a->height); + cairo_surface_t *cs; + cairo_t *c; + + cs = cairo_xlib_surface_create (server.dsp, *pmap, server.visual, a->width, a->height); c = cairo_create (cs); - draw_background (a, c); - + draw_background (a, c, active); + if (a->draw_foreground) - a->draw_foreground(a, c); + a->draw_foreground(a, c, active); cairo_destroy (c); cairo_surface_destroy (cs); - a->redraw = 0; } -void draw_background (Area *a, cairo_t *c) +void draw_background (Area *a, cairo_t *c, int active) { - if (a->back.alpha > 0.0) { - //printf(" draw_background %d %d\n", a->width, a->height); - draw_rect(c, a->border.width, a->border.width, a->width-(2.0 * a->border.width), a->height-(2.0*a->border.width), a->border.rounded - a->border.width/1.571); - cairo_set_source_rgba(c, a->back.color[0], a->back.color[1], a->back.color[2], a->back.alpha); - + Pmap *pix = (active == 0) ? (&a->pix) : (&a->pix_active); + + if (pix->back.alpha > 0.0) { + //printf(" draw_background (%d %d) RGBA (%lf, %lf, %lf, %lf)\n", a->posx, a->posy, pix->back.color[0], pix->back.color[1], pix->back.color[2], pix->back.alpha); + draw_rect(c, pix->border.width, pix->border.width, a->width-(2.0 * pix->border.width), a->height-(2.0*pix->border.width), pix->border.rounded - pix->border.width/1.571); + cairo_set_source_rgba(c, pix->back.color[0], pix->back.color[1], pix->back.color[2], pix->back.alpha); + cairo_fill(c); } - if (a->border.width > 0 && a->border.alpha > 0.0) { - cairo_set_line_width (c, a->border.width); + if (pix->border.width > 0 && pix->border.alpha > 0.0) { + cairo_set_line_width (c, pix->border.width); // draw border inside (x, y, width, height) - draw_rect(c, a->border.width/2.0, a->border.width/2.0, a->width - a->border.width, a->height - a->border.width, a->border.rounded); + draw_rect(c, pix->border.width/2.0, pix->border.width/2.0, a->width - pix->border.width, a->height - pix->border.width, pix->border.rounded); /* // convert : radian = degre * M_PI/180 // définir le dégradé dans un carré de (0,0) (100,100) @@ -116,7 +122,7 @@ void draw_background (Area *a, cairo_t *c) degre = 45; // et ensuite faire la changement d'unité du repère // car ce qui doit resté inchangée est les traits et pas la direction - + // il faut d'abord appliquer une rotation de 90° (et -180° si l'angle est supérieur à 180°) // ceci peut être appliqué une fois pour toute au départ // ensuite calculer l'angle dans le nouveau repère @@ -125,21 +131,21 @@ void draw_background (Area *a, cairo_t *c) x1 = X1 * ((double)a->width / 100); y0 = Y0 * ((double)a->height / 100); y1 = Y1 * ((double)a->height / 100); - + x0 = X0 * ((double)a->height / 100); x1 = X1 * ((double)a->height / 100); y0 = Y0 * ((double)a->width / 100); y1 = Y1 * ((double)a->width / 100); printf("repère (%d, %d) points (%lf, %lf) (%lf, %lf)\n", a->width, a->height, x0, y0, x1, y1); - + cairo_pattern_t *linpat; linpat = cairo_pattern_create_linear (x0, y0, x1, y1); cairo_pattern_add_color_stop_rgba (linpat, 0, a->border.color[0], a->border.color[1], a->border.color[2], a->border.alpha); cairo_pattern_add_color_stop_rgba (linpat, 1, a->border.color[0], a->border.color[1], a->border.color[2], 0); cairo_set_source (c, linpat); */ - cairo_set_source_rgba (c, a->border.color[0], a->border.color[1], a->border.color[2], a->border.alpha); - + cairo_set_source_rgba (c, pix->border.color[0], pix->border.color[1], pix->border.color[2], pix->border.alpha); + cairo_stroke (c); //cairo_pattern_destroy (linpat); } @@ -149,7 +155,7 @@ void draw_background (Area *a, cairo_t *c) void remove_area (Area *a) { Area *parent; - + parent = (Area*)a->parent; parent->list = g_slist_remove(parent->list, a); set_redraw (parent); @@ -160,7 +166,7 @@ void remove_area (Area *a) void add_area (Area *a) { Area *parent; - + parent = (Area*)a->parent; parent->list = g_slist_remove(parent->list, a); set_redraw (parent); @@ -171,12 +177,12 @@ void add_area (Area *a) void free_area (Area *a) { GSList *l0; - for (l0 = a->list; l0 ; l0 = l0->next) + for (l0 = a->list; l0 ; l0 = l0->next) free_area (l0->data); if (a->list) { g_slist_free(a->list); - a->list = 0; + a->list = 0; } } diff --git a/src/util/area.h b/src/util/area.h index 0499e1a..9a29ebd 100644 --- a/src/util/area.h +++ b/src/util/area.h @@ -1,26 +1,28 @@ /************************************************************************** * Copyright (C) 2008 thierry lorthiois (lorthiois@bbsoft.fr) -* +* * base class for all graphical objects (panel, taskbar, task, systray, clock, ...). -* Area is at the begining of each graphical object so &object == &area. -* +* Area is at the begining of each object (&object == &area). +* * Area manage the background and border drawing, size and padding. -* Area also manage the tree of visible objects +* Each Area have 2 Pixmap (pix and pix_active). +* +* Area also manage the tree of visible objects. Parent object drawn before child object. * panel -> taskbars -> tasks * -> systray -> icons * -> clock -* -* draw_foreground(obj) and draw(obj) are virtual function. -* +* +* draw_foreground(obj) is virtual function. +* +* TODO : * resize_width(obj, width) = 0 : fonction virtuelle à redéfinir * recalcule la largeur de l'objet (car la hauteur est fixe) * - taille systray calculée à partir de la liste des icones * - taille clock calculée à partir de l'heure * - taille d'une tache calculée à partir de la taskbar (ajout, suppression, taille) * - taille d'une taskbar calculée à partir de la taille du panel et des autres objets -* +* * voir resize_taskbar(), resize_clock() et resize_tasks() -* variable widthChanged ou bien emission d'un signal ??? * voir config(obj) configure un objet (définie les positions verticales) * **************************************************************************/ @@ -34,7 +36,6 @@ #include "common.h" - typedef struct { double color[3]; @@ -51,31 +52,37 @@ typedef struct } Color; +typedef struct +{ + Pixmap pmap; + Color back; + Border border; +} Pmap; + + +// TODO: isoler 'draw' de 'refresh' +// TODO: isoler les données locales des données communes aux freres typedef struct { - // TODO: isoler 'draw' de 'refresh' - // TODO: isoler les données locales des données communes aux freres // absolute coordinate in panel int posx, posy; int width, height; - Pixmap pmap; + Pmap pix; + Pmap pix_active; // list of child : Area object GSList *list; - + // need redraw Pixmap - int redraw; - int paddingx, paddingy; + int redraw; + int use_active, is_active; + int paddingx, paddingy; // parent Area void *parent; - - Color back; - Border border; - + // each object can overwrite following function - void (*draw)(void *obj); - void (*draw_foreground)(void *obj, cairo_t *c); + void (*draw_foreground)(void *obj, cairo_t *c, int active); void (*add_child)(void *obj); - int (*remove_child)(void *obj); + int (*remove_child)(void *obj); } Area; @@ -85,8 +92,10 @@ void refresh (Area *a); // set 'redraw' on an area and childs void set_redraw (Area *a); -void draw (Area *a); -void draw_background (Area *a, cairo_t *c); + +// draw pixmap and pixmap_active +void draw (Area *a, int active); +void draw_background (Area *a, cairo_t *c, int active); void remove_area (Area *a); void add_area (Area *a); -- 2.45.2