<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    On 12-01-29 09:02 AM, Jon Lund Steffensen wrote:
    <blockquote
cite="mid:CAJgnOwsA9xnMwofnrDv15TOrSGNQvFyewKCUVbEZL_GjnC8M3A@mail.gmail.com"
      type="cite">
      <pre wrap="">I've ported xbacklight to XCB; patch below. I'm posting it here in
case anyone is interested.
Cheers,
Jon

---
 configure.ac |    2 +-
 xbacklight.c |  272 +++++++++++++++++++++++++++++++++++-----------------------
 2 files changed, 165 insertions(+), 109 deletions(-)

diff --git a/configure.ac b/configure.ac
index 2c67604..87c7b26 100644
--- a/configure.ac
+++ b/configure.ac
@@ -37,7 +37,7 @@ XORG_DEFAULT_OPTIONS
 AC_CONFIG_HEADERS([config.h])

 # Checks for pkg-config packages
-PKG_CHECK_MODULES(XRANDR, xrandr &gt;= 1.2.0 x11)
+PKG_CHECK_MODULES(XRANDR, [xcb-randr &gt;= 1.2 xcb-atom xcb-aux xcb])</pre>
    </blockquote>
    I recall seeing an app ported to xcb which still needed xproto for
    some header file. You can confirm by running 'make uninstall' on
    x11proto and libX11 just to be sure. <br>
    <br>
    I don't see an xcb-atom or an xcb-aux pc file in libxcb<br>
    <blockquote><tt><a class="moz-txt-link-freetext" href="http://cgit.freedesktop.org/xcb/libxcb/tree/">http://cgit.freedesktop.org/xcb/libxcb/tree/</a></tt><br>
    </blockquote>
    Am I looking at the wrong place?<br>
    Consider providing the git url for the new dependencies in the
    commit text as it was not obvious to find.<br>
    <br>
    You may also want to check if the tinderbox build box has those in
    the jhbuild build script.<br>
    <blockquote
