diff options
Diffstat (limited to 'src/XrrMode.c')
-rw-r--r-- | src/XrrMode.c | 89 |
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); } |