summaryrefslogtreecommitdiff
path: root/mate-window-picker-applet/applet.c
diff options
context:
space:
mode:
Diffstat (limited to 'mate-window-picker-applet/applet.c')
-rw-r--r--mate-window-picker-applet/applet.c351
1 files changed, 351 insertions, 0 deletions
diff --git a/mate-window-picker-applet/applet.c b/mate-window-picker-applet/applet.c
new file mode 100644
index 0000000..c2b33a6
--- /dev/null
+++ b/mate-window-picker-applet/applet.c
@@ -0,0 +1,351 @@
+/*
+ * 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]>
+ *
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+#include <stdlib.h>
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+
+#include <libmatewnck/libmatewnck.h>
+
+#include <mate-panel-applet.h>
+#include <mate-panel-applet-mateconf.h>
+#include <mateconf/mateconf-client.h>
+
+#include "task-list.h"
+#include "task-title.h"
+
+#define SHOW_WIN_KEY "show_all_windows"
+
+typedef struct
+{
+ GtkWidget *tasks;
+ GtkWidget *applet;
+ GtkWidget *title;
+
+} WinPickerApp;
+
+static WinPickerApp *mainapp;
+
+static void cw_panel_background_changed (MatePanelApplet *applet,
+ MatePanelAppletBackgroundType type,
+ GdkColor *colour,
+ GdkPixmap *pixmap,
+ gpointer user_data);
+static void display_about_dialog (GtkAction *action,
+ WinPickerApp *applet);
+
+static void display_prefs_dialog (GtkAction *action,
+ WinPickerApp *applet);
+
+static const GtkActionEntry window_picker_menu_actions [] = {
+ { "MenuPrefs", GTK_STOCK_PREFERENCES, N_("_Preferences"),
+ NULL, NULL,
+ G_CALLBACK (display_prefs_dialog) },
+ { "ShowDesktopAbout", GTK_STOCK_ABOUT, N_("_About"),
+ NULL, NULL,
+ G_CALLBACK (display_about_dialog) }
+};
+
+static const gchar *close_window_authors [] = {
+ "Neil J. Patel <[email protected]>",
+ "Stefano Karapetsas <[email protected]>",
+ NULL
+};
+
+static void
+on_show_all_windows_changed (MateConfClient *client,
+ guint conn_id,
+ MateConfEntry *entry,
+ gpointer data)
+{
+ WinPickerApp *app;
+ gboolean show_windows = TRUE;
+
+ app = (WinPickerApp*)data;
+
+ show_windows = mate_panel_applet_mateconf_get_bool (MATE_PANEL_APPLET (app->applet),
+ SHOW_WIN_KEY, NULL);
+
+ g_object_set (app->tasks, "show_all_windows", show_windows, NULL);
+}
+
+static inline void
+force_no_focus_padding (GtkWidget *widget)
+{
+ static gboolean first_time = TRUE;
+
+ if (first_time)
+ {
+ gtk_rc_parse_string ("\n"
+ " style \"na-tray-style\"\n"
+ " {\n"
+ " GtkWidget::focus-line-width=0\n"
+ " GtkWidget::focus-padding=0\n"
+ " }\n"
+ "\n"
+ " widget \"*.na-tray\" style \"na-tray-style\"\n"
+ "\n");
+ first_time = FALSE;
+ }
+
+ gtk_widget_set_name (widget, "na-tray");
+}
+
+static gboolean
+cw_applet_fill (MatePanelApplet *applet,
+ const gchar *iid,
+ gpointer data)
+{
+ MatewnckScreen *screen;
+ WinPickerApp *app;
+ GtkWidget *eb, *tasks, *title;
+ GError *error = NULL;
+ gchar *key;
+ gchar *ui_path;
+ GtkActionGroup *action_group;
+
+ if (strcmp (iid, "MateWindowPicker") != 0)
+ return FALSE;
+
+ bindtextdomain (GETTEXT_PACKAGE, MATELOCALEDIR);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+ textdomain (GETTEXT_PACKAGE);
+
+ matewnck_set_client_type (MATEWNCK_CLIENT_TYPE_PAGER);
+
+ app = g_slice_new0 (WinPickerApp);
+ mainapp = app;
+ screen = matewnck_screen_get_default ();
+
+ /* mateconf prefs */
+ mate_panel_applet_add_preferences (applet,
+ "/schemas/apps/mate-window-picker-applet/prefs",
+ &error);
+ if (error)
+ {
+ g_warning ("%s", error->message);
+ g_error_free (error);
+ }
+
+ key = mate_panel_applet_mateconf_get_full_key (applet, SHOW_WIN_KEY);
+ mateconf_client_notify_add (mateconf_client_get_default (), key,
+ on_show_all_windows_changed, app,
+ NULL, NULL);
+ g_free (key);
+
+ app->applet = GTK_WIDGET (applet);
+ force_no_focus_padding (GTK_WIDGET (applet));
+ gtk_container_set_border_width (GTK_CONTAINER (applet), 0);
+
+ eb = gtk_hbox_new (FALSE, 6);
+ gtk_container_add (GTK_CONTAINER (applet), eb);
+ gtk_container_set_border_width (GTK_CONTAINER (eb), 0);
+
+ tasks = app->tasks = task_list_get_default ();
+ gtk_box_pack_start (GTK_BOX (eb), tasks, FALSE, FALSE, 0);
+
+ title = app->title = task_title_new ();
+ gtk_box_pack_start (GTK_BOX (eb), title, TRUE, TRUE, 0);
+
+ gtk_widget_show_all (GTK_WIDGET (applet));
+
+ on_show_all_windows_changed (NULL, 0, NULL, app);
+
+ /* Signals */
+ g_signal_connect (applet, "change-background",
+ G_CALLBACK (cw_panel_background_changed), NULL);
+
+
+ action_group = gtk_action_group_new ("MateWindowPicker Applet Actions");
+ gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE);
+ gtk_action_group_add_actions (action_group,
+ window_picker_menu_actions,
+ G_N_ELEMENTS (window_picker_menu_actions),
+ app);
+ ui_path = g_build_filename (MATEWINDOWPICKER_MENU_UI_DIR, "mate-window-picker-menu.xml", NULL);
+ mate_panel_applet_setup_menu_from_file (MATE_PANEL_APPLET (app->applet),
+ ui_path, action_group);
+ g_free (ui_path);
+ g_object_unref (action_group);
+
+ mate_panel_applet_set_flags (MATE_PANEL_APPLET (applet),
+ MATE_PANEL_APPLET_EXPAND_MAJOR
+ | MATE_PANEL_APPLET_EXPAND_MINOR
+ | MATE_PANEL_APPLET_HAS_HANDLE);
+
+ return TRUE;
+}
+
+MATE_PANEL_APPLET_OUT_PROCESS_FACTORY ("MateWindowPickerFactory",
+ PANEL_TYPE_APPLET,
+ "MateWindowPicker",
+ cw_applet_fill,
+ NULL);
+
+static void
+cw_panel_background_changed (MatePanelApplet *applet,
+ MatePanelAppletBackgroundType type,
+ GdkColor *colour,
+ GdkPixmap *pixmap,
+ gpointer user_data)
+{
+ GtkRcStyle *rc_style;
+ GtkStyle *style;
+
+ /* reset style */
+ gtk_widget_set_style (GTK_WIDGET (applet), NULL);
+ rc_style = gtk_rc_style_new ();
+ gtk_widget_modify_style (GTK_WIDGET (applet), rc_style);
+ gtk_rc_style_unref (rc_style);
+
+ gtk_widget_set_style (mainapp->title, NULL);
+ rc_style = gtk_rc_style_new ();
+ gtk_widget_modify_style (mainapp->title, rc_style);
+ gtk_rc_style_unref (rc_style);
+
+ switch (type)
+ {
+ case PANEL_NO_BACKGROUND:
+ break;
+ case PANEL_COLOR_BACKGROUND:
+ gtk_widget_modify_bg (GTK_WIDGET (applet), GTK_STATE_NORMAL, colour);
+ gtk_widget_modify_bg (mainapp->title, GTK_STATE_NORMAL, colour);
+ break;
+
+ case PANEL_PIXMAP_BACKGROUND:
+ style = gtk_style_copy (GTK_WIDGET (applet)->style);
+ if (style->bg_pixmap[GTK_STATE_NORMAL])
+ g_object_unref (style->bg_pixmap[GTK_STATE_NORMAL]);
+ style->bg_pixmap[GTK_STATE_NORMAL] = g_object_ref (pixmap);
+ gtk_widget_set_style (GTK_WIDGET (applet), style);
+ g_object_unref (style);
+
+ /*style = gtk_style_copy (mainapp->title->style);
+ if (style->bg_pixmap[GTK_STATE_NORMAL])
+ g_object_unref (style->bg_pixmap[GTK_STATE_NORMAL]);
+ style->bg_pixmap[GTK_STATE_NORMAL] = g_object_ref (pixmap);
+ gtk_widget_set_style (mainapp->title, style);
+ g_object_unref (style);*/
+
+ break;
+ }
+}
+
+static void
+display_about_dialog (GtkAction *action,
+ WinPickerApp *applet)
+{
+ GtkWidget *panel_about_dialog;
+
+ panel_about_dialog = gtk_about_dialog_new ();
+
+ g_object_set (panel_about_dialog,
+ "name", _("Window Picker"),
+ "comments", _("Window Picker"),
+ "version", PACKAGE_VERSION,
+ "authors", close_window_authors,
+ "logo-icon-name", "system-preferences-windows",
+ "copyright", "Copyright \xc2\xa9 2008 Canonical Ltd",
+ NULL);
+
+ gtk_widget_show (panel_about_dialog);
+
+ g_signal_connect (panel_about_dialog, "response",
+ G_CALLBACK (gtk_widget_destroy), NULL);
+
+
+ gtk_window_present (GTK_WINDOW (panel_about_dialog));
+}
+
+static void
+on_checkbox_toggled (GtkToggleButton *check, gpointer null)
+{
+ gboolean is_active;
+
+ is_active = gtk_toggle_button_get_active (check);
+
+ mate_panel_applet_mateconf_set_bool (MATE_PANEL_APPLET (mainapp->applet),
+ SHOW_WIN_KEY, is_active, NULL);
+}
+
+static void
+display_prefs_dialog (GtkAction *action,
+ WinPickerApp *applet)
+{
+ GtkWidget *window, *box, *vbox, *nb, *hbox, *label, *check, *button;
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (window), _("Preferences"));
+ gtk_window_set_type_hint (GTK_WINDOW (window),
+ GDK_WINDOW_TYPE_HINT_DIALOG);
+ gtk_container_set_border_width (GTK_CONTAINER (window), 12);
+
+ box = gtk_vbox_new (FALSE, 8);
+ gtk_container_add (GTK_CONTAINER (window), box);
+
+ nb = gtk_notebook_new ();
+ g_object_set (nb, "show-tabs", FALSE, "show-border", TRUE, NULL);
+ gtk_box_pack_start (GTK_BOX (box), nb, TRUE, TRUE, 0);
+
+ vbox = gtk_vbox_new (FALSE, 8);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
+ gtk_notebook_append_page (GTK_NOTEBOOK (nb), vbox, NULL);
+
+ check = gtk_check_button_new_with_label (_("Show windows from all workspaces"));
+ gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check),
+ mate_panel_applet_mateconf_get_bool (
+ MATE_PANEL_APPLET (mainapp->applet),
+ SHOW_WIN_KEY, NULL));
+ g_signal_connect (check, "toggled",
+ G_CALLBACK (on_checkbox_toggled), NULL);
+
+ check = gtk_label_new (" ");
+ gtk_box_pack_start (GTK_BOX (vbox), check, TRUE, TRUE, 0);
+
+ gtk_widget_set_size_request (nb, -1, 100);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (box), hbox, TRUE, TRUE, 0);
+
+ label = gtk_label_new (" ");
+ gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
+
+ button = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
+ gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+
+ gtk_widget_show_all (window);
+
+ g_signal_connect (window, "delete-event",
+ G_CALLBACK (gtk_widget_destroy), window);
+
+ g_signal_connect (window, "destroy",
+ G_CALLBACK (gtk_widget_destroy), window);
+ g_signal_connect_swapped (button, "clicked",
+ G_CALLBACK (gtk_widget_destroy), window);
+
+ gtk_window_present (GTK_WINDOW (window));
+}