~ci-train-bot/unity/unity-ubuntu-disco-3336

« back to all changes in this revision

Viewing changes to tools/compiz_config_profile_setter.c

  • Committer: Bileto Bot
  • Author(s): Marco Trevisan (Treviño)
  • Date: 2017-04-25 17:58:05 UTC
  • mfrom: (4213.4.24 lowgfx-profile-setter)
  • Revision ID: ci-train-bot@canonical.com-20170425175805-gbceanvts5r3id6o
compiz-profile-setter: tool to update the current profile and use in systemd and Unity settings

Added a compiz-profile-setter tool that allows to change compiz profile, so we use
this to set the right profile when starting unity and when the gsettings key has changed.

So we can just toggle lowgfx profile on the fly by just doing
  gsettings set com.canonical.Unity lowgfx true|false (LP: #1668950)

Approved by: Andrea Azzarone

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) 2017 Canonical Ltd
 
3
 *
 
4
 * This program is free software: you can redistribute it and/or modify
 
5
 * it under the terms of the GNU General Public License version 3 as
 
6
 * published by the Free Software Foundation.
 
7
 *
 
8
 * This program is distributed in the hope that it will be useful,
 
9
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
 * GNU General Public License for more details.
 
12
 *
 
13
 * You should have received a copy of the GNU General Public License
 
14
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
15
 *
 
16
 * Authored by: Marco Trevisan <marco.trevisan@canonical.com>
 
17
 */
 
18
 
 
19
#include <ccs.h>
 
20
#include <gio/gio.h>
 
21
 
 
22
#define COMPIZ_CONFIG_PROFILE_ENV "COMPIZ_CONFIG_PROFILE"
 
23
#define COMPIZ_CONFIG_DEFAULT_PROFILE "ubuntu"
 
24
 
 
25
extern const CCSInterfaceTable ccsDefaultInterfaceTable;
 
26
 
 
27
static gchar *
 
28
get_ccs_profile_env_from_env_list (const gchar **env_vars)
 
29
{
 
30
  gchar *var = NULL;
 
31
 
 
32
  for (; env_vars && *env_vars; ++env_vars)
 
33
    {
 
34
      if (g_str_has_prefix (*env_vars, COMPIZ_CONFIG_PROFILE_ENV "="))
 
35
        {
 
36
          var = g_strdup (*env_vars + G_N_ELEMENTS (COMPIZ_CONFIG_PROFILE_ENV));
 
37
          break;
 
38
        }
 
39
    }
 
40
 
 
41
  return var;
 
42
}
 
43
 
 
44
static gchar *
 
45
get_ccs_profile_env_from_session_manager ()
 
46
{
 
47
  GDBusConnection *bus;
 
48
  GVariant *environment_prop, *environment_prop_list;
 
49
  const gchar **env_vars;
 
50
  gchar *profile;
 
51
 
 
52
  profile = NULL;
 
53
  bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL);
 
54
 
 
55
  environment_prop = g_dbus_connection_call_sync (bus,
 
56
                                                  "org.freedesktop.systemd1",
 
57
                                                  "/org/freedesktop/systemd1",
 
58
                                                  "org.freedesktop.DBus.Properties",
 
59
                                                  "Get",
 
60
                                                  g_variant_new ("(ss)",
 
61
                                                                  "org.freedesktop.systemd1.Manager",
 
62
                                                                  "Environment"),
 
63
                                                  G_VARIANT_TYPE ("(v)"),
 
64
                                                  G_DBUS_CALL_FLAGS_NONE,
 
65
                                                  -1,
 
66
                                                  NULL,
 
67
                                                  NULL);
 
68
 
 
69
  if (!environment_prop)
 
70
    goto out;
 
71
 
 
72
  g_variant_get (environment_prop, "(v)", &environment_prop_list, NULL);
 
73
  env_vars = g_variant_get_strv (environment_prop_list, NULL);
 
74
  profile = get_ccs_profile_env_from_env_list (env_vars);
 
75
 
 
76
  g_clear_pointer (&environment_prop, g_variant_unref);
 
77
  g_clear_pointer (&environment_prop_list, g_variant_unref);
 
78
 
 
79
  if (!profile && g_getenv ("UPSTART_SESSION"))
 
80
    {
 
81
      const gchar * const * empty_array[] = {0};
 
82
      environment_prop_list = g_dbus_connection_call_sync (bus,
 
83
                                                           "com.ubuntu.Upstart",
 
84
                                                           "/com/ubuntu/Upstart",
 
85
                                                           "com.ubuntu.Upstart0_6",
 
86
                                                           "ListEnv",
 
87
                                                           g_variant_new("(@as)",
 
88
                                                             g_variant_new_strv (NULL, 0)),
 
89
                                                           NULL,
 
90
                                                           G_DBUS_CALL_FLAGS_NONE,
 
91
                                                           -1,
 
92
                                                           NULL,
 
93
                                                           NULL);
 
94
      if (!environment_prop_list)
 
95
        goto out;
 
96
 
 
97
      g_variant_get (environment_prop_list, "(^a&s)", &env_vars);
 
98
      profile = get_ccs_profile_env_from_env_list (env_vars);
 
99
 
 
100
      g_variant_unref (environment_prop_list);
 
101
    }
 
