diff options
Diffstat (limited to 'libmdock/mdock-item.c')
-rw-r--r-- | libmdock/mdock-item.c | 203 |
1 files changed, 61 insertions, 142 deletions
diff --git a/libmdock/mdock-item.c b/libmdock/mdock-item.c index a9d9ad0..7de1264 100644 --- a/libmdock/mdock-item.c +++ b/libmdock/mdock-item.c @@ -17,7 +17,6 @@ * along with MDock. If not, see <http://www.gnu.org/licenses/>. */ -#include <glib/gi18n.h> #include "mdock-enums.h" #include "mdock-item.h" #include "mdock-item-menu.h" @@ -36,11 +35,6 @@ struct _MDockItemPrivate WnckWindow *last_active; MDockItemMenu *menu; - - GtkMenu *right_menu; - GtkImageMenuItem *menu_close_all; - GtkImageMenuItem *menu_pin; - GtkImageMenuItem *menu_launch; }; G_DEFINE_TYPE (MDockItem, mdock_item, GTK_TYPE_WIDGET) @@ -50,6 +44,7 @@ enum { PROP_PINNED, PROP_DESKTOP_APP_INFO, PROP_ICON_SIZE, + PROP_N_WINDOWS, N_PROPERTIES }; @@ -100,33 +95,6 @@ static void mdock_item_update_icon(MDockItem *self) gtk_widget_queue_draw(GTK_WIDGET(self)); } -static void mdock_item_update_tooltip(MDockItem *self) -{ - // TODO gtk_widget_set_tooltip_text(GTK_WIDGET(self), mdock_item_get_display_name(self)); -} - -static void mdock_item_update_menu(MDockItem *self) -{ - gtk_widget_set_visible(GTK_WIDGET(self->priv->menu_close_all), self->priv->windows != NULL); - gtk_widget_set_visible(GTK_WIDGET(self->priv->menu_pin), self->priv->appinfo != NULL); - if (self->priv->appinfo) { - gtk_menu_item_set_label(GTK_MENU_ITEM(self->priv->menu_pin), - self->priv->pinned ? _("Un_pin") : _("_Pin")); - } - gtk_widget_set_visible(GTK_WIDGET(self->priv->menu_launch), self->priv->appinfo != NULL); - if (!gtk_image_menu_item_get_image(self->priv->menu_launch) && self->priv->appinfo && self->priv->icon) { - gint width, height; - if (gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &width, &height)) { - GdkPixbuf *pixbuf = mdock_item_load_icon(self, MIN(width, height)); - if (pixbuf) { - GtkWidget *image = gtk_image_new_from_pixbuf(pixbuf); - gtk_image_menu_item_set_image(self->priv->menu_launch, image); - g_object_unref(pixbuf); - } - } - } -} - static void mdock_item_realize(GtkWidget *widget) { GdkWindowAttr attributes; @@ -165,78 +133,6 @@ static void mdock_item_size_allocate(GtkWidget *widget, GtkAllocation *allocatio GTK_WIDGET_CLASS(mdock_item_parent_class)->size_allocate(widget, allocation); } -static gboolean mdock_item_button_press(GtkWidget *widget, GdkEventButton *event) -{ - MDockItem *self = MDOCK_ITEM(widget); - switch (event->button) { - case 1: - // Will activate item during release. - break; - - case 3: - gtk_menu_popup(self->priv->right_menu, - NULL, NULL, NULL, NULL, - event->button, event->time); - break; - } - - return TRUE; -} - -static gboolean mdock_item_button_release(GtkWidget *widget, GdkEventButton *event) -{ - MDockItem *self = MDOCK_ITEM(widget); - switch (event->button) { - case 1: - if (self->priv->windows) { - // This item has one window at least - if (self->priv->windows->next) { - // There is more than one window - gboolean found_window = FALSE; - for (GList *l = self->priv->windows; l; l = g_list_next(l)) { - WnckWindow *window = WNCK_WINDOW(l->data); - if (wnck_window_is_most_recently_activated(window) - || wnck_window_transient_is_most_recently_activated(window)) { - // This is the currently focused window, let's focus the next in the list - GList *n = l->next ? g_list_next(l) : self->priv->windows; - window = WNCK_WINDOW(n->data); - wnck_window_activate_transient(window, event->time); - found_window = TRUE; - break; - } - } - if (!found_window) { - WnckWindow *window = WNCK_WINDOW(self->priv->windows->data); - wnck_window_activate_transient(window, event->time); - } - } else { - // There is only one window in this group - WnckWindow *window = WNCK_WINDOW(self->priv->windows->data); - if (wnck_window_is_minimized(window)) { - wnck_window_unminimize(window, event->time); - } else if (wnck_window_is_most_recently_activated(window) - || wnck_window_transient_is_most_recently_activated(window)) { - wnck_window_minimize(window); - } else { - wnck_window_activate_transient(window, event->time); - } - } - } else if (self->priv->appinfo) { - // No windows, but we have an application to launch! - mdock_item_launch(self); - } else { - g_warning("A MDockItem has no windows and no appinfo to launch"); - } - break; - - case 3: - // Popup menu shown during press - break; - } - - return TRUE; -} - static gboolean mdock_item_expose(GtkWidget *widget, GdkEventExpose *event) { MDockItem *self = MDOCK_ITEM(widget); @@ -261,13 +157,10 @@ static void mdock_item_set_property(GObject *object, switch (property_id) { case PROP_PINNED: self->priv->pinned = g_value_get_boolean(value); - mdock_item_update_menu(self); 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); @@ -296,6 +189,9 @@ static void mdock_item_get_property(GObject *object, case PROP_ICON_SIZE: g_value_set_uint(value, self->priv->icon_size); break; + case PROP_N_WINDOWS: + g_value_set_uint(value, g_list_length(self->priv->windows)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); break; @@ -308,10 +204,6 @@ 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); G_OBJECT_CLASS(mdock_item_parent_class)->dispose(object); } @@ -329,29 +221,6 @@ static void mdock_item_init(MDockItem *self) self->priv->icon_size = 48; gtk_widget_add_events(GTK_WIDGET(self), GDK_BUTTON_PRESS_MASK); - - 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->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->right_menu), - GTK_WIDGET(self->priv->menu_pin)); - g_signal_connect_swapped(self->priv->menu_pin, "activate", - G_CALLBACK(mdock_item_toggle_pinned), self); - - 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->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 @@ -367,8 +236,6 @@ mdock_item_class_init(MDockItemClass *klass) widget_class->realize = mdock_item_realize; widget_class->size_request = mdock_item_size_request; widget_class->size_allocate = mdock_item_size_allocate; - widget_class->button_press_event = mdock_item_button_press; - widget_class->button_release_event = mdock_item_button_release; widget_class->expose_event = mdock_item_expose; obj_properties[PROP_PINNED] = g_param_spec_boolean("pinned", @@ -390,6 +257,13 @@ mdock_item_class_init(MDockItemClass *klass) 48, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + obj_properties[PROP_N_WINDOWS] = g_param_spec_uint("n-windows", + "Number of windows", + "Reads the current number of windows under this item", + 0, G_MAXINT32, + 0, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_properties(obj_class, N_PROPERTIES, obj_properties); g_type_class_add_private (obj_class, sizeof (MDockItemPrivate)); @@ -465,10 +339,7 @@ void mdock_item_add_window(MDockItem *self, WnckWindow *window) if (!self->priv->icon) { mdock_item_update_icon(self); } - if (!gtk_widget_get_has_tooltip(GTK_WIDGET(self))) { - mdock_item_update_tooltip(self); - } - mdock_item_update_menu(self); + g_object_notify_by_pspec(G_OBJECT(self), obj_properties[PROP_N_WINDOWS]); } void mdock_item_remove_window(MDockItem *self, WnckWindow *window) @@ -477,7 +348,7 @@ void mdock_item_remove_window(MDockItem *self, WnckWindow *window) if (self->priv->last_active == window) { self->priv->last_active = NULL; } - mdock_item_update_menu(self); + g_object_notify_by_pspec(G_OBJECT(self), obj_properties[PROP_N_WINDOWS]); } void mdock_item_set_last_active_window(MDockItem *self, WnckWindow *window) @@ -492,6 +363,11 @@ gint mdock_item_get_num_windows(MDockItem *self) return g_list_length(self->priv->windows); } +gboolean mdock_item_has_windows(MDockItem *self) +{ + return self->priv->windows ? TRUE : FALSE; +} + void mdock_item_close_all_windows(MDockItem *self) { for (GList *l = self->priv->windows; l; l = g_list_next(l)) { @@ -499,3 +375,46 @@ void mdock_item_close_all_windows(MDockItem *self) wnck_window_close(window, GDK_CURRENT_TIME); } } + +void mdock_item_activate(MDockItem *self) +{ + if (self->priv->windows) { + // This item has one window at least + if (self->priv->windows->next) { + // There is more than one window + gboolean found_window = FALSE; + for (GList *l = self->priv->windows; l; l = g_list_next(l)) { + WnckWindow *window = WNCK_WINDOW(l->data); + if (wnck_window_is_most_recently_activated(window) + || wnck_window_transient_is_most_recently_activated(window)) { + // This is the currently focused window, let's focus the next in the list + GList *n = l->next ? g_list_next(l) : self->priv->windows; + window = WNCK_WINDOW(n->data); + wnck_window_activate_transient(window, gtk_get_current_event_time()); + found_window = TRUE; + break; + } + } + if (!found_window) { + WnckWindow *window = WNCK_WINDOW(self->priv->windows->data); + wnck_window_activate_transient(window, gtk_get_current_event_time()); + } + } else { + // There is only one window in this group + WnckWindow *window = WNCK_WINDOW(self->priv->windows->data); + if (wnck_window_is_minimized(window)) { + wnck_window_unminimize(window, gtk_get_current_event_time()); + } else if (wnck_window_is_most_recently_activated(window) + || wnck_window_transient_is_most_recently_activated(window)) { + wnck_window_minimize(window); + } else { + wnck_window_activate_transient(window, gtk_get_current_event_time()); + } + } + } else if (self->priv->appinfo) { + // No windows, but we have an application to launch! + mdock_item_launch(self); + } else { + g_warning("A MDockItem has no windows and no appinfo to launch"); + } +} |