[Goodies-commits] r4521 - xfmpc/trunk/src
Mike Massonnet
mmassonnet at xfce.org
Sun Apr 6 22:51:41 CEST 2008
Author: mmassonnet
Date: 2008-04-06 20:51:41 +0000 (Sun, 06 Apr 2008)
New Revision: 4521
Modified:
xfmpc/trunk/src/extended-interface.c
Log:
Add context button with an experimental menu
* src/extended-interface.c(xfmpc_extended_interface_init):
- Rework the box spacing for the inner children
- Add a GtkToggleButton with a callback cb_context_menu
* src/extended-interface.c:
- New callbacks cb_combobox_changed, cb_context_menu, cb_context_menu_detach
- New position function position_menu
Modified: xfmpc/trunk/src/extended-interface.c
===================================================================
--- xfmpc/trunk/src/extended-interface.c 2008-04-06 20:51:37 UTC (rev 4520)
+++ xfmpc/trunk/src/extended-interface.c 2008-04-06 20:51:41 UTC (rev 4521)
@@ -50,9 +50,17 @@
static void xfmpc_extended_interface_dispose (GObject *object);
static void xfmpc_extended_interface_finalize (GObject *object);
-static void cb_xfmpc_extended_interface_combobox_changed
- (GtkComboBox *widget,
+static void cb_combobox_changed (GtkComboBox *widget,
XfmpcExtendedInterface *extended_interface);
+static void cb_context_menu (GtkToggleButton *button,
+ XfmpcExtendedInterface *extended_interface);
+static void cb_context_menu_detach (GtkWidget *button,
+ GtkMenu *menu);
+static void position_menu (GtkMenu *menu,
+ gint *x,
+ gint *y,
+ gboolean *push_in,
+ GtkWidget *widget);
@@ -131,7 +139,7 @@
extended_interface->mpdclient = xfmpc_mpdclient_get ();
/* Hbox */
- GtkWidget *hbox = gtk_hbox_new (FALSE, 0);
+ GtkWidget *hbox = gtk_hbox_new (FALSE, 2);
gtk_box_pack_start (GTK_BOX (extended_interface), hbox, FALSE, FALSE, 2);
/* Clear playlist */
@@ -147,13 +155,23 @@
/* Refresh database */
widget = gtk_button_new ();
gtk_widget_set_tooltip_text (widget, _("Refresh Database"));
- gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
g_signal_connect_swapped (widget, "clicked",
G_CALLBACK (xfmpc_mpdclient_database_refresh), extended_interface->mpdclient);
image = gtk_image_new_from_stock (GTK_STOCK_REFRESH, GTK_ICON_SIZE_MENU);
gtk_button_set_image (GTK_BUTTON (widget), image);
+ /* Context menu */
+ widget = gtk_toggle_button_new ();
+ gtk_widget_set_tooltip_text (widget, _("Context Menu"));
+ gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
+ g_signal_connect (widget, "toggled",
+ G_CALLBACK (cb_context_menu), extended_interface);
+
+ image = gtk_image_new_from_stock (GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_MENU);
+ gtk_button_set_image (GTK_BUTTON (widget), image);
+
/* Combo box */
priv->list_store = gtk_list_store_new (N_COLUMNS,
G_TYPE_STRING,
@@ -162,7 +180,7 @@
priv->combobox = gtk_combo_box_new_with_model (GTK_TREE_MODEL (priv->list_store));
gtk_box_pack_start (GTK_BOX (hbox), priv->combobox, TRUE, TRUE, 0);
g_signal_connect (priv->combobox, "changed",
- G_CALLBACK (cb_xfmpc_extended_interface_combobox_changed), extended_interface);
+ G_CALLBACK (cb_combobox_changed), extended_interface);
GtkCellRenderer *cell = gtk_cell_renderer_text_new ();
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (priv->combobox), cell, TRUE);
@@ -229,8 +247,8 @@
}
static void
-cb_xfmpc_extended_interface_combobox_changed (GtkComboBox *widget,
- XfmpcExtendedInterface *extended_interface)
+cb_combobox_changed (GtkComboBox *widget,
+ XfmpcExtendedInterface *extended_interface)
{
XfmpcExtendedInterfacePrivate *priv = XFMPC_EXTENDED_INTERFACE_GET_PRIVATE (extended_interface);
@@ -250,3 +268,68 @@
gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), i);
}
+static void
+cb_context_menu (GtkToggleButton *button,
+ XfmpcExtendedInterface *extended_interface)
+{
+ if (!gtk_toggle_button_get_active (button))
+ return;
+
+#if 0
+ GtkWidget *menu = xfmpc_extended_interface_menu_preferences_new (extended_interface);
+#else
+ GtkWidget *menu = gtk_menu_new ();
+ gtk_menu_set_screen (GTK_MENU (menu), gtk_widget_get_screen (GTK_WIDGET (button)));
+ gtk_menu_attach_to_widget (GTK_MENU (menu), GTK_WIDGET (button),
+ (GtkMenuDetachFunc) cb_context_menu_detach);
+ g_signal_connect (menu, "deactivate",
+ G_CALLBACK (gtk_menu_detach), NULL);
+
+
+ GtkWidget *item = gtk_check_menu_item_new_with_label (_("Repeat"));
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+
+ item = gtk_check_menu_item_new_with_label (_("Random"));
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+
+ gtk_widget_show_all (menu);
+#endif
+
+ gtk_menu_popup (GTK_MENU (menu),
+ NULL,
+ NULL,
+ (GtkMenuPositionFunc) position_menu,
+ GTK_WIDGET (button),
+ 0,
+ gtk_get_current_event_time ());
+}
+
+static void
+cb_context_menu_detach (GtkWidget *button,
+ GtkMenu *menu)
+{
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
+ gtk_widget_destroy (GTK_WIDGET (menu));
+}
+
+static void
+position_menu (GtkMenu *menu,
+ gint *x,
+ gint *y,
+ gboolean *push_in,
+ GtkWidget *widget)
+{
+ GtkRequisition menu_req;
+ gint root_x;
+ gint root_y;
+
+ gtk_widget_size_request (GTK_WIDGET (menu), &menu_req);
+ gdk_window_get_origin (widget->window, &root_x, &root_y);
+
+ *x = root_x + widget->allocation.x;
+ *y = root_y + widget->allocation.y + widget->style->ythickness;
+
+ if (*y > gdk_screen_height () - menu_req.height)
+ *y = gdk_screen_height () - menu_req.height;
+}
+
More information about the Goodies-commits
mailing list