Changed launcher to use Areas for each icon; this allows showing tooltips

git-svn-id: http://tint2.googlecode.com/svn/trunk@631 121b4492-b84c-0410-8b4c-0d4edfb3f3cc
This commit is contained in:
o9000 2011-05-28 22:43:03 +00:00 committed by mrovi@interfete-web-club.com
parent f71967bbca
commit 47ce616991
4 changed files with 49 additions and 31 deletions

View file

@ -73,7 +73,7 @@ void init_launcher_panel(void *p)
launcher->area.parent = p; launcher->area.parent = p;
launcher->area.panel = p; launcher->area.panel = p;
launcher->area._draw_foreground = draw_launcher; launcher->area._draw_foreground = NULL;
launcher->area.size_mode = SIZE_BY_CONTENT; launcher->area.size_mode = SIZE_BY_CONTENT;
launcher->area._resize = resize_launcher; launcher->area._resize = resize_launcher;
launcher->area.resize = 1; launcher->area.resize = 1;
@ -128,6 +128,7 @@ void cleanup_launcher_theme(Launcher *launcher)
free(launcherIcon->icon_name); free(launcherIcon->icon_name);
free(launcherIcon->icon_path); free(launcherIcon->icon_path);
free(launcherIcon->cmd); free(launcherIcon->cmd);
free(launcherIcon->icon_tooltip);
} }
free(launcherIcon); free(launcherIcon);
} }
@ -163,6 +164,8 @@ int resize_launcher(void *obj)
LauncherIcon *launcherIcon = (LauncherIcon *)l->data; LauncherIcon *launcherIcon = (LauncherIcon *)l->data;
if (launcherIcon->icon_size != icon_size || !launcherIcon->icon_original) { if (launcherIcon->icon_size != icon_size || !launcherIcon->icon_original) {
launcherIcon->icon_size = icon_size; launcherIcon->icon_size = icon_size;
launcherIcon->area.width = launcherIcon->icon_size;
launcherIcon->area.height = launcherIcon->icon_size;
// Get the path for an icon file with the new size // Get the path for an icon file with the new size
char *new_icon_path = icon_path(launcher, launcherIcon->icon_name, launcherIcon->icon_size); char *new_icon_path = icon_path(launcher, launcherIcon->icon_name, launcherIcon->icon_size);
@ -263,27 +266,32 @@ int resize_launcher(void *obj)
return 1; return 1;
} }
// Here we override the default layout of the icons; normally Area layouts its children
void draw_launcher(void *obj, cairo_t *c) // in a stack; we need to layout them in a kind of table
void launcher_icon_on_change_layout(void *obj)
{ {
Launcher *launcher = obj; LauncherIcon *launcherIcon = (LauncherIcon*)obj;
GSList *l; launcherIcon->area.posy = ((Area*)launcherIcon->area.parent)->posy + launcherIcon->y;
if (launcher->list_icons == 0) return; launcherIcon->area.posx = ((Area*)launcherIcon->area.parent)->posx + launcherIcon->x;
}
for (l = launcher->list_icons; l ; l = l->next) { const char* launcher_icon_get_tooltip_text(void *obj)
LauncherIcon *launcherIcon = (LauncherIcon*)l->data; {
int pos_x = launcherIcon->x; LauncherIcon *launcherIcon = (LauncherIcon*)obj;
int pos_y = launcherIcon->y; return launcherIcon->icon_tooltip;
}
void draw_launcher_icon(void *obj, cairo_t *c)
{
LauncherIcon *launcherIcon = (LauncherIcon*)obj;
Imlib_Image icon_scaled = launcherIcon->icon_scaled; Imlib_Image icon_scaled = launcherIcon->icon_scaled;
// Render // Render
imlib_context_set_image (icon_scaled); imlib_context_set_image (icon_scaled);
if (server.real_transparency) { if (server.real_transparency) {
render_image(launcher->area.pix, pos_x, pos_y, imlib_image_get_width(), imlib_image_get_height() ); render_image(launcherIcon->area.pix, 0, 0, imlib_image_get_width(), imlib_image_get_height() );
} } else {
else { imlib_context_set_drawable(launcherIcon->area.pix);
imlib_context_set_drawable(launcher->area.pix); imlib_render_image_on_drawable (0, 0);
imlib_render_image_on_drawable (pos_x, pos_y);
}
} }
} }
@ -661,12 +669,25 @@ void launcher_load_icons(Launcher *launcher)
launcher_read_desktop_file(app->data, &entry); launcher_read_desktop_file(app->data, &entry);
if (entry.exec) { if (entry.exec) {
LauncherIcon *launcherIcon = calloc(1, sizeof(LauncherIcon)); LauncherIcon *launcherIcon = calloc(1, sizeof(LauncherIcon));
launcherIcon->area.parent = launcher;
launcherIcon->area.panel = launcher->area.panel;
launcherIcon->area._draw_foreground = draw_launcher_icon;
launcherIcon->area.size_mode = SIZE_BY_CONTENT;
launcherIcon->area._resize = NULL;
launcherIcon->area.resize = 0;
launcherIcon->area.redraw = 1;
launcherIcon->area.bg = &g_array_index(backgrounds, Background, 0);
launcherIcon->area.on_screen = 1;
launcherIcon->area._on_change_layout = launcher_icon_on_change_layout;
launcherIcon->area._get_tooltip_text = launcher_icon_get_tooltip_text;
launcherIcon->is_app_desktop = 1; launcherIcon->is_app_desktop = 1;
launcherIcon->cmd = strdup(entry.exec); launcherIcon->cmd = strdup(entry.exec);
launcherIcon->icon_name = entry.icon ? strdup(entry.icon) : strdup(ICON_FALLBACK); launcherIcon->icon_name = entry.icon ? strdup(entry.icon) : strdup(ICON_FALLBACK);
launcherIcon->icon_size = 1; launcherIcon->icon_size = 1;
launcherIcon->icon_tooltip = entry.name ? strdup(entry.name) : strdup(entry.exec);
free_desktop_entry(&entry); free_desktop_entry(&entry);
launcher->list_icons = g_slist_append(launcher->list_icons, launcherIcon); launcher->list_icons = g_slist_append(launcher->list_icons, launcherIcon);
add_area(&launcherIcon->area);
} }
app = g_slist_next(app); app = g_slist_next(app);
} }

