X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=simple-launcher.cc;h=b30f5e8f31fd454c3b008833d552bcb7bb1fbc28;hb=a35af69c462e54d249586a4a74dd9d374f2c9411;hp=134664f691bf00ade1f04a489cac9462c0b6c419;hpb=0167448ac2c8b2d008a2b379eab91dcd7760ddfa;p=simple-launcher diff --git a/simple-launcher.cc b/simple-launcher.cc index 134664f..b30f5e8 100644 --- a/simple-launcher.cc +++ b/simple-launcher.cc @@ -1,6 +1,6 @@ // This file is a part of Simple Launcher // -// Copyright (C) 2006, Mikhail Sobolev +// 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 @@ -19,6 +19,8 @@ #include #include +#include + #include #include @@ -27,6 +29,7 @@ #include "launcher-item.h" #include "sla-list.h" #include "launchable-item.h" +#include "settings-dialog.h" #define SL_APPLET_DBUS_NAME "simple-launcher" #define SL_APPLET_VERSION "0.0" @@ -49,9 +52,14 @@ public: 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(); @@ -132,8 +140,6 @@ bool SimpleLauncherApplet::doInit(void *state_data, int *state_size) { return false; } - gtk_widget_show_all(myWidget); - return true; } @@ -151,20 +157,43 @@ SimpleLauncherApplet::~SimpleLauncherApplet() { } } +void SimpleLauncherApplet::addItem(LauncherItems& items, const std::string& name, bool enabled) { + if (!items.exists(name)) { + LaunchableItem *item = new LaunchableItem(); + + item->load(name); + + if (enabled) { + item->enable(); + } else { + item->disable(); + } + + items.add(name, item); + } +} + +// FIXME: this probably should be done somehow differently static char *configFileName="/home/user/.slarc"; void SimpleLauncherApplet::loadConfig() { -#if 0 - for (int i = 0 ; ourFiles[i] != NULL ; ++i) { - LaunchableItem *item = new LaunchableItem(); + std::ifstream config(configFileName); - if (item->load(ourFiles[i])) { - myItems.push_back(std::pair(ourFiles[i], item)); - } else { - delete item; + if (config) { + char *buffer = new char [1024]; + + while (config.getline(buffer, 1024)) { + char *p = strchr(buffer, ','); + + if (p != NULL) { + *p++ = '\0'; + } + + addItem(myItems, buffer, (p != NULL && (*p == '1' || *p == 'y' || *p == 'Y'))); } + + delete buffer; } -#endif } void SimpleLauncherApplet::saveConfig() { @@ -178,6 +207,36 @@ void SimpleLauncherApplet::saveConfig() { } } +void SimpleLauncherApplet::updateItems(LauncherItems& items) { + for (int i = 0 ; ourDirs[i] != NULL ; ++i) { + processDirectory(items, ourDirs[i]); + } +} + +void SimpleLauncherApplet::processDirectory(LauncherItems& items, const std::string& dirname) { + DIR *dir = opendir(dirname.c_str()); + + if (dir != NULL) { + const std::string namePrefix = dirname + "/"; + std::string shortName; + std::string desktopExtension = ".desktop"; + const dirent *file; + + while ((file = readdir(dir)) != 0) { + shortName = file->d_name; + if ((shortName == ".") || (shortName == "..")) { + continue; + } + + if ((shortName.length() >= desktopExtension.length()) && (shortName.compare(shortName.length() - desktopExtension.length(), desktopExtension.length(), desktopExtension) == 0)) { + addItem(items, namePrefix+shortName, false); + } + } + + closedir(dir); + } +} + bool SimpleLauncherApplet::initWidget() { myWidget = gtk_frame_new(NULL); @@ -199,29 +258,34 @@ void SimpleLauncherApplet::updateWidget() { } int button_no = 0; - GtkToolbar *toolbar = GTK_TOOLBAR(gtk_toolbar_new()); + GtkBox *box = GTK_BOX(gtk_hbox_new(true, 1)); for (size_t i = 0 ; i < myItems.size() ; ++i) { LauncherItem *item = myItems[i]; if (item != NULL && item->isEnabled()) { - GtkToolItem *button = gtk_tool_button_new(gtk_image_new_from_pixbuf(item->getIcon(SL_APPLET_ICON_SIZE)), NULL); + GtkWidget *button = gtk_button_new(); + + gtk_container_add(GTK_CONTAINER(button), gtk_image_new_from_pixbuf(item->getIcon(SL_APPLET_ICON_SIZE))); gtk_object_set_user_data(GTK_OBJECT(button), item); g_signal_connect(button, "clicked", G_CALLBACK(_button_clicked), this); - gtk_toolbar_insert(toolbar, button, -1); + gtk_box_pack_start(box, GTK_WIDGET(button), false, false, 0); ++button_no; } } - if (button_no) { - gtk_container_add(GTK_CONTAINER(myWidget), GTK_WIDGET(toolbar)); - gtk_widget_set_size_request(myWidget, button_no*(SL_APPLET_ICON_SIZE+SL_APPLET_CANVAS_SIZE), SL_APPLET_ICON_SIZE+SL_APPLET_CANVAS_SIZE); + gtk_container_add(GTK_CONTAINER(myWidget), GTK_WIDGET(box)); + + if (button_no == 0) { + gtk_widget_set_size_request(myWidget, SL_APPLET_ICON_SIZE+SL_APPLET_CANVAS_SIZE, SL_APPLET_ICON_SIZE+SL_APPLET_CANVAS_SIZE); } else { - gtk_widget_destroy(GTK_WIDGET(toolbar)); + gtk_widget_set_size_request(myWidget, button_no*(SL_APPLET_ICON_SIZE+SL_APPLET_CANVAS_SIZE), SL_APPLET_ICON_SIZE+SL_APPLET_CANVAS_SIZE); } + + gtk_widget_show_all(myWidget); } void SimpleLauncherApplet::_button_clicked(GtkToolButton *button, void *self) { @@ -251,10 +315,6 @@ int SimpleLauncherApplet::saveState(void **state_data, int *state_size) { } GtkWidget *SimpleLauncherApplet::settings(GtkWindow *parent) { - // TODO: in case we want SimpleLauncherApplet to be configurable, this method - // should return a gtk_menu_item that would be included in home settings - // menu. Method should make sure that when we activate that item, a - // corresponding dialog appears. myParent = parent; // FIXME: Ugly piece of code :( GtkWidget *menuItem = gtk_menu_item_new_with_label("Launcher settings..."); @@ -269,20 +329,19 @@ void SimpleLauncherApplet::_run_dialog(GtkMenuItem *, void *self) { } void SimpleLauncherApplet::runDialog() { - SLAList list(SL_APPLET_ICON_SIZE, myItems); - - GtkDialog *dialog = GTK_DIALOG(gtk_dialog_new_with_buttons("Launcher Settings", myParent, (GtkDialogFlags)(GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT), "OK", GTK_RESPONSE_OK, "Cancel", GTK_RESPONSE_CANCEL, NULL)); - - gtk_container_add(GTK_CONTAINER(dialog->vbox), list.getWidget()); - - gtk_widget_set_size_request(GTK_WIDGET(dialog), 540, 257); + // We update the items before using them to avoid a small memory leak + // FIXME: deal with the situation in a better way (figure it out first :)) + updateItems(myItems); // User requested 'settings', let's give her the latest stuff :) - int response = gtk_dialog_run(dialog); + LauncherItems newItems = myItems; - gtk_widget_destroy(GTK_WIDGET(dialog)); + SettingsDialog dialog(myParent, SL_APPLET_ICON_SIZE, newItems); - switch (response) { + switch (dialog.run()) { case GTK_RESPONSE_OK: + myItems = newItems; + saveConfig(); // save it immediately! + updateWidget(); break; case GTK_RESPONSE_CANCEL: