summaryrefslogtreecommitdiff
path: root/src/XrrMode.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/XrrMode.c')
-rw-r--r--src/XrrMode.c89
1 files changed, 88 insertions, 1 deletions
diff --git a/src/XrrMode.c b/src/XrrMode.c
index 65b60f9..fc624e1 100644
--- a/src/XrrMode.c
+++ b/src/XrrMode.c
@@ -35,29 +35,116 @@
XRRModeInfo *
XRRAllocModeInfo (char *name, int nameLength)
{
+ XRRModeInfo *mode_info;
+
+ mode_info = Xmalloc (sizeof (XRRModeInfo) + nameLength + 1);
+ if (!mode_info)
+ return NULL;
+ memset (mode_info, '\0', sizeof (XRRModeInfo));
+ mode_info->nameLength = nameLength;
+ mode_info->name = (char *) (mode_info + 1);
+ memcpy (mode_info->name, name, nameLength);
+ mode_info->name[nameLength] = '\0';
+ return mode_info;
}
RRMode
-XRRCreateMode (Display *dpy, Window window, XRRModeInfo *modeInfo)
+XRRCreateMode (Display *dpy, Window window, XRRModeInfo *mode_info)
{
+ XExtDisplayInfo *info = XRRFindDisplay(dpy);
+ xRRCreateModeReq *req;
+ xRRCreateModeReply rep;
+ long channelSize;
+
+ RRSimpleCheckExtension (dpy, info);
+
+ LockDisplay(dpy);
+ GetReq (RRCreateMode, req);
+ req->reqType = info->codes->major_opcode;
+ req->randrReqType = X_RRCreateMode;
+ req->length += (mode_info->nameLength + 3) >> 2;
+
+ req->window = window;
+
+ req->modeInfo.id = 0;
+ req->modeInfo.width = mode_info->width;
+ req->modeInfo.height = mode_info->height;
+ req->modeInfo.dotClock = mode_info->dotClock;
+ req->modeInfo.hSyncStart = mode_info->hSyncStart;
+ req->modeInfo.hSyncEnd = mode_info->hSyncEnd;
+ req->modeInfo.hTotal = mode_info->hTotal;
+ req->modeInfo.hSkew = mode_info->hSkew;
+ req->modeInfo.vSyncStart = mode_info->vSyncStart;
+ req->modeInfo.vSyncEnd = mode_info->vSyncEnd;
+ req->modeInfo.vTotal = mode_info->vTotal;
+ req->modeInfo.nameLength = mode_info->nameLength;
+ req->modeInfo.modeFlags = mode_info->modeFlags;
+
+ Data (dpy, mode_info->name, mode_info->nameLength);
+ if (!_XReply (dpy, (xReply *) &rep, 0, xFalse))
+ {
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return None;
+ }
+
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return rep.mode;
}
void
XRRDestroyMode (Display *dpy, RRMode mode)
{
+ XExtDisplayInfo *info = XRRFindDisplay(dpy);
+ xRRDestroyModeReq *req;
+ RRSimpleCheckExtension (dpy, info);
+
+ LockDisplay(dpy);
+ GetReq (RRDestroyMode, req);
+ req->reqType = info->codes->major_opcode;
+ req->randrReqType = X_RRDestroyMode;
+ req->mode = mode;
+ UnlockDisplay (dpy);
+ SyncHandle ();
}
void
XRRAddOutputMode (Display *dpy, RROutput output, RRMode mode)
{
+ XExtDisplayInfo *info = XRRFindDisplay(dpy);
+ xRRAddOutputModeReq *req;
+ RRSimpleCheckExtension (dpy, info);
+
+ LockDisplay(dpy);
+ GetReq (RRAddOutputMode, req);
+ req->reqType = info->codes->major_opcode;
+ req->randrReqType = X_RRAddOutputMode;
+ req->output = output;
+ req->mode = mode;
+ UnlockDisplay (dpy);
+ SyncHandle ();
}
void
XRRDeleteOutputMode (Display *dpy, RROutput output, RRMode mode)
{
+ XExtDisplayInfo *info = XRRFindDisplay(dpy);
+ xRRDeleteOutputModeReq *req;
+ RRSimpleCheckExtension (dpy, info);
+
+ LockDisplay(dpy);
+ GetReq (RRDeleteOutputMode, req);
+ req->reqType = info->codes->major_opcode;
+ req->randrReqType = X_RRDeleteOutputMode;
+ req->output = output;
+ req->mode = mode;
+ UnlockDisplay (dpy);
+ SyncHandle ();
}
void
XRRFreeModeInfo (XRRModeInfo *modeInfo)
{
+ Xfree (modeInfo);
}