mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2026-06-02 13:28:40 +02:00
Merge commit 'origin/server-1.6-branch' into xorg-server-1.6-apple
This commit is contained in:
commit
e45877e05e
22 changed files with 607 additions and 62 deletions
|
|
@ -150,7 +150,7 @@ XIGetDevice(xEvent* xE)
|
|||
int rc;
|
||||
int id;
|
||||
|
||||
id = ((deviceKeyButtonPointer*)xE)->deviceid;
|
||||
id = ((deviceKeyButtonPointer*)xE)->deviceid & ~MORE_EVENTS;
|
||||
|
||||
rc = dixLookupDevice(&pDev, id, serverClient, DixUnknownAccess);
|
||||
if (rc != Success)
|
||||
|
|
|
|||
|
|
@ -121,7 +121,7 @@ XIRegisterPropertyHandler(DeviceIntPtr dev,
|
|||
}
|
||||
|
||||
void
|
||||
XIUnRegisterPropertyHandler(DeviceIntPtr dev, long id)
|
||||
XIUnregisterPropertyHandler(DeviceIntPtr dev, long id)
|
||||
{
|
||||
XIPropertyHandlerPtr curr, prev = NULL;
|
||||
|
||||
|
|
|
|||
25
configure.ac
25
configure.ac
|
|
@ -26,7 +26,7 @@ dnl
|
|||
dnl Process this file with autoconf to create configure.
|
||||
|
||||
AC_PREREQ(2.57)
|
||||
AC_INIT([xorg-server], 1.5.99.2, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
|
||||
AC_INIT([xorg-server], 1.5.99.3, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
|
||||
AC_CONFIG_SRCDIR([Makefile.am])
|
||||
AM_INIT_AUTOMAKE([dist-bzip2 foreign])
|
||||
AM_MAINTAINER_MODE
|
||||
|
|
@ -312,7 +312,6 @@ case $host_cpu in
|
|||
i*86)
|
||||
I386_VIDEO=yes
|
||||
case $host_os in
|
||||
*linux*) DEFAULT_INT10=vm86 ;;
|
||||
*freebsd*) AC_DEFINE(USE_DEV_IO) ;;
|
||||
*dragonfly*) AC_DEFINE(USE_DEV_IO) ;;
|
||||
*netbsd*) AC_DEFINE(USE_I386_IOPL)
|
||||
|
|
@ -870,6 +869,28 @@ if test "x$DRI" = xyes || test "x$DRI2" = xyes; then
|
|||
AC_SUBST(LIBDRM_LIBS)
|
||||
fi
|
||||
|
||||
if test "x$DRI2" = xyes; then
|
||||
save_CFLAGS=$CFLAGS
|
||||
CFLAGS="$GL_CFLAGS $LIBDRM_CFLAGS -Wall"
|
||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include <GL/gl.h>
|
||||
#include <GL/internal/dri_interface.h>
|
||||
#ifndef __DRI_DRI2
|
||||
#error DRI2 extension not available.
|
||||
#endif]])],
|
||||
[HAVE_DRI2EXTENSION=yes],
|
||||
[HAVE_DRI2EXTENSION=no])
|
||||
CFLAGS=$save_CFLAGS
|
||||
if test "x$HAVE_DRI2EXTENSION" = xyes; then
|
||||
AC_DEFINE(DRI2_AIGLX, 1, [Build DRI2 AIGLX loader])
|
||||
DRI2_AIGLX=yes
|
||||
else
|
||||
AC_MSG_NOTICE([DRI2 AIGLX disabled, __DRI_DRI2 not defined in dri_interface.h.])
|
||||
DRI2_AIGLX=no
|
||||
fi
|
||||
fi
|
||||
AM_CONDITIONAL(DRI2_AIGLX, test "x$DRI2_AIGLX" == xyes)
|
||||
|
||||
|
||||
AM_CONDITIONAL(XINERAMA, [test "x$XINERAMA" = xyes])
|
||||
if test "x$XINERAMA" = xyes; then
|
||||
AC_DEFINE(XINERAMA, 1, [Support Xinerama extension])
|
||||
|
|
|
|||
|
|
@ -728,9 +728,9 @@ static int
|
|||
countValuatorEvents(int num_valuators)
|
||||
{
|
||||
if (num_valuators) {
|
||||
if ((num_valuators / 6) + 1 > MAX_VALUATOR_EVENTS)
|
||||
num_valuators = MAX_VALUATOR_EVENTS;
|
||||
return (num_valuators / 6) + 1;
|
||||
if (((num_valuators - 1) / 6) + 1 > MAX_VALUATOR_EVENTS)
|
||||
num_valuators = MAX_VALUATOR_EVENTS * 6;
|
||||
return ((num_valuators - 1)/ 6) + 1;
|
||||
} else
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ INCLUDES = \
|
|||
-I$(top_srcdir)/hw/xfree86/dri \
|
||||
-I$(top_srcdir)/mi
|
||||
|
||||
if DRI2
|
||||
if DRI2_AIGLX
|
||||
INCLUDES += -I$(top_srcdir)/hw/xfree86/dri2
|
||||
endif
|
||||
|
||||
|
|
@ -53,7 +53,7 @@ libglxdri_la_SOURCES = \
|
|||
extension_string.c \
|
||||
extension_string.h
|
||||
|
||||
if DRI2
|
||||
if DRI2_AIGLX
|
||||
libglxdri_la_SOURCES += glxdri2.c
|
||||
endif
|
||||
|
||||
|
|
|
|||
|
|
@ -865,7 +865,7 @@ static void dmxInputScanForExtensions(DMXInputInfo *dmxInput, int doXI)
|
|||
|
||||
/* Print out information about the XInput Extension. */
|
||||
handler = XSetExtensionErrorHandler(dmxInputExtensionErrorHandler);
|
||||
ext = XQueryInputVersion(display, XI_2_Major, XI_2_Minor);
|
||||
ext = XGetExtensionVersion(display, INAME);
|
||||
XSetExtensionErrorHandler(handler);
|
||||
|
||||
if (!ext || ext == (XExtensionVersion *)NoSuchExtension) {
|
||||
|
|
|
|||
|
|
@ -2460,13 +2460,14 @@ checkInput(serverLayoutPtr layout, Bool implicit_layout) {
|
|||
while(*dev)
|
||||
{
|
||||
if (strcmp((*dev)->driver, "kbd") == 0 ||
|
||||
strcmp((*dev)->driver, "mouse") == 0)
|
||||
strcmp((*dev)->driver, "mouse") == 0 ||
|
||||
strcmp((*dev)->driver, "vmmouse") == 0)
|
||||
{
|
||||
IDevPtr *current;
|
||||
if (!warned)
|
||||
{
|
||||
xf86Msg(X_WARNING, "AllowEmptyInput is on, devices using "
|
||||
"drivers 'kbd' or 'mouse' will be disabled.\n");
|
||||
"drivers 'kbd', 'mouse' or 'vmmouse' will be disabled.\n");
|
||||
warned = TRUE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ extern InputDriverPtr *xf86InputDriverList;
|
|||
extern int xf86NumInputDrivers;
|
||||
|
||||
/* xf86Xinput.c */
|
||||
void xf86ActivateDevice(InputInfoPtr pInfo);
|
||||
int xf86ActivateDevice(InputInfoPtr pInfo);
|
||||
|
||||
/* xf86Helper.c */
|
||||
InputDriverPtr xf86LookupInputDriver(const char *name);
|
||||
|
|
|
|||
|
|
@ -1315,6 +1315,8 @@ InitInput(argc, argv)
|
|||
|
||||
xf86Info.vtRequestsPending = FALSE;
|
||||
|
||||
mieqInit();
|
||||
|
||||
/* Call the PreInit function for each input device instance. */
|
||||
for (pDev = xf86ConfigLayout.inputs; pDev && *pDev; pDev++) {
|
||||
/* Replace obsolete keyboard driver with kbd */
|
||||
|
|
@ -1322,10 +1324,10 @@ InitInput(argc, argv)
|
|||
strcpy((*pDev)->driver, "kbd");
|
||||
}
|
||||
|
||||
xf86NewInputDevice(*pDev, &dev, TRUE);
|
||||
/* If one fails, the others will too */
|
||||
if (xf86NewInputDevice(*pDev, &dev, TRUE) == BadAlloc)
|
||||
break;
|
||||
}
|
||||
|
||||
mieqInit();
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -287,12 +287,13 @@ xf86ProcessCommonOptions(LocalDevicePtr local,
|
|||
/***********************************************************************
|
||||
*
|
||||
* xf86ActivateDevice --
|
||||
*
|
||||
*
|
||||
* Initialize an input device.
|
||||
*
|
||||
* Returns TRUE on success, or FALSE otherwise.
|
||||
***********************************************************************
|
||||
*/
|
||||
_X_EXPORT void
|
||||
_X_EXPORT int
|
||||
xf86ActivateDevice(LocalDevicePtr local)
|
||||
{
|
||||
DeviceIntPtr dev;
|
||||
|
|
@ -301,8 +302,13 @@ xf86ActivateDevice(LocalDevicePtr local)
|
|||
dev = AddInputDevice(serverClient, local->device_control, TRUE);
|
||||
|
||||
if (dev == NULL)
|
||||
FatalError("Too many input devices");
|
||||
|
||||
{
|
||||
xf86Msg(X_ERROR, "Too many input devices. Ignoring %s\n",
|
||||
local->name);
|
||||
local->dev = NULL;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
local->atom = MakeAtom(local->type_name,
|
||||
strlen(local->type_name),
|
||||
TRUE);
|
||||
|
|
@ -334,6 +340,8 @@ xf86ActivateDevice(LocalDevicePtr local)
|
|||
xf86Msg(X_INFO, "XINPUT: Adding extended input device \"%s\" (type: %s)\n",
|
||||
local->name, local->type_name);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -470,6 +478,13 @@ AddOtherInputDevices()
|
|||
/**
|
||||
* Create a new input device, activate and enable it.
|
||||
*
|
||||
* Possible return codes:
|
||||
* BadName .. a bad driver name was supplied.
|
||||
* BadImplementation ... The driver does not have a PreInit function. This
|
||||
* is a driver bug.
|
||||
* BadMatch .. device initialization failed.
|
||||
* BadAlloc .. too many input devices
|
||||
*
|
||||
* @param idev The device, already set up with identifier, driver, and the
|
||||
* options.
|
||||
* @param pdev Pointer to the new device, if Success was reported.
|
||||
|
|
@ -519,7 +534,11 @@ xf86NewInputDevice(IDevPtr idev, DeviceIntPtr *pdev, BOOL enable)
|
|||
goto unwind;
|
||||
}
|
||||
|
||||
xf86ActivateDevice(pInfo);
|
||||
if (!xf86ActivateDevice(pInfo))
|
||||
{
|
||||
rval = BadAlloc;
|
||||
goto unwind;
|
||||
}
|
||||
|
||||
dev = pInfo->dev;
|
||||
ActivateDevice(dev);
|
||||
|
|
|
|||
|
|
@ -170,9 +170,7 @@ void xf86PostKeyEvent(DeviceIntPtr device, unsigned int key_code, int is_down,
|
|||
...);
|
||||
void xf86PostKeyboardEvent(DeviceIntPtr device, unsigned int key_code,
|
||||
int is_down);
|
||||
void xf86ActivateDevice(LocalDevicePtr local);
|
||||
Bool xf86CheckButton(int button, int down);
|
||||
void xf86SwitchCoreDevice(LocalDevicePtr device, DeviceIntPtr core);
|
||||
int xf86ActivateDevice(LocalDevicePtr local);
|
||||
LocalDevicePtr xf86FirstLocalDevice(void);
|
||||
int xf86ScaleAxis(int Cx, int Sxhigh, int Sxlow, int Rxhigh, int Rxlow);
|
||||
void xf86XInputSetScreen(LocalDevicePtr local, int screen_number, int x, int y);
|
||||
|
|
|
|||
|
|
@ -662,7 +662,7 @@ the X server to load. Disabled by default.
|
|||
If enabled, don't add the standard keyboard and mouse drivers, if there are no
|
||||
input devices in the config file. Enabled by default if AutoAddDevices and
|
||||
AutoEnableDevices is enabled, otherwise disabled.
|
||||
If AllowEmptyInput is on, devices using the kbd or mouse driver are ignored.
|
||||
If AllowEmptyInput is on, devices using the kbd, mouse or vmmouse driver are ignored.
|
||||
.TP 7
|
||||
.BI "Option \*qAutoAddDevices\*q \*q" boolean \*q
|
||||
If this option is disabled, then no devices will be added from HAL events.
|
||||
|
|
|
|||
|
|
@ -96,6 +96,7 @@ xf86CrtcCreate (ScrnInfoPtr scrn,
|
|||
crtc = xcalloc (sizeof (xf86CrtcRec), 1);
|
||||
if (!crtc)
|
||||
return NULL;
|
||||
crtc->version = XF86_CRTC_VERSION;
|
||||
crtc->scrn = scrn;
|
||||
crtc->funcs = funcs;
|
||||
#ifdef RANDR_12_INTERFACE
|
||||
|
|
@ -112,6 +113,8 @@ xf86CrtcCreate (ScrnInfoPtr scrn,
|
|||
crtc->filter_width = 0;
|
||||
crtc->filter_height = 0;
|
||||
crtc->transform_in_use = FALSE;
|
||||
crtc->transformPresent = FALSE;
|
||||
crtc->desiredTransformPresent = FALSE;
|
||||
memset (&crtc->bounds, '\0', sizeof (crtc->bounds));
|
||||
|
||||
if (xf86_config->crtc)
|
||||
|
|
@ -241,6 +244,8 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati
|
|||
RRTransformPtr transform, int x, int y)
|
||||
{
|
||||
ScrnInfoPtr scrn = crtc->scrn;
|
||||
/* During ScreenInit() scrn->pScreen is still NULL */
|
||||
ScreenPtr pScreen = screenInfo.screens[scrn->scrnIndex];
|
||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
int i;
|
||||
Bool ret = FALSE;
|
||||
|
|
@ -254,9 +259,9 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati
|
|||
|
||||
if (crtc->funcs->set_mode_major)
|
||||
return crtc->funcs->set_mode_major(crtc, mode, rotation, x, y);
|
||||
|
||||
|
||||
crtc->enabled = xf86CrtcInUse (crtc);
|
||||
|
||||
|
||||
if (!crtc->enabled)
|
||||
{
|
||||
/* XXX disable crtc? */
|
||||
|
|
@ -290,6 +295,11 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati
|
|||
} else
|
||||
crtc->transformPresent = FALSE;
|
||||
|
||||
/* xf86CrtcFitsScreen() relies on these values being correct. */
|
||||
/* This should ensure the values are always set at modeset time. */
|
||||
pScreen->width = scrn->virtualX;
|
||||
pScreen->height = scrn->virtualY;
|
||||
|
||||
/* Shift offsets that move us out of virtual size */
|
||||
if (x + mode->HDisplay > xf86_config->maxWidth ||
|
||||
y + mode->VDisplay > xf86_config->maxHeight)
|
||||
|
|
@ -314,8 +324,14 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati
|
|||
crtc->x, crtc->y);
|
||||
}
|
||||
|
||||
/* XXX short-circuit changes to base location only */
|
||||
|
||||
if (crtc->funcs->set_origin &&
|
||||
memcmp (mode, &saved_mode, sizeof(saved_mode)) == 0 &&
|
||||
saved_rotation == rotation) {
|
||||
crtc->funcs->set_origin (crtc, crtc->x, crtc->y);
|
||||
ret = TRUE;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Pass our mode to the outputs and the CRTC to give them a chance to
|
||||
* adjust it according to limitations or output properties, and also
|
||||
* a chance to reject the mode entirely.
|
||||
|
|
@ -404,6 +420,20 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation,
|
|||
return xf86CrtcSetModeTransform (crtc, mode, rotation, NULL, x, y);
|
||||
}
|
||||
|
||||
/**
|
||||
* Pans the screen, does not change the mode
|
||||
*/
|
||||
_X_EXPORT void
|
||||
xf86CrtcSetOrigin (xf86CrtcPtr crtc, int x, int y)
|
||||
{
|
||||
crtc->x = x;
|
||||
crtc->y = y;
|
||||
if (crtc->funcs->set_origin)
|
||||
crtc->funcs->set_origin (crtc, x, y);
|
||||
else
|
||||
xf86CrtcSetMode (crtc, &crtc->mode, crtc->rotation, x, y);
|
||||
}
|
||||
|
||||
/*
|
||||
* Output functions
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -213,9 +213,16 @@ typedef struct _xf86CrtcFuncs {
|
|||
Bool
|
||||
(*set_mode_major)(xf86CrtcPtr crtc, DisplayModePtr mode,
|
||||
Rotation rotation, int x, int y);
|
||||
|
||||
/**
|
||||
* Callback for panning. Doesn't change the mode.
|
||||
*/
|
||||
void
|
||||
(*set_origin)(xf86CrtcPtr crtc, int x, int y);
|
||||
|
||||
} xf86CrtcFuncsRec, *xf86CrtcFuncsPtr;
|
||||
|
||||
#define XF86_CRTC_VERSION 1
|
||||
#define XF86_CRTC_VERSION 2
|
||||
|
||||
struct _xf86Crtc {
|
||||
/**
|
||||
|
|
@ -321,6 +328,15 @@ struct _xf86Crtc {
|
|||
* Bounding box in screen space
|
||||
*/
|
||||
BoxRec bounds;
|
||||
/**
|
||||
* Panning:
|
||||
* TotalArea: total panning area, larger than CRTC's size
|
||||
* TrackingArea: Area of the pointer for which the CRTC is panned
|
||||
* border: Borders of the displayed CRTC area which induces panning if the pointer reaches them
|
||||
*/
|
||||
BoxRec panningTotalArea;
|
||||
BoxRec panningTrackingArea;
|
||||
INT16 panningBorder[4];
|
||||
};
|
||||
|
||||
typedef struct _xf86OutputFuncs {
|
||||
|
|
@ -678,6 +694,9 @@ Bool
|
|||
xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation,
|
||||
int x, int y);
|
||||
|
||||
void
|
||||
xf86CrtcSetOrigin (xf86CrtcPtr crtc, int x, int y);
|
||||
|
||||
/*
|
||||
* Assign crtc rotation during mode set
|
||||
*/
|
||||
|
|
@ -867,4 +886,19 @@ xf86_unwrap_crtc_notify(ScreenPtr pScreen, xf86_crtc_notify_proc_ptr old);
|
|||
void
|
||||
xf86_crtc_notify(ScreenPtr pScreen);
|
||||
|
||||
/**
|
||||
* Panning
|
||||
*/
|
||||
Bool
|
||||
xf86_crtc_get_panning(ScrnInfoPtr pScrn,
|
||||
BoxPtr totalArea,
|
||||
BoxPtr TrackingArea,
|
||||
INT16 *border);
|
||||
|
||||
Bool
|
||||
xf86_crtc_set_panning(ScrnInfoPtr pScrn,
|
||||
BoxPtr totalArea,
|
||||
BoxPtr TrackingArea,
|
||||
INT16 *border);
|
||||
|
||||
#endif /* _XF86CRTC_H_ */
|
||||
|
|
|
|||
|
|
@ -51,6 +51,8 @@ typedef struct _xf86RandR12Info {
|
|||
int mmHeight;
|
||||
int maxX;
|
||||
int maxY;
|
||||
int pointerX;
|
||||
int pointerY;
|
||||
Rotation rotation; /* current mode */
|
||||
Rotation supported_rotations; /* driver supported */
|
||||
} XF86RandRInfoRec, *XF86RandRInfoPtr;
|
||||
|
|
@ -86,6 +88,143 @@ xf86RandR12ModeRefresh (DisplayModePtr mode)
|
|||
return (int) (mode->Clock * 1000.0 / mode->HTotal / mode->VTotal + 0.5);
|
||||
}
|
||||
|
||||
/* Adapt panning area; return TRUE if panning area was valid without adaption */
|
||||
static int
|
||||
xf86RandR13VerifyPanningArea (xf86CrtcPtr crtc, int screenWidth, int screenHeight)
|
||||
{
|
||||
int ret = TRUE;
|
||||
|
||||
if (crtc->version < 2)
|
||||
return FALSE;
|
||||
|
||||
if (crtc->panningTotalArea.x2 <= crtc->panningTotalArea.x1) {
|
||||
/* Panning in X is disabled */
|
||||
if (crtc->panningTotalArea.x1 || crtc->panningTotalArea.x2)
|
||||
/* Illegal configuration -> fail/disable */
|
||||
ret = FALSE;
|
||||
crtc->panningTotalArea.x1 = crtc->panningTotalArea.x2 = 0;
|
||||
crtc->panningTrackingArea.x1 = crtc->panningTrackingArea.x2 = 0;
|
||||
crtc->panningBorder[0] = crtc->panningBorder[2] = 0;
|
||||
} else {
|
||||
/* Panning in X is enabled */
|
||||
if (crtc->panningTotalArea.x1 < 0) {
|
||||
/* Panning region outside screen -> move inside */
|
||||
crtc->panningTotalArea.x2 -= crtc->panningTotalArea.x1;
|
||||
crtc->panningTotalArea.x1 = 0;
|
||||
ret = FALSE;
|
||||
}
|
||||
if (crtc->panningTotalArea.x2 < crtc->panningTotalArea.x1 + crtc->mode.HDisplay) {
|
||||
/* Panning region smaller than displayed area -> crop to displayed area */
|
||||
crtc->panningTotalArea.x2 = crtc->panningTotalArea.x1 + crtc->mode.HDisplay;
|
||||
ret = FALSE;
|
||||
}
|
||||
if (crtc->panningTotalArea.x2 > screenWidth) {
|
||||
/* Panning region larger than screen -> move inside, then crop to screen */
|
||||
crtc->panningTotalArea.x1 -= crtc->panningTotalArea.x2 - screenWidth;
|
||||
crtc->panningTotalArea.x2 = screenWidth;
|
||||
ret = FALSE;
|
||||
if (crtc->panningTotalArea.x1 < 0)
|
||||
crtc->panningTotalArea.x1 = 0;
|
||||
}
|
||||
if (crtc->panningBorder[0] + crtc->panningBorder[2] > crtc->mode.HDisplay) {
|
||||
/* Borders too large -> set to 0 */
|
||||
crtc->panningBorder[0] = crtc->panningBorder[2] = 0;
|
||||
ret = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (crtc->panningTotalArea.y2 <= crtc->panningTotalArea.y1) {
|
||||
/* Panning in Y is disabled */
|
||||
if (crtc->panningTotalArea.y1 || crtc->panningTotalArea.y2)
|
||||
/* Illegal configuration -> fail/disable */
|
||||
ret = FALSE;
|
||||
crtc->panningTotalArea.y1 = crtc->panningTotalArea.y2 = 0;
|
||||
crtc->panningTrackingArea.y1 = crtc->panningTrackingArea.y2 = 0;
|
||||
crtc->panningBorder[1] = crtc->panningBorder[3] = 0;
|
||||
} else {
|
||||
/* Panning in Y is enabled */
|
||||
if (crtc->panningTotalArea.y1 < 0) {
|
||||
/* Panning region outside screen -> move inside */
|
||||
crtc->panningTotalArea.y2 -= crtc->panningTotalArea.y1;
|
||||
crtc->panningTotalArea.y1 = 0;
|
||||
ret = FALSE;
|
||||
}
|
||||
if (crtc->panningTotalArea.y2 < crtc->panningTotalArea.y1 + crtc->mode.VDisplay) {
|
||||
/* Panning region smaller than displayed area -> crop to displayed area */
|
||||
crtc->panningTotalArea.y2 = crtc->panningTotalArea.y1 + crtc->mode.VDisplay;
|
||||
ret = FALSE;
|
||||
}
|
||||
if (crtc->panningTotalArea.y2 > screenHeight) {
|
||||
/* Panning region larger than screen -> move inside, then crop to screen */
|
||||
crtc->panningTotalArea.y1 -= crtc->panningTotalArea.y2 - screenHeight;
|
||||
crtc->panningTotalArea.y2 = screenHeight;
|
||||
ret = FALSE;
|
||||
if (crtc->panningTotalArea.y1 < 0)
|
||||
crtc->panningTotalArea.y1 = 0;
|
||||
}
|
||||
if (crtc->panningBorder[1] + crtc->panningBorder[3] > crtc->mode.VDisplay) {
|
||||
/* Borders too large -> set to 0 */
|
||||
crtc->panningBorder[1] = crtc->panningBorder[3] = 0;
|
||||
ret = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
xf86RandR13Pan (xf86CrtcPtr crtc, int x, int y)
|
||||
{
|
||||
int newX, newY;
|
||||
int width, height;
|
||||
|
||||
if (crtc->version < 2)
|
||||
return;
|
||||
|
||||
if (! crtc->enabled ||
|
||||
(crtc->panningTotalArea.x2 <= crtc->panningTotalArea.x1 &&
|
||||
crtc->panningTotalArea.y2 <= crtc->panningTotalArea.y1))
|
||||
return;
|
||||
|
||||
newX = crtc->x;
|
||||
newY = crtc->y;
|
||||
width = crtc->mode.HDisplay;
|
||||
height = crtc->mode.VDisplay;
|
||||
|
||||
if ((crtc->panningTrackingArea.x2 <= crtc->panningTrackingArea.x1 ||
|
||||
(x >= crtc->panningTrackingArea.x1 && x < crtc->panningTrackingArea.x2)) &&
|
||||
(crtc->panningTrackingArea.y2 <= crtc->panningTrackingArea.y1 ||
|
||||
(y >= crtc->panningTrackingArea.y1 && y < crtc->panningTrackingArea.y2))) {
|
||||
if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1) {
|
||||
if (x < crtc->x + crtc->panningBorder[0])
|
||||
newX = x - crtc->panningBorder[0];
|
||||
if (x >= crtc->x + width - crtc->panningBorder[2])
|
||||
newX = x - width + crtc->panningBorder[2] + 1;
|
||||
}
|
||||
if (crtc->panningTotalArea.y2 > crtc->panningTotalArea.y1) {
|
||||
if (y < crtc->y + crtc->panningBorder[1])
|
||||
newY = y - crtc->panningBorder[1];
|
||||
if (y >= crtc->y + height - crtc->panningBorder[3])
|
||||
newY = y - height + crtc->panningBorder[3] + 1;
|
||||
}
|
||||
}
|
||||
/* Validate against [xy]1 after [xy]2, to be sure that results are > 0 for [xy]1 > 0 */
|
||||
if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1) {
|
||||
if (newX >= crtc->panningTotalArea.x2 - width)
|
||||
newX = crtc->panningTotalArea.x2 - width - 1;
|
||||
if (newX < crtc->panningTotalArea.x1)
|
||||
newX = crtc->panningTotalArea.x1;
|
||||
}
|
||||
if (crtc->panningTotalArea.y2 > crtc->panningTotalArea.y1) {
|
||||
if (newY >= crtc->panningTotalArea.y2 - height)
|
||||
newY = crtc->panningTotalArea.y2 - height - 1;
|
||||
if (newY < crtc->panningTotalArea.y1)
|
||||
newY = crtc->panningTotalArea.y1;
|
||||
}
|
||||
if (newX != crtc->x || newY != crtc->y)
|
||||
xf86CrtcSetOrigin (crtc, newX, newY);
|
||||
}
|
||||
|
||||
static Bool
|
||||
xf86RandR12GetInfo (ScreenPtr pScreen, Rotation *rotations)
|
||||
{
|
||||
|
|
@ -332,6 +471,7 @@ xf86RandR12ScreenSetSize (ScreenPtr pScreen,
|
|||
WindowPtr pRoot = WindowTable[pScreen->myNum];
|
||||
PixmapPtr pScrnPix = (*pScreen->GetScreenPixmap)(pScreen);
|
||||
Bool ret = FALSE;
|
||||
int c;
|
||||
|
||||
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
|
||||
if (xf86RandR12Key) {
|
||||
|
|
@ -352,6 +492,23 @@ xf86RandR12ScreenSetSize (ScreenPtr pScreen,
|
|||
goto finish;
|
||||
|
||||
ret = TRUE;
|
||||
/* Update panning information */
|
||||
for (c = 0; c < config->num_crtc; c++) {
|
||||
xf86CrtcPtr crtc = config->crtc[c];
|
||||
if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1 ||
|
||||
crtc->panningTotalArea.y2 > crtc->panningTotalArea.y1) {
|
||||
if (crtc->panningTotalArea.x2 > crtc->panningTrackingArea.x1)
|
||||
crtc->panningTotalArea.x2 += width - pScreen->width;
|
||||
if (crtc->panningTotalArea.y2 > crtc->panningTrackingArea.y1)
|
||||
crtc->panningTotalArea.y2 += height - pScreen->height;
|
||||
if (crtc->panningTrackingArea.x2 > crtc->panningTrackingArea.x1)
|
||||
crtc->panningTrackingArea.x2 += width - pScreen->width;
|
||||
if (crtc->panningTrackingArea.y2 > crtc->panningTrackingArea.y1)
|
||||
crtc->panningTrackingArea.y2 += height - pScreen->height;
|
||||
xf86RandR13VerifyPanningArea (crtc, width, height);
|
||||
xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY);
|
||||
}
|
||||
}
|
||||
|
||||
pScreen->width = pScrnPix->drawable.width = width;
|
||||
pScreen->height = pScrnPix->drawable.height = height;
|
||||
|
|
@ -762,6 +919,7 @@ xf86RandR12CrtcSet (ScreenPtr pScreen,
|
|||
int num_randr_outputs,
|
||||
RROutputPtr *randr_outputs)
|
||||
{
|
||||
XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
|
||||
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
|
||||
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
|
||||
xf86CrtcPtr crtc = randr_crtc->devPrivate;
|
||||
|
|
@ -841,6 +999,8 @@ xf86RandR12CrtcSet (ScreenPtr pScreen,
|
|||
xfree(save_crtcs);
|
||||
return FALSE;
|
||||
}
|
||||
xf86RandR13VerifyPanningArea (crtc, pScreen->width, pScreen->height);
|
||||
xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY);
|
||||
/*
|
||||
* Save the last successful setting for EnterVT
|
||||
*/
|
||||
|
|
@ -1187,6 +1347,77 @@ xf86RandR12TellChanged (ScreenPtr pScreen)
|
|||
static void
|
||||
xf86RandR12PointerMoved (int scrnIndex, int x, int y)
|
||||
{
|
||||
ScreenPtr pScreen = screenInfo.screens[scrnIndex];
|
||||
ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
|
||||
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
|
||||
XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
|
||||
int c;
|
||||
|
||||
randrp->pointerX = x;
|
||||
randrp->pointerY = y;
|
||||
for (c = 0; c < config->num_crtc; c++)
|
||||
xf86RandR13Pan (config->crtc[c], x, y);
|
||||
}
|
||||
|
||||
static Bool
|
||||
xf86RandR13GetPanning (ScreenPtr pScreen,
|
||||
RRCrtcPtr randr_crtc,
|
||||
BoxPtr totalArea,
|
||||
BoxPtr trackingArea,
|
||||
INT16 *border)
|
||||
{
|
||||
xf86CrtcPtr crtc = randr_crtc->devPrivate;
|
||||
|
||||
if (crtc->version < 2)
|
||||
return FALSE;
|
||||
if (totalArea)
|
||||
memcpy (totalArea, &crtc->panningTotalArea, sizeof(BoxRec));
|
||||
if (trackingArea)
|
||||
memcpy (trackingArea, &crtc->panningTrackingArea, sizeof(BoxRec));
|
||||
if (border)
|
||||
memcpy (border, crtc->panningBorder, 4*sizeof(INT16));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static Bool
|
||||
xf86RandR13SetPanning (ScreenPtr pScreen,
|
||||
RRCrtcPtr randr_crtc,
|
||||
BoxPtr totalArea,
|
||||
BoxPtr trackingArea,
|
||||
INT16 *border)
|
||||
{
|
||||
XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
|
||||
xf86CrtcPtr crtc = randr_crtc->devPrivate;
|
||||
BoxRec oldTotalArea;
|
||||
BoxRec oldTrackingArea;
|
||||
INT16 oldBorder[4];
|
||||
|
||||
|
||||
if (crtc->version < 2)
|
||||
return FALSE;
|
||||
|
||||
memcpy (&oldTotalArea, &crtc->panningTotalArea, sizeof(BoxRec));
|
||||
memcpy (&oldTrackingArea, &crtc->panningTrackingArea, sizeof(BoxRec));
|
||||
memcpy (oldBorder, crtc->panningBorder, 4*sizeof(INT16));
|
||||
|
||||
if (totalArea)
|
||||
memcpy (&crtc->panningTotalArea, totalArea, sizeof(BoxRec));
|
||||
if (trackingArea)
|
||||
memcpy (&crtc->panningTrackingArea, trackingArea, sizeof(BoxRec));
|
||||
if (border)
|
||||
memcpy (crtc->panningBorder, border, 4*sizeof(INT16));
|
||||
|
||||
if (xf86RandR13VerifyPanningArea (crtc, pScreen->width, pScreen->height)) {
|
||||
xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY);
|
||||
return TRUE;
|
||||
} else {
|
||||
/* Restore old settings */
|
||||
memcpy (&crtc->panningTotalArea, &oldTotalArea, sizeof(BoxRec));
|
||||
memcpy (&crtc->panningTrackingArea, &oldTrackingArea, sizeof(BoxRec));
|
||||
memcpy (crtc->panningBorder, oldBorder, 4*sizeof(INT16));
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static Bool
|
||||
|
|
@ -1203,6 +1434,8 @@ xf86RandR12Init12 (ScreenPtr pScreen)
|
|||
rp->rrOutputValidateMode = xf86RandR12OutputValidateMode;
|
||||
#if RANDR_13_INTERFACE
|
||||
rp->rrOutputGetProperty = xf86RandR13OutputGetProperty;
|
||||
rp->rrGetPanning = xf86RandR13GetPanning;
|
||||
rp->rrSetPanning = xf86RandR13SetPanning;
|
||||
#endif
|
||||
rp->rrModeDestroy = xf86RandR12ModeDestroy;
|
||||
rp->rrSetConfig = NULL;
|
||||
|
|
|
|||
|
|
@ -464,7 +464,7 @@ xf86CrtcRotate (xf86CrtcPtr crtc)
|
|||
/* mark shadowed area as damaged so it will be repainted */
|
||||
xf86CrtcDamageShadow (crtc);
|
||||
}
|
||||
|
||||
|
||||
if (!xf86_config->rotation_damage)
|
||||
{
|
||||
/* Create damage structure */
|
||||
|
|
|
|||
|
|
@ -240,7 +240,7 @@ extern long XIRegisterPropertyHandler(
|
|||
Atom property)
|
||||
);
|
||||
|
||||
extern void XIUnRegisterPropertyHandler(
|
||||
extern _X_EXPORT void XIUnregisterPropertyHandler(
|
||||
DeviceIntPtr dev,
|
||||
long id
|
||||
);
|
||||
|
|
|
|||
|
|
@ -190,6 +190,17 @@ typedef void (*RRModeDestroyProcPtr) (ScreenPtr pScreen,
|
|||
typedef Bool (*RROutputGetPropertyProcPtr) (ScreenPtr pScreen,
|
||||
RROutputPtr output,
|
||||
Atom property);
|
||||
typedef Bool (*RRGetPanningProcPtr) (ScreenPtr pScrn,
|
||||
RRCrtcPtr crtc,
|
||||
BoxPtr totalArea,
|
||||
BoxPtr trackingArea,
|
||||
INT16 *border);
|
||||
typedef Bool (*RRSetPanningProcPtr) (ScreenPtr pScrn,
|
||||
RRCrtcPtr crtc,
|
||||
BoxPtr totalArea,
|
||||
BoxPtr trackingArea,
|
||||
INT16 *border);
|
||||
|
||||
#endif /* RANDR_13_INTERFACE */
|
||||
|
||||
typedef Bool (*RRGetInfoProcPtr) (ScreenPtr pScreen, Rotation *rotations);
|
||||
|
|
@ -239,6 +250,8 @@ typedef struct _rrScrPriv {
|
|||
#endif
|
||||
#if RANDR_13_INTERFACE
|
||||
RROutputGetPropertyProcPtr rrOutputGetProperty;
|
||||
RRGetPanningProcPtr rrGetPanning;
|
||||
RRSetPanningProcPtr rrSetPanning;
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
@ -686,6 +699,12 @@ ProcRRSetCrtcTransform (ClientPtr client);
|
|||
int
|
||||
ProcRRGetCrtcTransform (ClientPtr client);
|
||||
|
||||
int
|
||||
ProcRRGetPanning (ClientPtr client);
|
||||
|
||||
int
|
||||
ProcRRSetPanning (ClientPtr client);
|
||||
|
||||
/* rrdispatch.c */
|
||||
Bool
|
||||
RRClientKnowsRates (ClientPtr pClient);
|
||||
|
|
|
|||
158
randr/rrcrtc.c
158
randr/rrcrtc.c
|
|
@ -977,6 +977,158 @@ sendReply:
|
|||
return client->noClientException;
|
||||
}
|
||||
|
||||
int
|
||||
ProcRRGetPanning (ClientPtr client)
|
||||
{
|
||||
REQUEST(xRRGetPanningReq);
|
||||
xRRGetPanningReply rep;
|
||||
RRCrtcPtr crtc;
|
||||
ScreenPtr pScreen;
|
||||
rrScrPrivPtr pScrPriv;
|
||||
BoxRec total;
|
||||
BoxRec tracking;
|
||||
INT16 border[4];
|
||||
int n;
|
||||
|
||||
REQUEST_SIZE_MATCH(xRRGetPanningReq);
|
||||
crtc = LookupCrtc(client, stuff->crtc, DixReadAccess);
|
||||
|
||||
if (!crtc)
|
||||
return RRErrorBase + BadRRCrtc;
|
||||
|
||||
/* All crtcs must be associated with screens before client
|
||||
* requests are processed
|
||||
*/
|
||||
pScreen = crtc->pScreen;
|
||||
pScrPriv = rrGetScrPriv(pScreen);
|
||||
|
||||
if (!pScrPriv || !pScrPriv->rrGetPanning)
|
||||
return RRErrorBase + BadRRCrtc;
|
||||
|
||||
rep.type = X_Reply;
|
||||
rep.status = RRSetConfigSuccess;
|
||||
rep.sequenceNumber = client->sequence;
|
||||
rep.length = 1;
|
||||
rep.timestamp = pScrPriv->lastSetTime.milliseconds;
|
||||
|
||||
if (! pScrPriv->rrGetPanning (pScreen, crtc, &total, &tracking, border))
|
||||
return RRErrorBase + BadRRCrtc;
|
||||
|
||||
rep.left = total.x1;
|
||||
rep.top = total.y1;
|
||||
rep.width = total.x2 - total.x1;
|
||||
rep.height = total.y2 - total.y1;
|
||||
rep.track_left = tracking.x1;
|
||||
rep.track_top = tracking.y1;
|
||||
rep.track_width = tracking.x2 - tracking.x1;
|
||||
rep.track_height = tracking.y2 - tracking.y1;
|
||||
rep.border_left = border[0];
|
||||
rep.border_top = border[1];
|
||||
rep.border_right = border[2];
|
||||
rep.border_bottom = border[3];
|
||||
|
||||
if (client->swapped) {
|
||||
swaps(&rep.sequenceNumber, n);
|
||||
swapl(&rep.length, n);
|
||||
swaps(&rep.timestamp, n);
|
||||
swaps(&rep.left, n);
|
||||
swaps(&rep.top, n);
|
||||
swaps(&rep.width, n);
|
||||
swaps(&rep.height, n);
|
||||
swaps(&rep.track_left, n);
|
||||
swaps(&rep.track_top, n);
|
||||
swaps(&rep.track_width, n);
|
||||
swaps(&rep.track_height, n);
|
||||
swaps(&rep.border_left, n);
|
||||
swaps(&rep.border_top, n);
|
||||
swaps(&rep.border_right, n);
|
||||
swaps(&rep.border_bottom, n);
|
||||
}
|
||||
WriteToClient(client, sizeof(xRRGetPanningReply), (char *)&rep);
|
||||
return client->noClientException;
|
||||
}
|
||||
|
||||
int
|
||||
ProcRRSetPanning (ClientPtr client)
|
||||
{
|
||||
REQUEST(xRRSetPanningReq);
|
||||
xRRSetPanningReply rep;
|
||||
RRCrtcPtr crtc;
|
||||
ScreenPtr pScreen;
|
||||
rrScrPrivPtr pScrPriv;
|
||||
TimeStamp time;
|
||||
BoxRec total;
|
||||
BoxRec tracking;
|
||||
INT16 border[4];
|
||||
int n;
|
||||
|
||||
REQUEST_SIZE_MATCH(xRRSetPanningReq);
|
||||
crtc = LookupCrtc(client, stuff->crtc, DixReadAccess);
|
||||
|
||||
if (!crtc)
|
||||
return RRErrorBase + BadRRCrtc;
|
||||
|
||||
|
||||
/* All crtcs must be associated with screens before client
|
||||
* requests are processed
|
||||
*/
|
||||
pScreen = crtc->pScreen;
|
||||
pScrPriv = rrGetScrPriv(pScreen);
|
||||
|
||||
if (!pScrPriv) {
|
||||
time = currentTime;
|
||||
rep.status = RRSetConfigFailed;
|
||||
goto sendReply;
|
||||
}
|
||||
|
||||
time = ClientTimeToServerTime(stuff->timestamp);
|
||||
|
||||
/*
|
||||
* Make sure the requested set-time is not older than
|
||||
* the last set-time
|
||||
*/
|
||||
if (CompareTimeStamps (time, pScrPriv->lastSetTime) < 0)
|
||||
{
|
||||
rep.status = RRSetConfigInvalidTime;
|
||||
goto sendReply;
|
||||
}
|
||||
|
||||
if (!pScrPriv->rrGetPanning)
|
||||
return RRErrorBase + BadRRCrtc;
|
||||
|
||||
total.x1 = stuff->left;
|
||||
total.y1 = stuff->top;
|
||||
total.x2 = stuff->width - total.x1;
|
||||
total.y2 = stuff->height - total.y1;
|
||||
tracking.x1 = stuff->track_left;
|
||||
tracking.y1 = stuff->track_top;
|
||||
tracking.x2 = stuff->track_width - tracking.x1;
|
||||
tracking.y2 = stuff->track_height - tracking.y1;
|
||||
border[0] = stuff->border_left;
|
||||
border[1] = stuff->border_top;
|
||||
border[2] = stuff->border_right;
|
||||
border[3] = stuff->border_bottom;
|
||||
|
||||
if (! pScrPriv->rrSetPanning (pScreen, crtc, &total, &tracking, border))
|
||||
return BadMatch;
|
||||
|
||||
rep.status = RRSetConfigSuccess;
|
||||
|
||||
sendReply:
|
||||
rep.type = X_Reply;
|
||||
rep.sequenceNumber = client->sequence;
|
||||
rep.length = 0;
|
||||
rep.newTimestamp = pScrPriv->lastSetTime.milliseconds;
|
||||
|
||||
if (client->swapped) {
|
||||
swaps(&rep.sequenceNumber, n);
|
||||
swapl(&rep.length, n);
|
||||
swaps(&rep.newTimestamp, n);
|
||||
}
|
||||
WriteToClient(client, sizeof(xRRSetPanningReply), (char *)&rep);
|
||||
return client->noClientException;
|
||||
}
|
||||
|
||||
int
|
||||
ProcRRGetCrtcGammaSize (ClientPtr client)
|
||||
{
|
||||
|
|
@ -1150,8 +1302,7 @@ transform_filter_encode (ClientPtr client, char *output,
|
|||
if (client->swapped) {
|
||||
swaps (nbytesFilter, n);
|
||||
swaps (nparamsFilter, n);
|
||||
SwapLongs ((CARD32 *) (output + nbytes),
|
||||
nparams * sizeof (xFixed));
|
||||
SwapLongs ((CARD32 *) (output + nbytes), nparams);
|
||||
}
|
||||
nbytes += nparams * sizeof (xFixed);
|
||||
return nbytes;
|
||||
|
|
@ -1162,7 +1313,7 @@ transform_encode (ClientPtr client, xRenderTransform *wire, PictTransform *pict)
|
|||
{
|
||||
xRenderTransform_from_PictTransform (wire, pict);
|
||||
if (client->swapped)
|
||||
SwapLongs ((CARD32 *) wire, sizeof (xRenderTransform));
|
||||
SwapLongs ((CARD32 *) wire, sizeof (xRenderTransform) >> 2);
|
||||
}
|
||||
|
||||
int
|
||||
|
|
@ -1214,5 +1365,6 @@ ProcRRGetCrtcTransform (ClientPtr client)
|
|||
swapl (&reply->length, n);
|
||||
}
|
||||
WriteToClient (client, sizeof (xRRGetCrtcTransformReply) + nextra, (char *) reply);
|
||||
xfree(reply);
|
||||
return client->noClientException;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -215,5 +215,7 @@ int (*ProcRandrVector[RRNumberRequests])(ClientPtr) = {
|
|||
ProcRRGetScreenResourcesCurrent, /* 25 */
|
||||
ProcRRSetCrtcTransform, /* 26 */
|
||||
ProcRRGetCrtcTransform, /* 27 */
|
||||
ProcRRGetPanning, /* 28 */
|
||||
ProcRRSetPanning, /* 29 */
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -367,21 +367,73 @@ SProcRRSetCrtcGamma (ClientPtr client)
|
|||
static int
|
||||
SProcRRSetCrtcTransform (ClientPtr client)
|
||||
{
|
||||
int n, nparams;
|
||||
char *filter;
|
||||
CARD32 *params;
|
||||
REQUEST(xRRSetCrtcTransformReq);
|
||||
|
||||
REQUEST_SIZE_MATCH(xRRSetCrtcTransformReq);
|
||||
(void) stuff;
|
||||
return BadImplementation;
|
||||
|
||||
REQUEST_AT_LEAST_SIZE(xRRSetCrtcTransformReq);
|
||||
swaps(&stuff->length, n);
|
||||
swapl(&stuff->crtc, n);
|
||||
SwapLongs((CARD32 *)&stuff->transform, (sizeof(xRenderTransform)) >> 2);
|
||||
swaps(&stuff->nbytesFilter, n);
|
||||
filter = (char *)(stuff + 1);
|
||||
params = (CARD32 *) (filter + ((stuff->nbytesFilter + 3) & ~3));
|
||||
nparams = ((CARD32 *) stuff + client->req_len) - params;
|
||||
if (nparams < 0)
|
||||
return BadLength;
|
||||
|
||||
SwapLongs(params, nparams);
|
||||
return (*ProcRandrVector[stuff->randrReqType]) (client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcRRGetCrtcTransform (ClientPtr client)
|
||||
{
|
||||
int n;
|
||||
REQUEST(xRRGetCrtcTransformReq);
|
||||
|
||||
|
||||
REQUEST_SIZE_MATCH(xRRGetCrtcTransformReq);
|
||||
(void) stuff;
|
||||
return BadImplementation;
|
||||
swaps(&stuff->length, n);
|
||||
swapl(&stuff->crtc, n);
|
||||
return (*ProcRandrVector[stuff->randrReqType]) (client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcRRGetPanning (ClientPtr client)
|
||||
{
|
||||
int n;
|
||||
REQUEST(xRRGetPanningReq);
|
||||
|
||||
REQUEST_SIZE_MATCH(xRRGetPanningReq);
|
||||
swaps(&stuff->length, n);
|
||||
swapl(&stuff->crtc, n);
|
||||
return (*ProcRandrVector[stuff->randrReqType]) (client);
|
||||
}
|
||||
|
||||
static int
|
||||
SProcRRSetPanning (ClientPtr client)
|
||||
{
|
||||
int n;
|
||||
REQUEST(xRRSetPanningReq);
|
||||
|
||||
REQUEST_SIZE_MATCH(xRRSetPanningReq);
|
||||
swaps(&stuff->length, n);
|
||||
swapl(&stuff->crtc, n);
|
||||
swapl(&stuff->timestamp, n);
|
||||
swaps(&stuff->left, n);
|
||||
swaps(&stuff->top, n);
|
||||
swaps(&stuff->width, n);
|
||||
swaps(&stuff->height, n);
|
||||
swaps(&stuff->track_left, n);
|
||||
swaps(&stuff->track_top, n);
|
||||
swaps(&stuff->track_width, n);
|
||||
swaps(&stuff->track_height, n);
|
||||
swaps(&stuff->border_left, n);
|
||||
swaps(&stuff->border_top, n);
|
||||
swaps(&stuff->border_right, n);
|
||||
swaps(&stuff->border_bottom, n);
|
||||
return (*ProcRandrVector[stuff->randrReqType]) (client);
|
||||
}
|
||||
|
||||
int (*SProcRandrVector[RRNumberRequests])(ClientPtr) = {
|
||||
|
|
@ -418,5 +470,7 @@ int (*SProcRandrVector[RRNumberRequests])(ClientPtr) = {
|
|||
SProcRRGetScreenResources, /* 25 GetScreenResourcesCurrent */
|
||||
SProcRRSetCrtcTransform, /* 26 */
|
||||
SProcRRGetCrtcTransform, /* 27 */
|
||||
SProcRRGetPanning, /* 28 */
|
||||
SProcRRSetPanning, /* 29 */
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -57,27 +57,7 @@ int realRepeat;
|
|||
int
|
||||
XkbDDXUsesSoftRepeat(DeviceIntPtr pXDev)
|
||||
{
|
||||
#ifndef XKB_ALWAYS_USES_SOFT_REPEAT
|
||||
if (pXDev && pXDev->kbdfeed ) {
|
||||
if (pXDev->kbdfeed->ctrl.autoRepeat) {
|
||||
if (pXDev->key && pXDev->key->xkbInfo) {
|
||||
XkbDescPtr xkb;
|
||||
xkb= pXDev->key->xkbInfo->desc;
|
||||
if ((xkb->ctrls->repeat_delay == 660) &&
|
||||
(xkb->ctrls->repeat_interval == 40) &&
|
||||
((xkb->ctrls->enabled_ctrls&(XkbSlowKeysMask|
|
||||
XkbBounceKeysMask|
|
||||
XkbMouseKeysMask))==0)) {
|
||||
return 0;
|
||||
}
|
||||
return ((xkb->ctrls->enabled_ctrls&XkbRepeatKeysMask)!=0);
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
#else
|
||||
return 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue