From fe69cfd1ad1e98508be79b85a34a7f0c04190c91 Mon Sep 17 00:00:00 2001 From: Javier Date: Sat, 24 Jan 2015 21:06:58 +0100 Subject: adding window selector popup --- libmdock/mdock-item-window-selector.c | 111 ++++++++++++++++++++++++++++++++-- 1 file changed, 106 insertions(+), 5 deletions(-) (limited to 'libmdock/mdock-item-window-selector.c') diff --git a/libmdock/mdock-item-window-selector.c b/libmdock/mdock-item-window-selector.c index c7df718..ea5ceb8 100644 --- a/libmdock/mdock-item-window-selector.c +++ b/libmdock/mdock-item-window-selector.c @@ -18,24 +18,61 @@ */ #include "mdock-item-window-selector.h" +#include "mdock-window.h" #define MDOCK_ITEM_WINDOW_SELECTOR_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE((object), MDOCK_TYPE_ITEM_WINDOW_SELECTOR, MDockItemWindowSelectorPrivate)) +#define GLOBAL_PADDING 8 +#define WINDOW_PADDING 4 +#define APP_NAME_PADDING 8 + struct _MDockItemWindowSelectorPrivate { - GList *temp; + GSequence *windows; + GSequenceIter *active_window; + GtkLabel *app_label; + GtkBox *window_box; }; -G_DEFINE_TYPE (MDockItemWindowSelector, mdock_item_window_selector, GTK_TYPE_WINDOW) +static void mdock_item_window_selector_orientable_init(GtkOrientableIface *iface); + +G_DEFINE_TYPE_WITH_CODE(MDockItemWindowSelector, mdock_item_window_selector, GTK_TYPE_WINDOW, + G_IMPLEMENT_INTERFACE(GTK_TYPE_ORIENTABLE, mdock_item_window_selector_orientable_init)) -enum { +enum MDockItemWindowSelectorProperties { PROP_0, PROP_ITEM, - N_PROPERTIES + N_PROPERTIES, + PROP_ORIENTATION }; static GParamSpec *obj_properties[N_PROPERTIES] = { NULL }; +static GSequenceIter * find_window(MDockItemWindowSelector *self, WnckWindow *window) +{ + GSequenceIter *iter = g_sequence_get_begin_iter(self->priv->windows); + while (!g_sequence_iter_is_end(iter)) { + MDockWindow *dwin = MDOCK_WINDOW(g_sequence_get(iter)); + if (dwin->window == window) { + return iter; + } + + iter = g_sequence_iter_next(iter); + } + return NULL; +} + +static gboolean handle_window_button_release(MDockItemWindowSelector *self, GdkEventButton *event, MDockWindow *window) +{ + switch (event->button) { + case 1: + wnck_window_activate_transient(window->window, event->time); + break; + } + + return TRUE; +} + static void mdock_item_window_selector_set_property(GObject *object, guint property_id, const GValue *value, @@ -47,6 +84,10 @@ static void mdock_item_window_selector_set_property(GObject *object, g_clear_object(&self->item); self->item = g_value_dup_object(value); break; + case PROP_ORIENTATION: + gtk_orientable_set_orientation(GTK_ORIENTABLE(self->priv->window_box), + g_value_get_enum(value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); break; @@ -63,6 +104,10 @@ static void mdock_item_window_selector_get_property(GObject *object, case PROP_ITEM: g_value_set_object(value, self->item); break; + case PROP_ORIENTATION: + g_value_set_enum(value, + gtk_orientable_get_orientation(GTK_ORIENTABLE(self->priv->window_box))); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); break; @@ -71,7 +116,15 @@ static void mdock_item_window_selector_get_property(GObject *object, static void mdock_item_window_selector_constructed(GObject *object) { + GtkWindow *window = GTK_WINDOW(object); + window->type = GTK_WINDOW_POPUP; + gtk_window_set_type_hint(window, GDK_WINDOW_TYPE_HINT_TOOLTIP); + G_OBJECT_CLASS(mdock_item_window_selector_parent_class)->constructed(object); + + MDockItemWindowSelector *self = MDOCK_ITEM_WINDOW_SELECTOR(object); + gtk_label_set_text(self->priv->app_label, + mdock_item_get_display_name(self->item)); } static void mdock_item_window_selector_dispose(GObject *object) @@ -84,6 +137,10 @@ static void mdock_item_window_selector_finalize(GObject *object) G_OBJECT_CLASS(mdock_item_window_selector_parent_class)->finalize(object); } +static void mdock_item_window_selector_orientable_init(GtkOrientableIface *iface) +{ +} + static void mdock_item_window_selector_class_init(MDockItemWindowSelectorClass *klass) { @@ -103,12 +160,56 @@ mdock_item_window_selector_class_init(MDockItemWindowSelectorClass *klass) G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); g_object_class_install_properties(obj_class, N_PROPERTIES, obj_properties); + g_object_class_override_property(obj_class, PROP_ORIENTATION, "orientation"); } static void -mdock_item_window_selector_init (MDockItemWindowSelector *self) +mdock_item_window_selector_init(MDockItemWindowSelector *self) { self->priv = MDOCK_ITEM_WINDOW_SELECTOR_GET_PRIVATE (self); + self->priv->windows = g_sequence_new(NULL); + self->priv->app_label = GTK_LABEL(gtk_label_new(NULL)); + self->priv->window_box = GTK_BOX(gtk_hbox_new(TRUE, 1)); + gtk_container_set_border_width(GTK_CONTAINER(self), GLOBAL_PADDING); + gtk_container_add(GTK_CONTAINER(self), GTK_WIDGET(self->priv->window_box)); + gtk_box_pack_start(self->priv->window_box, GTK_WIDGET(self->priv->app_label), TRUE, TRUE, APP_NAME_PADDING); + gtk_widget_show_all(GTK_WIDGET(self->priv->window_box)); +} + +void mdock_item_window_selector_add_window(MDockItemWindowSelector *self, WnckWindow *window) +{ + MDockWindow *win = mdock_window_new(window); + g_sequence_append(self->priv->windows, win); + gtk_box_pack_start(self->priv->window_box, GTK_WIDGET(win), FALSE, FALSE, WINDOW_PADDING); + gtk_widget_hide(GTK_WIDGET(self->priv->app_label)); + gtk_widget_show(GTK_WIDGET(win)); + + g_signal_connect_object(win, "button-release-event", + G_CALLBACK(handle_window_button_release), self, + G_CONNECT_SWAPPED); +} + +void mdock_item_window_selector_remove_window(MDockItemWindowSelector *self, WnckWindow *window) +{ + GSequenceIter *iter = find_window(self, window); + g_return_if_fail(iter); + + MDockWindow *dwin = g_sequence_get(iter); + g_sequence_remove(iter); + gtk_widget_destroy(GTK_WIDGET(dwin)); + + if (g_sequence_get_length(self->priv->windows) == 0) { + gtk_widget_show(GTK_WIDGET(self->priv->app_label)); + } +} + +void mdock_item_window_selector_set_active_window(MDockItemWindowSelector *self, WnckWindow *window) +{ + GSequenceIter *iter = find_window(self, window); + g_return_if_fail(iter); + + MDockWindow *dwin = g_sequence_get(iter); + mdock_window_update_screenshot(dwin); } MDockItemWindowSelector * -- cgit v1.2.3