X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=simple-launcher.cc;h=3ebd1da1abf386b1c038cb31be76af971c59e80d;hb=HEAD;hp=c8a42c75c2d18b51913a1543c47a93ff9ec38751;hpb=d6bf5ec4c9e9b72d3d4dc408841ffe3cca849be0;p=simple-launcher diff --git a/simple-launcher.cc b/simple-launcher.cc index c8a42c7..3ebd1da 100644 --- a/simple-launcher.cc +++ b/simple-launcher.cc @@ -23,23 +23,36 @@ #include -#include #include #include "launcher-item.h" -#include "sla-list.h" #include "launchable-item.h" #include "settings-dialog.h" +#include "gconf-wrapper.h" #define SL_APPLET_DBUS_NAME "simple-launcher" #define SL_APPLET_VERSION "0.0" -#define SL_APPLET_ICON_SIZE 48 #define SL_APPLET_GCONF_PATH "/apps/simple-launcher" +// A copy of interface functions from hildon-home-plugin-interface (new hildon desktop does not have it) {{{ + +extern "C" { + + void *hildon_home_applet_lib_initialize(void *state_data, int *state_size, GtkWidget **widget); + int hildon_home_applet_lib_save_state(void *applet_data, void **state_data, int *state_size); + void hildon_home_applet_lib_background(void *applet_data); + void hildon_home_applet_lib_foreground(void *applet_data); + void hildon_home_applet_lib_deinitialize(void *applet_data); + GtkWidget *hildon_home_applet_lib_settings(void *applet_data, GtkWindow *parent); + +}; + +// }}} + class SimpleLauncherApplet { public: - SimpleLauncherApplet(); + SimpleLauncherApplet(const GConfKey&); ~SimpleLauncherApplet(); bool doInit(void *state_data, int *state_size); @@ -80,13 +93,19 @@ private: LauncherItems myItems; + GConfBooleanOption myTransparent; + // bool myShowInfobanner; // FIXME: to implement + GConfIntegerOption myIconSize; + static char *ourDirs[]; }; // Hildon home applet interface functions void *hildon_home_applet_lib_initialize(void *state_data, int *state_size, GtkWidget **widget) { - SimpleLauncherApplet *applet = new SimpleLauncherApplet(); + GConfKey baseKey(SL_APPLET_GCONF_PATH); + + SimpleLauncherApplet *applet = new SimpleLauncherApplet(baseKey); if (applet != NULL) { if (applet->doInit(state_data, state_size)) { @@ -130,7 +149,7 @@ char *SimpleLauncherApplet::ourDirs[] = { }; // SimpleLauncherApplet::SimpleLauncherApplet() : myMainSettings(myClient.getKey(SL_APPLET_GCONF_PATH)), myContext(NULL), myWidget(NULL), myParent(NULL) { -SimpleLauncherApplet::SimpleLauncherApplet() : myContext(NULL), myWidget(NULL), myParent(NULL) { +SimpleLauncherApplet::SimpleLauncherApplet(const GConfKey& base) : myContext(NULL), myWidget(NULL), myParent(NULL), myTransparent(base, "transparent", false), myIconSize(base, "icon_size", 48) { } bool SimpleLauncherApplet::doInit(void *state_data, int *state_size) { @@ -150,12 +169,13 @@ bool SimpleLauncherApplet::doInit(void *state_data, int *state_size) { SimpleLauncherApplet::~SimpleLauncherApplet() { myItems.clear(); - +#if 0 + // This does not seem to be necessary if (myWidget != NULL) { gtk_widget_destroy(myWidget); myWidget = NULL; } - +#endif if (myContext != NULL) { osso_deinitialize(myContext); myContext = NULL; @@ -178,11 +198,19 @@ void SimpleLauncherApplet::addItem(LauncherItems& items, const std::string& name } } -// FIXME: this probably should be done somehow differently -static char *configFileName="/home/user/.slarc"; +// {{{ Configuration file managment +static const gchar *getConfigFileName() { + static gchar *configFileName = NULL; + + if (configFileName == NULL) { + configFileName = g_build_filename(g_get_home_dir(), ".slarc", NULL); + } + + return configFileName; +} void SimpleLauncherApplet::loadConfig() { - std::ifstream config(configFileName); + std::ifstream config(getConfigFileName()); if (config) { char *buffer = new char [1024]; @@ -197,13 +225,13 @@ void SimpleLauncherApplet::loadConfig() { addItem(myItems, buffer, (p != NULL && (*p == '1' || *p == 'y' || *p == 'Y'))); } - delete buffer; + delete [] buffer; } } void SimpleLauncherApplet::saveConfig() { // TODO: make saving config an atomic operation - std::ofstream config(configFileName); + std::ofstream config(getConfigFileName()); if (config) { for (size_t i = 0 ; i < myItems.size() ; ++i) { @@ -212,6 +240,8 @@ void SimpleLauncherApplet::saveConfig() { } } +// }}} + void SimpleLauncherApplet::updateItems(LauncherItems& items) { for (int i = 0 ; ourDirs[i] != NULL ; ++i) { processDirectory(items, ourDirs[i]); @@ -268,10 +298,13 @@ void SimpleLauncherApplet::updateWidget() { gtk_widget_set_events(button, GDK_BUTTON_PRESS_MASK); g_signal_connect(button, "button-press-event", G_CALLBACK(_button_pressed), this); - gtk_event_box_set_visible_window(GTK_EVENT_BOX(button), false); - // gtk_button_set_relief(GTK_BUTTON(button),GTK_RELIEF_NONE); + gtk_event_box_set_visible_window(GTK_EVENT_BOX(button), !myTransparent.value()); - gtk_container_add(GTK_CONTAINER(button), gtk_image_new_from_pixbuf(item->getIcon(SL_APPLET_ICON_SIZE))); + { + GdkPixbuf *pixbuf = item->getIcon(myIconSize.value()); + gtk_container_add(GTK_CONTAINER(button), gtk_image_new_from_pixbuf(pixbuf)); + g_object_unref(G_OBJECT(pixbuf)); + } gtk_object_set_user_data(GTK_OBJECT(button), item); @@ -285,10 +318,12 @@ void SimpleLauncherApplet::updateWidget() { g_object_unref(G_OBJECT(group)); + int totalSize = myIconSize.value(); + if (button_no == 0) { - gtk_widget_set_size_request(myWidget, SL_APPLET_ICON_SIZE, SL_APPLET_ICON_SIZE); + gtk_widget_set_size_request(myWidget, totalSize, totalSize); } else { - gtk_widget_set_size_request(myWidget, button_no*SL_APPLET_ICON_SIZE, SL_APPLET_ICON_SIZE); + gtk_widget_set_size_request(myWidget, button_no*totalSize, totalSize); } gtk_widget_show_all(myWidget); @@ -341,11 +376,14 @@ void SimpleLauncherApplet::runDialog() { LauncherItems newItems = myItems; - SettingsDialog dialog(myParent, SL_APPLET_ICON_SIZE, newItems); + // TODO: make it nicer... this code is ugly :( + SettingsDialog dialog(myParent, newItems, myTransparent, myIconSize); switch (dialog.run()) { case GTK_RESPONSE_OK: myItems = newItems; + dialog.updateValues(); // FIXME: hackish :( make it better + saveConfig(); // save it immediately! updateWidget(); break; @@ -356,6 +394,8 @@ void SimpleLauncherApplet::runDialog() { default: ; // FIXME: do I want to do anything in here? } + + // newItems.clear(); // TODO: do I really need it? } // vim:ts=2:sw=2:et