cite="mid:CAJgnOwsA9xnMwofnrDv15TOrSGNQvFyewKCUVbEZL_GjnC8M3A@mail.gmail.com"
      type="cite">
      <pre wrap="">

 AC_CONFIG_FILES([
         Makefile
diff --git a/xbacklight.c b/xbacklight.c
index 9b68ce8..942fa3f 100644
--- a/xbacklight.c
+++ b/xbacklight.c
@@ -21,9 +21,11 @@
  */
 #include &lt;stdio.h&gt;
 #include &lt;stdlib.h&gt;
-#include &lt;X11/Xatom.h&gt;
-#include &lt;X11/Xlib.h&gt;
-#include &lt;X11/extensions/Xrandr.h&gt;
+
+#include &lt;xcb/xcb.h&gt;
+#include &lt;xcb/xcb_util.h&gt;
+#include &lt;xcb/xproto.h&gt;
+#include &lt;xcb/randr.h&gt;

 #include &lt;ctype.h&gt;
 #include &lt;string.h&gt;
@@ -33,7 +35,7 @@ typedef enum { Get, Set, Inc, Dec } op_t;

 static char *program_name;

-static Atom backlight, backlight_new, backlight_legacy;
+static xcb_atom_t backlight, backlight_new, backlight_legacy;

 static void
 usage (void)
@@ -53,58 +55,75 @@ usage (void)
 }

 static long
-backlight_get (Display *dpy, RROutput output)
+backlight_get (xcb_connection_t *conn, xcb_randr_output_t output)
 {
-    unsigned long   nitems;
-    unsigned long   bytes_after;
-    unsigned char   *prop;
-    Atom            actual_type;
-    int                    actual_format;
-    long            value;
-
+    xcb_generic_error_t *error;
+    xcb_randr_get_output_property_reply_t *prop_reply = NULL;
+    xcb_randr_get_output_property_cookie_t prop_cookie;
+    long value;
+
     backlight = backlight_new;
-    if (!backlight ||
-        XRRGetOutputProperty (dpy, output, backlight,
-                              0, 4, False, False, None,
-                              &amp;actual_type, &amp;actual_format,
-                              &amp;nitems, &amp;bytes_after, &amp;prop) != Success) {
-        backlight = backlight_legacy;
-        if (!backlight ||
-            XRRGetOutputProperty (dpy, output, backlight,
-                                  0, 4, False, False, None,
-                                  &amp;actual_type, &amp;actual_format,
-                                  &amp;nitems, &amp;bytes_after, &amp;prop) != Success)
-            return -1;
+    if (backlight != XCB_ATOM_NONE) {
+        prop_cookie = xcb_randr_get_output_property (conn, output,
+                                                     backlight, XCB_ATOM_NONE,
+                                                     0, 4, 0, 0);
+        prop_reply = xcb_randr_get_output_property_reply (conn,
prop_cookie, &amp;error);
+        if (error != NULL || prop_reply == NULL) {
+            backlight = backlight_legacy;
+            if (backlight != XCB_ATOM_NONE) {
+                prop_cookie = xcb_randr_get_output_property (conn, output,
+
backlight, XCB_ATOM_NONE,
+                                                             0, 4, 0, 0);
+                prop_reply = xcb_randr_get_output_property_reply
(conn, prop_cookie, &amp;error);
+                if (error != NULL || prop_reply == NULL) {
+                    return -1;
+                }
+            }
+        }
     }

-    if (actual_type != XA_INTEGER || nitems != 1 || actual_format != 32)
+    if (prop_reply == NULL ||
+        prop_reply-&gt;type != XCB_ATOM_INTEGER ||
+        prop_reply-&gt;num_items != 1 ||
+        prop_reply-&gt;format != 32) {
         value = -1;
-    else
-        value = *((long *) prop);
-    XFree (prop);
+    } else {
+        value = *((long *) xcb_randr_get_output_property_data (prop_reply));
+    }
+
+    free (prop_reply);
     return value;
 }

 static void
-backlight_set (Display *dpy, RROutput output, long value)
+backlight_set (xcb_connection_t *conn, xcb_randr_output_t output, long value)
 {
-    XRRChangeOutputProperty (dpy, output, backlight, XA_INTEGER, 32,
-                             PropModeReplace, (unsigned char *) &amp;value, 1);
+    xcb_randr_change_output_property (conn, output, backlight,
XCB_ATOM_INTEGER,
+                                      32, XCB_PROP_MODE_REPLACE,
+                                      1, (unsigned char *)&amp;value);
 }

 int
 main (int argc, char **argv)
 {
     char    *dpy_name = NULL;
-    Display *dpy;
-    int            screen;
-    int            major, minor;
     op_t    op = Get;
     int            value = 0;
     int            i;
     int            total_time = 200;        /* ms */
     int            steps = 20;

+    xcb_connection_t *conn;
+    xcb_generic_error_t *error;
+
+    xcb_randr_query_version_cookie_t ver_cookie;
+    xcb_randr_query_version_reply_t *ver_reply;
+
+    xcb_intern_atom_cookie_t backlight_cookie[2];
+    xcb_intern_atom_reply_t *backlight_reply;
+
+    xcb_screen_iterator_t iter;
+
     program_name = argv[0];

     for (i = 1; i &lt; argc; i++)
@@ -177,97 +196,134 @@ main (int argc, char **argv)
         }
         usage ();
     }
-    dpy = XOpenDisplay (dpy_name);
-    if (!dpy)
-    {
-        fprintf (stderr, "Cannot open display \"%s\"\n",
-                 XDisplayName (dpy_name));
-        exit (1);
+    conn = xcb_connect (dpy_name, NULL);
+    ver_cookie = xcb_randr_query_version (conn, 1, 2);
+    ver_reply = xcb_randr_query_version_reply (conn, ver_cookie, &amp;error);
+    if (error != NULL || ver_reply == NULL) {
+        int ec = error ? error-&gt;error_code : -1;
+        fprintf (stderr, "RANDR Query Version returned error %d\n", ec);
+        exit (1);
     }
-    if (!XRRQueryVersion (dpy, &amp;major, &amp;minor))
-    {
-        fprintf (stderr, "RandR extension missing\n");
-        exit (1);
+    if (ver_reply-&gt;major_version != 1 ||
+        ver_reply-&gt;minor_version &lt; 2) {
+        fprintf (stderr, "RandR version %d.%d too old\n",
+                 ver_reply-&gt;major_version, ver_reply-&gt;minor_version);
+        exit (1);
     }
-    if (major &lt; 1 || (major == 1 &amp;&amp; minor &lt; 2))
-    {
-        fprintf (stderr, "RandR version %d.%d too old\n", major, minor);
-        exit (1);
+    free (ver_reply);
+
+    backlight_cookie[0] = xcb_intern_atom (conn, 1,
strlen("Backlight"), "Backlight");
+    backlight_cookie[1] = xcb_intern_atom (conn, 1,
strlen("BACKLIGHT"), "BACKLIGHT");
+
+    backlight_reply = xcb_intern_atom_reply (conn,
backlight_cookie[0], &amp;error);
+    if (error != NULL || backlight_reply == NULL) {
+        int ec = error ? error-&gt;error_code : -1;
+        fprintf (stderr, "Intern Atom returned error %d\n", ec);
+        exit (1);
     }

-    backlight_new    = XInternAtom (dpy, "Backlight", True);
-    backlight_legacy = XInternAtom (dpy, "BACKLIGHT", True);
-    if (backlight_new == None &amp;&amp; backlight_legacy == None)
-    {
+    backlight_new = backlight_reply-&gt;atom;
+    free (backlight_reply);
+
+    backlight_reply = xcb_intern_atom_reply (conn,
backlight_cookie[1], &amp;error);
+    if (error != NULL || backlight_reply == NULL) {
+        int ec = error ? error-&gt;error_code : -1;
+        fprintf (stderr, "Intern Atom returned error %d\n", ec);
+        exit (1);
+    }
+
+    backlight_legacy = backlight_reply-&gt;atom;
+    free (backlight_reply);
+
+    if (backlight_new == XCB_NONE &amp;&amp; backlight_legacy == XCB_NONE) {
         fprintf (stderr, "No outputs have backlight property\n");
         exit (1);
     }
-    for (screen = 0; screen &lt; ScreenCount (dpy); screen++)
-    {
-        Window                    root = RootWindow (dpy, screen);
-        XRRScreenResources  *resources = XRRGetScreenResources (dpy, root);
-        int                    o;
-        
-        if (!resources) continue;
-        for (o = 0; o &lt; resources-&gt;noutput; o++)
+
+    iter = xcb_setup_roots_iterator (xcb_get_setup (conn));
+    while (iter.rem) {
+        xcb_screen_t *screen = iter.data;
+        xcb_window_t root = screen-&gt;root;
+        xcb_randr_output_t *outputs;
+
+        xcb_randr_get_screen_resources_cookie_t resources_cookie;
+        xcb_randr_get_screen_resources_reply_t *resources_reply;
+
+        resources_cookie = xcb_randr_get_screen_resources (conn, root);
+        resources_reply = xcb_randr_get_screen_resources_reply (conn,
resources_cookie, &amp;error);
+        if (error != NULL || resources_reply == NULL) {
+            int ec = error ? error-&gt;error_code : -1;
+            fprintf (stderr, "RANDR Get Screen Resources returned
error %d\n", ec);
+            continue;
+        }
+
+        outputs = xcb_randr_get_screen_resources_outputs (resources_reply);
+        for (int o = 0; o &lt; resources_reply-&gt;num_outputs; o++)
         {
-            RROutput        output = resources-&gt;outputs[o];
-            XRRPropertyInfo *info;
+            xcb_randr_output_t output = outputs[o];
             double            cur, new, step;
             double        min, max;
             double        set;

-            cur = backlight_get (dpy, output);
+            cur = backlight_get (conn, output);
             if (cur != -1)
             {
-                info = XRRQueryOutputProperty (dpy, output, backlight);
-                if (info)
-                {
-                    if (info-&gt;range &amp;&amp; info-&gt;num_values == 2)
-                    {
-                        min = info-&gt;values[0];
-                        max = info-&gt;values[1];
-                        if (op == Get) {
-                            printf ("%f\n", (cur - min) * 100 / (max - min));
-                        } else {
-                            set = value * (max - min) / 100;
-                            switch (op) {
-                            case Set:
-                                new = min + set;
-                                break;
-                            case Inc:
-                                new = cur + set;
-                                break;
-                            case Dec:
-                                new = cur - set;
-                                break;
-                            default:
-                                XSync (dpy, False);
-                                return 1;
-                            }
-                            if (new &gt; max) new = max;
-                            if (new &lt; min) new = min;
-                            step = (new - cur) / steps;
-                            for (i = 0; i &lt; steps &amp;&amp; step != 0; i++)
-                            {
-                                if (i == steps - 1)
-                                    cur = new;
-                                else
-                                    cur += step;
-                                backlight_set (dpy, output, (long) cur);
-                                XFlush (dpy);
-                                usleep (total_time * 1000 / steps);
-                            }
-                        }
-                    }
-                    XFree (info);
-                }
+                xcb_randr_query_output_property_cookie_t prop_cookie;
+                xcb_randr_query_output_property_reply_t *prop_reply;
+
+                prop_cookie = xcb_randr_query_output_property (conn,
output, backlight);
+                prop_reply = xcb_randr_query_output_property_reply
(conn, prop_cookie, &amp;error);
+
+                if (error != NULL || prop_reply == NULL) continue;
+
+                if (prop_reply-&gt;range &amp;&amp;
+
xcb_randr_query_output_property_valid_values_length (prop_reply) == 2)
{
+                    int32_t *values =
xcb_randr_query_output_property_valid_values (prop_reply);
+                    min = values[0];
+                    max = values[1];
+
+                    if (op == Get) {
+                        printf ("%f\n", (cur - min) * 100 / (max - min));
+                    } else {
+                        set = value * (max - min) / 100;
+                        switch (op) {
+                        case Set:
+                            new = min + set;
+                            break;
+                        case Inc:
+                            new = cur + set;
+                            break;
+                        case Dec:
+                            new = cur - set;
+                            break;
+                        default:
+                            xcb_aux_sync (conn);
+                            return 1;
+                        }
+                        if (new &gt; max) new = max;
+                        if (new &lt; min) new = min;
+                        step = (new - cur) / steps;
+                        for (i = 0; i &lt; steps &amp;&amp; step != 0; i++)
+                        {
+                            if (i == steps - 1)
+                                cur = new;
+                            else
+                                cur += step;
+                            backlight_set (conn, output, (long) cur);
+                            xcb_flush (conn);
+                            usleep (total_time * 1000 / steps);
+                        }
+                    }
+                }
+                free (prop_reply);
             }
         }
-                                                        
-        XRRFreeScreenResources (resources);
+
+        free (resources_reply);
+        xcb_screen_next (&amp;iter);
     }
-    XSync (dpy, False);
+
+    xcb_aux_sync (conn);

     return 0;
 }
</pre>
    </blockquote>
    <br>
  </body>
</html>