102
 
 
103
out:
 
104
  g_object_unref (bus);
 
105
 
 
106
  return profile;
 
107
}
 
108
 
 
109
static gboolean
 
110
is_compiz_profile_available (const gchar *profile)
 
111
{
 
112
  gboolean is_available;
 
113
  gchar *profile_path;
 
114
 
 
115
  profile_path = g_strdup_printf ("%s/compiz-1/compizconfig/%s.ini",
 
116
                                  g_get_user_config_dir (), profile);
 
117
  is_available = g_file_test (profile_path, G_FILE_TEST_EXISTS);
 
118
  g_free (profile_path);
 
119
 
 
120
  if (!is_available)
 
121
    {
 
122
      profile_path = g_strdup_printf ("/etc/compizconfig/%s.ini", profile);
 
123
      is_available = g_file_test (profile_path, G_FILE_TEST_EXISTS);
 
124
      g_free (profile_path);
 
125
    }
 
126
 
 
127
  return is_available;
 
128
}
 
129
 
 
130
static gboolean
 
131
set_compiz_profile (CCSContext *ccs_context, const gchar *profile_name)
 
132
{
 
133
  CCSPluginList plugins;
 
134
  const char *ccs_backend;
 
135
 
 
136
  ccs_backend = ccsGetBackend (ccs_context);
 
137
 
 
138
  ccsSetProfile (ccs_context, profile_name);
 
139
  ccsReadSettings (ccs_context);
 
140
  ccsWriteSettings (ccs_context);
 
141
 
 
142
  if (g_strcmp0 (ccs_backend, "gsettings") == 0)
 
143
    g_settings_sync ();
 
144
 
 
145
  plugins = ccsContextGetPlugins (ccs_context);
 
146
 
 
147
  for (CCSPluginList p = plugins; p; p = p->next)
 
148
    {
 
149
      CCSPlugin* plugin = p->data;
 
150
      ccsReadPluginSettings (plugin);
 
151
    }
 
152
 
 
153
  return TRUE;
 
154
}
 
155
 
 
156
int main(int argc, char *argv[])
 
157
{
 
158
  CCSContext *context;
 
159
  const gchar *profile, *current_profile, *ccs_profile_env;
 
160
  gchar *session_manager_ccs_profile;
 
161
 
 
162
  if (argc < 2)
 
163
    {
 
164
      g_warning ("You need to pass a valid profile as argument\n");
 
165
      return 1;
 
166
    }
 
167
 
 
168
  session_manager_ccs_profile = get_ccs_profile_env_from_session_manager ();
 
169
 
 
170
  if (session_manager_ccs_profile)
 
171
    {
 
172
      g_setenv (COMPIZ_CONFIG_PROFILE_ENV, session_manager_ccs_profile, TRUE);
 
173
      g_clear_pointer (&session_manager_ccs_profile, g_free);
 
174
    }
 
175
  else
 
176
    {
 
177
      ccs_profile_env = g_getenv (COMPIZ_CONFIG_PROFILE_ENV);
 
178
 
 
179
      if (!ccs_profile_env || ccs_profile_env[0] == '\0')
 
180
        {
 
181
          g_setenv (COMPIZ_CONFIG_PROFILE_ENV, COMPIZ_CONFIG_DEFAULT_PROFILE, TRUE);
 
182
        }
 
183
    }
 
184
 
 
185
  profile = argv[1];
 
186
 
 
187
  if (!is_compiz_profile_available (profile))
 
188
    {
 
189
      g_warning ("Compiz profile '%s' not found", profile);
 
190
      return 1;
 
191
    }
 
192
 
 
193
  context = ccsContextNew (0, &ccsDefaultInterfaceTable);
 
194
 
 
195
  if (!context)
 
196
    {
 
197
      g_warning ("Impossible to get Compiz config context\n");
 
198
      return -1;
 
199
    }
 
200
 
 
201
  g_debug ("Setting profile to '%s' (for environment '%s')",
 
202
           profile, g_getenv (COMPIZ_CONFIG_PROFILE_ENV));
 
203
 
 
204
  current_profile = ccsGetProfile (context);
 
205
 
 
206
  if (g_strcmp0 (current_profile, profile) == 0)
 
207
    {
 
208
      g_print("We're already using profile '%s', no need to switch\n", profile);
 
209
      return 0;
 
210
    }
 
211
 
 
212
  if (!set_compiz_profile (context, profile))
 
213
    {
 
214
      ccsFreeContext (context);
 
215
      return 1;
 
216
    }
 
217
 
 
218
  ccsFreeContext (context);
 
219
 
 
220
  g_print ("Switched to profile '%s' (for environment '%s')\n",
 
221
           profile, g_getenv (COMPIZ_CONFIG_PROFILE_ENV));
 
222
 
 
223
  /* This is for printing debug informations */
 
224
  context = ccsContextNew (0, &ccsDefaultInterfaceTable);
 
225
  ccsFreeContext (context);
 
226
 
 
227
  return 0;
 
228
}