gdouble volume_widget_get_current_volume ( GtkWidget *widget ) { VolumeWidget* mitem = VOLUME_WIDGET(widget); VolumeWidgetPrivate * priv = VOLUME_WIDGET_GET_PRIVATE(mitem); gdouble vol = g_variant_get_double( dbusmenu_menuitem_property_get_variant( priv->twin_item, DBUSMENU_VOLUME_MENUITEM_LEVEL)); return vol; }
/** * dbusmenu_menuitem_property_get_shortcut: * @menuitem: The #DbusmenuMenuitem to get the shortcut off * @key: (out): Location to put the key value * @modifier: (out): Location to put the modifier mask * * This function gets a GTK shortcut as a key and a mask * for use to set the accelerators. */ void dbusmenu_menuitem_property_get_shortcut (DbusmenuMenuitem * menuitem, guint * key, GdkModifierType * modifier) { guint dummykey; GdkModifierType dummymodifier; if (key == NULL) { key = &dummykey; } if (modifier == NULL) { modifier = &dummymodifier; } *key = 0; *modifier = 0; g_return_if_fail(DBUSMENU_IS_MENUITEM(menuitem)); GVariant * wrapper = dbusmenu_menuitem_property_get_variant(menuitem, DBUSMENU_MENUITEM_PROP_SHORTCUT); if (wrapper == NULL) { return; } if (g_variant_n_children(wrapper) != 1) { g_warning("Unable to parse shortcut, too many keys"); return; } GVariantIter iter; GVariant * child = g_variant_get_child_value(wrapper, 0); g_variant_iter_init(&iter, child); gchar * string; while(g_variant_iter_loop(&iter, "s", &string)) { if (g_strcmp0(string, DBUSMENU_MENUITEM_SHORTCUT_CONTROL) == 0) { *modifier |= GDK_CONTROL_MASK; } else if (g_strcmp0(string, DBUSMENU_MENUITEM_SHORTCUT_ALT) == 0) { *modifier |= GDK_MOD1_MASK; } else if (g_strcmp0(string, DBUSMENU_MENUITEM_SHORTCUT_SHIFT) == 0) { *modifier |= GDK_SHIFT_MASK; } else if (g_strcmp0(string, DBUSMENU_MENUITEM_SHORTCUT_SUPER) == 0) { *modifier |= GDK_SUPER_MASK; } else { GdkModifierType tempmod; gtk_accelerator_parse(string, key, &tempmod); } } g_variant_unref(child); return; }
static void volume_widget_set_twin_item(VolumeWidget* self, DbusmenuMenuitem* twin_item) { VolumeWidgetPrivate * priv = VOLUME_WIDGET_GET_PRIVATE(self); priv->twin_item = twin_item; g_object_ref(priv->twin_item); g_signal_connect(G_OBJECT(twin_item), "property-changed", G_CALLBACK(volume_widget_property_update), self); gdouble initial_level = g_variant_get_double (dbusmenu_menuitem_property_get_variant(twin_item, DBUSMENU_VOLUME_MENUITEM_LEVEL)); gboolean initial_mute = g_variant_get_boolean (dbusmenu_menuitem_property_get_variant(twin_item, DBUSMENU_VOLUME_MENUITEM_MUTE)); //g_debug("volume_widget_set_twin_item initial level = %f", initial_level); GtkWidget *slider = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)priv->ido_volume_slider); GtkRange *range = (GtkRange*)slider; if(initial_mute == TRUE){ initial_level = 0; } gtk_range_set_value(range, initial_level); }
static void volume_widget_property_update( DbusmenuMenuitem* item, gchar* property, GVariant* value, gpointer userdata) { g_return_if_fail (IS_VOLUME_WIDGET(userdata)); VolumeWidget* mitem = VOLUME_WIDGET(userdata); VolumeWidgetPrivate * priv = VOLUME_WIDGET_GET_PRIVATE(mitem); if(g_ascii_strcasecmp(DBUSMENU_VOLUME_MENUITEM_LEVEL, property) == 0){ g_return_if_fail (g_variant_is_of_type (value, G_VARIANT_TYPE_DOUBLE) ); if(priv->grabbed == FALSE){ GtkWidget *slider = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)priv->ido_volume_slider); GtkRange *range = (GtkRange*)slider; gdouble update = g_variant_get_double (value); gtk_range_set_value(range, update); /* g_debug ("volume-widget::volume_widget_property_update - volume - value %f", update); */ update_accessible_desc(update/**priv->indicator*/); } } else if(g_ascii_strcasecmp(DBUSMENU_VOLUME_MENUITEM_MUTE, property) == 0){ g_return_if_fail (g_variant_is_of_type (value, G_VARIANT_TYPE_BOOLEAN)); if(priv->grabbed == FALSE){ GtkWidget *slider = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)priv->ido_volume_slider); GtkRange *range = (GtkRange*)slider; gboolean update = g_variant_get_boolean (value); gdouble level; if (update == TRUE){ level = 0; } else{ GVariant* variant = dbusmenu_menuitem_property_get_variant (priv->twin_item, DBUSMENU_VOLUME_MENUITEM_LEVEL); /* g_debug ("variant for the volume - is it null = %i", variant == NULL); */ g_return_if_fail (g_variant_is_of_type (variant, G_VARIANT_TYPE_DOUBLE) ); level = g_variant_get_double (variant); } /* g_debug ("volume-widget::volume_widget_property_update - mute - value %i and level = %f", update, level); */ gtk_range_set_value(range, level); } } }
/** * mute_widget_new: * @returns: a new #MuteWidget. **/ MuteWidget * mute_widget_new (DbusmenuMenuitem *item) { MuteWidget* widget = g_object_new(MUTE_WIDGET_TYPE, NULL); MuteWidgetPrivate* priv = MUTE_WIDGET_GET_PRIVATE(widget); priv->item = g_object_ref(item); GVariant *label = dbusmenu_menuitem_property_get_variant(priv->item, DBUSMENU_MENUITEM_PROP_LABEL); if (g_variant_is_of_type(label, G_VARIANT_TYPE_STRING)) gtk_menu_item_set_label(priv->gitem, g_variant_get_string(label, NULL)); return widget; }
MuteStatus mute_widget_get_status (MuteWidget *self) { g_return_val_if_fail(self, MUTE_STATUS_UNAVAILABLE); MuteStatus status = MUTE_STATUS_UNAVAILABLE; MuteWidgetPrivate *priv = MUTE_WIDGET_GET_PRIVATE(self); GVariant *vstatus = dbusmenu_menuitem_property_get_variant(priv->item, DBUSMENU_MUTE_MENUITEM_VALUE); if (g_variant_is_of_type (vstatus, G_VARIANT_TYPE_BOOLEAN)) { if (g_variant_get_boolean (vstatus)) status = MUTE_STATUS_MUTED; else status = MUTE_STATUS_UNMUTED; } return status; }
/* We only want this callback to catch mouse icon press events which set the slider to 0 or 100. Ignore all other events. */ static gboolean volume_widget_value_changed_cb (GtkRange *range, gpointer user_data) { g_return_val_if_fail (IS_VOLUME_WIDGET (user_data), FALSE); VolumeWidget* mitem = VOLUME_WIDGET (user_data); VolumeWidgetPrivate * priv = VOLUME_WIDGET_GET_PRIVATE(mitem); GtkWidget *slider = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)priv->ido_volume_slider); gdouble current_value = CLAMP(gtk_range_get_value(GTK_RANGE(slider)), 0, 100); gboolean mute = g_variant_get_boolean (dbusmenu_menuitem_property_get_variant (priv->twin_item, DBUSMENU_VOLUME_MENUITEM_MUTE)); if((current_value == 0 && mute == FALSE) || current_value == 100){ /* g_debug ("value changed - actual set %f", current_value); */ volume_widget_update (mitem, current_value, "value-changed"); } return FALSE; }