added static to create_sensor_popup
[psensor.git] / src / ui.c
index 6cc04f3..132fb7b 100644 (file)
--- a/src/ui.c
+++ b/src/ui.c
 #include "cfg.h"
 #include "ui.h"
 #include "ui_graph.h"
+#include "ui_pref.h"
 #include "ui_sensorlist.h"
 
-static void on_destroy(GtkWidget *widget, gpointer data)
+static gboolean
+on_delete_event_cb(GtkWidget *widget, GdkEvent *event, gpointer data)
 {
+
+#if defined(HAVE_APPINDICATOR) || defined(HAVE_APPINDICATOR_029)
+       gtk_widget_hide(((struct ui_psensor *)data)->main_window);
+#else
        ui_psensor_quit();
+#endif
+
+       return TRUE;
+}
+
+static void
+cb_menu_quit(gpointer data, guint cb_action, GtkWidget *item)
+{
+       ui_psensor_quit();
+}
+
+static void
+cb_menu_preferences(gpointer data, guint cb_action, GtkWidget *item)
+{
+       ui_pref_dialog_run((struct ui_psensor *)data);
 }
 
 void ui_psensor_quit()
@@ -32,13 +53,37 @@ void ui_psensor_quit()
        gtk_main_quit();
 }
 
-GtkWidget *ui_window_create(struct ui_psensor * ui)
+static GtkItemFactoryEntry menu_items[] = {
+       {"/Psensor", NULL, NULL, 0, "<Branch>"},
+       {"/Psensor/Preferences",
+        NULL, cb_menu_preferences, 0, "<Item>"},
+       {"/Psensor/sep1",
+        NULL, NULL, 0, "<Separator>"},
+       {"/Psensor/Quit",
+        "", cb_menu_quit, 0, "<StockItem>", GTK_STOCK_QUIT},
+};
+
+static gint nmenu_items = sizeof(menu_items) / sizeof(menu_items[0]);
+
+static GtkWidget *get_menu(struct ui_psensor *ui)
+{
+       GtkItemFactory *item_factory;
+
+       item_factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<main>", NULL);
+
+       gtk_item_factory_create_items(item_factory,
+                                     nmenu_items, menu_items, ui);
+       return gtk_item_factory_get_widget(item_factory, "<main>");
+}
+
+void ui_window_create(struct ui_psensor *ui)
 {
        GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        GdkScreen *screen;
        GdkColormap *colormap;
        GdkPixbuf *icon;
        GtkIconTheme *icon_theme;
+       GtkWidget *menubar;
 
        gtk_window_set_default_size(GTK_WINDOW(window), 800, 200);
 
@@ -67,7 +112,8 @@ GtkWidget *ui_window_create(struct ui_psensor * ui)
        else
                fprintf(stderr, _("ERROR: Failed to load psensor icon.\n"));
 
-       g_signal_connect(window, "destroy", G_CALLBACK(on_destroy), ui);
+       g_signal_connect(window,
+                        "delete_event", G_CALLBACK(on_delete_event_cb), ui);
 
        gtk_window_set_decorated(GTK_WINDOW(window),
                                 ui->config->window_decoration_enabled);
@@ -75,10 +121,31 @@ GtkWidget *ui_window_create(struct ui_psensor * ui)
        gtk_window_set_keep_below(GTK_WINDOW(window),
                                  ui->config->window_keep_below_enabled);
 
-       return window;
+       /* main box */
+       menubar = get_menu(ui);
+
+       ui->main_box = gtk_vbox_new(FALSE, 1);
+
+       gtk_box_pack_start(GTK_BOX(ui->main_box), menubar,
+                          FALSE, TRUE, 0);
+
+       gtk_container_add(GTK_CONTAINER(window), ui->main_box);
+
+       ui->main_window = window;
+       ui->menu_bar = menubar;
+
+       gtk_widget_show_all(ui->main_window);
 }
 
-void ui_sensor_box_create(struct ui_psensor *ui)
+static void menu_bar_show(unsigned int show, struct ui_psensor *ui)
+{
+       if (show)
+               gtk_widget_show(ui->menu_bar);
+       else
+               gtk_widget_hide(ui->menu_bar);
+}
+
+void ui_window_update(struct ui_psensor *ui)
 {
        struct config *cfg;
        GtkWidget *w_sensorlist;
@@ -88,7 +155,7 @@ void ui_sensor_box_create(struct ui_psensor *ui)
        if (ui->sensor_box) {
                ui_sensorlist_create_widget(ui->ui_sensorlist);
 
-               gtk_container_remove(GTK_CONTAINER(ui->main_window),
+               gtk_container_remove(GTK_CONTAINER(ui->main_box),
                                     ui->sensor_box);
 
                ui->w_graph = ui_graph_create(ui);
@@ -107,7 +174,7 @@ void ui_sensor_box_create(struct ui_psensor *ui)
        gtk_container_add(GTK_CONTAINER(w_sensorlist),
                          ui->ui_sensorlist->widget);
 
-       gtk_container_add(GTK_CONTAINER(ui->main_window), ui->sensor_box);
+       gtk_box_pack_end(GTK_BOX(ui->main_box), ui->sensor_box, TRUE, TRUE, 2);
 
        if (cfg->sensorlist_position == SENSORLIST_POSITION_RIGHT
            || cfg->sensorlist_position == SENSORLIST_POSITION_BOTTOM) {
@@ -123,4 +190,9 @@ void ui_sensor_box_create(struct ui_psensor *ui)
        }
 
        gtk_widget_show_all(ui->sensor_box);
+
+       if (cfg->menu_bar_disabled)
+               menu_bar_show(0, ui);
+       else
+               menu_bar_show(1, ui);
 }