summaryrefslogtreecommitdiff
path: root/applets/notification_area/testtray.c
diff options
context:
space:
mode:
authorPerberos <[email protected]>2011-12-01 22:56:10 -0300
committerPerberos <[email protected]>2011-12-01 22:56:10 -0300
commitc51ef797a707f4e2c6f9688d4378f2b0e9898a66 (patch)
tree019ae92bb53c19b30077545cb14743cbd1b57aef /applets/notification_area/testtray.c
downloadmate-panel-c51ef797a707f4e2c6f9688d4378f2b0e9898a66.tar.bz2
mate-panel-c51ef797a707f4e2c6f9688d4378f2b0e9898a66.tar.xz
moving from https://github.com/perberos/mate-desktop-environment
Diffstat (limited to 'applets/notification_area/testtray.c')
-rw-r--r--applets/notification_area/testtray.c220
1 files changed, 220 insertions, 0 deletions
diff --git a/applets/notification_area/testtray.c b/applets/notification_area/testtray.c
new file mode 100644
index 00000000..d052bedf
--- /dev/null
+++ b/applets/notification_area/testtray.c
@@ -0,0 +1,220 @@
+/*
+ * Copyright (C) 2002 Anders Carlsson <[email protected]>
+ * Copyright (C) 2003-2006 Vincent Untz
+ * Copyright (C) 2006, 2007 Christian Persch
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include <stdio.h>
+#include <gtk/gtk.h>
+#include "na-tray-manager.h"
+#include "na-tray.h"
+
+#define NOTIFICATION_AREA_ICON "mate-panel-notification-area"
+
+static guint n_windows = 0;
+
+typedef struct
+{
+ GdkScreen *screen;
+ guint screen_num;
+ GtkWidget *window;
+ NaTray *tray;
+ GtkWidget *box;
+ GtkLabel *count_label;
+} TrayData;
+
+static void
+do_add (GtkWidget *child, guint *n_children)
+{
+ *n_children += 1;
+}
+
+static void
+update_child_count (TrayData *data)
+{
+ guint n_children = 0;
+ char text[64];
+
+ if (!gtk_widget_get_realized (data->window))
+ return;
+
+ gtk_container_foreach (GTK_CONTAINER (data->box), (GtkCallback) do_add, &n_children);
+
+ g_snprintf (text, sizeof (text), "%u icons", n_children);
+ gtk_label_set_text (data->count_label, text);
+}
+
+static void
+tray_added_cb (GtkContainer *box, GtkWidget *icon, TrayData *data)
+{
+ g_print ("[Screen %u tray %p] Child %p added to tray: \"%s\"\n",
+ data->screen_num, data->tray, icon, "XXX");//na_tray_child_get_title (icon));
+
+ update_child_count (data);
+}
+
+static void
+tray_removed_cb (GtkContainer *box, GtkWidget *icon, TrayData *data)
+{
+ g_print ("[Screen %u tray %p] Child %p removed from tray\n",
+ data->screen_num, data->tray, icon);
+
+ update_child_count (data);
+}
+
+static void orientation_changed_cb (GtkComboBox *combo, TrayData *data)
+{
+ GtkOrientation orientation = (GtkOrientation) gtk_combo_box_get_active (combo);
+
+ g_print ("[Screen %u tray %p] Setting orientation to \"%s\"\n",
+ data->screen_num, data->tray, orientation == 0 ? "horizontal" : "vertical");
+
+ na_tray_set_orientation (data->tray, orientation);
+}
+
+static void
+maybe_quit (gpointer data,
+ GObject *zombie)
+{
+ if (--n_windows == 0) {
+ gtk_main_quit ();
+ }
+}
+
+static TrayData *create_tray_on_screen (GdkScreen *screen, gboolean force);
+
+static void
+warning_dialog_response_cb (GtkWidget *dialog,
+ gint response,
+ GdkScreen *screen)
+{
+ if (response == GTK_RESPONSE_YES) {
+ create_tray_on_screen (screen, TRUE);
+ }
+
+ gtk_widget_destroy (dialog);
+}
+
+static void
+add_tray_cb (GtkWidget *button, TrayData *data)
+{
+ create_tray_on_screen (data->screen, TRUE);
+}
+
+static TrayData *
+create_tray_on_screen (GdkScreen *screen,
+ gboolean force)
+{
+ GtkWidget *window, *hbox, *vbox, *button, *combo, *label;
+ TrayData *data;
+
+ n_windows++;
+
+ if (!force && na_tray_manager_check_running (screen)) {
+ GtkWidget *dialog;
+
+ dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_WARNING, GTK_BUTTONS_YES_NO,
+ "Override tray manager?");
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ "There is already a tray manager running on screen %d.",
+ gdk_screen_get_number (screen));
+ gtk_window_set_screen (GTK_WINDOW (dialog), screen);
+ g_signal_connect (dialog, "response", G_CALLBACK (warning_dialog_response_cb), screen);
+ gtk_window_present (GTK_WINDOW (dialog));
+ g_object_weak_ref (G_OBJECT (dialog), (GWeakNotify) maybe_quit, NULL);
+ return NULL;
+ }
+
+ data = g_new0 (TrayData, 1);
+ data->screen = screen;
+ data->screen_num = gdk_screen_get_number (screen);
+
+ data->window = window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ g_object_weak_ref (G_OBJECT (window), (GWeakNotify) maybe_quit, NULL);
+
+ vbox = gtk_vbox_new (FALSE, 6);
+ gtk_container_add (GTK_CONTAINER (window), vbox);
+
+ button = gtk_button_new_with_mnemonic ("_Add another tray");
+ g_signal_connect (button, "clicked", G_CALLBACK (add_tray_cb), data);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+
+ hbox = gtk_hbox_new (FALSE, 12);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
+ label = gtk_label_new_with_mnemonic ("_Orientation:");
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+ combo = gtk_combo_box_new_text ();
+ gtk_combo_box_append_text (GTK_COMBO_BOX (combo), "Horizontal");
+ gtk_combo_box_append_text (GTK_COMBO_BOX (combo), "Vertical");
+ g_signal_connect (combo, "changed",
+ G_CALLBACK (orientation_changed_cb), data);
+ gtk_box_pack_start (GTK_BOX (hbox), combo, FALSE, FALSE, 0);
+
+ label = gtk_label_new (NULL);
+ data->count_label = GTK_LABEL (label);
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+ gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
+
+ data->tray = na_tray_new_for_screen (screen, GTK_ORIENTATION_HORIZONTAL);
+ gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (data->tray), TRUE, TRUE, 0);
+
+ data->box = gtk_bin_get_child (GTK_BIN (gtk_bin_get_child (GTK_BIN (data->tray))));
+ g_signal_connect_after (data->box, "add", G_CALLBACK (tray_added_cb), data);
+ g_signal_connect_after (data->box, "remove", G_CALLBACK (tray_removed_cb), data);
+
+ gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
+
+ gtk_window_set_screen (GTK_WINDOW (window), screen);
+ gtk_window_set_default_size (GTK_WINDOW (window), -1, 200);
+
+ /* gtk_window_set_resizable (GTK_WINDOW (window), FALSE); */
+
+ gtk_widget_show_all (window);
+
+ update_child_count (data);
+
+ return data;
+}
+
+int
+main (int argc, char *argv[])
+{
+ GdkDisplay *display;
+ GdkScreen *screen;
+ int n_screens, i;
+
+ gtk_init (&argc, &argv);
+
+ gtk_window_set_default_icon_name (NOTIFICATION_AREA_ICON);
+
+ display = gdk_display_get_default ();
+ n_screens = gdk_display_get_n_screens (display);
+ for (i = 0; i < n_screens; ++i) {
+ screen = gdk_display_get_screen (display, i);
+
+ create_tray_on_screen (screen, FALSE);
+ }
+
+ gtk_main ();
+
+ return 0;
+}