XSettingsResult
xsettings_manager_set_setting (XSettingsManager *manager,
			       XSettingsSetting *setting)
{
  XSettingsSetting *old_setting = xsettings_list_lookup (settings, setting->name);
  XSettingsSetting *new_setting;
  XSettingsResult result;

  if (old_setting)
    {
      if (xsettings_setting_equal (old_setting, setting))
	return XSETTINGS_SUCCESS;

      xsettings_list_delete (&settings, setting->name);
    }

  new_setting = xsettings_setting_copy (setting);
  if (!new_setting)
    return XSETTINGS_NO_MEM;
  
  new_setting->last_change_serial = manager->serial;
  
  result = xsettings_list_insert (&settings, new_setting);
  
  if (result != XSETTINGS_SUCCESS)
    xsettings_setting_free (new_setting);

  return result;
}
Exemplo n.º 2
0
static gboolean
gdk_x11_screen_get_setting (GdkScreen   *screen,
			    const gchar *name,
			    GValue      *value)
{

  const char *xsettings_name = NULL;
  XSettingsResult result;
  XSettingsSetting *setting = NULL;
  GdkX11Screen *x11_screen;
  gboolean success = FALSE;
  gint i;
  GValue tmp_val = { 0, };

  g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE);

  x11_screen = GDK_X11_SCREEN (screen);

  for (i = 0; i < GDK_SETTINGS_N_ELEMENTS(); i++)
    if (strcmp (GDK_SETTINGS_GDK_NAME (i), name) == 0)
      {
	xsettings_name = GDK_SETTINGS_X_NAME (i);
	break;
      }

  if (!xsettings_name)
    goto out;

  result = xsettings_client_get_setting (x11_screen->xsettings_client,
					 xsettings_name, &setting);
  if (result != XSETTINGS_SUCCESS)
    goto out;

  switch (setting->type)
    {
    case XSETTINGS_TYPE_INT:
      if (check_transform (xsettings_name, G_TYPE_INT, G_VALUE_TYPE (value)))
	{
	  g_value_init (&tmp_val, G_TYPE_INT);
	  g_value_set_int (&tmp_val, setting->data.v_int);
	  g_value_transform (&tmp_val, value);

	  success = TRUE;
	}
      break;
    case XSETTINGS_TYPE_STRING:
      if (check_transform (xsettings_name, G_TYPE_STRING, G_VALUE_TYPE (value)))
	{
	  g_value_init (&tmp_val, G_TYPE_STRING);
	  g_value_set_string (&tmp_val, setting->data.v_string);
	  g_value_transform (&tmp_val, value);

	  success = TRUE;
	}
      break;
    case XSETTINGS_TYPE_COLOR:
      if (!check_transform (xsettings_name, GDK_TYPE_COLOR, G_VALUE_TYPE (value)))
	{
	  GdkColor color;

	  g_value_init (&tmp_val, GDK_TYPE_COLOR);

	  color.pixel = 0;
	  color.red = setting->data.v_color.red;
	  color.green = setting->data.v_color.green;
	  color.blue = setting->data.v_color.blue;

	  g_value_set_boxed (&tmp_val, &color);

	  g_value_transform (&tmp_val, value);

	  success = TRUE;
	}
      break;
    }

  g_value_unset (&tmp_val);

 out:
  if (setting)
    xsettings_setting_free (setting);

  if (success)
    return TRUE;
  else
    return _gdk_x11_get_xft_setting (screen, name, value);
}