diff options
Diffstat (limited to 'mate-window-picker-applet/task-list.c')
-rw-r--r-- | mate-window-picker-applet/task-list.c | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/mate-window-picker-applet/task-list.c b/mate-window-picker-applet/task-list.c new file mode 100644 index 0000000..43c0d5d --- /dev/null +++ b/mate-window-picker-applet/task-list.c @@ -0,0 +1,246 @@ +/* + * Copyright (C) 2008 Canonical Ltd + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * Authored by Neil Jagdish Patel <[email protected]> + * + */ + +#include "task-list.h" +#include "task-item.h" + +#include <libmatewnck/libmatewnck.h> + +G_DEFINE_TYPE (TaskList, task_list, GTK_TYPE_HBOX); + +#define TASK_LIST_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj),\ + TASK_TYPE_LIST, \ + TaskListPrivate)) + +struct _TaskListPrivate +{ + MatewnckScreen *screen; + GHashTable *win_table; + guint timer; + guint counter; + + gboolean show_all_windows; +}; + +enum +{ + PROP_0, + + PROP_SHOW_ALL_WINDOWS +}; + +static void +task_list_set_show_all_windows (TaskList *list, gboolean show_all_windows) +{ + TaskListPrivate *priv = list->priv; + + priv->show_all_windows = show_all_windows; + + g_debug ("Show all windows: %s", show_all_windows ? "true" : "false"); +} + +static void +on_task_item_closed (TaskItem *item, + TaskList *list) +{ + gtk_container_remove (GTK_CONTAINER (list), + GTK_WIDGET (item)); + gtk_widget_destroy (GTK_WIDGET (item)); +} + +static void +on_window_opened (MatewnckScreen *screen, + MatewnckWindow *window, + TaskList *list) +{ + TaskListPrivate *priv; + MatewnckWindowType type; + + g_return_if_fail (TASK_IS_LIST (list)); + priv = list->priv; + + type = matewnck_window_get_window_type (window); + + if (type == MATEWNCK_WINDOW_DESKTOP + || type == MATEWNCK_WINDOW_DOCK + || type == MATEWNCK_WINDOW_SPLASHSCREEN + || type == MATEWNCK_WINDOW_MENU) + return; + + GtkWidget *item = task_item_new (window); + + if (item) + { + gtk_box_pack_start (GTK_BOX (list), item, FALSE, FALSE, 0); + g_signal_connect (TASK_ITEM (item), "task-item-closed", + G_CALLBACK (on_task_item_closed), list); + } +} + +/* GObject stuff */ +static void +task_list_finalize (GObject *object) +{ + TaskListPrivate *priv; + + priv = TASK_LIST_GET_PRIVATE (object); + + /* Remove the blink timer */ + if (priv->timer) g_source_remove (priv->timer); + + G_OBJECT_CLASS (task_list_parent_class)->finalize (object); +} + +static void +task_list_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + TaskList *list = TASK_LIST (object); + TaskListPrivate *priv; + + g_return_if_fail (TASK_IS_LIST (list)); + priv = list->priv; + + switch (prop_id) + { + case PROP_SHOW_ALL_WINDOWS: + g_value_set_boolean (value, priv->show_all_windows); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +task_list_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + TaskList *list = TASK_LIST (object); + TaskListPrivate *priv; + + g_return_if_fail (TASK_IS_LIST (list)); + priv = list->priv; + + switch (prop_id) + { + case PROP_SHOW_ALL_WINDOWS: + task_list_set_show_all_windows (list, g_value_get_boolean (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +task_list_class_init (TaskListClass *klass) +{ + GObjectClass *obj_class = G_OBJECT_CLASS (klass); + + obj_class->finalize = task_list_finalize; + obj_class->set_property = task_list_set_property; + obj_class->get_property = task_list_get_property; + + g_object_class_install_property (obj_class, + PROP_SHOW_ALL_WINDOWS, + g_param_spec_boolean ("show_all_windows", + "Show All Windows", + "Show windows from all workspaces", + TRUE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + + g_type_class_add_private (obj_class, sizeof (TaskListPrivate)); +} + +static void +task_list_init (TaskList *list) +{ + TaskListPrivate *priv; + + priv = list->priv = TASK_LIST_GET_PRIVATE (list); + + priv->screen = matewnck_screen_get_default (); + + priv->win_table = g_hash_table_new (NULL, NULL); + + /* No blink timer */ + priv->timer = 0; + + gtk_container_set_border_width (GTK_CONTAINER (list), 0); + + g_signal_connect (priv->screen, "window-opened", + G_CALLBACK (on_window_opened), list); +} + +GtkWidget * +task_list_new (void) + +{ + GtkWidget *list = NULL; + + list = g_object_new (TASK_TYPE_LIST, + "homogeneous", FALSE, + "spacing", 0, + NULL); + + return list; +} + +GtkWidget * +task_list_get_default (void) +{ + static GtkWidget *list = NULL; + + if (!list) + list = task_list_new (); + + return list; +} + +gboolean +task_list_get_desktop_visible (TaskList *list) +{ + GList *windows, *w; + gboolean all_minimised = TRUE; + + g_return_val_if_fail (TASK_IS_LIST (list), TRUE); + + windows = matewnck_screen_get_windows (list->priv->screen); + for (w = windows; w; w = w->next) + { + MatewnckWindow *window; + + window = w->data; + + if (MATEWNCK_IS_WINDOW (window) && !matewnck_window_is_minimized (window)) + all_minimised = FALSE; + } + + return all_minimised; +} + +gboolean +task_list_get_show_all_windows (TaskList *list) +{ + return list->priv->show_all_windows; +} + |