summaryrefslogtreecommitdiff
path: root/applets/notification_area/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'applets/notification_area/main.c')
-rw-r--r--applets/notification_area/main.c267
1 files changed, 267 insertions, 0 deletions
diff --git a/applets/notification_area/main.c b/applets/notification_area/main.c
new file mode 100644
index 00000000..fc11040f
--- /dev/null
+++ b/applets/notification_area/main.c
@@ -0,0 +1,267 @@
+/* System tray main() */
+
+/*
+ * Copyright (C) 2002 Red Hat, Inc.
+ * Copyright (C) 2003-2006 Vincent Untz
+ * Copyright (C) 2011 Perberos
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <string.h>
+
+#include <mate-panel-applet.h>
+#include <mate-panel-applet-mateconf.h>
+
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+
+#include "na-tray-manager.h"
+#include "na-tray.h"
+#include "fixedtip.h"
+
+#define NOTIFICATION_AREA_ICON "mate-panel-notification-area"
+
+typedef struct {
+ MatePanelApplet* applet;
+ NaTray* tray;
+} AppletData;
+
+static GtkOrientation get_orientation_from_applet(MatePanelApplet* applet)
+{
+ GtkOrientation orientation;
+
+ switch (mate_panel_applet_get_orient(applet))
+ {
+ case MATE_PANEL_APPLET_ORIENT_LEFT:
+ case MATE_PANEL_APPLET_ORIENT_RIGHT:
+ orientation = GTK_ORIENTATION_VERTICAL;
+ break;
+ case MATE_PANEL_APPLET_ORIENT_UP:
+ case MATE_PANEL_APPLET_ORIENT_DOWN:
+ default:
+ orientation = GTK_ORIENTATION_HORIZONTAL;
+ break;
+ }
+
+ return orientation;
+}
+
+static void help_cb(GtkAction* action, AppletData* data)
+{
+ GError* error = NULL;
+ char* uri;
+ #define NA_HELP_DOC "user-guide"
+
+ uri = g_strdup_printf("ghelp:%s?%s", NA_HELP_DOC, "panels-notification-area");
+
+ gtk_show_uri(gtk_widget_get_screen(GTK_WIDGET(data->applet)), uri, gtk_get_current_event_time(), &error);
+
+ g_free(uri);
+
+ if (error && g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ {
+ g_error_free(error);
+ }
+ else if(error)
+ {
+ GtkWidget* dialog;
+ char* primary;
+
+ primary = g_markup_printf_escaped (_("Could not display help document '%s'"), NA_HELP_DOC);
+ dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "%s", primary);
+
+ gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), "%s", error->message);
+
+ g_error_free(error);
+ g_free(primary);
+
+ g_signal_connect(dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL);
+
+ gtk_window_set_icon_name (GTK_WINDOW (dialog), NOTIFICATION_AREA_ICON);
+ gtk_window_set_screen (GTK_WINDOW (dialog), gtk_widget_get_screen (GTK_WIDGET (data->applet)));
+ /* we have no parent window */
+ gtk_window_set_skip_taskbar_hint (GTK_WINDOW (dialog), FALSE);
+ gtk_window_set_title (GTK_WINDOW (dialog), _("Error displaying help document"));
+
+ gtk_widget_show (dialog);
+ }
+}
+
+static void about_cb(GtkAction* action, AppletData* data)
+{
+ const gchar* authors[] = {
+ "Havoc Pennington <[email protected]>",
+ "Anders Carlsson <[email protected]>",
+ "Vincent Untz <[email protected]>",
+ NULL
+ };
+
+ const char* documenters[] = {
+ "Sun GNOME Documentation Team <[email protected]>",
+ NULL
+ };
+
+ const char copyright[] = \
+ "Copyright \xc2\xa9 2002 Red Hat, Inc.\n"
+ "Copyright \xc2\xa9 2003-2006 Vincent Untz\n"
+ "Copyright \xc2\xa9 2011 Perberos";
+
+ gtk_show_about_dialog(NULL,
+ "program-name", _("Notification Area"),
+ "authors", authors,
+ //"comments", _(comments),
+ "copyright", copyright,
+ "documenters", documenters,
+ "logo-icon-name", NOTIFICATION_AREA_ICON,
+ "translator-credits", _("translator-credits"),
+ "version", VERSION,
+ "website", "http://matsusoft.com.ar/projects/mate/",
+ NULL);
+}
+
+static const GtkActionEntry menu_actions [] = {
+ { "SystemTrayHelp", GTK_STOCK_HELP, N_("_Help"),
+ NULL, NULL,
+ G_CALLBACK (help_cb) },
+ { "SystemTrayAbout", GTK_STOCK_ABOUT, N_("_About"),
+ NULL, NULL,
+ G_CALLBACK (about_cb) }
+};
+
+static void applet_change_background(MatePanelApplet* applet, MatePanelAppletBackgroundType type, GdkColor* color, GdkPixmap* pixmap, AppletData* data)
+{
+ na_tray_force_redraw(data->tray);
+}
+
+
+static void applet_change_orientation(MatePanelApplet* applet, MatePanelAppletOrient orient, AppletData* data)
+{
+ na_tray_set_orientation(data->tray, get_orientation_from_applet(applet));
+}
+
+static void applet_destroy(MatePanelApplet* applet, AppletData* data)
+{
+}
+
+static void free_applet_data(AppletData* data)
+{
+ g_slice_free(AppletData, data);
+}
+
+static void on_applet_realized(GtkWidget* widget, gpointer user_data)
+{
+ MatePanelApplet* applet;
+ AppletData* data;
+ NaTray* tray;
+ GtkActionGroup* action_group;
+ gchar* ui_path;
+
+ applet = MATE_PANEL_APPLET(widget);
+ data = g_object_get_data(G_OBJECT(widget), "system-tray-data");
+
+ if (data != NULL)
+ {
+ return;
+ }
+
+ tray = na_tray_new_for_screen(gtk_widget_get_screen(GTK_WIDGET(applet)), get_orientation_from_applet(applet));
+
+ data = g_slice_new(AppletData);
+ data->applet = applet;
+ data->tray = tray;
+
+ g_object_set_data_full(G_OBJECT(applet), "system-tray-data", data, (GDestroyNotify) free_applet_data);
+
+ g_signal_connect(applet, "change_orient", G_CALLBACK (applet_change_orientation), data);
+ g_signal_connect(applet, "change_background", G_CALLBACK (applet_change_background), data);
+ g_signal_connect(applet, "destroy", G_CALLBACK (applet_destroy), data);
+
+ gtk_container_add(GTK_CONTAINER (applet), GTK_WIDGET (tray));
+ gtk_widget_show(GTK_WIDGET(tray));
+
+ action_group = gtk_action_group_new("ClockApplet Menu Actions");
+ gtk_action_group_set_translation_domain(action_group, GETTEXT_PACKAGE);
+ gtk_action_group_add_actions(action_group, menu_actions, G_N_ELEMENTS(menu_actions), data);
+ ui_path = g_build_filename(NOTIFICATION_AREA_MENU_UI_DIR, "notification-area-menu.xml", NULL);
+ mate_panel_applet_setup_menu_from_file(applet, ui_path, action_group);
+ g_free(ui_path);
+ g_object_unref(action_group);
+
+}
+
+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 \"*.PanelAppletNaTray\" style \"na-tray-style\"\n"
+ "\n");
+
+ first_time = FALSE;
+ }
+
+ /* El widget antes se llamaba na-tray
+ *
+ * Issue #27
+ */
+ gtk_widget_set_name(widget, "PanelAppletNaTray");
+}
+
+static gboolean applet_factory(MatePanelApplet* applet, const gchar* iid, gpointer user_data)
+{
+ AtkObject* atko;
+
+ if (!(strcmp (iid, "NotificationArea") == 0 || strcmp (iid, "SystemTrayApplet") == 0))
+ {
+ return FALSE;
+ }
+
+ /* Defer loading until applet is added to panel so
+ * gtk_widget_get_screen returns correct information */
+ g_signal_connect(GTK_WIDGET(applet), "realize", G_CALLBACK(on_applet_realized), NULL);
+
+ atko = gtk_widget_get_accessible (GTK_WIDGET (applet));
+ atk_object_set_name (atko, _("Panel Notification Area"));
+
+ mate_panel_applet_set_flags(applet, MATE_PANEL_APPLET_HAS_HANDLE | MATE_PANEL_APPLET_EXPAND_MINOR);
+
+ mate_panel_applet_set_background_widget(applet, GTK_WIDGET(applet));
+
+ force_no_focus_padding(GTK_WIDGET(applet));
+
+ #ifndef NOTIFICATION_AREA_INPROCESS
+ gtk_window_set_default_icon_name(NOTIFICATION_AREA_ICON);
+ #endif
+
+ gtk_widget_show_all(GTK_WIDGET(applet));
+ return TRUE;
+}
+
+#ifdef NOTIFICATION_AREA_INPROCESS
+ MATE_PANEL_APPLET_IN_PROCESS_FACTORY("NotificationAreaAppletFactory", PANEL_TYPE_APPLET, "NotificationArea", applet_factory, NULL)
+#else
+ MATE_PANEL_APPLET_OUT_PROCESS_FACTORY("NotificationAreaAppletFactory", PANEL_TYPE_APPLET, "NotificationArea", applet_factory, NULL)
+#endif