diff options
-rw-r--r-- | examples/xrandr.c | 202 | ||||
-rw-r--r-- | include/X11/extensions/XrandrUtils.h | 38 | ||||
-rw-r--r-- | man/XrandrUtils.man | 15 | ||||
-rw-r--r-- | src/Makefile.am | 3 | ||||
-rw-r--r-- | src/names.c | 80 |
5 files changed, 206 insertions, 132 deletions
diff --git a/examples/xrandr.c b/examples/xrandr.c index 7ddddb4..7eb50bf 100644 --- a/examples/xrandr.c +++ b/examples/xrandr.c @@ -186,21 +186,6 @@ typedef enum _changes { changes_primary = (1 << 12), } changes_t; -typedef enum _name_kind { - name_none = 0, - name_string = (1 << 0), - name_xid = (1 << 1), - name_index = (1 << 2), - name_preferred = (1 << 3), -} name_kind_t; - -typedef struct { - name_kind_t kind; - char *string; - XID xid; - int index; -} name_t; - typedef struct _crtc crtc_t; typedef struct _output output_t; typedef struct _transform transform_t; @@ -215,7 +200,7 @@ struct _transform { }; struct _crtc { - name_t crtc; + XRUName crtc; Bool changing; XRRCrtcInfo *crtc_info; @@ -242,18 +227,18 @@ struct _output { output_prop_t *props; - name_t output; + XRUName output; XRROutputInfo *output_info; - name_t crtc; + XRUName crtc; crtc_t *crtc_info; crtc_t *current_crtc_info; - name_t mode; + XRUName mode; double refresh; XRRModeInfo *mode_info; - name_t addmode; + XRUName addmode; XRURelation relation; char *relative_to; @@ -289,8 +274,8 @@ struct _umode { umode_action_t action; XRRModeInfo mode; - name_t output; - name_t name; + XRUName output; + XRUName name; }; static char *connection[3] = { @@ -326,6 +311,23 @@ static int minWidth, maxWidth, minHeight, maxHeight; static Bool has_1_2 = False; static Bool has_1_3 = False; +static void +set_name (XRUName *name, char *string, XRUNameKind valid) +{ + unsigned int xid; /* don't make it XID (which is unsigned long): + scanf() takes unsigned int */ + int index; + + if ((valid & name_xid) && sscanf (string, "0x%x", &xid) == 1) + XRUSetNameXid (name, xid); + else if ((valid & name_index) && sscanf (string, "%d", &index) == 1) + XRUSetNameIndex (name, index); + else if (valid & name_string) + XRUSetNameString (name, string); + else + usage (); +} + static int mode_height (XRRModeInfo *mode_info, Rotation rotation) { @@ -459,68 +461,6 @@ mode_hsync (XRRModeInfo *mode_info) } static void -init_name (name_t *name) -{ - name->kind = name_none; -} - -static void -set_name_string (name_t *name, char *string) -{ - name->kind |= name_string; - name->string = string; -} - -static void -set_name_xid (name_t *name, XID xid) -{ - name->kind |= name_xid; - name->xid = xid; -} - -static void -set_name_index (name_t *name, int index) -{ - name->kind |= name_index; - name->index = index; -} - -static void -set_name_preferred (name_t *name) -{ - name->kind |= name_preferred; -} - -static void -set_name_all (name_t *name, name_t *old) -{ - if (old->kind & name_xid) - name->xid = old->xid; - if (old->kind & name_string) - name->string = old->string; - if (old->kind & name_index) - name->index = old->index; - name->kind |= old->kind; -} - -static void -set_name (name_t *name, char *string, name_kind_t valid) -{ - unsigned int xid; /* don't make it XID (which is unsigned long): - scanf() takes unsigned int */ - int index; - - if ((valid & name_xid) && sscanf (string, "0x%x", &xid) == 1) - set_name_xid (name, xid); - else if ((valid & name_index) && sscanf (string, "%d", &index) == 1) - set_name_index (name, index); - else if (valid & name_string) - set_name_string (name, string); - else - usage (); -} - -static void init_transform (transform_t *transform) { int x; @@ -583,14 +523,14 @@ add_output (void) } static output_t * -find_output (name_t *name) +find_output (XRUName *name) { output_t *output; for (output = outputs; output; output = output->next) { - name_kind_t common = name->kind & output->output.kind; - + XRUNameKind common = name->kind & output->output.kind; + if ((common & name_xid) && name->xid == output->output.xid) break; if ((common & name_string) && !strcmp (name->string, output->output.string)) @@ -604,33 +544,33 @@ find_output (name_t *name) static output_t * find_output_by_xid (RROutput output) { - name_t output_name; + XRUName output_name; - init_name (&output_name); - set_name_xid (&output_name, output); + XRUInitName (&output_name); + XRUSetNameXid (&output_name, output); return find_output (&output_name); } static output_t * find_output_by_name (char *name) { - name_t output_name; + XRUName output_name; - init_name (&output_name); - set_name_string (&output_name, name); + XRUInitName (&output_name); + XRUSetNameString (&output_name, name); return find_output (&output_name); } static crtc_t * -find_crtc (name_t *name) +find_crtc (XRUName *name) { int c; crtc_t *crtc = NULL; for (c = 0; c < num_crtcs; c++) { - name_kind_t common; - + XRUNameKind common; + crtc = &crtcs[c]; common = name->kind & crtc->crtc.kind; @@ -648,15 +588,15 @@ find_crtc (name_t *name) static crtc_t * find_crtc_by_xid (RRCrtc crtc) { - name_t crtc_name; + XRUName crtc_name; - init_name (&crtc_name); - set_name_xid (&crtc_name, crtc); + XRUInitName (&crtc_name); + XRUSetNameXid (&crtc_name, crtc); return find_crtc (&crtc_name); } static XRRModeInfo * -find_mode (name_t *name, double refresh) +find_mode (XRUName *name, double refresh) { int m; XRRModeInfo *best = NULL; @@ -691,10 +631,10 @@ find_mode (name_t *name, double refresh) static XRRModeInfo * find_mode_by_xid (RRMode mode) { - name_t mode_name; + XRUName mode_name; - init_name (&mode_name); - set_name_xid (&mode_name, mode); + XRUInitName (&mode_name); + XRUSetNameXid (&mode_name, mode); return find_mode (&mode_name, 0); } @@ -702,16 +642,16 @@ find_mode_by_xid (RRMode mode) static XRRModeInfo * find_mode_by_name (char *name) { - name_t mode_name; - init_name (&mode_name); - set_name_string (&mode_name, name); + XRUName mode_name; + XRUInitName (&mode_name); + XRUSetNameString (&mode_name, name); return find_mode (&mode_name, 0); } #endif static XRRModeInfo * -find_mode_for_output (output_t *output, name_t *name) +find_mode_for_output (output_t *output, XRUName *name) { XRROutputInfo *output_info = output->output_info; int m; @@ -986,14 +926,14 @@ set_output_info (output_t *output, RROutput xid, XRROutputInfo *output_info) /* set output name and info */ if (!(output->output.kind & name_xid)) - set_name_xid (&output->output, xid); + XRUSetNameXid (&output->output, xid); if (!(output->output.kind & name_string)) - set_name_string (&output->output, output_info->name); + XRUSetNameString (&output->output, output_info->name); output->output_info = output_info; /* set crtc name and info */ if (!(output->changes & changes_crtc)) - set_name_xid (&output->crtc, output_info->crtc); + XRUSetNameXid (&output->crtc, output_info->crtc); if (output->crtc.kind == name_xid && output->crtc.xid == None) output->crtc_info = NULL; @@ -1020,11 +960,11 @@ set_output_info (output_t *output, RROutput xid, XRROutputInfo *output_info) if (output_info->crtc) crtc = find_crtc_by_xid(output_info->crtc); if (crtc && crtc->crtc_info) - set_name_xid (&output->mode, crtc->crtc_info->mode); + XRUSetNameXid (&output->mode, crtc->crtc_info->mode); else if (output->crtc_info) - set_name_xid (&output->mode, output->crtc_info->crtc_info->mode); + XRUSetNameXid (&output->mode, output->crtc_info->crtc_info->mode); else - set_name_xid (&output->mode, None); + XRUSetNameXid (&output->mode, None); if (output->mode.xid) { output->mode_info = find_mode_by_xid (output->mode.xid); @@ -1154,8 +1094,8 @@ get_crtcs (void) } } - set_name_xid (&crtcs[c].crtc, res->crtcs[c]); - set_name_index (&crtcs[c].crtc, c); + XRUSetNameXid (&crtcs[c].crtc, res->crtcs[c]); + XRUSetNameIndex (&crtcs[c].crtc, c); if (!crtc_info) fatal ("could not get crtc 0x%x information\n", res->crtcs[c]); crtcs[c].crtc_info = crtc_info; crtcs[c].panning_info = panning_info; @@ -1579,16 +1519,16 @@ get_outputs (void) { XRROutputInfo *output_info = XRRGetOutputInfo (dpy, res, res->outputs[o]); output_t *output; - name_t output_name; + XRUName output_name; if (!output_info) fatal ("could not get output 0x%x information\n", res->outputs[o]); - set_name_xid (&output_name, res->outputs[o]); - set_name_index (&output_name, o); - set_name_string (&output_name, output_info->name); + XRUSetNameXid (&output_name, res->outputs[o]); + XRUSetNameIndex (&output_name, o); + XRUSetNameString (&output_name, output_info->name); output = find_output (&output_name); if (!output) { output = add_output (); - set_name_all (&output->output, &output_name); + XRUSetNameAll (&output->output, &output_name); /* * When global --automatic mode is set, turn on connected but off * outputs, turn off disconnected but on outputs @@ -1625,15 +1565,15 @@ get_outputs (void) case RR_UnknownConnection: if ((!(output->changes & changes_mode))) { - set_name_preferred (&output->mode); + XRUSetNamePreferred (&output->mode); output->changes |= changes_mode; } break; case RR_Disconnected: if ((!(output->changes & changes_mode))) { - set_name_xid (&output->mode, None); - set_name_xid (&output->crtc, None); + XRUSetNameXid (&output->mode, None); + XRUSetNameXid (&output->crtc, None); output->changes |= changes_mode; output->changes |= changes_crtc; } @@ -1782,14 +1722,14 @@ set_positions (void) for (output = outputs; output; output = output->next) { output_t *relation; - name_t relation_name; + XRUName relation_name; if (!(output->changes & changes_relation)) continue; if (output->mode_info == NULL) continue; - init_name (&relation_name); - set_name_string (&relation_name, output->relative_to); + XRUInitName (&relation_name); + XRUSetNameString (&relation_name, output->relative_to); relation = find_output (&relation_name); if (!relation) fatal ("cannot find output \"%s\"\n", output->relative_to); @@ -2230,9 +2170,9 @@ main (int argc, char **argv) output = find_output_by_name (argv[i]); if (!output) { output = add_output (); - set_name (&output->output, argv[i], name_string|name_xid); + set_name (&output->output, argv[i], name_string|name_xid); } - + setit_1_2 = True; action_requested = True; continue; @@ -2253,7 +2193,7 @@ main (int argc, char **argv) } if (!strcmp ("--preferred", argv[i])) { if (!output) usage(); - set_name_preferred (&output->mode); + XRUSetNamePreferred (&output->mode); output->changes |= changes_mode; continue; } @@ -2452,8 +2392,8 @@ main (int argc, char **argv) } if (!strcmp ("--off", argv[i])) { if (!output) usage(); - set_name_xid (&output->mode, None); - set_name_xid (&output->crtc, None); + XRUSetNameXid (&output->mode, None); + XRUSetNameXid (&output->crtc, None); output->changes |= changes_mode; continue; } diff --git a/include/X11/extensions/XrandrUtils.h b/include/X11/extensions/XrandrUtils.h index 7b33769..5330358 100644 --- a/include/X11/extensions/XrandrUtils.h +++ b/include/X11/extensions/XrandrUtils.h @@ -28,6 +28,7 @@ #ifndef _XRANDR_UTILS_H_ #define _XRANDR_UTILS_H_ +#include <X11/Xdefs.h> #include <X11/extensions/randr.h> typedef enum { @@ -46,6 +47,23 @@ typedef struct { int x, y; } XRUPoint; +typedef enum { + name_none = 0, + name_string = (1 << 0), + name_xid = (1 << 1), + name_index = (1 << 2), + name_preferred = (1 << 3), +} XRUNameKind; + +typedef struct { + XRUNameKind kind; + char *string; + XID xid; + int index; +} XRUName; + + +/* Geometry */ const char * XRURotationName(Rotation rotation); @@ -64,4 +82,24 @@ XRUGetReflectionIndex(char * reflection_name); Rotation XRUGetReflection(int dirind); + +/* Names */ +void +XRUInitName (XRUName *name); + +void +XRUSetNameString (XRUName *name, char *string); + +void +XRUSetNameXid (XRUName *name, XID xid); + +void +XRUSetNameIndex (XRUName *name, int index); + +void +XRUSetNamePreferred (XRUName *name); + +void +XRUSetNameAll (XRUName *name, XRUName *old); + #endif /* _XRANDR_UTILS_H_ */ diff --git a/man/XrandrUtils.man b/man/XrandrUtils.man index 7acf0e9..60144f8 100644 --- a/man/XrandrUtils.man +++ b/man/XrandrUtils.man @@ -34,6 +34,21 @@ typedef struct { int x, y; } XRUPoint; +typedef enum { + name_none = 0, + name_string = (1 << 0), + name_xid = (1 << 1), + name_index = (1 << 2), + name_preferred = (1 << 3), +} XRUNameKind; + +typedef struct { + XRUNameKind kind; + char *string; + XID xid; + int index; +} XRUName; + /** * Return string name for the given rotation, * or "invalid rotation" on error. diff --git a/src/Makefile.am b/src/Makefile.am index cbc5600..c7f1503 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,7 +1,8 @@ lib_LTLIBRARIES = libXrandrUtils.la libXrandrUtils_la_SOURCES = \ - XrandrUtils.c + XrandrUtils.c \ + names.c libXrandrUtils_la_LIBADD = @RANDR_UTILS_LIBS@ diff --git a/src/names.c b/src/names.c new file mode 100644 index 0000000..b8f7ecb --- /dev/null +++ b/src/names.c @@ -0,0 +1,80 @@ +/* + * Copyright © 2001 Keith Packard, member of The XFree86 Project, Inc. + * Copyright © 2002 Hewlett Packard Company, Inc. + * Copyright © 2006 Intel Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + * + * Thanks to Jim Gettys who wrote most of the client side code, + * and part of the server code for randr. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <string.h> +#include <X11/extensions/randr.h> + +#include "XrandrUtils.h" + +void +XRUInitName (XRUName *name) +{ + name->kind = name_none; +} + +void +XRUSetNameString (XRUName *name, char *string) +{ + name->kind |= name_string; + name->string = string; +} + +void +XRUSetNameXid (XRUName *name, XID xid) +{ + name->kind |= name_xid; + name->xid = xid; +} + +void +XRUSetNameIndex (XRUName *name, int index) +{ + name->kind |= name_index; + name->index = index; +} + +void +XRUSetNamePreferred (XRUName *name) +{ + name->kind |= name_preferred; +} + +void +XRUSetNameAll (XRUName *name, XRUName *old) +{ + if (old->kind & name_xid) + name->xid = old->xid; + if (old->kind & name_string) + name->string = old->string; + if (old->kind & name_index) + name->index = old->index; + name->kind |= old->kind; +} |