Add option to debug geometry (set env var DEBUG_GEOMETRY) (issue #583)

This commit is contained in:
o9000 2016-06-04 13:53:22 +02:00
parent 95a9e8a82e
commit fc56e48781
12 changed files with 297 additions and 101 deletions

View file

@ -58,6 +58,7 @@ gboolean battery_found;
void battery_init_fonts(); void battery_init_fonts();
char *battery_get_tooltip(void *obj); char *battery_get_tooltip(void *obj);
void battery_dump_geometry(void *obj, int indent);
void default_battery() void default_battery()
{ {
@ -382,6 +383,23 @@ void draw_battery(void *obj, cairo_t *c)
g_object_unref(layout); g_object_unref(layout);
} }
void battery_dump_geometry(void *obj, int indent)
{
Battery *battery = obj;
fprintf(stderr,
"%*sText 1: y = %d, text = %s\n",
indent,
"",
battery->bat1_posy,
buf_bat_percentage);
fprintf(stderr,
"%*sText 2: y = %d, text = %s\n",
indent,
"",
battery->bat2_posy,
buf_bat_time);
}
char *battery_get_tooltip(void *obj) char *battery_get_tooltip(void *obj)
{ {
return battery_os_tooltip(); return battery_os_tooltip();

View file

@ -55,6 +55,7 @@ static timeout *clock_timeout;
void clock_init_fonts(); void clock_init_fonts();
char *clock_get_tooltip(void *obj); char *clock_get_tooltip(void *obj);
void clock_dump_geometry(void *obj, int indent);
void default_clock() void default_clock()
{ {
@ -188,6 +189,7 @@ void init_clock_panel(void *p)
clock->area._draw_foreground = draw_clock; clock->area._draw_foreground = draw_clock;
clock->area.size_mode = LAYOUT_FIXED; clock->area.size_mode = LAYOUT_FIXED;
clock->area._resize = resize_clock; clock->area._resize = resize_clock;
clock->area._dump_geometry = clock_dump_geometry;
// check consistency // check consistency
if (!time1_format) if (!time1_format)
return; return;
@ -334,6 +336,26 @@ void draw_clock(void *obj, cairo_t *c)
g_object_unref(layout); g_object_unref(layout);
} }
void clock_dump_geometry(void *obj, int indent)
{
Clock *clock = (Clock *)obj;
fprintf(stderr,
"%*sText 1: y = %d, text = %s\n",
indent,
"",
clock->time1_posy,
buf_time);
if (time2_format) {
fprintf(stderr,
"%*sText 2: y = %d, text = %s\n",
indent,
"",
clock->time2_posy,
buf_date);
}
}
char *clock_get_tooltip(void *obj) char *clock_get_tooltip(void *obj)
{ {
strftime(buf_tooltip, sizeof(buf_tooltip), time_tooltip_format, clock_gettime_for_tz(time_tooltip_timezone)); strftime(buf_tooltip, sizeof(buf_tooltip), time_tooltip_format, clock_gettime_for_tz(time_tooltip_timezone));

View file

@ -21,6 +21,7 @@
void execp_timer_callback(void *arg); void execp_timer_callback(void *arg);
char *execp_get_tooltip(void *obj); char *execp_get_tooltip(void *obj);
void execp_init_fonts(); void execp_init_fonts();
void execp_dump_geometry(void *obj, int indent);
void default_execp() void default_execp()
{ {
@ -157,17 +158,21 @@ void init_execp_panel(void *p)
execp->area.paddingxlr = execp->backend->paddingxlr; execp->area.paddingxlr = execp->backend->paddingxlr;
execp->area.parent = panel; execp->area.parent = panel;
execp->area.panel = panel; execp->area.panel = panel;
snprintf(execp->area.name, sizeof(execp->area.name), "Execp %s", execp->backend->command ? execp->backend->command : "null"); execp->area._dump_geometry = execp_dump_geometry;
snprintf(execp->area.name,
sizeof(execp->area.name),
"Execp %s",
execp->backend->command ? execp->backend->command : "null");
execp->area._draw_foreground = draw_execp; execp->area._draw_foreground = draw_execp;
execp->area.size_mode = LAYOUT_FIXED; execp->area.size_mode = LAYOUT_FIXED;
execp->area._resize = resize_execp; execp->area._resize = resize_execp;
execp->area._get_tooltip_text = execp_get_tooltip; execp->area._get_tooltip_text = execp_get_tooltip;
execp->area._is_under_mouse = full_width_area_is_under_mouse; execp->area._is_under_mouse = full_width_area_is_under_mouse;
execp->area.has_mouse_press_effect = execp->area.has_mouse_press_effect =
panel_config.mouse_effects && panel_config.mouse_effects &&
(execp->area.has_mouse_over_effect = execp->backend->lclick_command || execp->backend->mclick_command || (execp->area.has_mouse_over_effect = execp->backend->lclick_command || execp->backend->mclick_command ||
execp->backend->rclick_command || execp->backend->uwheel_command || execp->backend->rclick_command || execp->backend->uwheel_command ||
execp->backend->dwheel_command); execp->backend->dwheel_command);
execp->area.resize_needed = TRUE; execp->area.resize_needed = TRUE;
execp->area.on_screen = TRUE; execp->area.on_screen = TRUE;
@ -265,7 +270,7 @@ gboolean reload_icon(Execp *execp)
} }
if (w != imlib_image_get_width() || h != imlib_image_get_height()) { if (w != imlib_image_get_width() || h != imlib_image_get_height()) {
Imlib_Image icon_scaled = Imlib_Image icon_scaled =
imlib_create_cropped_scaled_image(0, 0, imlib_image_get_width(), imlib_image_get_height(), w, h); imlib_create_cropped_scaled_image(0, 0, imlib_image_get_width(), imlib_image_get_height(), w, h);
imlib_context_set_image(execp->backend->icon); imlib_context_set_image(execp->backend->icon);
imlib_free_image(); imlib_free_image();
execp->backend->icon = icon_scaled; execp->backend->icon = icon_scaled;
@ -304,31 +309,31 @@ gboolean resize_execp(void *obj)
int txt_height_ink, txt_height, txt_width; int txt_height_ink, txt_height, txt_width;
if (panel_horizontal) { if (panel_horizontal) {
get_text_size2(execp->backend->font_desc, get_text_size2(execp->backend->font_desc,
&txt_height_ink, &txt_height_ink,
&txt_height, &txt_height,
&txt_width, &txt_width,
panel->area.height, panel->area.height,
panel->area.width, panel->area.width,
execp->backend->text, execp->backend->text,
strlen(execp->backend->text), strlen(execp->backend->text),
PANGO_WRAP_WORD_CHAR, PANGO_WRAP_WORD_CHAR,
PANGO_ELLIPSIZE_NONE, PANGO_ELLIPSIZE_NONE,
execp->backend->has_markup); execp->backend->has_markup);
} else { } else {
get_text_size2(execp->backend->font_desc, get_text_size2(execp->backend->font_desc,
&txt_height_ink, &txt_height_ink,
&txt_height, &txt_height,
&txt_width, &txt_width,
panel->area.height, panel->area.height,
!text_next_line !text_next_line
? execp->area.width - icon_w - (icon_w ? interior_padding : 0) - ? execp->area.width - icon_w - (icon_w ? interior_padding : 0) - 2 * horiz_padding -
2 * horiz_padding - left_right_border_width(&execp->area) left_right_border_width(&execp->area)
: execp->area.width - 2 * horiz_padding - left_right_border_width(&execp->area), : execp->area.width - 2 * horiz_padding - left_right_border_width(&execp->area),
execp->backend->text, execp->backend->text,
strlen(execp->backend->text), strlen(execp->backend->text),
PANGO_WRAP_WORD_CHAR, PANGO_WRAP_WORD_CHAR,
PANGO_ELLIPSIZE_NONE, PANGO_ELLIPSIZE_NONE,
execp->backend->has_markup); execp->backend->has_markup);
} }
gboolean result = FALSE; gboolean result = FALSE;
@ -348,7 +353,8 @@ gboolean resize_execp(void *obj)
new_size = txt_height + 2 * vert_padding + top_bottom_border_width(&execp->area); new_size = txt_height + 2 * vert_padding + top_bottom_border_width(&execp->area);
new_size = MAX(new_size, icon_h + 2 * vert_padding + top_bottom_border_width(&execp->area)); new_size = MAX(new_size, icon_h + 2 * vert_padding + top_bottom_border_width(&execp->area));
} else { } else {
new_size = icon_h + interior_padding + txt_height + 2 * vert_padding + top_bottom_border_width(&execp->area); new_size =
icon_h + interior_padding + txt_height + 2 * vert_padding + top_bottom_border_width(&execp->area);
} }
if (new_size != execp->area.height) { if (new_size != execp->area.height) {
execp->area.height = new_size; execp->area.height = new_size;
@ -420,15 +426,44 @@ void draw_execp(void *obj, cairo_t *c)
pango_cairo_update_layout(c, layout); pango_cairo_update_layout(c, layout);
draw_text(layout, draw_text(layout,
c, c,
execp->frontend->textx, execp->frontend->textx,
execp->frontend->texty, execp->frontend->texty,
&execp->backend->font_color, &execp->backend->font_color,
panel_config.font_shadow); panel_config.font_shadow);
g_object_unref(layout); g_object_unref(layout);
} }
void execp_dump_geometry(void *obj, int indent)
{
Execp *execp = obj;
if (execp->backend->has_icon && execp->backend->icon) {
Imlib_Image tmp = imlib_context_get_image();
imlib_context_set_image(execp->backend->icon);
fprintf(stderr,
"%*sIcon: x = %d, y = %d, w = %d\n",
indent,
"",
execp->frontend->iconx,
execp->frontend->icony,
imlib_image_get_width(),
imlib_image_get_height());
if (tmp)
imlib_context_set_image(tmp);
}
fprintf(stderr,
"%*sText: x = %d, y = %d, w = %d, h = %d, align = %s, text = %s\n",
indent,
"",
execp->frontend->textx,
execp->frontend->texty,
execp->frontend->textw,
execp->backend->centered ? "center" : "left",
execp->backend->text);
}
void execp_action(void *obj, int button, int x, int y) void execp_action(void *obj, int button, int x, int y)
{ {
Execp *execp = obj; Execp *execp = obj;
@ -537,8 +572,8 @@ gboolean read_execp(void *obj)
execp->backend->buf_output = realloc(execp->backend->buf_output, execp->backend->buf_capacity); execp->backend->buf_output = realloc(execp->backend->buf_output, execp->backend->buf_capacity);
} }
ssize_t count = read(execp->backend->child_pipe, ssize_t count = read(execp->backend->child_pipe,
execp->backend->buf_output + execp->backend->buf_length, execp->backend->buf_output + execp->backend->buf_length,
execp->backend->buf_capacity - execp->backend->buf_length - 1); execp->backend->buf_capacity - execp->backend->buf_length - 1);
if (count > 0) { if (count > 0) {
// Successful read // Successful read
execp->backend->buf_length += count; execp->backend->buf_length += count;
@ -568,7 +603,7 @@ gboolean read_execp(void *obj)
execp->backend->child_pipe = -1; execp->backend->child_pipe = -1;
if (execp->backend->interval) if (execp->backend->interval)
execp->backend->timer = execp->backend->timer =
add_timeout(execp->backend->interval * 1000, 0, execp_timer_callback, execp, &execp->backend->timer); add_timeout(execp->backend->interval * 1000, 0, execp_timer_callback, execp, &execp->backend->timer);
} }
if (!execp->backend->continuous && command_finished) { if (!execp->backend->continuous && command_finished) {
@ -594,7 +629,7 @@ gboolean read_execp(void *obj)
execp->backend->buf_output[execp->backend->buf_length] = '\0'; execp->backend->buf_output[execp->backend->buf_length] = '\0';
execp->backend->last_update_finish_time = time(NULL); execp->backend->last_update_finish_time = time(NULL);
execp->backend->last_update_duration = execp->backend->last_update_duration =
execp->backend->last_update_finish_time - execp->backend->last_update_start_time; execp->backend->last_update_finish_time - execp->backend->last_update_start_time;
return TRUE; return TRUE;
} else if (execp->backend->continuous > 0) { } else if (execp->backend->continuous > 0) {
// Count lines in buffer // Count lines in buffer
@ -649,7 +684,7 @@ gboolean read_execp(void *obj)
execp->backend->last_update_finish_time = time(NULL); execp->backend->last_update_finish_time = time(NULL);
execp->backend->last_update_duration = execp->backend->last_update_duration =
execp->backend->last_update_finish_time - execp->backend->last_update_start_time; execp->backend->last_update_finish_time - execp->backend->last_update_start_time;
return TRUE; return TRUE;
} }
} }
@ -698,16 +733,16 @@ char *execp_get_tooltip(void *obj)
// We updated at least once // We updated at least once
if (execp->backend->interval > 0) { if (execp->backend->interval > 0) {
sprintf(execp->backend->tooltip_text, sprintf(execp->backend->tooltip_text,
"Last update finished %s ago (took %s). Next update starting in %s.", "Last update finished %s ago (took %s). Next update starting in %s.",
time_to_string((int)(now - execp->backend->last_update_finish_time), tmp_buf1), time_to_string((int)(now - execp->backend->last_update_finish_time), tmp_buf1),
time_to_string((int)execp->backend->last_update_duration, tmp_buf2), time_to_string((int)execp->backend->last_update_duration, tmp_buf2),
time_to_string((int)(execp->backend->interval - (now - execp->backend->last_update_finish_time)), time_to_string((int)(execp->backend->interval - (now - execp->backend->last_update_finish_time)),
tmp_buf3)); tmp_buf3));
} else { } else {
sprintf(execp->backend->tooltip_text, sprintf(execp->backend->tooltip_text,
"Last update finished %s ago (took %s).", "Last update finished %s ago (took %s).",
time_to_string((int)(now - execp->backend->last_update_finish_time), tmp_buf1), time_to_string((int)(now - execp->backend->last_update_finish_time), tmp_buf1),
time_to_string((int)execp->backend->last_update_duration, tmp_buf2)); time_to_string((int)execp->backend->last_update_duration, tmp_buf2));
} }
} else { } else {
// we never requested an update // we never requested an update
@ -718,14 +753,14 @@ char *execp_get_tooltip(void *obj)
if (execp->backend->last_update_finish_time) { if (execp->backend->last_update_finish_time) {
// we finished updating at least once // we finished updating at least once
sprintf(execp->backend->tooltip_text, sprintf(execp->backend->tooltip_text,
"Last update finished %s ago. Update in progress (started %s ago).", "Last update finished %s ago. Update in progress (started %s ago).",
time_to_string((int)(now - execp->backend->last_update_finish_time), tmp_buf1), time_to_string((int)(now - execp->backend->last_update_finish_time), tmp_buf1),
time_to_string((int)(now - execp->backend->last_update_start_time), tmp_buf3)); time_to_string((int)(now - execp->backend->last_update_start_time), tmp_buf3));
} else { } else {
// we never finished an update // we never finished an update
sprintf(execp->backend->tooltip_text, sprintf(execp->backend->tooltip_text,
"First update in progress (started %s seconds ago).", "First update in progress (started %s seconds ago).",
time_to_string((int)(now - execp->backend->last_update_start_time), tmp_buf1)); time_to_string((int)(now - execp->backend->last_update_start_time), tmp_buf1));
} }
} }
return strdup(execp->backend->tooltip_text); return strdup(execp->backend->tooltip_text);

View file

@ -56,6 +56,7 @@ Background *launcher_icon_bg;
Imlib_Image scale_icon(Imlib_Image original, int icon_size); Imlib_Image scale_icon(Imlib_Image original, int icon_size);
void free_icon(Imlib_Image icon); void free_icon(Imlib_Image icon);
void launcher_icon_dump_geometry(void *obj, int indent);
void default_launcher() void default_launcher()
{ {
@ -346,6 +347,17 @@ void draw_launcher_icon(void *obj, cairo_t *c)
render_image(launcherIcon->area.pix, 0, 0); render_image(launcherIcon->area.pix, 0, 0);
} }
void launcher_icon_dump_geometry(void *obj, int indent)
{
LauncherIcon *launcherIcon = (LauncherIcon *)obj;
fprintf(stderr,
"%*sIcon: w = h = %d, name = %s\n",
indent,
"",
launcherIcon->icon_size,
launcherIcon->icon_name);
}
Imlib_Image scale_icon(Imlib_Image original, int icon_size) Imlib_Image scale_icon(Imlib_Image original, int icon_size)
{ {
Imlib_Image icon_scaled; Imlib_Image icon_scaled;
@ -468,6 +480,7 @@ void launcher_load_icons(Launcher *launcher)
launcherIcon->area.bg = launcher_icon_bg; launcherIcon->area.bg = launcher_icon_bg;
launcherIcon->area.on_screen = TRUE; launcherIcon->area.on_screen = TRUE;
launcherIcon->area._on_change_layout = launcher_icon_on_change_layout; launcherIcon->area._on_change_layout = launcher_icon_on_change_layout;
launcherIcon->area._dump_geometry = launcher_icon_dump_geometry;
if (launcher_tooltip_enabled) { if (launcher_tooltip_enabled) {
launcherIcon->area._get_tooltip_text = launcher_icon_get_tooltip_text; launcherIcon->area._get_tooltip_text = launcher_icon_get_tooltip_text;
} else { } else {

View file

@ -55,6 +55,7 @@ gboolean panel_horizontal;
gboolean panel_refresh; gboolean panel_refresh;
gboolean task_dragged; gboolean task_dragged;
char *panel_window_name = NULL; char *panel_window_name = NULL;
gboolean debug_geometry;
gboolean panel_autohide; gboolean panel_autohide;
int panel_autohide_show_timeout; int panel_autohide_show_timeout;
@ -942,6 +943,8 @@ void autohide_trigger_hide(Panel *p)
void render_panel(Panel *panel) void render_panel(Panel *panel)
{ {
relayout(&panel->area); relayout(&panel->area);
if (debug_geometry)
area_dump_geometry(&panel->area, 0);
draw_tree(&panel->area); draw_tree(&panel->area);
} }

View file

@ -86,6 +86,7 @@ extern Imlib_Image default_icon;
#define DEFAULT_FONT "sans 10" #define DEFAULT_FONT "sans 10"
extern char *default_font; extern char *default_font;
extern XSettingsClient *xsettings_client; extern XSettingsClient *xsettings_client;
extern gboolean debug_geometry;
typedef struct Panel { typedef struct Panel {
Area area; Area area;

View file

@ -65,6 +65,8 @@ const int slow_resize_period = 5000;
const int min_bad_resize_events = 3; const int min_bad_resize_events = 3;
const int max_bad_resize_events = 10; const int max_bad_resize_events = 10;
void systray_dump_geometry(void *obj, int indent);
void default_systray() void default_systray()
{ {
systray_enabled = 0; systray_enabled = 0;
@ -114,6 +116,7 @@ void init_systray_panel(void *p)
Panel *panel = (Panel *)p; Panel *panel = (Panel *)p;
systray.area.parent = panel; systray.area.parent = panel;
systray.area.panel = panel; systray.area.panel = panel;
systray.area._dump_geometry = systray_dump_geometry;
snprintf(systray.area.name, sizeof(systray.area.name), "Systray"); snprintf(systray.area.name, sizeof(systray.area.name), "Systray");
if (!systray.area.bg) if (!systray.area.bg)
systray.area.bg = &g_array_index(backgrounds, Background, 0); systray.area.bg = &g_array_index(backgrounds, Background, 0);
@ -208,6 +211,29 @@ void draw_systray(void *obj, cairo_t *c)
refresh_systray = TRUE; refresh_systray = TRUE;
} }
void systray_dump_geometry(void *obj, int indent)
{
Systray *tray = (Systray *)obj;
fprintf(stderr,
"%*sIcons:\n",
indent,
"");
indent += 2;
for (GSList *l = tray->list_icons; l; l = l->next) {
TrayWindow *traywin = (TrayWindow *)l->data;
fprintf(stderr,
"%*sIcon: x = %d, y = %d, w = %d, h = %d, name = %s\n",
indent,
"",
traywin->x,
traywin->y,
traywin->width,
traywin->height,
traywin->name);
}
}
void on_change_systray(void *obj) void on_change_systray(void *obj)
{ {
if (systray_profile) if (systray_profile)

View file

@ -38,6 +38,8 @@
timeout *urgent_timeout; timeout *urgent_timeout;
GSList *urgent_list; GSList *urgent_list;
void task_dump_geometry(void *obj, int indent);
char *task_get_tooltip(void *obj) char *task_get_tooltip(void *obj)
{ {
Task *t = (Task *)obj; Task *t = (Task *)obj;
@ -68,6 +70,7 @@ Task *add_task(Window win)
snprintf(task_template.area.name, sizeof(task_template.area.name), "Task %d", (int)win); snprintf(task_template.area.name, sizeof(task_template.area.name), "Task %d", (int)win);
task_template.area.has_mouse_over_effect = panel_config.mouse_effects; task_template.area.has_mouse_over_effect = panel_config.mouse_effects;
task_template.area.has_mouse_press_effect = panel_config.mouse_effects; task_template.area.has_mouse_press_effect = panel_config.mouse_effects;
task_template.area._dump_geometry = task_dump_geometry;
task_template.area._is_under_mouse = full_width_area_is_under_mouse; task_template.area._is_under_mouse = full_width_area_is_under_mouse;
task_template.win = win; task_template.win = win;
task_template.desktop = get_window_desktop(win); task_template.desktop = get_window_desktop(win);
@ -83,7 +86,11 @@ Task *add_task(Window win)
} }
task_update_title(&task_template); task_update_title(&task_template);
task_update_icon(&task_template); task_update_icon(&task_template);
snprintf(task_template.area.name, sizeof(task_template.area.name), "Task %d %s", (int)win, task_template.title ? task_template.title : "null"); snprintf(task_template.area.name,
sizeof(task_template.area.name),
"Task %d %s",
(int)win,
task_template.title ? task_template.title : "null");
// fprintf(stderr, "%s %d: win = %ld, task = %s\n", __FUNCTION__, __LINE__, win, task_template.title ? // fprintf(stderr, "%s %d: win = %ld, task = %s\n", __FUNCTION__, __LINE__, win, task_template.title ?
// task_template.title : "??"); // task_template.title : "??");
@ -99,6 +106,7 @@ Task *add_task(Window win)
memcpy(&task_instance->area, &panels[monitor].g_task.area, sizeof(Area)); memcpy(&task_instance->area, &panels[monitor].g_task.area, sizeof(Area));
task_instance->area.has_mouse_over_effect = panel_config.mouse_effects; task_instance->area.has_mouse_over_effect = panel_config.mouse_effects;
task_instance->area.has_mouse_press_effect = panel_config.mouse_effects; task_instance->area.has_mouse_press_effect = panel_config.mouse_effects;
task_instance->area._dump_geometry = task_dump_geometry;
task_instance->area._is_under_mouse = full_width_area_is_under_mouse; task_instance->area._is_under_mouse = full_width_area_is_under_mouse;
task_instance->win = task_template.win; task_instance->win = task_template.win;
task_instance->desktop = task_template.desktop; task_instance->desktop = task_template.desktop;
@ -303,7 +311,7 @@ void task_update_icon(Task *task)
int w = imlib_image_get_width(); int w = imlib_image_get_width();
int h = imlib_image_get_height(); int h = imlib_image_get_height();
Imlib_Image orig_image = Imlib_Image orig_image =
imlib_create_cropped_scaled_image(0, 0, w, h, panel->g_task.icon_size1, panel->g_task.icon_size1); imlib_create_cropped_scaled_image(0, 0, w, h, panel->g_task.icon_size1, panel->g_task.icon_size1);
imlib_free_image(); imlib_free_image();
imlib_context_set_image(orig_image); imlib_context_set_image(orig_image);
@ -317,22 +325,22 @@ void task_update_icon(Task *task)
if (panel->g_task.alpha[k] != 100 || panel->g_task.saturation[k] != 0 || panel->g_task.brightness[k] != 0) { if (panel->g_task.alpha[k] != 100 || panel->g_task.saturation[k] != 0 || panel->g_task.brightness[k] != 0) {
data32 = imlib_image_get_data(); data32 = imlib_image_get_data();
adjust_asb(data32, adjust_asb(data32,
task->icon_width, task->icon_width,
task->icon_height, task->icon_height,
panel->g_task.alpha[k] / 100.0, panel->g_task.alpha[k] / 100.0,
panel->g_task.saturation[k] / 100.0, panel->g_task.saturation[k] / 100.0,
panel->g_task.brightness[k] / 100.0); panel->g_task.brightness[k] / 100.0);
imlib_image_put_back_data(data32); imlib_image_put_back_data(data32);
} }
if (panel_config.mouse_effects) { if (panel_config.mouse_effects) {
task->icon_hover[k] = adjust_icon(task->icon[k], task->icon_hover[k] = adjust_icon(task->icon[k],
panel_config.mouse_over_alpha, panel_config.mouse_over_alpha,
panel_config.mouse_over_saturation, panel_config.mouse_over_saturation,
panel_config.mouse_over_brightness); panel_config.mouse_over_brightness);
task->icon_press[k] = adjust_icon(task->icon[k], task->icon_press[k] = adjust_icon(task->icon[k],
panel_config.mouse_pressed_alpha, panel_config.mouse_pressed_alpha,
panel_config.mouse_pressed_saturation, panel_config.mouse_pressed_saturation,
panel_config.mouse_pressed_brightness); panel_config.mouse_pressed_brightness);
} }
} }
imlib_context_set_image(orig_image); imlib_context_set_image(orig_image);
@ -361,15 +369,14 @@ void draw_task_icon(Task *task, int text_width)
return; return;
// Find pos // Find pos
int pos_x;
Panel *panel = (Panel *)task->area.panel; Panel *panel = (Panel *)task->area.panel;
if (panel->g_task.centered) { if (panel->g_task.centered) {
if (panel->g_task.has_text) if (panel->g_task.has_text)
pos_x = (task->area.width - text_width - panel->g_task.icon_size1) / 2; task->_icon_x = (task->area.width - text_width - panel->g_task.icon_size1) / 2;
else else
pos_x = (task->area.width - panel->g_task.icon_size1) / 2; task->_icon_x = (task->area.width - panel->g_task.icon_size1) / 2;
} else { } else {
pos_x = left_border_width(&task->area) + task->area.paddingxlr; task->_icon_x = left_border_width(&task->area) + task->area.paddingxlr;
} }
// Render // Render
@ -388,14 +395,8 @@ void draw_task_icon(Task *task, int text_width)
} }
imlib_context_set_image(image); imlib_context_set_image(image);
render_image(task->area.pix, pos_x, (task->area.height - panel->g_task.icon_size1) / 2); task->_icon_y = (task->area.height - panel->g_task.icon_size1) / 2;
if (0) { render_image(task->area.pix, task->_icon_x, task->_icon_y);
fprintf(stderr, "Task icon size: %d %d pos %d %d\n", imlib_image_get_width(), imlib_image_get_height(), pos_x, panel->g_task.icon_posy);
fprintf(stderr, "Task max size : %d %d\n", panel->g_task.maximum_width, panel->g_task.maximum_height);
fprintf(stderr, "Task area size: %d %d\n", task->area.width, task->area.height);
fprintf(stderr, "Task border : %d\n", left_border_width(&task->area));
fprintf(stderr, "\n");
}
} }
void draw_task(void *obj, cairo_t *c) void draw_task(void *obj, cairo_t *c)
@ -403,7 +404,7 @@ void draw_task(void *obj, cairo_t *c)
Task *task = (Task *)obj; Task *task = (Task *)obj;
Panel *panel = (Panel *)task->area.panel; Panel *panel = (Panel *)task->area.panel;
int text_width = 0; task->_text_width = 0;
if (panel->g_task.has_text) { if (panel->g_task.has_text) {
PangoLayout *layout = pango_cairo_create_layout(c); PangoLayout *layout = pango_cairo_create_layout(c);
pango_layout_set_font_description(layout, panel->g_task.font_desc); pango_layout_set_font_description(layout, panel->g_task.font_desc);
@ -419,18 +420,41 @@ void draw_task(void *obj, cairo_t *c)
else else
pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT); pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
int text_height; pango_layout_get_pixel_size(layout, &task->_text_width, &task->_text_height);
pango_layout_get_pixel_size(layout, &text_width, &text_height); task->_text_posy = (panel->g_task.area.height - task->_text_height) / 2.0;
double text_posy = (panel->g_task.area.height - text_height) / 2.0;
Color *config_text = &panel->g_task.font[task->current_state]; Color *config_text = &panel->g_task.font[task->current_state];
draw_text(layout, c, panel->g_task.text_posx, text_posy, config_text, panel->font_shadow); draw_text(layout, c, panel->g_task.text_posx, task->_text_posy, config_text, panel->font_shadow);
g_object_unref(layout); g_object_unref(layout);
} }
if (panel->g_task.has_icon) if (panel->g_task.has_icon)
draw_task_icon(task, text_width); draw_task_icon(task, task->_text_width);
}
void task_dump_geometry(void *obj, int indent)
{
Task *task = (Task *)obj;
Panel *panel = (Panel *)task->area.panel;
fprintf(stderr,
"%*sText: x = %d, y = %d, w = %d, h = %d, align = %s, text = %s\n",
indent,
"",
(int)panel->g_task.text_posx,
(int)task->_text_posy,
task->_text_width,
task->_text_height,
panel->g_task.centered ? "center" : "left",
task->title);
fprintf(stderr,
"%*sIcon: x = %d, y = %d, w = h = %d\n",
indent,
"",
task->_icon_x,
task->_icon_y,
panel->g_task.icon_size1);
} }
void on_change_task(void *obj) void on_change_task(void *obj)
@ -440,13 +464,13 @@ void on_change_task(void *obj)
long value[] = {panel->posx + task->area.posx, panel->posy + task->area.posy, task->area.width, task->area.height}; long value[] = {panel->posx + task->area.posx, panel->posy + task->area.posy, task->area.width, task->area.height};
XChangeProperty(server.display, XChangeProperty(server.display,
task->win, task->win,
server.atom._NET_WM_ICON_GEOMETRY, server.atom._NET_WM_ICON_GEOMETRY,
XA_CARDINAL, XA_CARDINAL,
32, 32,
PropModeReplace, PropModeReplace,
(unsigned char *)value, (unsigned char *)value,
4); 4);
} }
Task *find_active_task(Task *current_task) Task *find_active_task(Task *current_task)
@ -579,7 +603,7 @@ void set_task_state(Task *task, TaskState state)
} }
} }
if (get_window_monitor(task->win) != ((Panel *)task->area.panel)->monitor && if (get_window_monitor(task->win) != ((Panel *)task->area.panel)->monitor &&
(hide_task_diff_monitor || num_panels > 1)) { (hide_task_diff_monitor || num_panels > 1)) {
hide = TRUE; hide = TRUE;
} }
if ((!hide) != task1->area.on_screen) { if ((!hide) != task1->area.on_screen) {

View file

@ -67,6 +67,11 @@ typedef struct Task {
int win_w; int win_w;
int win_h; int win_h;
struct timespec last_activation_time; struct timespec last_activation_time;
int _text_width;
int _text_height;
double _text_posy;
int _icon_x;
int _icon_y;
} Task; } Task;
extern timeout *urgent_timeout; extern timeout *urgent_timeout;

View file

@ -372,6 +372,8 @@ void init(int argc, char *argv[])
sigaction(SIGABRT, &sa_crash, 0); sigaction(SIGABRT, &sa_crash, 0);
sigaction(SIGSYS, &sa_crash, 0); sigaction(SIGSYS, &sa_crash, 0);
#endif #endif
debug_geometry = getenv("DEBUG_GEOMETRY") != NULL;
} }
static int sn_pipe_valid = 0; static int sn_pipe_valid = 0;

