summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRui Matos <tiagomatos@gmail.com>2015-05-04 18:02:37 +0200
committerRui Matos <tiagomatos@gmail.com>2015-05-12 14:55:22 +0200
commitd1329f99524ac6c7172141d6dba026a77f3ae0f7 (patch)
tree2d878b2f31c08e467ff65ec16cff5b42f12c8d9d
parentfdf5d2eefb548be79e5fbef45a4df139c64c7a58 (diff)
downloadgnome-settings-daemon-d1329f99524ac6c7172141d6dba026a77f3ae0f7.tar.gz
power: Refactor the backlight helper spawning
We'll need to change the environment that we pass on to the helper and this will make it easier. https://bugzilla.gnome.org/show_bug.cgi?id=748804
-rw-r--r--plugins/power/gpm-common.c120
1 files changed, 64 insertions, 56 deletions
diff --git a/plugins/power/gpm-common.c b/plugins/power/gpm-common.c
index e03738a5..f8a2da5b 100644
--- a/plugins/power/gpm-common.c
+++ b/plugins/power/gpm-common.c
@@ -45,6 +45,12 @@
#define UPS_SOUND_LOOP_ID 99
#define GSD_POWER_MANAGER_CRITICAL_ALERT_TIMEOUT 5 /* seconds */
+enum BacklightHelperCommand {
+ BACKLIGHT_HELPER_GET,
+ BACKLIGHT_HELPER_GET_MAX,
+ BACKLIGHT_HELPER_SET
+};
+
/* take a discrete value with offset and convert to percentage */
int
gsd_power_backlight_abs_to_percentage (int min, int max, int value)
@@ -339,17 +345,17 @@ backlight_set_mock_value (gint value)
}
static gint64
-backlight_get_mock_value (const char *argument)
+backlight_get_mock_value (enum BacklightHelperCommand command)
{
char *contents;
gint64 ret;
- if (g_str_equal (argument, "get-max-brightness")) {
+ if (command == BACKLIGHT_HELPER_GET_MAX) {
g_debug ("Returning max mock brightness: %d", GSD_MOCK_MAX_BRIGHTNESS);
return GSD_MOCK_MAX_BRIGHTNESS;
}
- g_assert (g_str_equal (argument, "get-brightness"));
+ g_assert (command == BACKLIGHT_HELPER_GET);
if (g_file_get_contents ("GSD_MOCK_brightness", &contents, NULL, NULL)) {
ret = g_ascii_strtoll (contents, NULL, 0);
@@ -386,6 +392,37 @@ backlight_available (GnomeRRScreen *rr_screen)
return TRUE;
}
+static gboolean
+run_backlight_helper (enum BacklightHelperCommand command,
+ gchar *value,
+ gchar **stdout_data,
+ gint *exit_status,
+ GError **error)
+{
+ static gchar *helper_args[] = {
+ "--get-brightness",
+ "--get-max-brightness",
+ "--set-brightness",
+ };
+ gchar *argv[5] = { 0 };
+
+ argv[0] = "pkexec";
+ argv[1] = LIBEXECDIR "/gsd-backlight-helper";
+ argv[2] = helper_args[command];
+ argv[3] = value;
+
+ return g_spawn_sync (NULL,
+ command == BACKLIGHT_HELPER_SET ? argv : &argv[1],
+ NULL,
+ G_SPAWN_SEARCH_PATH,
+ NULL,
+ NULL,
+ stdout_data,
+ NULL,
+ exit_status,
+ error);
+}
+
/**
* backlight_helper_get_value:
*
@@ -395,17 +432,16 @@ backlight_available (GnomeRRScreen *rr_screen)
* for failure. If -1 then @error is set.
**/
static gint64
-backlight_helper_get_value (const gchar *argument, GError **error)
+backlight_helper_get_value (enum BacklightHelperCommand command, GError **error)
{
gboolean ret;
gchar *stdout_data = NULL;
gint exit_status = 0;
gint64 value = -1;
- gchar *command = NULL;
gchar *endptr = NULL;
#ifdef GSD_MOCK
- return backlight_get_mock_value (argument);
+ return backlight_get_mock_value (command);
#endif
#ifndef __linux__
@@ -418,15 +454,8 @@ backlight_helper_get_value (const gchar *argument, GError **error)
#endif
/* get the data */
- command = g_strdup_printf (LIBEXECDIR "/gsd-backlight-helper --%s",
- argument);
- ret = g_spawn_command_line_sync (command,
- &stdout_data,
- NULL,
- &exit_status,
- error);
- g_debug ("executed %s retval: %i", command, exit_status);
-
+ ret = run_backlight_helper (command, NULL,
+ &stdout_data, &exit_status, error);
if (!ret)
goto out;
@@ -475,7 +504,6 @@ backlight_helper_get_value (const gchar *argument, GError **error)
}
out:
- g_free (command);
g_free (stdout_data);
return value;
}
@@ -488,13 +516,12 @@ out:
* Return value: Success. If FALSE then @error is set.
**/
static gboolean
-backlight_helper_set_value (const gchar *argument,
- gint value,
+backlight_helper_set_value (gint value,
GError **error)
{
gboolean ret = FALSE;
gint exit_status = 0;
- gchar *command = NULL;
+ gchar *vstr = NULL;
#ifdef GSD_MOCK
backlight_set_mock_value (value);
@@ -507,25 +534,14 @@ backlight_helper_set_value (const gchar *argument,
GSD_POWER_MANAGER_ERROR,
GSD_POWER_MANAGER_ERROR_FAILED,
"The sysfs backlight helper is only for Linux");
- goto out;
+ return FALSE;
#endif
/* get the data */
- command = g_strdup_printf ("pkexec " LIBEXECDIR "/gsd-backlight-helper --%s %i",
- argument, value);
- ret = g_spawn_command_line_sync (command,
- NULL,
- NULL,
- &exit_status,
- error);
-
- g_debug ("executed %s retval: %i", command, exit_status);
-
- if (!ret || WEXITSTATUS (exit_status) != 0)
- goto out;
-
-out:
- g_free (command);
+ vstr = g_strdup_printf ("%i", value);
+ ret = run_backlight_helper (BACKLIGHT_HELPER_SET, vstr,
+ NULL, &exit_status, error);
+ g_free (vstr);
return ret;
}
@@ -562,7 +578,7 @@ backlight_get_abs (GnomeRRScreen *rr_screen, GError **error)
}
return -1;
#else
- return backlight_helper_get_value ("get-brightness", error);
+ return backlight_helper_get_value (BACKLIGHT_HELPER_GET, error);
#endif
}
@@ -583,10 +599,10 @@ backlight_get_percentage (GnomeRRScreen *rr_screen, GError **error)
}
return value;
#else
- max = backlight_helper_get_value ("get-max-brightness", error);
+ max = backlight_helper_get_value (BACKLIGHT_HELPER_GET_MAX, error);
if (max < 0)
return value;
- now = backlight_helper_get_value ("get-brightness", error);
+ now = backlight_helper_get_value (BACKLIGHT_HELPER_GET, error);
if (now < 0)
return value;
value = ABS_TO_PERCENTAGE (0, max, now);
@@ -606,7 +622,7 @@ backlight_get_max (GnomeRRScreen *rr_screen, GError **error)
#ifndef __linux__
return 100;
#else
- return backlight_helper_get_value ("get-max-brightness", error);
+ return backlight_helper_get_value (BACKLIGHT_HELPER_GET_MAX, error);
#endif
}
@@ -629,13 +645,11 @@ backlight_set_percentage (GnomeRRScreen *rr_screen,
}
return ret;
#else
- max = backlight_helper_get_value ("get-max-brightness", error);
+ max = backlight_helper_get_value (BACKLIGHT_HELPER_GET_MAX, error);
if (max < 0)
return ret;
discrete = PERCENTAGE_TO_ABS (0, max, *value);
- ret = backlight_helper_set_value ("set-brightness",
- discrete,
- error);
+ ret = backlight_helper_set_value (discrete, error);
if (ret)
*value = ABS_TO_PERCENTAGE (0, max, discrete);
@@ -681,17 +695,15 @@ backlight_step_up (GnomeRRScreen *rr_screen, GError **error)
}
return percentage_value;
#else
- now = backlight_helper_get_value ("get-brightness", error);
+ now = backlight_helper_get_value (BACKLIGHT_HELPER_GET, error);
if (now < 0)
return percentage_value;
- max = backlight_helper_get_value ("get-max-brightness", error);
+ max = backlight_helper_get_value (BACKLIGHT_HELPER_GET_MAX, error);
if (max < 0)
return percentage_value;
step = BRIGHTNESS_STEP_AMOUNT (max + 1);
discrete = MIN (now + step, max);
- ret = backlight_helper_set_value ("set-brightness",
- discrete,
- error);
+ ret = backlight_helper_set_value (discrete, error);
if (ret)
percentage_value = ABS_TO_PERCENTAGE (0, max, discrete);
@@ -737,17 +749,15 @@ backlight_step_down (GnomeRRScreen *rr_screen, GError **error)
}
return percentage_value;
#else
- now = backlight_helper_get_value ("get-brightness", error);
+ now = backlight_helper_get_value (BACKLIGHT_HELPER_GET, error);
if (now < 0)
return percentage_value;
- max = backlight_helper_get_value ("get-max-brightness", error);
+ max = backlight_helper_get_value (BACKLIGHT_HELPER_GET_MAX, error);
if (max < 0)
return percentage_value;
step = BRIGHTNESS_STEP_AMOUNT (max + 1);
discrete = MAX (now - step, 0);
- ret = backlight_helper_set_value ("set-brightness",
- discrete,
- error);
+ ret = backlight_helper_set_value (discrete, error);
if (ret)
percentage_value = ABS_TO_PERCENTAGE (0, max, discrete);
@@ -768,9 +778,7 @@ backlight_set_abs (GnomeRRScreen *rr_screen,
return gnome_rr_output_set_backlight (output, value, error);
return ret;
#else
- ret = backlight_helper_set_value ("set-brightness",
- value,
- error);
+ ret = backlight_helper_set_value (value, error);
return ret;
#endif