]> Dogcows Code - chaz/tint2/commitdiff
Changed launcher to use Areas for each icon; this allows showing tooltips
authorThierry Lorthiois <lorthiois@bbsoft.fr>
Sat, 28 May 2011 22:43:03 +0000 (22:43 +0000)
committerThierry Lorthiois <lorthiois@bbsoft.fr>
Sat, 28 May 2011 22:43:03 +0000 (22:43 +0000)
src/launcher/launcher.c
src/launcher/launcher.h
src/panel.c
src/util/area.c

index 1166dc0d7728a66c7e372d3084d16aee50bfe73c..4e7a6f956a6870e676a70dca699657e61967ec30 100644 (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;
 }
 
+// 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)
+{
+       LauncherIcon *launcherIcon = (LauncherIcon*)obj;
+       launcherIcon->area.posy = ((Area*)launcherIcon->area.parent)->posy + launcherIcon->y;
+       launcherIcon->area.posx = ((Area*)launcherIcon->area.parent)->posx + launcherIcon->x;
+}
 
-void draw_launcher(void *obj, cairo_t *c)
+const char* launcher_icon_get_tooltip_text(void *obj)
 {
-       Launcher *launcher = obj;
-       GSList *l;
-       if (launcher->list_icons == 0) return;
+       LauncherIcon *launcherIcon = (LauncherIcon*)obj;
+       return launcherIcon->icon_tooltip;
+}
 
-       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);
-               }
+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);
        }
index 10a915101bf9677dc4e9f5ada1688a0999cee919..3a6abcf87f7c496408b16ad151cab14ef66bae35 100644 (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;
index f9593777d0c6bd1516c7dd1c07c3689991a5f396..0c16ae3e3fc360d480097f85f381ef65a541a38d 100644 (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;
                }
index 970776563ccbeecb91aa1c51519a6d058e2b841f..22dbe716cb758ebec961945758ef72293faf8cef 100644 (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);
 
 }
This page took 0.025962 seconds and 4 git commands to generate.