summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Hopf <mhopf@suse.de>2008-11-28 17:26:43 +0100
committerMatthias Hopf <mhopf@suse.de>2008-12-04 18:19:06 +0100
commit1de7212d9a945403f13f4dc15a66ec115c3be44c (patch)
tree2c180ffa7dbf9e81052ff2e776e574ade4e957e9
parent0dd24bd6ad3c437f320c5d8e922c479fb61b115f (diff)
downloadxorg-lib-libXrandr-1de7212d9a945403f13f4dc15a66ec115c3be44c.tar.gz
Panning support
-rw-r--r--include/X11/extensions/Xrandr.h28
-rw-r--r--src/XrrCrtc.c97
2 files changed, 125 insertions, 0 deletions
diff --git a/include/X11/extensions/Xrandr.h b/include/X11/extensions/Xrandr.h
index 892fae8..80d9d47 100644
--- a/include/X11/extensions/Xrandr.h
+++ b/include/X11/extensions/Xrandr.h
@@ -412,6 +412,34 @@ XRRGetCrtcTransform (Display *dpy,
*/
int XRRUpdateConfiguration(XEvent *event);
+typedef struct _XRRPanning {
+ Time timestamp;
+ unsigned int left;
+ unsigned int top;
+ unsigned int width;
+ unsigned int height;
+ unsigned int track_left;
+ unsigned int track_top;
+ unsigned int track_width;
+ unsigned int track_height;
+ int border_left;
+ int border_top;
+ int border_right;
+ int border_bottom;
+} XRRPanning;
+
+XRRPanning *
+XRRGetPanning (Display *dpy, XRRScreenResources *resources, RRCrtc crtc);
+
+void
+XRRFreePanning (XRRPanning *panning);
+
+Status
+XRRSetPanning (Display *dpy,
+ XRRScreenResources *resources,
+ RRCrtc crtc,
+ XRRPanning *panning);
+
_XFUNCPROTOEND
#endif /* _XRANDR_H_ */
diff --git a/src/XrrCrtc.c b/src/XrrCrtc.c
index 66dbc67..6b0cdd8 100644
--- a/src/XrrCrtc.c
+++ b/src/XrrCrtc.c
@@ -463,3 +463,100 @@ XRRGetCrtcTransform (Display *dpy,
return True;
}
+
+XRRPanning *
+XRRGetPanning (Display *dpy, XRRScreenResources *resources, RRCrtc crtc)
+{
+ XExtDisplayInfo *info = XRRFindDisplay(dpy);
+ xRRGetPanningReply rep;
+ xRRGetPanningReq *req;
+ XRRPanning *xp;
+
+ RRCheckExtension (dpy, info, 0);
+
+ LockDisplay (dpy);
+ GetReq (RRGetPanning, req);
+ req->reqType = info->codes->major_opcode;
+ req->randrReqType = X_RRGetPanning;
+ req->crtc = crtc;
+ req->configTimestamp = resources->configTimestamp;
+
+ if (!_XReply (dpy, (xReply *) &rep, 1, xFalse))
+ {
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return NULL;
+ }
+
+ if (! (xp = (XRRPanning *) Xmalloc(sizeof(XRRPanning))) ) {
+ _XEatData (dpy, sizeof(XRRPanning));
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return NULL;
+ }
+
+ xp->timestamp = rep.timestamp;
+ xp->left = rep.left;
+ xp->top = rep.top;
+ xp->width = rep.width;
+ xp->height = rep.height;
+ xp->track_left = rep.track_left;
+ xp->track_top = rep.track_top;
+ xp->track_width = rep.track_width;
+ xp->track_height = rep.track_height;
+ xp->border_left = rep.border_left;
+ xp->border_top = rep.border_top;
+ xp->border_right = rep.border_right;
+ xp->border_bottom = rep.border_bottom;
+
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return (XRRPanning *) xp;
+}
+
+void
+XRRFreePanning (XRRPanning *panning)
+{
+ Xfree (panning);
+}
+
+Status
+XRRSetPanning (Display *dpy,
+ XRRScreenResources *resources,
+ RRCrtc crtc,
+ XRRPanning *panning)
+{
+ XExtDisplayInfo *info = XRRFindDisplay(dpy);
+ xRRSetPanningReply rep;
+ xRRSetPanningReq *req;
+ int i;
+
+ RRCheckExtension (dpy, info, 0);
+
+ LockDisplay(dpy);
+ GetReq (RRSetPanning, req);
+ req->reqType = info->codes->major_opcode;
+ req->randrReqType = X_RRSetPanning;
+ req->crtc = crtc;
+ req->timestamp = panning->timestamp;
+ req->configTimestamp = resources->configTimestamp;
+ req->left = panning->left;
+ req->top = panning->top;
+ req->width = panning->width;
+ req->height = panning->height;
+ req->track_left = panning->track_left;
+ req->track_top = panning->track_top;
+ req->track_width = panning->track_width;
+ req->track_height = panning->track_height;
+ req->border_left = panning->border_left;
+ req->border_top = panning->border_top;
+ req->border_right = panning->border_right;
+ req->border_bottom = panning->border_bottom;
+
+ if (!_XReply (dpy, (xReply *) &rep, 0, xFalse))
+ rep.status = RRSetConfigFailed;
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return rep.status;
+}
+