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;
}
Esempio n. 2
0
/**
 * 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);
    }
  }
}
Esempio n. 5
0
/**
 * 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;
}
Esempio n. 6
0
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;
}