diff options
Diffstat (limited to 'plugins/systray/xfce-tray-plugin.c')
-rw-r--r-- | plugins/systray/xfce-tray-plugin.c | 499 |
1 files changed, 0 insertions, 499 deletions
diff --git a/plugins/systray/xfce-tray-plugin.c b/plugins/systray/xfce-tray-plugin.c deleted file mode 100644 index 0307744b..00000000 --- a/plugins/systray/xfce-tray-plugin.c +++ /dev/null @@ -1,499 +0,0 @@ -/* $Id$ */ -/* - * Copyright (c) 2007 Nick Schermer <nick@xfce.org> - * - * 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 - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#define SMALL_PANEL_SIZE (26) - -#include <gtk/gtk.h> -#include <libxfce4util/libxfce4util.h> -#include <libxfce4panel/xfce-panel-plugin.h> -#include <libxfce4panel/xfce-panel-macros.h> - -#include "xfce-tray-manager.h" -#include "xfce-tray-widget.h" -#include "xfce-tray-plugin.h" -#include "xfce-tray-dialogs.h" - - - -/* prototypes */ -static void xfce_tray_plugin_message (GtkMessageType type, - GdkScreen *screen, - const gchar *message); -static gboolean xfce_tray_plugin_check (GdkScreen *screen); -static void xfce_tray_plugin_update_position (XfceTrayPlugin *plugin); -static XfceTrayPlugin *xfce_tray_plugin_new (XfcePanelPlugin *panel_plugin); -static void xfce_tray_plugin_screen_position_changed (XfceTrayPlugin *plugin, - XfceScreenPosition position); -static void xfce_tray_plugin_orientation_changed (XfceTrayPlugin *plugin, - GtkOrientation orientation); -static gboolean xfce_tray_plugin_size_changed (XfceTrayPlugin *plugin, - guint size); -static void xfce_tray_plugin_read (XfceTrayPlugin *plugin); -static void xfce_tray_plugin_write (XfceTrayPlugin *plugin); -static void xfce_tray_plugin_free (XfceTrayPlugin *plugin); -static void xfce_tray_plugin_construct (XfcePanelPlugin *panel_plugin); - - - -/* register the plugin */ -XFCE_PANEL_PLUGIN_REGISTER_INTERNAL_WITH_CHECK (xfce_tray_plugin_construct, xfce_tray_plugin_check); - - - -static void -xfce_tray_plugin_message (GtkMessageType type, - GdkScreen *screen, - const gchar *message) -{ - GtkWidget *dialog; - - dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, type, GTK_BUTTONS_CLOSE, _("Notification Area")); - gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "%s.", message); - gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER); - gtk_window_set_screen (GTK_WINDOW (dialog), screen); - - /* run the dialog */ - gtk_dialog_run (GTK_DIALOG (dialog)); - - /* destroy */ - gtk_widget_destroy (dialog); -} - - - -static gboolean -xfce_tray_plugin_check (GdkScreen *screen) -{ - gboolean running; - - - /* check if there is already a tray running */ - running = xfce_tray_manager_check_running (screen); - - /* message */ - if (running) - { - /* TRANSLATORS: This message is shown in an info dialog when the users - add a notification area to a screen with a running systray manager. */ - xfce_tray_plugin_message (GTK_MESSAGE_INFO, screen, _("There is already a notification area running on this screen")); - } - - return (!running); -} - - - -static void -xfce_tray_plugin_update_position (XfceTrayPlugin *plugin) -{ - XfceScreenPosition position; - GdkScreen *screen; - GdkRectangle geom; - gint mon, x, y; - GtkArrowType arrow_type; - - _panel_return_if_fail (GTK_WIDGET_REALIZED (plugin->panel_plugin)); - - /* get the plugin position */ - position = xfce_panel_plugin_get_screen_position (plugin->panel_plugin); - - /* get the button position */ - switch (position) - { - /* horizontal west */ - case XFCE_SCREEN_POSITION_NW_H: - case XFCE_SCREEN_POSITION_SW_H: - arrow_type = GTK_ARROW_RIGHT; - break; - - /* horizontal east */ - case XFCE_SCREEN_POSITION_N: - case XFCE_SCREEN_POSITION_NE_H: - case XFCE_SCREEN_POSITION_S: - case XFCE_SCREEN_POSITION_SE_H: - arrow_type = GTK_ARROW_LEFT; - break; - - /* vertical north */ - case XFCE_SCREEN_POSITION_NW_V: - case XFCE_SCREEN_POSITION_NE_V: - arrow_type = GTK_ARROW_DOWN; - break; - - /* vertical south */ - case XFCE_SCREEN_POSITION_W: - case XFCE_SCREEN_POSITION_SW_V: - case XFCE_SCREEN_POSITION_E: - case XFCE_SCREEN_POSITION_SE_V: - arrow_type = GTK_ARROW_UP; - break; - - /* floating */ - default: - /* get the screen information */ - screen = gtk_widget_get_screen (GTK_WIDGET (plugin->panel_plugin)); - mon = gdk_screen_get_monitor_at_window (screen, GTK_WIDGET (plugin->panel_plugin)->window); - gdk_screen_get_monitor_geometry (screen, mon, &geom); - gdk_window_get_root_origin (GTK_WIDGET (plugin->panel_plugin)->window, &x, &y); - - /* get the position based on the screen position */ - if (position == XFCE_SCREEN_POSITION_FLOATING_H) - arrow_type = ((x < (geom.x + geom.width / 2)) ? GTK_ARROW_RIGHT : GTK_ARROW_LEFT); - else - arrow_type = ((y < (geom.y + geom.height / 2)) ? GTK_ARROW_DOWN : GTK_ARROW_UP); - break; - } - - /* set the arrow type of the tray widget */ - xfce_tray_widget_set_arrow_type (XFCE_TRAY_WIDGET (plugin->tray), arrow_type); - - /* update the manager orientation */ - xfce_tray_manager_set_orientation (plugin->manager, xfce_screen_position_get_orientation (position)); -} - - - -static void -xfce_tray_plugin_icon_added (XfceTrayManager *manager, - GtkWidget *icon, - XfceTrayPlugin *plugin) -{ - gchar *name; - - /* get the application name */ - name = xfce_tray_manager_get_application_name (icon); - - /* add the icon to the widget */ - xfce_tray_widget_add_with_name (XFCE_TRAY_WIDGET (plugin->tray), icon, name); - - /* cleanup */ - g_free (name); - - /* show icon */ - gtk_widget_show (icon); -} - - - -static void -xfce_tray_plugin_icon_removed (XfceTrayManager *manager, - GtkWidget *icon, - XfceTrayPlugin *plugin) -{ - /* remove from the tray */ - gtk_container_remove (GTK_CONTAINER (plugin->tray), icon); -} - - - -static void -xfce_tray_plugin_lost_selection (XfceTrayManager *manager, - XfceTrayPlugin *plugin) -{ - GdkScreen *screen; - - /* get screen */ - screen = gtk_widget_get_screen (GTK_WIDGET (plugin->panel_plugin)); - - /* TRANSLATORS: Bit of a weird text, but this is shown when for some - reason another tray takes the ownership of the tray icons and this - tray becomes unusable. */ - xfce_tray_plugin_message (GTK_MESSAGE_WARNING, screen, _("The tray manager lost selection")); -} - - - -static XfceTrayPlugin * -xfce_tray_plugin_new (XfcePanelPlugin *panel_plugin) -{ - XfceTrayPlugin *plugin; - gboolean result; - GError *error = NULL; - GdkScreen *screen; - - /* create structure */ - plugin = panel_slice_new0 (XfceTrayPlugin); - - /* set some data */ - plugin->panel_plugin = panel_plugin; - plugin->manager = NULL; - plugin->show_frame = TRUE; - - /* create the frame */ - plugin->frame = gtk_frame_new (NULL); - gtk_container_add (GTK_CONTAINER (panel_plugin), plugin->frame); - gtk_widget_show (plugin->frame); - - /* create tray widget */ - plugin->tray = xfce_tray_widget_new (); - gtk_container_add (GTK_CONTAINER (plugin->frame), plugin->tray); - gtk_widget_show (plugin->tray); - - /* create a tray manager */ - plugin->manager = xfce_tray_manager_new (); - - /* read the plugin settings */ - xfce_tray_plugin_read (plugin); - - /* set frame shadow */ - gtk_frame_set_shadow_type (GTK_FRAME (plugin->frame), plugin->show_frame ? GTK_SHADOW_IN : GTK_SHADOW_NONE); - - /* get screen */ - screen = gtk_widget_get_screen (GTK_WIDGET (panel_plugin)); - - /* register the tray */ - result = xfce_tray_manager_register (plugin->manager, screen, &error); - - /* check for problems */ - if (G_LIKELY (result == TRUE)) - { - /* connect signals */ - g_signal_connect (G_OBJECT (plugin->manager), "tray-icon-added", G_CALLBACK (xfce_tray_plugin_icon_added), plugin); - g_signal_connect (G_OBJECT (plugin->manager), "tray-icon-removed", G_CALLBACK (xfce_tray_plugin_icon_removed), plugin); - g_signal_connect (G_OBJECT (plugin->manager), "tray-lost-selection", G_CALLBACK (xfce_tray_plugin_lost_selection), plugin); - - /* update the plugin position */ - xfce_tray_plugin_update_position (plugin); - } - else - { - /* show error */ - xfce_tray_plugin_message (GTK_MESSAGE_ERROR, screen, error->message); - - /* free error */ - g_error_free (error); - } - - return plugin; -} - - - -static void -xfce_tray_plugin_screen_position_changed (XfceTrayPlugin *plugin, - XfceScreenPosition position) -{ - /* update the plugin position */ - xfce_tray_plugin_update_position (plugin); -} - - - -static void -xfce_tray_plugin_orientation_changed (XfceTrayPlugin *plugin, - GtkOrientation orientation) -{ - /* update the plugin position */ - xfce_tray_plugin_update_position (plugin); -} - - - -static gboolean -xfce_tray_plugin_size_changed (XfceTrayPlugin *plugin, - guint size) -{ - /* set the border sizes */ - gtk_container_set_border_width (GTK_CONTAINER (plugin->frame), (size > SMALL_PANEL_SIZE && plugin->show_frame) ? 1 : 0); - gtk_container_set_border_width (GTK_CONTAINER (plugin->tray), plugin->show_frame ? 1 : 0); - - /* we handled the size of the plugin */ - return TRUE; -} - - - -static void -xfce_tray_plugin_read (XfceTrayPlugin *plugin) -{ - gchar *file; - gchar **names; - gboolean hidden; - XfceRc *rc; - guint i; - - /* get rc file name */ - file = xfce_panel_plugin_lookup_rc_file (plugin->panel_plugin); - - if (G_LIKELY (file)) - { - /* open the file, readonly */ - rc = xfce_rc_simple_open (file, TRUE); - - /* cleanup */ - g_free (file); - - if (G_LIKELY (rc)) - { - /* save global plugin settings */ - xfce_rc_set_group (rc, "Global"); - - /* frame setting */ - plugin->show_frame = xfce_rc_read_bool_entry (rc, "ShowFrame", TRUE); - - xfce_tray_widget_set_rows (XFCE_TRAY_WIDGET (plugin->tray), xfce_rc_read_int_entry (rc, "Rows", 1)); - - if (G_LIKELY (plugin->manager)) - { - /* list of known applications */ - names = xfce_rc_get_entries (rc, "Applications"); - - if (G_LIKELY (names)) - { - /* set the group */ - xfce_rc_set_group (rc, "Applications"); - - /* read their visibility */ - for (i = 0; names[i] != NULL; i++) - { - /* whether the application is hidden */ - hidden = xfce_rc_read_bool_entry (rc, names[i], FALSE); - - /* add the application name */ - xfce_tray_widget_name_add (XFCE_TRAY_WIDGET (plugin->tray), names[i], hidden); - } - - /* cleanup */ - g_strfreev (names); - } - } - - /* close the rc file */ - xfce_rc_close (rc); - } - } -} - - - -static void -xfce_tray_plugin_write (XfceTrayPlugin *plugin) -{ - gchar *file; - GList *names, *li; - XfceRc *rc; - const gchar *name; - gboolean hidden; - - /* get rc file name, create it if needed */ - file = xfce_panel_plugin_save_location (plugin->panel_plugin, TRUE); - - if (G_LIKELY (file)) - { - /* open the file, writable */ - rc = xfce_rc_simple_open (file, FALSE); - - /* cleanup */ - g_free (file); - - if (G_LIKELY (rc)) - { - /* save global plugin settings */ - xfce_rc_set_group (rc, "Global"); - - /* write setting */ - xfce_rc_write_bool_entry (rc, "ShowFrame", plugin->show_frame); - xfce_rc_write_int_entry (rc, "Rows", xfce_tray_widget_get_rows (XFCE_TRAY_WIDGET (plugin->tray))); - - if (G_LIKELY (plugin->manager)) - { - /* get the list of known applications */ - names = xfce_tray_widget_name_list (XFCE_TRAY_WIDGET (plugin->tray)); - - if (names == NULL) - { - /* delete group */ - if (xfce_rc_has_group (rc, "Applications")) - xfce_rc_delete_group (rc, "Applications", FALSE); - } - else - { - /* save the list of known applications and their visibility */ - xfce_rc_set_group (rc, "Applications"); - - /* save their state */ - for (li = names; li != NULL; li = li->next) - { - /* get name and status */ - name = li->data; - hidden = xfce_tray_widget_name_hidden (XFCE_TRAY_WIDGET (plugin->tray), name); - - /* write entry */ - xfce_rc_write_bool_entry (rc, name, hidden); - } - - /* cleanup */ - g_list_free (names); - } - } - - /* close the rc file */ - xfce_rc_close (rc); - } - } -} - - - -static void -xfce_tray_plugin_free (XfceTrayPlugin *plugin) -{ - /* unregister manager */ - xfce_tray_manager_unregister (plugin->manager); - - /* release */ - g_object_unref (G_OBJECT (plugin->manager)); - - /* free slice */ - panel_slice_free (XfceTrayPlugin, plugin); -} - - - -static void -xfce_tray_plugin_construct (XfcePanelPlugin *panel_plugin) -{ - XfceTrayPlugin *plugin; - - /* create the tray panel plugin */ - plugin = xfce_tray_plugin_new (panel_plugin); - - /* set the action widgets and show configure */ - xfce_panel_plugin_add_action_widget (panel_plugin, plugin->frame); - xfce_panel_plugin_add_action_widget (panel_plugin, plugin->tray); - xfce_panel_plugin_menu_show_configure (panel_plugin); - - /* connect signals */ - g_signal_connect_swapped (G_OBJECT (panel_plugin), "screen-position-changed", - G_CALLBACK (xfce_tray_plugin_screen_position_changed), plugin); - g_signal_connect_swapped (G_OBJECT (panel_plugin), "orientation-changed", - G_CALLBACK (xfce_tray_plugin_orientation_changed), plugin); - g_signal_connect_swapped (G_OBJECT (panel_plugin), "size-changed", - G_CALLBACK (xfce_tray_plugin_size_changed), plugin); - g_signal_connect_swapped (G_OBJECT (panel_plugin), "save", - G_CALLBACK (xfce_tray_plugin_write), plugin); - g_signal_connect_swapped (G_OBJECT (panel_plugin), "free-data", - G_CALLBACK (xfce_tray_plugin_free), plugin); - g_signal_connect_swapped (G_OBJECT (panel_plugin), "configure-plugin", - G_CALLBACK (xfce_tray_dialogs_configure), plugin); -} |