View file

@ -20,11 +20,14 @@ typedef struct Launcher {
} Launcher; } Launcher;
typedef struct LauncherIcon { typedef struct LauncherIcon {
// always start with area
Area area;
Imlib_Image icon_scaled; Imlib_Image icon_scaled;
Imlib_Image icon_original; Imlib_Image icon_original;
char *cmd; char *cmd;
char *icon_name; char *icon_name;
char *icon_path; char *icon_path;
char *icon_tooltip;
int icon_size; int icon_size;
int is_app_desktop; int is_app_desktop;
int x, y; int x, y;

View file

@ -699,17 +699,11 @@ Area* click_area(Panel *panel, int x, int y)
GSList* it = result->list; GSList* it = result->list;
while (it) { while (it) {
Area* a = it->data; Area* a = it->data;
if (panel_horizontal) { if (a->on_screen && x >= a->posx && x <= (a->posx + a->width)
if (a->on_screen && x >= a->posx && x <= (a->posx + a->width)) { && y >= a->posy && y <= (a->posy + a->height)) {
new_result = a; new_result = a;
break; break;
} }
} else {
if (a->on_screen && y >= a->posy && y <= (a->posy + a->height)) {
new_result = a;
break;
}
}
it = it->next; it = it->next;
} }
} while (new_result != result); } while (new_result != result);

View file

@ -444,7 +444,7 @@ void add_area (Area *a)
{ {
Area *parent = (Area*)a->parent; Area *parent = (Area*)a->parent;
parent->list = g_slist_remove(parent->list, a); parent->list = g_slist_append(parent->list, a);
set_redraw (parent); set_redraw (parent);
} }