Launcher: reload shortcut on click (issue #569)
This commit is contained in:
parent
e9d6ec9f23
commit
5c6385b4c3
2 changed files with 115 additions and 105 deletions
|
@ -57,6 +57,10 @@ 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 launcher_icon_dump_geometry(void *obj, int indent);
|
||||||
|
void launcher_reload_icon(Launcher *launcher, LauncherIcon *launcherIcon);
|
||||||
|
void launcher_reload_icon_image(Launcher *launcher, LauncherIcon *launcherIcon);
|
||||||
|
void launcher_reload_hidden_icons(Launcher *launcher);
|
||||||
|
void launcher_icon_on_change_layout(void *obj);
|
||||||
|
|
||||||
void default_launcher()
|
void default_launcher()
|
||||||
{
|
{
|
||||||
|
@ -143,6 +147,7 @@ void cleanup_launcher_theme(Launcher *launcher)
|
||||||
free(launcherIcon->icon_path);
|
free(launcherIcon->icon_path);
|
||||||
free(launcherIcon->cmd);
|
free(launcherIcon->cmd);
|
||||||
g_free(launcherIcon->icon_tooltip);
|
g_free(launcherIcon->icon_tooltip);
|
||||||
|
free(launcherIcon->config_path);
|
||||||
}
|
}
|
||||||
free(launcherIcon);
|
free(launcherIcon);
|
||||||
}
|
}
|
||||||
|
@ -176,61 +181,17 @@ gboolean resize_launcher(void *obj)
|
||||||
launcherIcon->icon_size = icon_size;
|
launcherIcon->icon_size = icon_size;
|
||||||
launcherIcon->area.width = launcherIcon->icon_size;
|
launcherIcon->area.width = launcherIcon->icon_size;
|
||||||
launcherIcon->area.height = launcherIcon->icon_size;
|
launcherIcon->area.height = launcherIcon->icon_size;
|
||||||
|
launcher_reload_icon_image(launcher, launcherIcon);
|
||||||
// Get the path for an icon file with the new size
|
|
||||||
char *new_icon_path =
|
|
||||||
get_icon_path(launcher->icon_theme_wrapper, launcherIcon->icon_name, launcherIcon->icon_size);
|
|
||||||
if (!new_icon_path) {
|
|
||||||
// Draw a blank icon
|
|
||||||
free_icon(launcherIcon->image);
|
|
||||||
free_icon(launcherIcon->image_hover);
|
|
||||||
free_icon(launcherIcon->image_pressed);
|
|
||||||
launcherIcon->image = NULL;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Free the old files
|
|
||||||
free_icon(launcherIcon->image);
|
|
||||||
free_icon(launcherIcon->image_hover);
|
|
||||||
free_icon(launcherIcon->image_pressed);
|
|
||||||
// Load the new file
|
|
||||||
launcherIcon->image = load_image(new_icon_path, 1);
|
|
||||||
// On loading error, fallback to default
|
|
||||||
if (!launcherIcon->image) {
|
|
||||||
free(new_icon_path);
|
|
||||||
new_icon_path = get_icon_path(launcher->icon_theme_wrapper, DEFAULT_ICON, launcherIcon->icon_size);
|
|
||||||
if (new_icon_path)
|
|
||||||
launcherIcon->image = imlib_load_image_immediately(new_icon_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!launcherIcon->image) {
|
|
||||||
// Loading default icon failed, draw a blank icon
|
|
||||||
free(new_icon_path);
|
|
||||||
} else {
|
|
||||||
// Loaded icon successfully, rescale it
|
|
||||||
Imlib_Image original = launcherIcon->image;
|
|
||||||
launcherIcon->image = scale_icon(launcherIcon->image, launcherIcon->icon_size);
|
|
||||||
free_icon(original);
|
|
||||||
free(launcherIcon->icon_path);
|
|
||||||
launcherIcon->icon_path = new_icon_path;
|
|
||||||
fprintf(stderr, "launcher.c %d: Using icon %s\n", __LINE__, launcherIcon->icon_path);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (panel_config.mouse_effects) {
|
|
||||||
launcherIcon->image_hover = adjust_icon(launcherIcon->image,
|
|
||||||
panel_config.mouse_over_alpha,
|
|
||||||
panel_config.mouse_over_saturation,
|
|
||||||
panel_config.mouse_over_brightness);
|
|
||||||
launcherIcon->image_pressed = adjust_icon(launcherIcon->image,
|
|
||||||
panel_config.mouse_pressed_alpha,
|
|
||||||
panel_config.mouse_pressed_saturation,
|
|
||||||
panel_config.mouse_pressed_brightness);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
save_icon_cache(launcher->icon_theme_wrapper);
|
save_icon_cache(launcher->icon_theme_wrapper);
|
||||||
|
|
||||||
int count = g_slist_length(launcher->list_icons);
|
int count = 0;
|
||||||
|
for (GSList *l = launcher->list_icons; l; l = l->next) {
|
||||||
|
LauncherIcon *launcherIcon = (LauncherIcon *)l->data;
|
||||||
|
if (launcherIcon->area.on_screen)
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
if (panel_horizontal) {
|
if (panel_horizontal) {
|
||||||
if (!count) {
|
if (!count) {
|
||||||
|
@ -268,17 +229,15 @@ gboolean resize_launcher(void *obj)
|
||||||
posy = top_border_width(&launcher->area) + launcher->area.paddingxlr;
|
posy = top_border_width(&launcher->area) + launcher->area.paddingxlr;
|
||||||
}
|
}
|
||||||
|
|
||||||
int i;
|
int i = 0;
|
||||||
GSList *l;
|
for (GSList *l = launcher->list_icons; l; l = l->next) {
|
||||||
for (i = 1, l = launcher->list_icons; l; i++, l = l->next) {
|
|
||||||
LauncherIcon *launcherIcon = (LauncherIcon *)l->data;
|
LauncherIcon *launcherIcon = (LauncherIcon *)l->data;
|
||||||
|
if (!launcherIcon->area.on_screen)
|
||||||
|
continue;
|
||||||
|
i++;
|
||||||
launcherIcon->y = posy;
|
launcherIcon->y = posy;
|
||||||
launcherIcon->x = posx;
|
launcherIcon->x = posx;
|
||||||
launcherIcon->area.posy = ((Area *)launcherIcon->area.parent)->posy + launcherIcon->y;
|
launcher_icon_on_change_layout(launcherIcon);
|
||||||
launcherIcon->area.posx = ((Area *)launcherIcon->area.parent)->posx + launcherIcon->x;
|
|
||||||
launcherIcon->area.width = launcherIcon->icon_size;
|
|
||||||
launcherIcon->area.height = launcherIcon->icon_size;
|
|
||||||
// printf("launcher %d : %d,%d\n", i, posx, posy);
|
// printf("launcher %d : %d,%d\n", i, posx, posy);
|
||||||
if (panel_horizontal) {
|
if (panel_horizontal) {
|
||||||
if (i % icons_per_column) {
|
if (i % icons_per_column) {
|
||||||
|
@ -401,6 +360,8 @@ void free_icon(Imlib_Image icon)
|
||||||
|
|
||||||
void launcher_action(LauncherIcon *icon, XEvent *evt)
|
void launcher_action(LauncherIcon *icon, XEvent *evt)
|
||||||
{
|
{
|
||||||
|
launcher_reload_icon((Launcher *)icon->area.parent, icon);
|
||||||
|
launcher_reload_hidden_icons((Launcher *)icon->area.parent);
|
||||||
char *cmd = calloc(strlen(icon->cmd) + 10, 1);
|
char *cmd = calloc(strlen(icon->cmd) + 10, 1);
|
||||||
sprintf(cmd, "(%s&)", icon->cmd);
|
sprintf(cmd, "(%s&)", icon->cmd);
|
||||||
#if HAVE_SN
|
#if HAVE_SN
|
||||||
|
@ -461,56 +422,105 @@ void launcher_load_icons(Launcher *launcher)
|
||||||
// Load apps (.desktop style launcher items)
|
// Load apps (.desktop style launcher items)
|
||||||
GSList *app = launcher->list_apps;
|
GSList *app = launcher->list_apps;
|
||||||
while (app != NULL) {
|
while (app != NULL) {
|
||||||
DesktopEntry entry;
|
LauncherIcon *launcherIcon = calloc(1, sizeof(LauncherIcon));
|
||||||
read_desktop_file(app->data, &entry);
|
launcherIcon->area.panel = launcher->area.panel;
|
||||||
if (entry.exec) {
|
launcherIcon->area._draw_foreground = draw_launcher_icon;
|
||||||
LauncherIcon *launcherIcon = calloc(1, sizeof(LauncherIcon));
|
launcherIcon->area.size_mode = LAYOUT_FIXED;
|
||||||
launcherIcon->area.panel = launcher->area.panel;
|
launcherIcon->area._resize = NULL;
|
||||||
snprintf(launcherIcon->area.name,
|
launcherIcon->area.resize_needed = 0;
|
||||||
sizeof(launcherIcon->area.name),
|
launcherIcon->area.has_mouse_over_effect = panel_config.mouse_effects;
|
||||||
"LauncherIcon %s",
|
launcherIcon->area.has_mouse_press_effect = launcherIcon->area.has_mouse_over_effect;
|
||||||
entry.name ? entry.name : "null");
|
launcherIcon->area.bg = launcher_icon_bg;
|
||||||
launcherIcon->area._draw_foreground = draw_launcher_icon;
|
launcherIcon->area.on_screen = TRUE;
|
||||||
launcherIcon->area.size_mode = LAYOUT_FIXED;
|
launcherIcon->area._on_change_layout = launcher_icon_on_change_layout;
|
||||||
launcherIcon->area._resize = NULL;
|
launcherIcon->area._dump_geometry = launcher_icon_dump_geometry;
|
||||||
launcherIcon->area.resize_needed = 0;
|
if (launcher_tooltip_enabled) {
|
||||||
schedule_redraw(&launcherIcon->area);
|
launcherIcon->area._get_tooltip_text = launcher_icon_get_tooltip_text;
|
||||||
launcherIcon->area.has_mouse_over_effect = panel_config.mouse_effects;
|
} else {
|
||||||
launcherIcon->area.has_mouse_press_effect = launcherIcon->area.has_mouse_over_effect;
|
launcherIcon->area._get_tooltip_text = NULL;
|
||||||
launcherIcon->area.bg = launcher_icon_bg;
|
|
||||||
launcherIcon->area.on_screen = TRUE;
|
|
||||||
launcherIcon->area._on_change_layout = launcher_icon_on_change_layout;
|
|
||||||
launcherIcon->area._dump_geometry = launcher_icon_dump_geometry;
|
|
||||||
if (launcher_tooltip_enabled) {
|
|
||||||
launcherIcon->area._get_tooltip_text = launcher_icon_get_tooltip_text;
|
|
||||||
} else {
|
|
||||||
launcherIcon->area._get_tooltip_text = NULL;
|
|
||||||
}
|
|
||||||
launcherIcon->is_app_desktop = 1;
|
|
||||||
launcherIcon->cmd = strdup(entry.exec);
|
|
||||||
launcherIcon->icon_name = entry.icon ? strdup(entry.icon) : strdup(DEFAULT_ICON);
|
|
||||||
launcherIcon->icon_size = 1;
|
|
||||||
if (entry.name) {
|
|
||||||
if (entry.generic_name) {
|
|
||||||
launcherIcon->icon_tooltip = g_strdup_printf("%s (%s)", entry.name, entry.generic_name);
|
|
||||||
} else {
|
|
||||||
launcherIcon->icon_tooltip = g_strdup_printf("%s", entry.name);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (entry.generic_name) {
|
|
||||||
launcherIcon->icon_tooltip = g_strdup_printf("%s", entry.generic_name);
|
|
||||||
} else if (entry.exec) {
|
|
||||||
launcherIcon->icon_tooltip = g_strdup_printf("%s", entry.exec);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
launcher->list_icons = g_slist_append(launcher->list_icons, launcherIcon);
|
|
||||||
add_area(&launcherIcon->area, (Area *)launcher);
|
|
||||||
}
|
}
|
||||||
free_desktop_entry(&entry);
|
launcherIcon->config_path = strdup(app->data);
|
||||||
|
add_area(&launcherIcon->area, (Area *)launcher);
|
||||||
|
launcher->list_icons = g_slist_append(launcher->list_icons, launcherIcon);
|
||||||
|
launcher_reload_icon(launcher, launcherIcon);
|
||||||
app = g_slist_next(app);
|
app = g_slist_next(app);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void launcher_reload_icon(Launcher *launcher, LauncherIcon *launcherIcon)
|
||||||
|
{
|
||||||
|
DesktopEntry entry;
|
||||||
|
if (read_desktop_file(launcherIcon->config_path, &entry) && entry.exec) {
|
||||||
|
schedule_redraw(&launcherIcon->area);
|
||||||
|
launcherIcon->cmd = strdup(entry.exec);
|
||||||
|
launcherIcon->icon_name = entry.icon ? strdup(entry.icon) : strdup(DEFAULT_ICON);
|
||||||
|
if (entry.name) {
|
||||||
|
if (entry.generic_name) {
|
||||||
|
launcherIcon->icon_tooltip = g_strdup_printf("%s (%s)", entry.name, entry.generic_name);
|
||||||
|
} else {
|
||||||
|
launcherIcon->icon_tooltip = g_strdup_printf("%s", entry.name);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (entry.generic_name) {
|
||||||
|
launcherIcon->icon_tooltip = g_strdup_printf("%s", entry.generic_name);
|
||||||
|
} else if (entry.exec) {
|
||||||
|
launcherIcon->icon_tooltip = g_strdup_printf("%s", entry.exec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
launcher_reload_icon_image(launcher, launcherIcon);
|
||||||
|
if (!launcherIcon->area.on_screen)
|
||||||
|
show(&launcherIcon->area);
|
||||||
|
} else {
|
||||||
|
hide(&launcherIcon->area);
|
||||||
|
}
|
||||||
|
free_desktop_entry(&entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
void launcher_reload_hidden_icons(Launcher *launcher)
|
||||||
|
{
|
||||||
|
for (GSList *l = launcher->list_icons; l; l = l->next) {
|
||||||
|
LauncherIcon *launcherIcon = (LauncherIcon *)l->data;
|
||||||
|
if (!launcherIcon->area.on_screen)
|
||||||
|
launcher_reload_icon(launcher, launcherIcon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void launcher_reload_icon_image(Launcher *launcher, LauncherIcon *launcherIcon)
|
||||||
|
{
|
||||||
|
free_icon(launcherIcon->image);
|
||||||
|
free_icon(launcherIcon->image_hover);
|
||||||
|
free_icon(launcherIcon->image_pressed);
|
||||||
|
launcherIcon->image = NULL;
|
||||||
|
|
||||||
|
char *new_icon_path = get_icon_path(launcher->icon_theme_wrapper, launcherIcon->icon_name, launcherIcon->icon_size);
|
||||||
|
if (new_icon_path)
|
||||||
|
launcherIcon->image = load_image(new_icon_path, 1);
|
||||||
|
// On loading error, fallback to default
|
||||||
|
if (!launcherIcon->image) {
|
||||||
|
free(new_icon_path);
|
||||||
|
new_icon_path = get_icon_path(launcher->icon_theme_wrapper, DEFAULT_ICON, launcherIcon->icon_size);
|
||||||
|
if (new_icon_path)
|
||||||
|
launcherIcon->image = imlib_load_image_immediately(new_icon_path);
|
||||||
|
}
|
||||||
|
Imlib_Image original = launcherIcon->image;
|
||||||
|
launcherIcon->image = scale_icon(launcherIcon->image, launcherIcon->icon_size);
|
||||||
|
free_icon(original);
|
||||||
|
free(launcherIcon->icon_path);
|
||||||
|
launcherIcon->icon_path = new_icon_path;
|
||||||
|
// fprintf(stderr, "launcher.c %d: Using icon %s\n", __LINE__, launcherIcon->icon_path);
|
||||||
|
|
||||||
|
if (panel_config.mouse_effects) {
|
||||||
|
launcherIcon->image_hover = adjust_icon(launcherIcon->image,
|
||||||
|
panel_config.mouse_over_alpha,
|
||||||
|
panel_config.mouse_over_saturation,
|
||||||
|
panel_config.mouse_over_brightness);
|
||||||
|
launcherIcon->image_pressed = adjust_icon(launcherIcon->image,
|
||||||
|
panel_config.mouse_pressed_alpha,
|
||||||
|
panel_config.mouse_pressed_saturation,
|
||||||
|
panel_config.mouse_pressed_brightness);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Populates the icon_theme_wrapper list
|
// Populates the icon_theme_wrapper list
|
||||||
void launcher_load_themes(Launcher *launcher)
|
void launcher_load_themes(Launcher *launcher)
|
||||||
{
|
{
|
||||||
|
|
|
@ -23,6 +23,7 @@ typedef struct Launcher {
|
||||||
typedef struct LauncherIcon {
|
typedef struct LauncherIcon {
|
||||||
// always start with area
|
// always start with area
|
||||||
Area area;
|
Area area;
|
||||||
|
char *config_path;
|
||||||
Imlib_Image image;
|
Imlib_Image image;
|
||||||
Imlib_Image image_hover;
|
Imlib_Image image_hover;
|
||||||
Imlib_Image image_pressed;
|
Imlib_Image image_pressed;
|
||||||
|
@ -31,7 +32,6 @@ typedef struct LauncherIcon {
|
||||||
char *icon_path;
|
char *icon_path;
|
||||||
char *icon_tooltip;
|
char *icon_tooltip;
|
||||||
int icon_size;
|
int icon_size;
|
||||||
int is_app_desktop;
|
|
||||||
int x, y;
|
int x, y;
|
||||||
} LauncherIcon;
|
} LauncherIcon;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue