/****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)); }
void XdgCachedMenu::onItemTrigerred() { XdgCachedMenuAction* action = static_cast<XdgCachedMenuAction*>(sender()); XdgDesktopFile df; char* desktop_file = menu_cache_item_get_file_path(action->item()); df.load(desktop_file); g_free(desktop_file); df.startDetached(); }
QByteArray AppMenuView::selectedAppDesktopFilePath() { AppMenuViewItem* item = selectedItem(); if(item && item->isApp()) { char* path = menu_cache_item_get_file_path(item->item()); QByteArray ret(path); g_free(path); return ret; } return QByteArray(); }
char* fm_app_menu_view_get_selected_app_desktop_file(GtkTreeView* view) { GtkTreeIter it; GtkTreeSelection* sel = gtk_tree_view_get_selection(view); if(gtk_tree_selection_get_selected(sel, NULL, &it)) { MenuCacheItem* item; gtk_tree_model_get(GTK_TREE_MODEL(store), &it, COL_ITEM, &item, -1); if(item && menu_cache_item_get_type(item) == MENU_CACHE_TYPE_APP) { char* path = menu_cache_item_get_file_path(item); return path; } } return NULL; }
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; }
// taken from libqtxdg: XdgMenuWidget void XdgCachedMenu::handleMouseMoveEvent(QMouseEvent *event) { if (!(event->buttons() & Qt::LeftButton)) return; if ((event->pos() - mDragStartPosition).manhattanLength() < QApplication::startDragDistance()) return; XdgCachedMenuAction *a = qobject_cast<XdgCachedMenuAction*>(actionAt(event->pos())); if (!a) return; QList<QUrl> urls; char* desktop_file = menu_cache_item_get_file_path(a->item()); urls << QUrl(desktop_file); g_free(desktop_file); QMimeData *mimeData = new QMimeData(); mimeData->setUrls(urls); QDrag *drag = new QDrag(this); drag->setMimeData(mimeData); drag->exec(Qt::CopyAction | Qt::LinkAction); }