// This file is a part of Simple Launcher
//
-// Copyright (C) 2006, 2007, Mikhail Sobolev
+// Copyright (C) 2006, 2007, 2008 Mikhail Sobolev <mss@mawhrin.net>
//
// 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
#include <gtk/gtk.h>
-#include <hildon-home-plugin/hildon-home-plugin-interface.h>
-#include <libosso.h>
-
-#include "launcher-item.h"
-#include "sla-list.h"
-#include "launchable-item.h"
-#include "settings-dialog.h"
+#include "simple-launcher.h"
#define SL_APPLET_DBUS_NAME "simple-launcher"
#define SL_APPLET_VERSION "0.0"
-#define SL_APPLET_GCONF_PATH "/apps/simple-launcher"
-
-class SimpleLauncherApplet {
-public:
- SimpleLauncherApplet();
- ~SimpleLauncherApplet();
-
- bool doInit(void *state_data, int *state_size);
-
- void background() {}
- void foreground() {}
- int saveState(void **state_data, int *state_size);
- GtkWidget *settings(GtkWindow *parent);
-
- GtkWidget *getWidget() { return myWidget; }
-
-private:
- static void addItem(LauncherItems&, const std::string&, bool);
-
- void loadConfig();
- void saveConfig();
-
- static void updateItems(LauncherItems&);
- static void processDirectory(LauncherItems&, const std::string&);
-
- bool initWidget();
- void updateWidget();
-
- void buttonPressed(GtkWidget *button, GdkEventButton *event);
- void runDialog();
-
- static void _button_pressed(GtkWidget *button, GdkEventButton *event, void *self);
- static void _run_dialog(GtkMenuItem *, void *);
-
-private:
- // GConfClientWrapper myClient;
- // GConfKey myMainSettings;
-
- osso_context_t *myContext;
-
- GtkWidget *myWidget;
- GtkWindow *myParent;
-
- LauncherItems myItems;
-
- bool myTransparent;
- // bool myShowInfobanner; // FIXME: to implement
- int myIconSize;
- int myCanvasSize;
-
- 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();
+ SimpleLauncherApplet *applet = new SimpleLauncherApplet(SL_APPLET_GCONF_PATH);
if (applet != NULL) {
if (applet->doInit(state_data, state_size)) {
delete applet;
}
-void hildon_home_applet_lib_background(void *applet_data) {
- ((SimpleLauncherApplet *)applet_data)->background();
-}
-
-void hildon_home_applet_lib_foreground (void *applet_data) {
- ((SimpleLauncherApplet *)applet_data)->foreground();
-}
-
GtkWidget *hildon_home_applet_lib_settings(void *applet_data, GtkWindow *parent) {
return ((SimpleLauncherApplet *)applet_data)->settings(parent);
}
};
// SimpleLauncherApplet::SimpleLauncherApplet() : myMainSettings(myClient.getKey(SL_APPLET_GCONF_PATH)), myContext(NULL), myWidget(NULL), myParent(NULL) {
-SimpleLauncherApplet::SimpleLauncherApplet() : myContext(NULL), myWidget(NULL), myParent(NULL), myTransparent(true), myIconSize(48), myCanvasSize(1) {
+SimpleLauncherApplet::SimpleLauncherApplet(const std::string& base) : myContext(NULL), myWidget(NULL), myParent(NULL), myTransparent(GConfKey(base), "transparent", false), myIconSize(GConfKey(base), "icon_size", 48) {
}
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;
}
}
-// 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];
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) {
}
}
+// }}}
+
void SimpleLauncherApplet::updateItems(LauncherItems& items) {
for (int i = 0 ; ourDirs[i] != NULL ; ++i) {
processDirectory(items, ourDirs[i]);
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), !myTransparent);
- gtk_container_set_border_width(GTK_CONTAINER(button), myCanvasSize);
+ gtk_event_box_set_visible_window(GTK_EVENT_BOX(button), !myTransparent.value());
{
- GdkPixbuf *pixbuf = item->getIcon(myIconSize);
+ GdkPixbuf *pixbuf = item->getIcon(myIconSize.value());
gtk_container_add(GTK_CONTAINER(button), gtk_image_new_from_pixbuf(pixbuf));
g_object_unref(G_OBJECT(pixbuf));
}
g_object_unref(G_OBJECT(group));
+ int totalSize = myIconSize.value();
+
if (button_no == 0) {
- gtk_widget_set_size_request(myWidget, myIconSize+myCanvasSize+myCanvasSize, myIconSize+myCanvasSize+myCanvasSize);
+ gtk_widget_set_size_request(myWidget, totalSize, totalSize);
} else {
- gtk_widget_set_size_request(myWidget, button_no*(myIconSize+myCanvasSize+myCanvasSize), myIconSize+myCanvasSize+myCanvasSize);
+ gtk_widget_set_size_request(myWidget, button_no*totalSize, totalSize);
}
gtk_widget_show_all(myWidget);
LauncherItems newItems = myItems;
- SettingsDialog dialog(myParent, 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;
default:
; // FIXME: do I want to do anything in here?
}
+
+ // newItems.clear(); // TODO: do I really need it?
}
// vim:ts=2:sw=2:et