/****f* pekwm-menu/clean_exec * FUNCTION * Remove %f, %F, %u, %U, %i, %c, %k from exec field. * None of theses codes are interesting to manage here. * %i, %c and %k codes are implemented but don't ask why we need them. :) * * OUTPUT * A gchar that needs to be freed. * * NOTES * %d, %D, %n, %N, %v and %m are deprecated and should be removed. * * SEE ALSO * http://standards.freedesktop.org/desktop-entry-spec/latest/ar01s06.html ****/ gchar * clean_exec (MenuCacheApp *app) { gchar *filepath = NULL; const char *exec = menu_cache_app_get_exec (MENU_CACHE_APP(app)); GString *cmd = g_string_sized_new (64); for (;*exec; ++exec) { if (*exec == '%') { ++exec; switch (*exec) { /* useless and commonly used codes */ case 'u': case 'U': case 'f': case 'F': break; /* deprecated codes */ case 'd': case 'D': case 'm': case 'n': case 'N': case 'v': break; /* Other codes, more or less pointless to implement */ case 'c': g_string_append (cmd, menu_cache_item_get_name (MENU_CACHE_ITEM(app))); break; #if WITH_ICONS case 'i': if (get_item_icon_path (MENU_CACHE_ITEM(app))) { g_string_append_printf (cmd, "--icon %s", get_item_icon_path (MENU_CACHE_ITEM(app))); } break; #endif case 'k': filepath = menu_cache_item_get_file_path (MENU_CACHE_ITEM(app)); if (filepath) { g_string_append (cmd, filepath); g_free (filepath); } break; /* It was not in the freedesktop specification. */ default: g_string_append_c (cmd, '%'); g_string_append_c (cmd, *exec); break; } } else g_string_append_c (cmd, *exec); } return g_strchomp (g_string_free (cmd, FALSE)); }
static void add_menu_items(GtkTreeIter* parent_it, MenuCacheDir* dir) { GtkTreeIter it; GSList * l; GIcon* gicon; /* Iterate over all menu items in this directory. */ for (l = menu_cache_dir_get_children(dir); l != NULL; l = l->next) { /* Get the menu item. */ MenuCacheItem* item = MENU_CACHE_ITEM(l->data); switch(menu_cache_item_get_type(item)) { case MENU_CACHE_TYPE_NONE: case MENU_CACHE_TYPE_SEP: break; case MENU_CACHE_TYPE_APP: case MENU_CACHE_TYPE_DIR: if(menu_cache_item_get_icon(item)) { if(g_path_is_absolute(menu_cache_item_get_icon(item))) { GFile* gf = g_file_new_for_path(menu_cache_item_get_icon(item)); gicon = g_file_icon_new(gf); g_object_unref(gf); } else { char* dot = strrchr((char*)menu_cache_item_get_icon(item), '.'); if(dot && (strcmp(dot+1, "png") == 0 || strcmp(dot+1, "svg") == 0 || strcmp(dot+1, "xpm") == 0)) { char* name = g_strndup(menu_cache_item_get_icon(item), dot - menu_cache_item_get_icon(item)); gicon = g_themed_icon_new(name); g_free(name); } else gicon = g_themed_icon_new(menu_cache_item_get_icon(item)); } } else gicon = NULL; gtk_tree_store_append(store, &it, parent_it); gtk_tree_store_set(store, &it, COL_ICON, gicon, COL_TITLE, menu_cache_item_get_name(item), COL_ITEM, item, -1); if(gicon) g_object_unref(gicon); if(menu_cache_item_get_type(item) == MENU_CACHE_TYPE_DIR) add_menu_items(&it, MENU_CACHE_DIR(item)); break; } } }
XdgCachedMenuAction::XdgCachedMenuAction(MenuCacheItem* item, QObject* parent): QAction(parent), item_(menu_cache_item_ref(item)) { QString title = QString::fromUtf8(menu_cache_item_get_name(item)); title = title.replace('&', QLatin1String("&&")); // & is reserved for mnemonics setText(title); // Only set tooltips for app items if(menu_cache_item_get_type(item) == MENU_CACHE_TYPE_APP) { QString comment = QString::fromUtf8(menu_cache_item_get_comment(item)); setToolTip(comment); } }
XdgCachedMenuAction::XdgCachedMenuAction(MenuCacheItem* item, QObject* parent): QAction(parent), item_(menu_cache_item_ref(item)) { QString title = QString::fromUtf8(menu_cache_item_get_name(item)); setText(title); // Only set tooltips for app items if(menu_cache_item_get_type(item) == MENU_CACHE_TYPE_APP) { QString comment = QString::fromUtf8(menu_cache_item_get_comment(item)); setToolTip(comment); } QIcon icon = XdgIcon::fromTheme(menu_cache_item_get_icon(item)); setIcon(icon); }
AppLinkItem::AppLinkItem(MenuCacheApp* app): CommandProviderItem() { MenuCacheItem* item = MENU_CACHE_ITEM(app); mIconName = QString::fromUtf8(menu_cache_item_get_icon(item)); mTitle = QString::fromUtf8(menu_cache_item_get_name(item)); mComment = QString::fromUtf8(menu_cache_item_get_comment(item)); mToolTip = mComment; mCommand = menu_cache_app_get_exec(app); mProgram = QFileInfo(mCommand).baseName().section(" ", 0, 0); char* path = menu_cache_item_get_file_path(MENU_CACHE_ITEM(app)); mDesktopFile = QString::fromLocal8Bit(path); g_free(path); QMetaObject::invokeMethod(this, "updateIcon", Qt::QueuedConnection); // qDebug() << "FOUND: " << mIconName << ", " << mCommand; }
/* called with lock held */ static void add_menu_items(GtkTreeIter* parent_it, MenuCacheDir* dir) { GtkTreeIter it; GSList * l; #if MENU_CACHE_CHECK_VERSION(0, 4, 0) GSList *list; #endif GIcon* gicon; /* Iterate over all menu items in this directory. */ #if MENU_CACHE_CHECK_VERSION(0, 4, 0) for (l = list = menu_cache_dir_list_children(dir); l != NULL; l = l->next) #else for (l = menu_cache_dir_get_children(dir); l != NULL; l = l->next) #endif { /* Get the menu item. */ MenuCacheItem* item = MENU_CACHE_ITEM(l->data); switch(menu_cache_item_get_type(item)) { case MENU_CACHE_TYPE_NONE: case MENU_CACHE_TYPE_SEP: break; case MENU_CACHE_TYPE_APP: case MENU_CACHE_TYPE_DIR: if(menu_cache_item_get_icon(item)) gicon = G_ICON(fm_icon_from_name(menu_cache_item_get_icon(item))); else gicon = NULL; gtk_tree_store_append(store, &it, parent_it); gtk_tree_store_set(store, &it, COL_ICON, gicon, COL_TITLE, menu_cache_item_get_name(item), COL_ITEM, item, -1); if(gicon) g_object_unref(gicon); if(menu_cache_item_get_type(item) == MENU_CACHE_TYPE_DIR) add_menu_items(&it, MENU_CACHE_DIR(item)); break; } } #if MENU_CACHE_CHECK_VERSION(0, 4, 0) g_slist_free_full(list, (GDestroyNotify)menu_cache_item_unref); #endif }
/****f* pekwm-menu/menu_application * FUNCTION * create a menu entry for an application. ****/ void menu_application (MenuCacheApp *app, OB_Menu *context) { const char *exec_name = NULL; gchar *exec_icon = NULL; gchar *exec_cmd = NULL; /* is comment (description) or name displayed ? */ if (context->comment && menu_cache_item_get_comment (MENU_CACHE_ITEM(app))) exec_name = menu_cache_item_get_comment (MENU_CACHE_ITEM(app)); else exec_name = menu_cache_item_get_name (MENU_CACHE_ITEM(app)); exec_cmd = clean_exec (app); #ifdef WITH_ICONS if (!context->no_icons) { exec_icon = get_item_icon_path (MENU_CACHE_ITEM(app)); g_string_append_printf (context->builder, "Entry = \"%s\" { Icon = \"%s\"; Actions = \"Exec ", exec_name, exec_icon); } else #endif { g_string_append_printf (context->builder, "Entry = \"%s\" { Actions = \"Exec ", exec_name); } if (menu_cache_app_get_use_terminal (app)) g_string_append_printf (context->builder, "%s %s &\" }\n", context->terminal_cmd, exec_cmd); else g_string_append_printf (context->builder, "%s &\" }\n", exec_cmd); g_free (exec_icon); g_free (exec_cmd); }
/****f* pekwm-menu/menu_directory * FUNCTION * create a menu entry for a directory. * * NOTES * this menu entry has to be closed by "</menu>". ****/ void menu_directory (MenuCacheApp *dir, OB_Menu *context) { /* type changed from gchar to const char due to removal of get_safe_name function - NF 2013-08-21 */ const char *dir_name = menu_cache_item_get_name (MENU_CACHE_ITEM(dir)); #ifdef WITH_ICONS if (!context->no_icons) { gchar *dir_icon = get_item_icon_path (MENU_CACHE_ITEM(dir)); g_string_append_printf (context->builder, "Submenu = \"%s\" { Icon = \"%s\"\n", dir_name, dir_icon); g_free (dir_icon); } else #endif { g_string_append_printf (context->builder, "Submenu = \"%s\" {\n", dir_name); } }