XrrMode.c revision 8c4a8e55
1/*
2 * Copyright © 2006 Keith Packard
3 *
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that copyright
7 * notice and this permission notice appear in supporting documentation, and
8 * that the name of the copyright holders not be used in advertising or
9 * publicity pertaining to distribution of the software without specific,
10 * written prior permission.  The copyright holders make no representations
11 * about the suitability of this software for any purpose.  It is provided "as
12 * is" without express or implied warranty.
13 *
14 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
20 * OF THIS SOFTWARE.
21 */
22
23#ifdef HAVE_CONFIG_H
24#include <config.h>
25#endif
26
27#include <stdio.h>
28#include <X11/Xlib.h>
29/* we need to be able to manipulate the Display structure on events */
30#include <X11/Xlibint.h>
31#include <X11/extensions/render.h>
32#include <X11/extensions/Xrender.h>
33#include "Xrandrint.h"
34
35XRRModeInfo *
36XRRAllocModeInfo (char *name, int nameLength)
37{
38    XRRModeInfo	*mode_info;
39
40    mode_info = Xmalloc (sizeof (XRRModeInfo) + nameLength + 1);
41    if (!mode_info)
42	return NULL;
43    memset (mode_info, '\0', sizeof (XRRModeInfo));
44    mode_info->nameLength = nameLength;
45    mode_info->name = (char *) (mode_info + 1);
46    memcpy (mode_info->name, name, nameLength);
47    mode_info->name[nameLength] = '\0';
48    return mode_info;
49}
50
51RRMode
52XRRCreateMode (Display *dpy, Window window, XRRModeInfo *mode_info)
53{
54    XExtDisplayInfo	    *info = XRRFindDisplay(dpy);
55    xRRCreateModeReq	    *req;
56    xRRCreateModeReply	    rep;
57
58    RRCheckExtension (dpy, info, None);
59
60    LockDisplay(dpy);
61    GetReq (RRCreateMode, req);
62    req->reqType = info->codes->major_opcode;
63    req->randrReqType = X_RRCreateMode;
64    req->length += (mode_info->nameLength + 3) >> 2;
65
66    req->window = window;
67
68    req->modeInfo.id = 0;
69    req->modeInfo.width = mode_info->width;
70    req->modeInfo.height = mode_info->height;
71    req->modeInfo.dotClock = mode_info->dotClock;
72    req->modeInfo.hSyncStart = mode_info->hSyncStart;
73    req->modeInfo.hSyncEnd = mode_info->hSyncEnd;
74    req->modeInfo.hTotal = mode_info->hTotal;
75    req->modeInfo.hSkew = mode_info->hSkew;
76    req->modeInfo.vSyncStart = mode_info->vSyncStart;
77    req->modeInfo.vSyncEnd = mode_info->vSyncEnd;
78    req->modeInfo.vTotal = mode_info->vTotal;
79    req->modeInfo.nameLength = mode_info->nameLength;
80    req->modeInfo.modeFlags = mode_info->modeFlags;
81
82    Data (dpy, mode_info->name, mode_info->nameLength);
83    if (!_XReply (dpy, (xReply *) &rep, 0, xFalse))
84    {
85	UnlockDisplay (dpy);
86	SyncHandle ();
87	return None;
88    }
89
90    UnlockDisplay (dpy);
91    SyncHandle ();
92    return rep.mode;
93}
94
95void
96XRRDestroyMode (Display *dpy, RRMode mode)
97{
98    XExtDisplayInfo	    *info = XRRFindDisplay(dpy);
99    xRRDestroyModeReq	    *req;
100    RRSimpleCheckExtension (dpy, info);
101
102    LockDisplay(dpy);
103    GetReq (RRDestroyMode, req);
104    req->reqType = info->codes->major_opcode;
105    req->randrReqType = X_RRDestroyMode;
106    req->mode = mode;
107    UnlockDisplay (dpy);
108    SyncHandle ();
109}
110
111void
112XRRAddOutputMode (Display *dpy, RROutput output, RRMode mode)
113{
114    XExtDisplayInfo	    *info = XRRFindDisplay(dpy);
115    xRRAddOutputModeReq	    *req;
116    RRSimpleCheckExtension (dpy, info);
117
118    LockDisplay(dpy);
119    GetReq (RRAddOutputMode, req);
120    req->reqType = info->codes->major_opcode;
121    req->randrReqType = X_RRAddOutputMode;
122    req->output = output;
123    req->mode = mode;
124    UnlockDisplay (dpy);
125    SyncHandle ();
126}
127
128void
129XRRDeleteOutputMode (Display *dpy, RROutput output, RRMode mode)
130{
131    XExtDisplayInfo	    *info = XRRFindDisplay(dpy);
132    xRRDeleteOutputModeReq  *req;
133    RRSimpleCheckExtension (dpy, info);
134
135    LockDisplay(dpy);
136    GetReq (RRDeleteOutputMode, req);
137    req->reqType = info->codes->major_opcode;
138    req->randrReqType = X_RRDeleteOutputMode;
139    req->output = output;
140    req->mode = mode;
141    UnlockDisplay (dpy);
142    SyncHandle ();
143}
144
145void
146XRRFreeModeInfo (XRRModeInfo *modeInfo)
147{
148    Xfree (modeInfo);
149}
150