]>
Dogcows Code - chaz/tint2/blob - src/taskbar/taskbar.c
204491243b67d364be100f63565b77dc7794b695
1 /**************************************************************************
5 * Copyright (C) 2008 thierry lorthiois (lorthiois@bbsoft.fr)
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License version 2
9 * as published by the Free Software Foundation.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 **************************************************************************/
21 #include <X11/Xutil.h>
22 #include <X11/Xatom.h>
42 for (i
=0 ; i
< nb_panel
; i
++) {
46 panel
->g_taskbar
.posy
= panel
->area
.pix
.border
.width
+ panel
->area
.paddingy
;
47 panel
->g_taskbar
.height
= panel
->area
.height
- (2 * panel
->g_taskbar
.posy
);
48 panel
->g_taskbar
.redraw
= 1;
51 panel
->g_task
.area
.draw_foreground
= draw_foreground_task
;
52 panel
->g_task
.area
.posy
= panel
->g_taskbar
.posy
+ panel
->g_taskbar
.pix
.border
.width
+ panel
->g_taskbar
.paddingy
;
53 panel
->g_task
.area
.height
= panel
->area
.height
- (2 * panel
->g_task
.area
.posy
);
54 panel
->g_task
.area
.use_active
= 1;
55 panel
->g_task
.area
.redraw
= 1;
57 if (panel
->g_task
.area
.pix
.border
.rounded
> panel
->g_task
.area
.height
/2) {
58 panel
->g_task
.area
.pix
.border
.rounded
= panel
->g_task
.area
.height
/2;
59 panel
->g_task
.area
.pix_active
.border
.rounded
= panel
->g_task
.area
.pix
.border
.rounded
;
62 // compute vertical position : text and icon
63 int height_ink
, height
;
64 get_text_size(panel
->g_task
.font_desc
, &height_ink
, &height
, panel
->area
.height
, "TAjpg", 5);
66 if (!panel
->g_task
.maximum_width
)
67 panel
->g_task
.maximum_width
= server
.monitor
[panel
->monitor
].width
;
70 panel
->g_task
.text_posx
= panel
->g_task
.area
.paddingxlr
+ panel
->g_task
.area
.pix
.border
.width
;
71 panel
->g_task
.text_posy
= (panel
->g_task
.area
.height
- height
) / 2.0;
72 if (panel
->g_task
.icon
) {
73 panel
->g_task
.icon_size1
= panel
->g_task
.area
.height
- (2 * panel
->g_task
.area
.paddingy
);
74 panel
->g_task
.text_posx
+= panel
->g_task
.icon_size1
;
75 panel
->g_task
.icon_posy
= (panel
->g_task
.area
.height
- panel
->g_task
.icon_size1
) / 2;
77 //printf("monitor %d, task_maximum_width %d\n", panel->monitor, panel->g_task.maximum_width);
80 panel
->nb_desktop
= server
.nb_desktop
;
81 panel
->taskbar
= calloc(panel
->nb_desktop
, sizeof(Taskbar
));
82 for (j
=0 ; j
< panel
->nb_desktop
; j
++) {
83 tskbar
= &panel
->taskbar
[j
];
84 memcpy(&tskbar
->area
, &panel
->g_taskbar
, sizeof(Area
));
88 resize_taskbar(panel
);
94 void cleanup_taskbar()
101 for (i
=0 ; i
< nb_panel
; i
++) {
104 for (j
=0 ; j
< panel
->nb_desktop
; j
++) {
105 l0
= panel
->taskbar
[j
].area
.list
;
109 // careful : remove_task change l0->next
112 free_area (&panel
->taskbar
[j
].area
);
116 for (i
=0 ; i
< nb_panel
; i
++) {
118 free(panel
->taskbar
);
124 Task
*task_get_task (Window win
)
130 for (i
=0 ; i
< nb_panel
; i
++) {
131 for (j
=0 ; j
< panel1
[i
].nb_desktop
; j
++) {
132 for (l0
= panel1
[i
].taskbar
[j
].area
.list
; l0
; l0
= l0
->next
) {
143 void task_refresh_tasklist ()
145 Window
*win
, active_win
;
146 int num_results
, i
, j
, k
;
150 win
= server_get_property (server
.root_win
, server
.atom
._NET_CLIENT_LIST
, XA_WINDOW
, &num_results
);
154 // Remove any old and set active win
155 active_win
= window_get_active ();
157 task_active
->area
.is_active
= 0;
161 for (i
=0 ; i
< nb_panel
; i
++) {
162 for (j
=0 ; j
< panel1
[i
].nb_desktop
; j
++) {
163 l0
= panel1
[i
].taskbar
[j
].area
.list
;
168 if (tsk
->win
== active_win
) {
169 tsk
->area
.is_active
= 1;
173 for (k
= 0; k
< num_results
; k
++) {
174 if (tsk
->win
== win
[k
]) break;
176 // careful : remove_task change l0->next
177 if (tsk
->win
!= win
[k
]) remove_task (tsk
);
183 for (i
= 0; i
< num_results
; i
++)
184 if (!task_get_task (win
[i
]))
191 int resize_tasks (Taskbar
*taskbar
)
193 int ret
, task_count
, pixel_width
, modulo_width
=0;
194 int x
, taskbar_width
;
196 Panel
*panel
= (Panel
*)taskbar
->area
.panel
;
199 // new task width for 'desktop'
200 task_count
= g_slist_length(taskbar
->area
.list
);
201 if (!task_count
) pixel_width
= panel
->g_task
.maximum_width
;
203 taskbar_width
= taskbar
->area
.width
- (2 * panel
->g_taskbar
.pix
.border
.width
) - (2 * panel
->g_taskbar
.paddingxlr
);
204 if (task_count
>1) taskbar_width
-= ((task_count
-1) * panel
->g_taskbar
.paddingx
);
206 pixel_width
= taskbar_width
/ task_count
;
207 if (pixel_width
> panel
->g_task
.maximum_width
)
208 pixel_width
= panel
->g_task
.maximum_width
;
210 modulo_width
= taskbar_width
% task_count
;
212 //printf("monitor %d, resize_tasks %d %d\n", panel->monitor, task_count, pixel_width);
214 if ((taskbar
->task_width
== pixel_width
) && (taskbar
->task_modulo
== modulo_width
)) {
219 taskbar
->task_width
= pixel_width
;
220 taskbar
->task_modulo
= modulo_width
;
221 taskbar
->text_width
= pixel_width
- panel
->g_task
.text_posx
- panel
->g_task
.area
.pix
.border
.width
- panel
->g_task
.area
.paddingx
;
224 // change pos_x and width for all tasks
225 x
= taskbar
->area
.posx
+ taskbar
->area
.pix
.border
.width
+ taskbar
->area
.paddingxlr
;
226 for (l
= taskbar
->area
.list
; l
; l
= l
->next
) {
229 tsk
->area
.width
= pixel_width
;
235 x
+= tsk
->area
.width
+ panel
->g_taskbar
.paddingx
;
241 // initialise taskbar posx and width
242 void resize_taskbar(void *p
)
245 int taskbar_width
, modulo_width
, taskbar_on_screen
;
247 if (panel_mode
== MULTI_DESKTOP
) taskbar_on_screen
= panel
->nb_desktop
;
248 else taskbar_on_screen
= 1;
250 taskbar_width
= panel
->area
.width
- (2 * panel
->area
.paddingxlr
) - (2 * panel
->area
.pix
.border
.width
);
252 taskbar_width
-= (panel
->clock
.area
.width
+ panel
->area
.paddingx
);
253 taskbar_width
= (taskbar_width
- ((taskbar_on_screen
-1) * panel
->area
.paddingx
)) / taskbar_on_screen
;
255 if (taskbar_on_screen
> 1)
256 modulo_width
= (taskbar_width
- ((taskbar_on_screen
-1) * panel
->area
.paddingx
)) % taskbar_on_screen
;
260 int i
, modulo
=0, posx
=0;
261 for (i
=0 ; i
< panel
->nb_desktop
; i
++) {
262 if ((i
% taskbar_on_screen
) == 0) {
263 posx
= panel
->area
.pix
.border
.width
+ panel
->area
.paddingxlr
;
264 modulo
= modulo_width
;
266 else posx
+= taskbar_width
+ panel
->area
.paddingx
;
268 panel
->taskbar
[i
].area
.posx
= posx
;
269 panel
->taskbar
[i
].area
.width
= taskbar_width
;
271 panel
->taskbar
[i
].area
.width
++;
275 resize_tasks(&panel
->taskbar
[i
]);
This page took 0.05099 seconds and 3 git commands to generate.