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

View file

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

View file

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

View file

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