View file

@ -177,7 +177,8 @@ void relayout_dynamic(Area *a, int level)
children_size += (l == a->children) ? 0 : a->paddingx; children_size += (l == a->children) ? 0 : a->paddingx;
} }
int pos = (panel_horizontal ? a->posx + left_border_width(a) : a->posy + top_border_width(a)) + a->paddingxlr; int pos =
(panel_horizontal ? a->posx + left_border_width(a) : a->posy + top_border_width(a)) + a->paddingxlr;
pos += ((panel_horizontal ? a->width : a->height) - children_size) / 2; pos += ((panel_horizontal ? a->width : a->height) - children_size) / 2;
for (GList *l = a->children; l; l = l->next) { for (GList *l = a->children; l; l = l->next) {
@ -459,10 +460,10 @@ void draw_background(Area *a, cairo_t *c)
a->bg->fill_color.alpha); a->bg->fill_color.alpha);
// Not sure about this // Not sure about this
draw_rect(c, draw_rect(c,
left_border_width(a), left_border_width(a),
top_border_width(a), top_border_width(a),
a->width - left_right_border_width(a), a->width - left_right_border_width(a),
a->height - top_bottom_border_width(a), a->height - top_bottom_border_width(a),
a->bg->border.radius - a->bg->border.width / 1.571); a->bg->border.radius - a->bg->border.width / 1.571);
cairo_fill(c); cairo_fill(c);
@ -491,10 +492,10 @@ void draw_background(Area *a, cairo_t *c)
a->bg->border.color.rgb[2], a->bg->border.color.rgb[2],
a->bg->border.color.alpha); a->bg->border.color.alpha);
draw_rect_on_sides(c, draw_rect_on_sides(c,
left_border_width(a) / 2., left_border_width(a) / 2.,
top_border_width(a) / 2., top_border_width(a) / 2.,
a->width - left_right_border_width(a) / 2., a->width - left_right_border_width(a) / 2.,
a->height - top_bottom_border_width(a) / 2., a->height - top_bottom_border_width(a) / 2.,
a->bg->border.radius, a->bg->border.radius,
a->bg->border.mask); a->bg->border.mask);
@ -772,3 +773,44 @@ int top_bottom_bg_border_width(Background *bg)
{ {
return top_bg_border_width(bg) + bottom_bg_border_width(bg); return top_bg_border_width(bg) + bottom_bg_border_width(bg);
} }
void area_dump_geometry(Area *area, int indent)
{
fprintf(stderr, "%*s%s:\n", indent, "", area->name);
indent += 2;
if (!area->on_screen) {
fprintf(stderr, "%*shidden\n", indent, "");
return;
}
fprintf(stderr,
"%*sBox: x = %d, y = %d, w = %d, h = %d\n",
indent,
"",
area->posx,
area->posy,
area->width,
area->height);
fprintf(stderr,
"%*sBorder: left = %d, right = %d, top = %d, bottom = %d\n",
indent,
"",
left_border_width(area),
right_border_width(area),
top_border_width(area),
bottom_border_width(area));
fprintf(stderr,
"%*sPadding: left = right = %d, top = bottom = %d, spacing = %d\n",
indent,
"",
area->paddingxlr,
area->paddingy,
area->paddingx);
if (area->_dump_geometry)
area->_dump_geometry(area, indent);
if (area->children) {
fprintf(stderr, "%*sChildren:\n", indent, "");
indent += 2;
for (GList *l = area->children; l; l = l->next)
area_dump_geometry((Area *)l->data, indent);
}
}

View file

@ -230,6 +230,9 @@ typedef struct Area {
// Returns true if the Area handles a mouse event at the given x, y coordinates relative to the window. // Returns true if the Area handles a mouse event at the given x, y coordinates relative to the window.
// Leave this to NULL to use a default implementation. // Leave this to NULL to use a default implementation.
gboolean (*_is_under_mouse)(void *obj, int x, int y); gboolean (*_is_under_mouse)(void *obj, int x, int y);
// Prints the geometry of the object on stderr, with left indentation of indent spaces.
void (*_dump_geometry)(void *obj, int indent);
} Area; } Area;
// Initializes the Background member to default values. // Initializes the Background member to default values.
@ -306,6 +309,8 @@ gboolean area_is_under_mouse(void *obj, int x, int y);
// they are outside the drawing area of the button. // they are outside the drawing area of the button.
gboolean full_width_area_is_under_mouse(void *obj, int x, int y); gboolean full_width_area_is_under_mouse(void *obj, int x, int y);
void area_dump_geometry(Area *area, int indent);
void mouse_over(Area *area, int pressed); void mouse_over(Area *area, int pressed);
void mouse_out(); void mouse_out();