diff options
Diffstat (limited to 'libmdock/mdock-item.c')
-rw-r--r-- | libmdock/mdock-item.c | 98 |
1 files changed, 69 insertions, 29 deletions
diff --git a/libmdock/mdock-item.c b/libmdock/mdock-item.c index 2c9a836..9f87a6a 100644 --- a/libmdock/mdock-item.c +++ b/libmdock/mdock-item.c @@ -19,6 +19,7 @@ #include "mdock-enums.h" #include "mdock-item.h" +#include "mdock-item-menu.h" #include "thumbnailer.h" #define MDOCK_ITEM_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE((object), MDOCK_TYPE_ITEM, MDockItemPrivate)) @@ -33,7 +34,9 @@ struct _MDockItemPrivate WnckWindow *last_active; - GtkMenu *menu; + MDockItemMenu *menu; + + GtkMenu *right_menu; GtkImageMenuItem *menu_close_all; GtkImageMenuItem *menu_pin; GtkImageMenuItem *menu_launch; @@ -43,6 +46,7 @@ G_DEFINE_TYPE (MDockItem, mdock_item, GTK_TYPE_WIDGET) enum { PROP_0, + PROP_PINNED, PROP_DESKTOP_APP_INFO, PROP_ICON_SIZE, N_PROPERTIES @@ -97,7 +101,7 @@ static void mdock_item_update_icon(MDockItem *self) static void mdock_item_update_tooltip(MDockItem *self) { - gtk_widget_set_tooltip_text(GTK_WIDGET(self), mdock_item_get_display_name(self)); + // TODO gtk_widget_set_tooltip_text(GTK_WIDGET(self), mdock_item_get_display_name(self)); } static void mdock_item_update_menu(MDockItem *self) @@ -196,28 +200,7 @@ static gboolean mdock_item_button_press(GtkWidget *widget, GdkEventButton *event } } else if (self->priv->appinfo) { // No windows, but we have an application to launch! - GError *error = NULL; - if (!g_app_info_launch(G_APP_INFO(self->priv->appinfo), NULL, NULL, &error)) { - GtkWidget *msg; - - g_warning("Cannot launch '%s': %s", - g_app_info_get_display_name(G_APP_INFO(self->priv->appinfo)), - error->message); - - msg = gtk_message_dialog_new(GTK_WINDOW(gtk_widget_get_toplevel(widget)), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_WARNING, - GTK_BUTTONS_OK, - "Cannot launch '%s': %s", - g_app_info_get_display_name(G_APP_INFO(self->priv->appinfo)), - error->message); - - g_signal_connect_swapped(msg, "response", - G_CALLBACK(gtk_widget_destroy), msg); - - gtk_widget_show_all(msg); - g_error_free(error); - } + mdock_item_launch(self); } else { g_warning("A MDockItem has no windows and no appinfo to launch"); } @@ -225,7 +208,7 @@ static gboolean mdock_item_button_press(GtkWidget *widget, GdkEventButton *event break; case 3: - gtk_menu_popup(self->priv->menu, + gtk_menu_popup(self->priv->right_menu, NULL, NULL, NULL, NULL, event->button, event->time); break; @@ -256,10 +239,14 @@ static void mdock_item_set_property(GObject *object, { MDockItem *self = MDOCK_ITEM(object); switch (property_id) { + case PROP_PINNED: + self->priv->pinned = g_value_get_boolean(value); + break; case PROP_DESKTOP_APP_INFO: self->priv->appinfo = g_value_dup_object(value); mdock_item_update_icon(self); mdock_item_update_tooltip(self); + mdock_item_update_menu(self); break; case PROP_ICON_SIZE: self->priv->icon_size = g_value_get_uint(value); @@ -279,6 +266,9 @@ static void mdock_item_get_property(GObject *object, { MDockItem *self = MDOCK_ITEM(object); switch (property_id) { + case PROP_PINNED: + g_value_set_boolean(value, self->priv->pinned); + break; case PROP_DESKTOP_APP_INFO: g_value_set_object(value, self->priv->appinfo); break; @@ -297,6 +287,7 @@ static void mdock_item_dispose(GObject *object) g_clear_object(&self->priv->appinfo); g_clear_object(&self->priv->icon); g_clear_object(&self->priv->menu); + g_clear_object(&self->priv->right_menu); g_clear_object(&self->priv->menu_close_all); g_clear_object(&self->priv->menu_pin); g_clear_object(&self->priv->menu_launch); @@ -318,21 +309,26 @@ static void mdock_item_init(MDockItem *self) gtk_widget_add_events(GTK_WIDGET(self), GDK_BUTTON_PRESS_MASK); - self->priv->menu = g_object_ref_sink(gtk_menu_new()); + self->priv->menu = g_object_ref_sink(mdock_item_menu_new()); + gtk_widget_set_tooltip_window(GTK_WIDGET(self), GTK_WINDOW(self->priv->menu)); + + self->priv->right_menu = g_object_ref_sink(gtk_menu_new()); self->priv->menu_close_all = g_object_ref_sink(gtk_image_menu_item_new_from_stock(GTK_STOCK_CLOSE, NULL)); - gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->menu), + gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->right_menu), GTK_WIDGET(self->priv->menu_close_all)); g_signal_connect_swapped(self->priv->menu_close_all, "activate", G_CALLBACK(mdock_item_close_all_windows), self); self->priv->menu_pin = g_object_ref_sink(gtk_image_menu_item_new_with_mnemonic("_Pin")); - gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->menu), + gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->right_menu), GTK_WIDGET(self->priv->menu_pin)); self->priv->menu_launch = g_object_ref_sink(gtk_image_menu_item_new_with_mnemonic("_New instance")); - gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->menu), + gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->right_menu), GTK_WIDGET(self->priv->menu_launch)); + g_signal_connect_swapped(self->priv->menu_launch, "activate", + G_CALLBACK(mdock_item_launch), self); } static void @@ -351,6 +347,12 @@ mdock_item_class_init(MDockItemClass *klass) widget_class->button_press_event = mdock_item_button_press; widget_class->expose_event = mdock_item_expose; + obj_properties[PROP_PINNED] = g_param_spec_boolean("pinned", + "Pinned launcher", + "Set whether this launcher is pinned", + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + obj_properties[PROP_DESKTOP_APP_INFO] = g_param_spec_object("desktop-app-info", "The GDesktopAppInfo this application or launcher refers to", "Set the GDesktopAppInfo this application or launcher refers to", @@ -374,6 +376,16 @@ MDockItem *mdock_item_new() return g_object_new(MDOCK_TYPE_ITEM, NULL); } +gboolean mdock_item_get_pinned(MDockItem *self) +{ + return self->priv->pinned; +} + +void mdock_item_set_pinned(MDockItem *self, gboolean pinned) +{ + g_object_set(self, "pinned", pinned, NULL); +} + GDesktopAppInfo *mdock_item_get_desktop_app_info(MDockItem *self) { return g_object_ref(self->priv->appinfo); @@ -384,6 +396,34 @@ void mdock_item_set_desktop_app_info(MDockItem *self, GDesktopAppInfo *app_info) g_object_set(self, "desktop-app-info", app_info, NULL); } +void mdock_item_launch(MDockItem *self) +{ + g_return_if_fail(self->priv->appinfo); + GError *error = NULL; + g_debug("Launching '%s'", g_app_info_get_commandline(G_APP_INFO(self->priv->appinfo))); + if (!g_app_info_launch(G_APP_INFO(self->priv->appinfo), NULL, NULL, &error)) { + GtkWidget *msg; + + g_warning("Cannot launch '%s': %s", + g_app_info_get_display_name(G_APP_INFO(self->priv->appinfo)), + error->message); + + msg = gtk_message_dialog_new(GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(self))), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_WARNING, + GTK_BUTTONS_OK, + "Cannot launch '%s': %s", + g_app_info_get_display_name(G_APP_INFO(self->priv->appinfo)), + error->message); + + g_signal_connect_swapped(msg, "response", + G_CALLBACK(gtk_widget_destroy), msg); + + gtk_widget_show_all(msg); + g_error_free(error); + } +} + void mdock_item_add_window(MDockItem *self, WnckWindow *window) { thumbnailer_enable_for_window(window); |