summaryrefslogtreecommitdiff
path: root/libmdock/mdock-item-window-selector.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmdock/mdock-item-window-selector.c')
-rw-r--r--libmdock/mdock-item-window-selector.c111
1 files changed, 106 insertions, 5 deletions
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 *