diff options
Diffstat (limited to 'plugins/tasklist/tasklist.c')
-rw-r--r-- | plugins/tasklist/tasklist.c | 483 |
1 files changed, 0 insertions, 483 deletions
diff --git a/plugins/tasklist/tasklist.c b/plugins/tasklist/tasklist.c deleted file mode 100644 index a26e04c8..00000000 --- a/plugins/tasklist/tasklist.c +++ /dev/null @@ -1,483 +0,0 @@ -/* $Id$ - * - * Copyright (c) 2005-2007 Jasper Huijsmans <jasper@xfce.org> - * 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 Library 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 Library General Public License for more details. - * - * You should have received a copy of the GNU Library 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 - -#ifdef HAVE_STRING_H -#include <string.h> -#endif - -#include <libwnck/libwnck.h> -#include <libxfce4util/libxfce4util.h> -#include <libxfce4panel/xfce-hvbox.h> - -#include "tasklist.h" -#include "tasklist-dialogs.h" - -#define TASKLIST_HANDLE_SIZE (8) - - -/* prototypes */ -static gboolean tasklist_handle_exposed (GtkWidget *widget, - GdkEventExpose *event, - TasklistPlugin *tasklist); -static GdkPixbuf *tasklist_icon_loader (const gchar *name, - gint size, - guint flags, - TasklistPlugin *tasklist); -static TasklistPlugin *tasklist_plugin_new (XfcePanelPlugin *panel_plugin); -static void tasklist_plugin_screen_changed (TasklistPlugin *tasklist, - GdkScreen *previous_screen); -static void tasklist_plugin_orientation_changed (TasklistPlugin *tasklist, - GtkOrientation orientation); -static gboolean tasklist_plugin_size_changed (TasklistPlugin *tasklist, - guint size); -static void tasklist_plugin_size_request (TasklistPlugin *tasklist, - GtkRequisition *requisition); -static void tasklist_plugin_read (TasklistPlugin *tasklist); -static void tasklist_plugin_free (TasklistPlugin *tasklist); -static void tasklist_plugin_construct (XfcePanelPlugin *panel_plugin); - - - -/* register with the panel */ -XFCE_PANEL_PLUGIN_REGISTER_INTERNAL (tasklist_plugin_construct); - - - -gboolean -tasklist_using_xinerama (XfcePanelPlugin *panel_plugin) -{ - return (gdk_screen_get_n_monitors (gtk_widget_get_screen (GTK_WIDGET (panel_plugin))) > 1); -} - - - -static gboolean -tasklist_handle_exposed (GtkWidget *widget, - GdkEventExpose *event, - TasklistPlugin *tasklist) -{ - GtkOrientation orientation; - gint x, y, w, h; - - if (GTK_WIDGET_DRAWABLE (widget)) - { - /* get the panel orientation */ - orientation = xfce_panel_plugin_get_orientation (tasklist->panel_plugin); - - /* set sizes */ - x = widget->allocation.x; - y = widget->allocation.y; - w = widget->allocation.width; - h = widget->allocation.height; - - if (orientation == GTK_ORIENTATION_HORIZONTAL) - { - y += widget->style->ythickness; - h -= 2 * widget->style->ythickness; - } - else - { - x += widget->style->xthickness; - w -= 2 * widget->style->xthickness; - } - - gtk_paint_handle (widget->style, widget->window, - GTK_WIDGET_STATE (widget), GTK_SHADOW_NONE, - &(event->area), widget, "handlebox", - x, y, w, h, - orientation == GTK_ORIENTATION_HORIZONTAL ? - GTK_ORIENTATION_VERTICAL : - GTK_ORIENTATION_HORIZONTAL); - - return TRUE; - } - - return FALSE; -} - - - -static GdkPixbuf * -tasklist_icon_loader (const gchar *name, - gint size, - guint flags, - TasklistPlugin *tasklist) -{ - GdkPixbuf *pixbuf = NULL; - gchar *base = NULL; - const gchar *p; - - /* do nothing on invalid names */ - if (G_UNLIKELY (name == NULL || *name == '\0')) - return NULL; - - if (g_path_is_absolute (name)) - { - if (g_file_test (name, G_FILE_TEST_EXISTS)) - { - /* directly load the file */ - pixbuf = gdk_pixbuf_new_from_file_at_size (name, size, size, NULL); - } - else - { - /* get the base name */ - base = g_path_get_basename (name); - - /* use this function to try again */ - pixbuf = tasklist_icon_loader (base, size, flags, tasklist); - - /* cleanup */ - g_free (base); - } - } - else - { - /* strip prefix */ - p = strrchr (name, '.'); - if (G_UNLIKELY (p)) - base = g_strndup (name, p - name); - - /* load the icon */ - pixbuf = gtk_icon_theme_load_icon (tasklist->icon_theme, base ? base : name, size, 0, NULL); - - /* cleanup */ - g_free (base); - } - - return pixbuf; -} - - - -static TasklistPlugin * -tasklist_plugin_new (XfcePanelPlugin *panel_plugin) -{ - TasklistPlugin *tasklist; - GdkScreen *screen; - gint screen_n; - - /* allocate structure */ - tasklist = panel_slice_new0 (TasklistPlugin); - - /* init data */ - tasklist->panel_plugin = panel_plugin; - - /* read settings */ - tasklist_plugin_read (tasklist); - - /* create hvbox */ - tasklist->box = xfce_hvbox_new (xfce_panel_plugin_get_orientation (panel_plugin), FALSE, 0); - gtk_container_add (GTK_CONTAINER (panel_plugin), tasklist->box); - gtk_widget_show (tasklist->box); - - /* create handle */ - tasklist->handle = gtk_alignment_new (0.0, 0.0, 0.0, 0.0); - gtk_widget_set_size_request (tasklist->handle, TASKLIST_HANDLE_SIZE, TASKLIST_HANDLE_SIZE); - gtk_box_pack_start (GTK_BOX (tasklist->box), tasklist->handle, FALSE, FALSE, 0); - g_signal_connect (tasklist->handle, "expose-event", G_CALLBACK (tasklist_handle_exposed), tasklist); - if (tasklist->show_handles) - gtk_widget_show (tasklist->handle); - - /* get the current screen number */ - screen = gtk_widget_get_screen (GTK_WIDGET (panel_plugin)); - screen_n = gdk_screen_get_number (screen); - - /* set the icon theme */ - tasklist->icon_theme = gtk_icon_theme_get_for_screen (screen); - - /* create tasklist */ - tasklist->list = wnck_tasklist_new (wnck_screen_get (screen_n)); - gtk_box_pack_start (GTK_BOX (tasklist->box), tasklist->list, FALSE, FALSE, 0); - gtk_widget_show (tasklist->list); - - /* set the tasklist settings */ - wnck_tasklist_set_include_all_workspaces (WNCK_TASKLIST (tasklist->list), tasklist->all_workspaces); - wnck_tasklist_set_grouping (WNCK_TASKLIST (tasklist->list), tasklist->grouping); - wnck_tasklist_set_button_relief (WNCK_TASKLIST (tasklist->list), tasklist->flat_buttons ? GTK_RELIEF_NONE : GTK_RELIEF_NORMAL); - wnck_tasklist_set_icon_loader (WNCK_TASKLIST (tasklist->list), (WnckLoadIconFunction) tasklist_icon_loader, tasklist, NULL); - - return tasklist; -} - - - -static void -tasklist_plugin_screen_changed (TasklistPlugin *tasklist, - GdkScreen *previous_screen) -{ - GdkScreen *screen; - WnckScreen *wnck_screen; - - /* get the new screen */ - screen = gtk_widget_get_screen (GTK_WIDGET (tasklist->panel_plugin)); - if (G_UNLIKELY (screen == NULL)) - screen = gdk_screen_get_default (); - - /* get the wnck screen */ - wnck_screen = wnck_screen_get (gdk_screen_get_number (screen)); - - /* set the new tasklist screen */ - wnck_tasklist_set_screen (WNCK_TASKLIST (tasklist->list), wnck_screen); - - /* set the icon theme */ - tasklist->icon_theme = gtk_icon_theme_get_for_screen (screen); -} - - - -static void -tasklist_plugin_orientation_changed (TasklistPlugin *tasklist, - GtkOrientation orientation) -{ - /* set the new orientation of the hvbox */ - xfce_hvbox_set_orientation (XFCE_HVBOX (tasklist->box), orientation); - - /* redraw the handle */ - gtk_widget_queue_draw (tasklist->handle); -} - - - -gboolean -tasklist_plugin_size_changed (TasklistPlugin *tasklist, - guint size) -{ - /* size is handled in the size_request function */ - return TRUE; -} - - - -static void -tasklist_plugin_size_request (TasklistPlugin *tasklist, - GtkRequisition *requisition) -{ - const gint *size_hints; - gint length; - gint size; - GtkOrientation orientation; - - /* get the size hints */ - size_hints = wnck_tasklist_get_size_hint_list (WNCK_TASKLIST (tasklist->list), &length); - - /* check for pairs of 2 */ - if (G_LIKELY (length > 0)) - { - /* get the first size */ - size = size_hints[0]; - - /* add the handle size */ - if (tasklist->show_handles) - size += TASKLIST_HANDLE_SIZE; - - /* use the requested size when it is bigger then the prefered size */ - if (tasklist->fixed_width) - size = MAX (100, tasklist->width); - - /* get plugin orientation */ - orientation = xfce_panel_plugin_get_orientation (tasklist->panel_plugin); - - /* set the panel size */ - requisition->width = requisition->height = xfce_panel_plugin_get_size (tasklist->panel_plugin); - - /* set the requested plugin size */ - if (orientation == GTK_ORIENTATION_HORIZONTAL) - requisition->width = size; - else - requisition->height = size; - - /* save the requested size */ - tasklist->req_size = size; - } -} - - -static void -tasklist_plugin_size_allocate (TasklistPlugin *tasklist, - GtkAllocation *allocation) -{ - GtkOrientation orientation; - gint a_size, p_size; - - /* get orientation */ - orientation = xfce_panel_plugin_get_orientation (tasklist->panel_plugin); - - /* get plugin size */ - p_size = xfce_panel_plugin_get_size (tasklist->panel_plugin); - - if (orientation == GTK_ORIENTATION_HORIZONTAL) - a_size = MIN (tasklist->req_size, allocation->width); - else - a_size = MIN (tasklist->req_size, allocation->height); - - if (tasklist->show_handles) - a_size -= TASKLIST_HANDLE_SIZE; - - /* force the size request of the taskbar */ - if (orientation == GTK_ORIENTATION_HORIZONTAL) - gtk_widget_set_size_request (GTK_WIDGET (tasklist->list), a_size, p_size); - else - gtk_widget_set_size_request (GTK_WIDGET (tasklist->list), p_size, a_size); -} - - -static void -tasklist_plugin_read (TasklistPlugin *tasklist) -{ - gchar *file; - XfceRc *rc; - - /* set defaults */ - tasklist->grouping = WNCK_TASKLIST_AUTO_GROUP; - tasklist->all_workspaces = FALSE; - tasklist->expand = TRUE; - tasklist->flat_buttons = TRUE; - tasklist->show_handles = TRUE; - tasklist->width = 300; - tasklist->fixed_width = FALSE; - - /* get rc file name */ - file = xfce_panel_plugin_lookup_rc_file (tasklist->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)) - { - /* read settings */ - tasklist->grouping = xfce_rc_read_int_entry (rc, "grouping", tasklist->grouping); - tasklist->all_workspaces = xfce_rc_read_bool_entry (rc, "all_workspaces", tasklist->all_workspaces); - tasklist->flat_buttons = xfce_rc_read_bool_entry (rc, "flat_buttons", tasklist->flat_buttons); - tasklist->show_handles = xfce_rc_read_bool_entry (rc, "show_handles", tasklist->show_handles); - tasklist->width = xfce_rc_read_int_entry (rc, "width",tasklist->width); - tasklist->fixed_width = xfce_rc_read_bool_entry (rc, "fixed_width", tasklist->fixed_width); - - /* only set expand flag if xinerama is used */ - if (tasklist_using_xinerama (tasklist->panel_plugin)) - tasklist->expand = xfce_rc_read_bool_entry (rc, "expand", tasklist->expand); - - /* close the rc file */ - xfce_rc_close (rc); - } - } -} - - - -void -tasklist_plugin_write (TasklistPlugin *tasklist) -{ - gchar *file; - XfceRc *rc; - - /* get rc file name, create it if needed */ - file = xfce_panel_plugin_save_location (tasklist->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)) - { - /* write settings */ - xfce_rc_write_int_entry (rc, "grouping", tasklist->grouping); - xfce_rc_write_int_entry (rc, "width", tasklist->width); - xfce_rc_write_bool_entry (rc, "all_workspaces", tasklist->all_workspaces); - xfce_rc_write_bool_entry (rc, "expand", tasklist->expand); - xfce_rc_write_bool_entry (rc, "flat_buttons", tasklist->flat_buttons); - xfce_rc_write_bool_entry (rc, "show_handles", tasklist->show_handles); - xfce_rc_write_bool_entry (rc, "fixed_width", tasklist->fixed_width); - - /* close the rc file */ - xfce_rc_close (rc); - } - } -} - - - -static void -tasklist_plugin_free (TasklistPlugin *tasklist) -{ - GtkWidget *dialog; - - /* destroy the dialog */ - dialog = g_object_get_data (G_OBJECT (tasklist->panel_plugin), I_("dialog")); - if (dialog) - gtk_widget_destroy (dialog); - - /* disconnect screen changed signal */ - g_signal_handler_disconnect (G_OBJECT (tasklist->panel_plugin), tasklist->screen_changed_id); - - /* free slice */ - panel_slice_free (TasklistPlugin, tasklist); -} - - - -static void -tasklist_plugin_construct (XfcePanelPlugin *panel_plugin) -{ - TasklistPlugin *tasklist; - - /* create the tray panel plugin */ - tasklist = tasklist_plugin_new (panel_plugin); - - /* set the action widgets and show configure */ - xfce_panel_plugin_add_action_widget (panel_plugin, tasklist->handle); - xfce_panel_plugin_menu_show_configure (panel_plugin); - - /* whether to expand the plugin */ - xfce_panel_plugin_set_expand (panel_plugin, tasklist->expand); - - /* connect plugin signals */ - g_signal_connect_swapped (G_OBJECT (panel_plugin), "orientation-changed", - G_CALLBACK (tasklist_plugin_orientation_changed), tasklist); - g_signal_connect_swapped (G_OBJECT (panel_plugin), "size-changed", - G_CALLBACK (tasklist_plugin_size_changed), tasklist); - g_signal_connect_swapped (G_OBJECT (panel_plugin), "size-request", - G_CALLBACK (tasklist_plugin_size_request), tasklist); - g_signal_connect_swapped (G_OBJECT (panel_plugin), "size-allocate", - G_CALLBACK (tasklist_plugin_size_allocate), tasklist); - g_signal_connect_swapped (G_OBJECT (panel_plugin), "save", - G_CALLBACK (tasklist_plugin_write), tasklist); - g_signal_connect_swapped (G_OBJECT (panel_plugin), "free-data", - G_CALLBACK (tasklist_plugin_free), tasklist); - g_signal_connect_swapped (G_OBJECT (panel_plugin), "configure-plugin", - G_CALLBACK (tasklist_dialogs_configure), tasklist); - - /* screen changed signal */ - tasklist->screen_changed_id = - g_signal_connect_swapped (G_OBJECT (panel_plugin), "screen-changed", - G_CALLBACK (tasklist_plugin_screen_changed), tasklist); -} |