gnome-session/gnome-session-gnome.fallback-boot-arg.patch

103 lines
3.0 KiB
Diff
Raw Normal View History

commit 2613036679b7691c93f5bbd1e15379d80fbb9bf6
Author: Vincent Untz <vuntz@gnome.org>
Date: Wed Oct 19 13:14:50 2011 +0200
tools: Look at gnome.fallback argument in kernel boot line
This is a quick way to let users easily force the fallback (or
non-fallback mode) with gnome.fallback=0/1 on boot.
diff --git a/tools/gnome-session-check-accelerated-helper.c b/tools/gnome-session-check-accelerated-helper.c
index 3f83f76..c1fbe9d 100644
--- a/tools/gnome-session-check-accelerated-helper.c
+++ b/tools/gnome-session-check-accelerated-helper.c
@@ -70,7 +70,9 @@
/* for strcasestr */
#define _GNU_SOURCE
+#include <ctype.h>
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#include <X11/Xlib.h>
@@ -87,6 +89,54 @@ _print_error (const char *str)
}
static int
+_parse_kcmdline (void)
+{
+ FILE *kcmdline;
+ char *line = NULL;
+ size_t line_len = 0;
+ int ret = -1;
+
+ kcmdline = fopen("/proc/cmdline", "r");
+ if (kcmdline == NULL)
+ return ret;
+
+ while (getline (&line, &line_len, kcmdline) != -1) {
+ const char *arg;
+ const char *str;
+ int key_len = strlen ("gnome.fallback=");
+
+ if (line == NULL)
+ break;
+
+ /* don't break if we found the argument once: last mention wins */
+
+ str = line;
+ do {
+ arg = strstr (str, "gnome.fallback=");
+ str = arg + key_len;
+
+ if (arg &&
+ (arg == line || isspace (arg[-1])) && /* gnome.fallback= is really the beginning of an argument */
+ (isdigit (arg[key_len]))) { /* the first character of the value of this argument is an integer */
+ if ((arg[key_len+1] == '\0' || isspace (arg[key_len+1]))) /* the value of this argument is only one character long */
+ ret = arg[key_len] - '0';
+ else /* invalid value */
+ ret = 0xDEAD;
+
+ }
+ } while (arg != NULL);
+
+ free (line);
+ line = NULL;
+ line_len = 0;
+ }
+
+ fclose (kcmdline);
+
+ return ret;
+}
+
+static int
_has_composite (Display *display)
{
int dummy1, dummy2;
@@ -257,9 +307,23 @@ _is_max_texture_size_big_enough (Display *display)
int
main (int argc, char **argv)
{
+ int kcmdline_parsed;
Display *display = NULL;
int ret = 1;
+ kcmdline_parsed = _parse_kcmdline ();
+ if (kcmdline_parsed >= 0) {
+ if (kcmdline_parsed == 0) {
+ _print_error ("Non-fallback mode forced by kernel command line.");
+ ret = 0;
+ goto out;
+ } else if (kcmdline_parsed == 1) {
+ _print_error ("Fallback mode forced by kernel command line.");
+ goto out;
+ } else
+ _print_error ("Invalid value for gnome.fallback passed in kernel command line.");
+ }
+
display = XOpenDisplay (NULL);
if (!display) {
_print_error ("No X display.");