diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Makefile.am | 2 | ||||
| -rw-r--r-- | src/eggtrayicon.c | 513 | ||||
| -rw-r--r-- | src/eggtrayicon.h | 80 | ||||
| -rw-r--r-- | src/padevchooser.c | 32 | 
4 files changed, 12 insertions, 615 deletions
| diff --git a/src/Makefile.am b/src/Makefile.am index 77eab3c..1c13c1c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -24,7 +24,7 @@ bin_PROGRAMS=padevchooser  dist_pkgdata_DATA=padevchooser.glade  dist_desktop_DATA=padevchooser.desktop -padevchooser_SOURCES=padevchooser.c x11prop.c eggtrayicon.c x11prop.h eggtrayicon.h +padevchooser_SOURCES=padevchooser.c x11prop.c x11prop.h.h  padevchooser_LDADD=$(AM_LDADD) $(GUILIBS_LIBS) $(PULSE_LIBS)  padevchooser_CFLAGS=$(AM_CFLAGS) $(GUILIBS_CFLAGS) $(PULSE_CFLAGS)  diff --git a/src/eggtrayicon.c b/src/eggtrayicon.c deleted file mode 100644 index 07ce5df..0000000 --- a/src/eggtrayicon.c +++ /dev/null @@ -1,513 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* eggtrayicon.c - * Copyright (C) 2002 Anders Carlsson <andersca@gnu.org> - * - * 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 <libintl.h> - -#include "eggtrayicon.h" - -#include <gdkconfig.h> -#if defined (GDK_WINDOWING_X11) -#include <gdk/gdkx.h> -#include <X11/Xatom.h> -#elif defined (GDK_WINDOWING_WIN32) -#include <gdk/gdkwin32.h> -#endif - -#ifndef EGG_COMPILATION -#ifndef _ -#define _(x) dgettext (GETTEXT_PACKAGE, x) -#define N_(x) x -#endif -#else -#define _(x) x -#define N_(x) x -#endif - -#define SYSTEM_TRAY_REQUEST_DOCK    0 -#define SYSTEM_TRAY_BEGIN_MESSAGE   1 -#define SYSTEM_TRAY_CANCEL_MESSAGE  2 - -#define SYSTEM_TRAY_ORIENTATION_HORZ 0 -#define SYSTEM_TRAY_ORIENTATION_VERT 1 - -enum { -  PROP_0, -  PROP_ORIENTATION -}; -          -static GtkPlugClass *parent_class = NULL; - -static void egg_tray_icon_init (EggTrayIcon *icon); -static void egg_tray_icon_class_init (EggTrayIconClass *klass); - -static void egg_tray_icon_get_property (GObject    *object, -					guint       prop_id, -					GValue     *value, -					GParamSpec *pspec); - -static void egg_tray_icon_realize   (GtkWidget *widget); -static void egg_tray_icon_unrealize (GtkWidget *widget); - -#ifdef GDK_WINDOWING_X11 -static void egg_tray_icon_update_manager_window    (EggTrayIcon *icon, -						    gboolean     dock_if_realized); -static void egg_tray_icon_manager_window_destroyed (EggTrayIcon *icon); -#endif - -GType -egg_tray_icon_get_type (void) -{ -  static GType our_type = 0; - -  if (our_type == 0) -    { -      static const GTypeInfo our_info = -      { -	sizeof (EggTrayIconClass), -	(GBaseInitFunc) NULL, -	(GBaseFinalizeFunc) NULL, -	(GClassInitFunc) egg_tray_icon_class_init, -	NULL, /* class_finalize */ -	NULL, /* class_data */ -	sizeof (EggTrayIcon), -	0,    /* n_preallocs */ -	(GInstanceInitFunc) egg_tray_icon_init -      }; - -      our_type = g_type_register_static (GTK_TYPE_PLUG, "EggTrayIcon", &our_info, 0); -    } - -  return our_type; -} - -static void -egg_tray_icon_init (EggTrayIcon *icon) -{ -  icon->stamp = 1; -  icon->orientation = GTK_ORIENTATION_HORIZONTAL; -   -  gtk_widget_add_events (GTK_WIDGET (icon), GDK_PROPERTY_CHANGE_MASK); -} - -static void -egg_tray_icon_class_init (EggTrayIconClass *klass) -{ -  GObjectClass *gobject_class = (GObjectClass *)klass; -  GtkWidgetClass *widget_class = (GtkWidgetClass *)klass; - -  parent_class = g_type_class_peek_parent (klass); - -  gobject_class->get_property = egg_tray_icon_get_property; - -  widget_class->realize   = egg_tray_icon_realize; -  widget_class->unrealize = egg_tray_icon_unrealize; - -  g_object_class_install_property (gobject_class, -				   PROP_ORIENTATION, -				   g_param_spec_enum ("orientation", -						      _("Orientation"), -						      _("The orientation of the tray."), -						      GTK_TYPE_ORIENTATION, -						      GTK_ORIENTATION_HORIZONTAL, -						      G_PARAM_READABLE)); - -#if defined (GDK_WINDOWING_X11) -  /* Nothing */ -#elif defined (GDK_WINDOWING_WIN32) -  g_warning ("Port eggtrayicon to Win32"); -#else -  g_warning ("Port eggtrayicon to this GTK+ backend"); -#endif -} - -static void -egg_tray_icon_get_property (GObject    *object, -			    guint       prop_id, -			    GValue     *value, -			    GParamSpec *pspec) -{ -  EggTrayIcon *icon = EGG_TRAY_ICON (object); - -  switch (prop_id) -    { -    case PROP_ORIENTATION: -      g_value_set_enum (value, icon->orientation); -      break; -    default: -      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); -      break; -    } -} - -#ifdef GDK_WINDOWING_X11 - -static void -egg_tray_icon_get_orientation_property (EggTrayIcon *icon) -{ -  Display *xdisplay; -  Atom type; -  int format; -  union { -	gulong *prop; -	guchar *prop_ch; -  } prop = { NULL }; -  gulong nitems; -  gulong bytes_after; -  int error, result; - -  g_assert (icon->manager_window != None); -   -  xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon))); - -  gdk_error_trap_push (); -  type = None; -  result = XGetWindowProperty (xdisplay, -			       icon->manager_window, -			       icon->orientation_atom, -			       0, G_MAXLONG, FALSE, -			       XA_CARDINAL, -			       &type, &format, &nitems, -			       &bytes_after, &(prop.prop_ch)); -  error = gdk_error_trap_pop (); - -  if (error || result != Success) -    return; - -  if (type == XA_CARDINAL) -    { -      GtkOrientation orientation; - -      orientation = (prop.prop [0] == SYSTEM_TRAY_ORIENTATION_HORZ) ? -					GTK_ORIENTATION_HORIZONTAL : -					GTK_ORIENTATION_VERTICAL; - -      if (icon->orientation != orientation) -	{ -	  icon->orientation = orientation; - -	  g_object_notify (G_OBJECT (icon), "orientation"); -	} -    } - -  if (prop.prop) -    XFree (prop.prop); -} - -static GdkFilterReturn -egg_tray_icon_manager_filter (GdkXEvent *xevent, GdkEvent *event, gpointer user_data) -{ -  EggTrayIcon *icon = user_data; -  XEvent *xev = (XEvent *)xevent; - -  if (xev->xany.type == ClientMessage && -      xev->xclient.message_type == icon->manager_atom && -      xev->xclient.data.l[1] == icon->selection_atom) -    { -      egg_tray_icon_update_manager_window (icon, TRUE); -    } -  else if (xev->xany.window == icon->manager_window) -    { -      if (xev->xany.type == PropertyNotify && -	  xev->xproperty.atom == icon->orientation_atom) -	{ -	  egg_tray_icon_get_orientation_property (icon); -	} -      if (xev->xany.type == DestroyNotify) -	{ -	  egg_tray_icon_manager_window_destroyed (icon); -	} -    } -  return GDK_FILTER_CONTINUE; -} - -#endif   - -static void -egg_tray_icon_unrealize (GtkWidget *widget) -{ -#ifdef GDK_WINDOWING_X11 -  EggTrayIcon *icon = EGG_TRAY_ICON (widget); -  GdkWindow *root_window; - -  if (icon->manager_window != None) -    { -      GdkWindow *gdkwin; - -      gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (widget), -                                              icon->manager_window); - -      gdk_window_remove_filter (gdkwin, egg_tray_icon_manager_filter, icon); -    } - -  root_window = gdk_screen_get_root_window (gtk_widget_get_screen (widget)); - -  gdk_window_remove_filter (root_window, egg_tray_icon_manager_filter, icon); - -  if (GTK_WIDGET_CLASS (parent_class)->unrealize) -    (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget); -#endif -} - -#ifdef GDK_WINDOWING_X11 - -static void -egg_tray_icon_send_manager_message (EggTrayIcon *icon, -				    long         message, -				    Window       window, -				    long         data1, -				    long         data2, -				    long         data3) -{ -  XClientMessageEvent ev; -  Display *display; -   -  ev.type = ClientMessage; -  ev.window = window; -  ev.message_type = icon->system_tray_opcode_atom; -  ev.format = 32; -  ev.data.l[0] = gdk_x11_get_server_time (GTK_WIDGET (icon)->window); -  ev.data.l[1] = message; -  ev.data.l[2] = data1; -  ev.data.l[3] = data2; -  ev.data.l[4] = data3; - -  display = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon))); -   -  gdk_error_trap_push (); -  XSendEvent (display, -	      icon->manager_window, False, NoEventMask, (XEvent *)&ev); -  XSync (display, False); -  gdk_error_trap_pop (); -} - -static void -egg_tray_icon_send_dock_request (EggTrayIcon *icon) -{ -  egg_tray_icon_send_manager_message (icon, -				      SYSTEM_TRAY_REQUEST_DOCK, -				      icon->manager_window, -				      gtk_plug_get_id (GTK_PLUG (icon)), -				      0, 0); -} - -static void -egg_tray_icon_update_manager_window (EggTrayIcon *icon, -				     gboolean     dock_if_realized) -{ -  Display *xdisplay; -   -  if (icon->manager_window != None) -    return; - -  xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon))); -   -  XGrabServer (xdisplay); -   -  icon->manager_window = XGetSelectionOwner (xdisplay, -					     icon->selection_atom); - -  if (icon->manager_window != None) -    XSelectInput (xdisplay, -		  icon->manager_window, StructureNotifyMask|PropertyChangeMask); - -  XUngrabServer (xdisplay); -  XFlush (xdisplay); -   -  if (icon->manager_window != None) -    { -      GdkWindow *gdkwin; - -      gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)), -					      icon->manager_window); -       -      gdk_window_add_filter (gdkwin, egg_tray_icon_manager_filter, icon); - -      if (dock_if_realized && GTK_WIDGET_REALIZED (icon)) -	egg_tray_icon_send_dock_request (icon); - -      egg_tray_icon_get_orientation_property (icon); -    } -} - -static void -egg_tray_icon_manager_window_destroyed (EggTrayIcon *icon) -{ -  GdkWindow *gdkwin; -   -  g_return_if_fail (icon->manager_window != None); - -  gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)), -					  icon->manager_window); -       -  gdk_window_remove_filter (gdkwin, egg_tray_icon_manager_filter, icon); - -  icon->manager_window = None; - -  egg_tray_icon_update_manager_window (icon, TRUE); -} - -#endif - -static void -egg_tray_icon_realize (GtkWidget *widget) -{ -#ifdef GDK_WINDOWING_X11 -  EggTrayIcon *icon = EGG_TRAY_ICON (widget); -  GdkScreen *screen; -  GdkDisplay *display; -  Display *xdisplay; -  char buffer[256]; -  GdkWindow *root_window; - -  if (GTK_WIDGET_CLASS (parent_class)->realize) -    GTK_WIDGET_CLASS (parent_class)->realize (widget); - -  screen = gtk_widget_get_screen (widget); -  display = gdk_screen_get_display (screen); -  xdisplay = gdk_x11_display_get_xdisplay (display); - -  /* Now see if there's a manager window around */ -  g_snprintf (buffer, sizeof (buffer), -	      "_NET_SYSTEM_TRAY_S%d", -	      gdk_screen_get_number (screen)); - -  icon->selection_atom = XInternAtom (xdisplay, buffer, False); -   -  icon->manager_atom = XInternAtom (xdisplay, "MANAGER", False); -   -  icon->system_tray_opcode_atom = XInternAtom (xdisplay, -						   "_NET_SYSTEM_TRAY_OPCODE", -						   False); - -  icon->orientation_atom = XInternAtom (xdisplay, -					"_NET_SYSTEM_TRAY_ORIENTATION", -					False); - -  egg_tray_icon_update_manager_window (icon, FALSE); -  egg_tray_icon_send_dock_request (icon); - -  root_window = gdk_screen_get_root_window (screen); -   -  /* Add a root window filter so that we get changes on MANAGER */ -  gdk_window_add_filter (root_window, -			 egg_tray_icon_manager_filter, icon); -#endif -} - -EggTrayIcon * -egg_tray_icon_new_for_screen (GdkScreen *screen, const char *name) -{ -  g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); - -  return g_object_new (EGG_TYPE_TRAY_ICON, "screen", screen, "title", name, NULL); -} - -EggTrayIcon* -egg_tray_icon_new (const gchar *name) -{ -  return g_object_new (EGG_TYPE_TRAY_ICON, "title", name, NULL); -} - -guint -egg_tray_icon_send_message (EggTrayIcon *icon, -			    gint         timeout, -			    const gchar *message, -			    gint         len) -{ -  guint stamp; -   -  g_return_val_if_fail (EGG_IS_TRAY_ICON (icon), 0); -  g_return_val_if_fail (timeout >= 0, 0); -  g_return_val_if_fail (message != NULL, 0); -		      -#ifdef GDK_WINDOWING_X11 -  if (icon->manager_window == None) -    return 0; -#endif - -  if (len < 0) -    len = strlen (message); - -  stamp = icon->stamp++; -   -#ifdef GDK_WINDOWING_X11 -  /* Get ready to send the message */ -  egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_BEGIN_MESSAGE, -				      (Window)gtk_plug_get_id (GTK_PLUG (icon)), -				      timeout, len, stamp); - -  /* Now to send the actual message */ -  gdk_error_trap_push (); -  while (len > 0) -    { -      XClientMessageEvent ev; -      Display *xdisplay; - -      xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon))); -       -      ev.type = ClientMessage; -      ev.window = (Window)gtk_plug_get_id (GTK_PLUG (icon)); -      ev.format = 8; -      ev.message_type = XInternAtom (xdisplay, -				     "_NET_SYSTEM_TRAY_MESSAGE_DATA", False); -      if (len > 20) -	{ -	  memcpy (&ev.data, message, 20); -	  len -= 20; -	  message += 20; -	} -      else -	{ -	  memcpy (&ev.data, message, len); -	  len = 0; -	} - -      XSendEvent (xdisplay, -		  icon->manager_window, False, StructureNotifyMask, (XEvent *)&ev); -      XSync (xdisplay, False); -    } -  gdk_error_trap_pop (); -#endif - -  return stamp; -} - -void -egg_tray_icon_cancel_message (EggTrayIcon *icon, -			      guint        id) -{ -  g_return_if_fail (EGG_IS_TRAY_ICON (icon)); -  g_return_if_fail (id > 0); -#ifdef GDK_WINDOWING_X11   -  egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_CANCEL_MESSAGE, -				      (Window)gtk_plug_get_id (GTK_PLUG (icon)), -				      id, 0, 0); -#endif -} - -GtkOrientation -egg_tray_icon_get_orientation (EggTrayIcon *icon) -{ -  g_return_val_if_fail (EGG_IS_TRAY_ICON (icon), GTK_ORIENTATION_HORIZONTAL); - -  return icon->orientation; -} diff --git a/src/eggtrayicon.h b/src/eggtrayicon.h deleted file mode 100644 index e6664fc..0000000 --- a/src/eggtrayicon.h +++ /dev/null @@ -1,80 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* eggtrayicon.h - * Copyright (C) 2002 Anders Carlsson <andersca@gnu.org> - * - * 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. - */ - -#ifndef __EGG_TRAY_ICON_H__ -#define __EGG_TRAY_ICON_H__ - -#include <gtk/gtkplug.h> -#ifdef GDK_WINDOWING_X11 -#include <gdk/gdkx.h> -#endif - -G_BEGIN_DECLS - -#define EGG_TYPE_TRAY_ICON		(egg_tray_icon_get_type ()) -#define EGG_TRAY_ICON(obj)		(G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_TRAY_ICON, EggTrayIcon)) -#define EGG_TRAY_ICON_CLASS(klass)	(G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_TRAY_ICON, EggTrayIconClass)) -#define EGG_IS_TRAY_ICON(obj)		(G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_TRAY_ICON)) -#define EGG_IS_TRAY_ICON_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_TRAY_ICON)) -#define EGG_TRAY_ICON_GET_CLASS(obj)	(G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_TRAY_ICON, EggTrayIconClass)) -	 -typedef struct _EggTrayIcon	  EggTrayIcon; -typedef struct _EggTrayIconClass  EggTrayIconClass; - -struct _EggTrayIcon -{ -  GtkPlug parent_instance; - -  guint stamp; -   -#ifdef GDK_WINDOWING_X11 -  Atom selection_atom; -  Atom manager_atom; -  Atom system_tray_opcode_atom; -  Atom orientation_atom; -  Window manager_window; -#endif -  GtkOrientation orientation; -}; - -struct _EggTrayIconClass -{ -  GtkPlugClass parent_class; -}; - -GType        egg_tray_icon_get_type       (void); - -EggTrayIcon *egg_tray_icon_new_for_screen (GdkScreen   *screen, -					   const gchar *name); - -EggTrayIcon *egg_tray_icon_new            (const gchar *name); - -guint        egg_tray_icon_send_message   (EggTrayIcon *icon, -					   gint         timeout, -					   const char  *message, -					   gint         len); -void         egg_tray_icon_cancel_message (EggTrayIcon *icon, -					   guint        id); - -GtkOrientation egg_tray_icon_get_orientation (EggTrayIcon *icon); -					     -G_END_DECLS - -#endif /* __EGG_TRAY_ICON_H__ */ diff --git a/src/padevchooser.c b/src/padevchooser.c index d8fa47a..3c88031 100644 --- a/src/padevchooser.c +++ b/src/padevchooser.c @@ -30,6 +30,7 @@  #include <sys/types.h>  #include <gtk/gtk.h> +#include <gdk/gdkx.h>  #include <glade/glade.h>  #include <gconf/gconf-client.h>  #include <libnotify/notify.h> @@ -38,7 +39,6 @@  #include <pulse/browser.h>  #include <pulse/glib-mainloop.h> -#include "eggtrayicon.h"  #include "x11prop.h"  #define GCONF_PREFIX "/apps/padevchooser" @@ -53,7 +53,7 @@ struct menu_item_info {  static NotifyNotification *notification = NULL;  static gchar *last_events = NULL; -static EggTrayIcon *tray_icon = NULL; +static GtkStatusIcon *tray_icon = NULL;  static gchar *current_server = NULL, *current_sink = NULL, *current_source = NULL;  static struct menu_item_info *current_source_menu_item_info = NULL, *current_sink_menu_item_info = NULL, *current_server_menu_item_info = NULL;  static GtkMenu *menu = NULL, *sink_submenu = NULL, *source_submenu = NULL, *server_submenu = NULL; @@ -346,9 +346,8 @@ static void browse_cb(pa_browser *z, pa_browse_opcode_t c, const pa_browse_info      look_for_current_menu_items();  } -static void tray_icon_on_click(GtkWidget *widget, GdkEventButton* event) { -    if (event->type == GDK_BUTTON_PRESS) -        gtk_menu_popup(menu, NULL, NULL, NULL, NULL, event->button, event->time); +static void tray_icon_on_click(GtkStatusIcon *status_icon, void * user_data) { +    gtk_menu_popup(menu, NULL, NULL, gtk_status_icon_position_menu, status_icon, 1, gtk_get_current_event_time());  }  static void start_manager_cb(void) { @@ -520,24 +519,15 @@ static void server_other_cb(void) {      set_server(input_dialog("Other Server", "Please enter server name:", current_server));  } -static EggTrayIcon *create_tray_icon(void) { -    GtkTooltips *tips; -    EggTrayIcon *tray_icon; -    GtkWidget *event_box, *icon; +static GtkStatusIcon *create_tray_icon(void) { +    GtkStatusIcon *tray_icon; -    tray_icon = egg_tray_icon_new("PulseAudio Device Chooser"); - -    event_box = gtk_event_box_new(); -    g_signal_connect_swapped(G_OBJECT(event_box), "button-press-event", G_CALLBACK(tray_icon_on_click), NULL); - -    gtk_container_add(GTK_CONTAINER(tray_icon), event_box); -    icon = gtk_image_new_from_icon_name("audio-card", GTK_ICON_SIZE_SMALL_TOOLBAR); -    gtk_container_add(GTK_CONTAINER(event_box), icon); +    tray_icon = gtk_status_icon_new(); -    gtk_widget_show_all(GTK_WIDGET(tray_icon)); - -    tips = gtk_tooltips_new(); -    gtk_tooltips_set_tip(GTK_TOOLTIPS(tips), event_box, "PulseAudio Applet", "I don't know what this is."); +    g_signal_connect_object(G_OBJECT(tray_icon), "activate", G_CALLBACK(tray_icon_on_click), tray_icon, 0); +    gtk_status_icon_set_from_icon_name(tray_icon, "audio-card"); +    gtk_status_icon_set_tooltip(tray_icon, "PulseAudio Applet"); +    gtk_status_icon_set_visible(tray_icon, TRUE);      return tray_icon;  } | 
