summaryrefslogtreecommitdiff
path: root/libmdock/mdock-item.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmdock/mdock-item.c')
-rw-r--r--libmdock/mdock-item.c98
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);