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.c203
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");
+ }
+}