Here's an updated patch: o Added Close to main window o Fixed http://bugzilla.gnome.org/show_bug.cgi?id=155436
cvs server: Diffing . cvs server: Diffing component cvs server: Diffing corba cvs server: Diffing data cvs server: Diffing data/art cvs server: Diffing data/glade cvs server: Diffing data/node-views cvs server: Diffing data/ui Index: data/ui/rhythmbox-ui.xml =================================================================== RCS file: /cvs/gnome/rhythmbox/data/ui/rhythmbox-ui.xml,v retrieving revision 1.19 diff -u -p -r1.19 rhythmbox-ui.xml --- data/ui/rhythmbox-ui.xml 12 Jun 2005 17:21:44 -0000 1.19 +++ data/ui/rhythmbox-ui.xml 6 Jul 2005 20:37:52 -0000 @@ -18,6 +18,7 @@ <separator/> <menuitem name="MusicPropertiesMenu" action="MusicProperties"/> <separator/> + <menuitem name="MusicClose" action="MusicClose"/> <menuitem name="MusicQuit" action="MusicQuit"/> </menu> @@ -66,13 +67,14 @@ </menubar> <popup name="RhythmboxTrayPopup"> + <menuitem name="ShowWindowTray" action="TrayShowWindow"/> + <separator/> <menuitem name="PlayTray" action="ControlPlay"/> <menuitem name="PauseTray" action="ControlPause"/> <separator/> <menuitem name="PreviousTray" action="ControlPrevious"/> <menuitem name="NextTray" action="ControlNext"/> <separator/> - <menuitem name="ShowWindowTray" action="TrayShowWindow"/> <menuitem name="QuitTray" action="MusicQuit"/> </popup> cvs server: Diffing data/views cvs server: Diffing debian cvs server: Diffing doc cvs server: Diffing help cvs server: Diffing help/C cvs server: Diffing help/C/figures cvs server: Diffing help/ja cvs server: Diffing help/ja/figures cvs server: Diffing iradio cvs server: Diffing lib cvs server: Diffing lib/egg cvs server: Diffing lib/toolbar cvs server: Diffing lib/view cvs server: Diffing lib/widgets cvs server: Diffing library cvs server: Diffing macros cvs server: Diffing metadata cvs server: Diffing metadata/monkey-media cvs server: Diffing metadata/monkey-media/id3-vfs cvs server: Diffing metadata/monkey-media/stream-info-impl cvs server: Diffing metadata/monkey-media/stream-info-impl/id3-vfs cvs server: Diffing monkey-media cvs server: Diffing monkey-media/id3-vfs cvs server: Diffing monkey-media/stream-info-impl cvs server: Diffing monkey-media/stream-info-impl/id3-vfs cvs server: Diffing player cvs server: Diffing po cvs server: Diffing remote cvs server: Diffing remote/bonobo cvs server: Diffing remote/dbus cvs server: Diffing rhythmdb cvs server: Diffing shell Index: shell/rb-shell.c =================================================================== RCS file: /cvs/gnome/rhythmbox/shell/rb-shell.c,v retrieving revision 1.303 diff -u -p -r1.303 rb-shell.c --- shell/rb-shell.c 19 Jun 2005 18:30:57 -0000 1.303 +++ shell/rb-shell.c 6 Jul 2005 20:37:53 -0000 @@ -151,6 +151,8 @@ static void rb_shell_cmd_about (GtkActio RBShell *shell); static void rb_shell_cmd_contents (GtkAction *action, RBShell *shell); +static void rb_shell_cmd_toggle_visibility (GtkAction *action, + RBShell *shell); static void rb_shell_cmd_quit (GtkAction *action, RBShell *shell); static void rb_shell_cmd_preferences (GtkAction *action, @@ -388,6 +390,9 @@ static GtkActionEntry rb_shell_actions [ { "HelpContents", GTK_STOCK_HELP, N_("_Contents"), "F1", N_("Display music player help"), G_CALLBACK (rb_shell_cmd_contents) }, + { "MusicClose", GTK_STOCK_CLOSE, N_("_Close"), "<control>W", + N_("Hide the music player window"), + G_CALLBACK (rb_shell_cmd_toggle_visibility) }, { "MusicQuit", GTK_STOCK_QUIT, N_("_Quit"), "<control>Q", N_("Quit the music player"), G_CALLBACK (rb_shell_cmd_quit) }, @@ -1149,13 +1154,45 @@ rb_shell_window_state_cb (GtkWidget *wid } #endif +static void +rb_shell_set_visibility (RBShell *shell, gboolean visible) +{ + if (visible == shell->priv->visible) + return; + + if (visible) { + rb_debug ("showing main window"); + rb_shell_sync_window_state (shell); + + gtk_widget_realize (shell->priv->window); + gdk_flush (); + if ((shell->priv->window_x >= 0) && (shell->priv->window_y >= 0)) + gtk_window_move (GTK_WINDOW (shell->priv->window), + shell->priv->window_x, + shell->priv->window_y); + + gtk_widget_show (shell->priv->window); + } else { + /* should store this stuff in gconf instead? */ + rb_debug ("hiding main window"); + gtk_window_get_position (GTK_WINDOW (shell->priv->window), + &shell->priv->window_x, + &shell->priv->window_y); + gtk_widget_hide (shell->priv->window); + } + + shell->priv->visible = visible; + g_signal_emit_by_name (shell, "visibility_changed", visible); + +} + static gboolean rb_shell_window_delete_cb (GtkWidget *win, GdkEventAny *event, RBShell *shell) { - rb_debug ("window deleted"); - rb_shell_quit (shell); + rb_debug ("window deleted, toggling visibility"); + rb_shell_set_visibility (shell, !shell->priv->visible); return TRUE; }; @@ -1624,6 +1661,13 @@ rb_shell_cmd_about (GtkAction *action, } static void +rb_shell_cmd_toggle_visibility (GtkAction *action, + RBShell *shell) +{ + rb_shell_set_visibility (shell, !shell->priv->visible); +} + +static void rb_shell_cmd_quit (GtkAction *action, RBShell *shell) { @@ -2095,20 +2139,21 @@ static gboolean tray_destroy_cb (GtkObject *object, RBShell *shell) { if (shell->priv->tray_icon) { - rb_debug ("caught destroy event for tray icon"); + rb_debug ("caught destroy event for tray icon %p", object); gtk_object_sink (object); shell->priv->tray_icon = NULL; + rb_debug ("finished sinking tray"); } rb_debug ("creating new tray icon"); shell->priv->tray_icon = rb_tray_icon_new (shell->priv->ui_manager, - shell->priv->actiongroup, RB_REMOTE_PROXY (shell)); g_signal_connect_object (G_OBJECT (shell->priv->tray_icon), "destroy", G_CALLBACK (tray_destroy_cb), shell, 0); gtk_widget_show_all (GTK_WIDGET (shell->priv->tray_icon)); + rb_debug ("done creating new tray icon %p", shell->priv->tray_icon); return TRUE; } @@ -2217,32 +2262,7 @@ static void rb_shell_set_visibility_impl (RBRemoteProxy *proxy, gboolean visible) { RBShell *shell = RB_SHELL (proxy); - if (visible == shell->priv->visible) - return; - - if (visible) { - rb_debug ("showing main window"); - rb_shell_sync_window_state (shell); - - gtk_widget_realize (shell->priv->window); - gdk_flush (); - if ((shell->priv->window_x >= 0) && (shell->priv->window_y >= 0)) - gtk_window_move (GTK_WINDOW (shell->priv->window), - shell->priv->window_x, - shell->priv->window_y); - - gtk_widget_show (shell->priv->window); - } else { - /* should store this stuff in gconf instead? */ - rb_debug ("hiding main window"); - gtk_window_get_position (GTK_WINDOW (shell->priv->window), - &shell->priv->window_x, - &shell->priv->window_y); - gtk_widget_hide (shell->priv->window); - } - - shell->priv->visible = visible; - g_signal_emit_by_name (proxy, "visibility_changed", visible); + rb_shell_set_visibility (shell, visible); } static gboolean Index: shell/rb-tray-icon.c =================================================================== RCS file: /cvs/gnome/rhythmbox/shell/rb-tray-icon.c,v retrieving revision 1.17 diff -u -p -r1.17 rb-tray-icon.c --- shell/rb-tray-icon.c 19 Jun 2005 18:30:57 -0000 1.17 +++ shell/rb-tray-icon.c 6 Jul 2005 20:37:53 -0000 @@ -94,8 +94,8 @@ enum static GtkToggleActionEntry rb_tray_icon_toggle_entries [] = { - { "TrayShowWindow", NULL, N_("_Show Window"), NULL, - N_("Change the visibility of the main window"), + { "TrayShowWindow", NULL, N_("_Show Music Player"), NULL, + N_("Choose music to play"), G_CALLBACK (rb_tray_icon_show_window_changed_cb) } }; static guint rb_tray_icon_n_toggle_entries = G_N_ELEMENTS (rb_tray_icon_toggle_entries); @@ -165,7 +165,7 @@ rb_tray_icon_class_init (RBTrayIconClass "GtkActionGroup", "GtkActionGroup object", GTK_TYPE_ACTION_GROUP, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + G_PARAM_READABLE)); } static void @@ -217,6 +217,16 @@ rb_tray_icon_constructor (GType type, gu tray = RB_TRAY_ICON (parent_class->constructor (type, n_construct_properties, construct_properties)); + tray->priv->actiongroup = gtk_action_group_new ("TrayActions"); + gtk_action_group_add_toggle_actions (tray->priv->actiongroup, + rb_tray_icon_toggle_entries, + rb_tray_icon_n_toggle_entries, + tray); + rb_tray_icon_sync_action (NULL, FALSE, tray); + + gtk_ui_manager_insert_action_group (tray->priv->ui_manager, tray->priv->actiongroup, 0); + g_object_unref (tray->priv->actiongroup); + return G_OBJECT (tray); } @@ -230,6 +240,10 @@ rb_tray_icon_finalize (GObject *object) tray = RB_TRAY_ICON (object); + rb_debug ("tray icon %p finalizing", object); + + gtk_ui_manager_remove_action_group (tray->priv->ui_manager, tray->priv->actiongroup); + g_return_if_fail (tray->priv != NULL); gtk_object_destroy (GTK_OBJECT (tray->priv->tooltips)); @@ -272,14 +286,6 @@ rb_tray_icon_set_property (GObject *obje case PROP_UI_MANAGER: tray->priv->ui_manager = g_value_get_object (value); break; - case PROP_ACTION_GROUP: - tray->priv->actiongroup = g_value_get_object (value); - gtk_action_group_add_toggle_actions (tray->priv->actiongroup, - rb_tray_icon_toggle_entries, - rb_tray_icon_n_toggle_entries, - tray); - rb_tray_icon_sync_action (NULL, FALSE, tray); - break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -313,49 +319,64 @@ rb_tray_icon_get_property (GObject *obje RBTrayIcon * rb_tray_icon_new (GtkUIManager *mgr, - GtkActionGroup *group, RBRemoteProxy *remote) { return g_object_new (RB_TYPE_TRAY_ICON, "title", "Rhythmbox tray icon", "ui-manager", mgr, - "action-group", group, "remote", remote, NULL); } static void +tray_popup_position_menu (GtkMenu *menu, + int *x, + int *y, + gboolean *push_in, + gpointer user_data) +{ + GtkWidget *widget; + GtkRequisition requisition; + gint menu_xpos; + gint menu_ypos; + + widget = GTK_WIDGET (user_data); + + gtk_widget_size_request (GTK_WIDGET (menu), &requisition); + + gdk_window_get_origin (widget->window, &menu_xpos, &menu_ypos); + + menu_xpos += widget->allocation.x; + menu_ypos += widget->allocation.y; + + if (menu_ypos > gdk_screen_get_height (gtk_widget_get_screen (widget)) / 2) + menu_ypos -= requisition.height; + else + menu_ypos += widget->allocation.height; + + *x = menu_xpos; + *y = menu_ypos; + *push_in = TRUE; +} + +static void rb_tray_icon_button_press_event_cb (GtkWidget *ebox, GdkEventButton *event, RBTrayIcon *icon) { + GtkWidget *popup; + /* filter out double, triple clicks */ if (event->type != GDK_BUTTON_PRESS) return; rb_debug ("tray button press"); - switch (event->button) { - case 1: - { - gboolean visible = rb_remote_proxy_get_visibility (icon->priv->proxy); - rb_remote_proxy_set_visibility (icon->priv->proxy, visible ? FALSE : TRUE); - break; - } - - case 3: - { - GtkWidget *popup; - popup = gtk_ui_manager_get_widget (GTK_UI_MANAGER (icon->priv->ui_manager), - "/RhythmboxTrayPopup"); - gtk_menu_set_screen (GTK_MENU (popup), gtk_widget_get_screen (GTK_WIDGET (icon))); - gtk_menu_popup (GTK_MENU (popup), NULL, NULL, - NULL, NULL, 2, - gtk_get_current_event_time ()); - } - break; - default: - break; - } + popup = gtk_ui_manager_get_widget (GTK_UI_MANAGER (icon->priv->ui_manager), + "/RhythmboxTrayPopup"); + gtk_menu_set_screen (GTK_MENU (popup), gtk_widget_get_screen (GTK_WIDGET (icon))); + gtk_menu_popup (GTK_MENU (popup), NULL, NULL, + tray_popup_position_menu, ebox, 2, + gtk_get_current_event_time ()); } static void @@ -442,7 +463,7 @@ static void rb_tray_icon_show_window_changed_cb (GtkAction *action, RBTrayIcon *icon) { - rb_debug ("show window clicked"); + rb_debug ("show window clicked for %p", icon); rb_remote_proxy_set_visibility (icon->priv->proxy, gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))); } Index: shell/rb-tray-icon.h =================================================================== RCS file: /cvs/gnome/rhythmbox/shell/rb-tray-icon.h,v retrieving revision 1.6 diff -u -p -r1.6 rb-tray-icon.h --- shell/rb-tray-icon.h 19 Jun 2005 18:30:57 -0000 1.6 +++ shell/rb-tray-icon.h 6 Jul 2005 20:37:53 -0000 @@ -54,7 +54,6 @@ typedef struct GType rb_tray_icon_get_type (void); RBTrayIcon * rb_tray_icon_new (GtkUIManager *mgr, - GtkActionGroup *actiongroup, RBRemoteProxy *remote); void rb_tray_icon_set_tooltip(RBTrayIcon *icon, const char *tooltip); cvs server: Diffing sources cvs server: Diffing tests cvs server: Diffing views cvs server: Diffing widgets cvs server: Diffing xine-output
Attachment:
signature.asc
Description: This is a digitally signed message part