X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=launcher-item.cc;h=a72ff1ba750c9f349ea5182f1fe7a99d0f086c80;hb=ccab6edd2df2d5372e7d568abbc0ddede5d33414;hp=28825a20274235cac1afa2cf11ec54c48edcd6fa;hpb=434be06328d75d352498f1d3350e356dcc280d5c;p=simple-launcher diff --git a/launcher-item.cc b/launcher-item.cc index 28825a2..a72ff1b 100644 --- a/launcher-item.cc +++ b/launcher-item.cc @@ -1,103 +1,172 @@ +// This file is a part of Simple Launcher +// +// Copyright (C) 2006, 2007, Mikhail Sobolev +// +// Simple Launcher is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License version 2 as published by +// the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. +// +// You should have received a copy of the GNU General Public License along with +// this program; if not, write to the Free Software Foundation, Inc., 51 +// Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + #include +#include + #include #include -#include - #include "launcher-item.h" +GtkIconTheme *LauncherItem::ourTheme = NULL; + static const char *DESKTOP_ENTRY_GROUP = "Desktop Entry", *DESKTOP_ENTRY_TYPE_FIELD = "Type", *DESKTOP_ENTRY_ICON_FIELD = "Icon", *DESKTOP_ENTRY_NAME_FIELD = "Name", *DESKTOP_ENTRY_COMMENT_FIELD = "Comment", - *DESKTOP_ENTRY_SERVICE_FIELD = "X-Osso-Service"; + *DESKTOP_ENTRY_EXEC_FIELD = "Exec", + *DESKTOP_ENTRY_SERVICE_FIELD = "X-Osso-Service", + *DESKTOP_ENTRY_TEXT_DOMAIN = "X-Text-Domain"; -inline std::string getStringWrapper(GKeyFile *keyFile, const gchar *group, const gchar *itemName) { - gchar *tempo = g_key_file_get_string(keyFile, group, itemName, 0); - std::string result; +static const char *DEFAULT_TEXT_DOMAIN = "maemo-af-desktop"; +static const char *DEFAULT_APP_ICON = "qgn_list_gene_default_app"; - if (tempo != 0) { - result = tempo; +class GKeyFileWrapper { +public: + GKeyFileWrapper() { + myKeyFile = g_key_file_new(); + } - g_free(tempo); + ~GKeyFileWrapper() { + if (myKeyFile != NULL) { + g_key_file_free(myKeyFile); + } } - return result; -} + bool load(const std::string& name) { + GError *error = NULL; + bool result = g_key_file_load_from_file(myKeyFile, name.c_str(), G_KEY_FILE_NONE, &error); -inline std::string getLocaleStringWrapper(GKeyFile *keyFile, const gchar *group, const gchar *itemName) { - gchar *tempo = g_key_file_get_locale_string(keyFile, group, itemName, 0, 0); - std::string result; + if (error != NULL) { + g_error_free(error); + } + + return result; + } - if (tempo != 0) { - result = tempo; + std::string getString(const gchar *group, const gchar *itemName) { + gchar *tempo = g_key_file_get_string(myKeyFile, group, itemName, NULL); + std::string result; - g_free(tempo); + if (tempo != NULL) { + result.assign(tempo); + + g_free(tempo); + } + + return result; } - return result; -} + std::string getLocaleString(const gchar *group, const gchar *itemName) { + gchar *tempo = g_key_file_get_locale_string(myKeyFile, group, itemName, NULL, NULL); + std::string result; + + if (tempo != NULL) { + result.assign(tempo); + + g_free(tempo); + } + + return result; + } + +private: + GKeyFile *myKeyFile; +}; -LauncherItem::LauncherItem() { +LauncherItem::LauncherItem(): myEnabled(false) { } LauncherItem::~LauncherItem() { } +std::string LauncherItem::translateString(const std::string& what) const { + if (what.empty()) { + return what; + } else { + return dgettext(myTextDomain.empty() ? DEFAULT_TEXT_DOMAIN : myTextDomain.c_str(), what.c_str()); + } +} + bool LauncherItem::load(const std::string& filename) { - GKeyFile *key_file = 0; - GError *error = 0; + GKeyFileWrapper key_file; for (;;) { - if ((key_file = g_key_file_new()) == 0) { - break; - } + myFileName = filename; - if (!g_key_file_load_from_file(key_file, filename.c_str(), G_KEY_FILE_NONE, &error)) { + if (!key_file.load(filename)) { break; } - if (getStringWrapper(key_file, DESKTOP_ENTRY_GROUP, DESKTOP_ENTRY_TYPE_FIELD) != "Application") { + if (key_file.getString(DESKTOP_ENTRY_GROUP, DESKTOP_ENTRY_TYPE_FIELD) != "Application") { break; } - myName = getStringWrapper(key_file, DESKTOP_ENTRY_GROUP, DESKTOP_ENTRY_NAME_FIELD); - myComment = getLocaleStringWrapper(key_file, DESKTOP_ENTRY_GROUP, DESKTOP_ENTRY_COMMENT_FIELD); - myIcon = getStringWrapper(key_file, DESKTOP_ENTRY_GROUP, DESKTOP_ENTRY_ICON_FIELD); - myService = getStringWrapper(key_file, DESKTOP_ENTRY_GROUP, DESKTOP_ENTRY_SERVICE_FIELD); + myName = key_file.getLocaleString(DESKTOP_ENTRY_GROUP, DESKTOP_ENTRY_NAME_FIELD); + myComment = key_file.getLocaleString(DESKTOP_ENTRY_GROUP, DESKTOP_ENTRY_COMMENT_FIELD); + myIcon = key_file.getString(DESKTOP_ENTRY_GROUP, DESKTOP_ENTRY_ICON_FIELD); + myService = key_file.getString(DESKTOP_ENTRY_GROUP, DESKTOP_ENTRY_SERVICE_FIELD); + myExec = key_file.getString(DESKTOP_ENTRY_GROUP, DESKTOP_ENTRY_EXEC_FIELD); + myTextDomain = key_file.getString(DESKTOP_ENTRY_GROUP, DESKTOP_ENTRY_TEXT_DOMAIN); break; } - if (error != 0) { - g_error_free(error); - error = 0; - } - - if (key_file != 0) { - g_key_file_free(key_file); - } - - return !(myName.empty() || myIcon.empty() || myService.empty()); + return (myEnabled = checkSanity()); } GdkPixbuf *LauncherItem::getIcon(int icon_size) const { - GdkPixbuf *pixbuf = 0; + if (ourTheme == NULL) { + ourTheme = gtk_icon_theme_get_default(); + } + + GdkPixbuf *pixbuf = NULL; + GError *error = NULL; if (!myIcon.empty()) { - GtkIconTheme *theme; - GError *error = 0; + pixbuf = gtk_icon_theme_load_icon(ourTheme, myIcon.c_str(), icon_size, GTK_ICON_LOOKUP_NO_SVG, &error); - theme = gtk_icon_theme_get_default(); - pixbuf = gtk_icon_theme_load_icon(theme, myIcon.c_str(), icon_size, GTK_ICON_LOOKUP_NO_SVG, &error); + if (error != NULL) { + g_error_free(error); + error = NULL; + } + } + + if (pixbuf == NULL) { + pixbuf = gtk_icon_theme_load_icon(ourTheme, DEFAULT_APP_ICON, icon_size, GTK_ICON_LOOKUP_NO_SVG, &error); - if (error != 0) { + if (error != NULL) { g_error_free(error); error = NULL; } } + if (pixbuf != NULL) { + GdkPixbuf *tempo = gdk_pixbuf_copy(pixbuf); + + g_object_unref(pixbuf); + + pixbuf = tempo; + } + return pixbuf; } + +// vim:ts=2:sw=2:et