aboutsummaryrefslogtreecommitdiff
path: root/xorg-server
diff options
context:
space:
mode:
Diffstat (limited to 'xorg-server')
-rw-r--r--xorg-server/configure.ac2
-rw-r--r--xorg-server/dix/getevents.c2
-rw-r--r--xorg-server/hw/xfree86/dri2/dri2.c41
-rw-r--r--xorg-server/hw/xfree86/dri2/dri2.h26
-rw-r--r--xorg-server/hw/xfree86/dri2/dri2ext.c33
-rw-r--r--xorg-server/xkb/XKBMAlloc.c6
-rw-r--r--xorg-server/xkeyboard-config/symbols/is4
7 files changed, 107 insertions, 7 deletions
diff --git a/xorg-server/configure.ac b/xorg-server/configure.ac
index 97ceab1b8..9ae77fbae 100644
--- a/xorg-server/configure.ac
+++ b/xorg-server/configure.ac
@@ -773,7 +773,7 @@ RECORDPROTO="recordproto >= 1.13.99.1"
SCRNSAVERPROTO="scrnsaverproto >= 1.1"
RESOURCEPROTO="resourceproto >= 1.2.0"
DRIPROTO="xf86driproto >= 2.1.0"
-DRI2PROTO="dri2proto >= 2.6"
+DRI2PROTO="dri2proto >= 2.7"
XINERAMAPROTO="xineramaproto"
BIGFONTPROTO="xf86bigfontproto >= 1.2.0"
DGAPROTO="xf86dgaproto >= 2.0.99.1"
diff --git a/xorg-server/dix/getevents.c b/xorg-server/dix/getevents.c
index ae4112ffc..4fbaa6c94 100644
--- a/xorg-server/dix/getevents.c
+++ b/xorg-server/dix/getevents.c
@@ -1615,7 +1615,7 @@ GetPointerEvents(InternalEvent *events, DeviceIntPtr pDev, int type,
/* Now turn the smooth-scrolling axes back into emulated button presses
* for legacy clients, based on the integer delta between before and now */
for (i = 0; i < valuator_mask_size(&mask); i++) {
- if (i >= pDev->valuator->numAxes)
+ if ( !pDev->valuator || (i >= pDev->valuator->numAxes))
break;
if (!valuator_mask_isset(&mask, i))
diff --git a/xorg-server/hw/xfree86/dri2/dri2.c b/xorg-server/hw/xfree86/dri2/dri2.c
index 591ff3ace..babf32f13 100644
--- a/xorg-server/hw/xfree86/dri2/dri2.c
+++ b/xorg-server/hw/xfree86/dri2/dri2.c
@@ -107,6 +107,7 @@ typedef struct _DRI2Screen {
DRI2AuthMagicProcPtr AuthMagic;
DRI2ReuseBufferNotifyProcPtr ReuseBufferNotify;
DRI2SwapLimitValidateProcPtr SwapLimitValidate;
+ DRI2GetParamProcPtr GetParam;
HandleExposuresProcPtr HandleExposures;
@@ -1210,6 +1211,11 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
ds->SwapLimitValidate = info->SwapLimitValidate;
}
+ if (info->version >= 7) {
+ ds->GetParam = info->GetParam;
+ cur_minor = 4;
+ }
+
/*
* if the driver doesn't provide an AuthMagic function or the info struct
* version is too low, it relies on the old method (using libdrm) or fail
@@ -1332,3 +1338,38 @@ DRI2Version(int *major, int *minor)
if (minor != NULL)
*minor = DRI2VersRec.minorversion;
}
+
+int
+DRI2GetParam(ClientPtr client,
+ DrawablePtr drawable,
+ CARD64 param,
+ BOOL *is_param_recognized,
+ CARD64 *value)
+{
+ DRI2ScreenPtr ds = DRI2GetScreen(drawable->pScreen);
+ char high_byte = (param >> 24);
+
+ switch (high_byte) {
+ case 0:
+ /* Parameter names whose high_byte is 0 are reserved for the X
+ * server. The server currently recognizes no parameters.
+ */
+ goto not_recognized;
+ case 1:
+ /* Parameter names whose high byte is 1 are reserved for the DDX. */
+ if (ds->GetParam)
+ return ds->GetParam(client, drawable, param,
+ is_param_recognized, value);
+ else
+ goto not_recognized;
+ default:
+ /* Other parameter names are reserved for future use. They are never
+ * recognized.
+ */
+ goto not_recognized;
+ }
+
+not_recognized:
+ *is_param_recognized = FALSE;
+ return Success;
+}
diff --git a/xorg-server/hw/xfree86/dri2/dri2.h b/xorg-server/hw/xfree86/dri2/dri2.h
index 00b3668cc..f849be67a 100644
--- a/xorg-server/hw/xfree86/dri2/dri2.h
+++ b/xorg-server/hw/xfree86/dri2/dri2.h
@@ -176,9 +176,23 @@ typedef Bool (*DRI2SwapLimitValidateProcPtr) (DrawablePtr pDraw,
int swap_limit);
/**
+ * \brief Get the value of a parameter.
+ *
+ * The parameter's \a value is looked up on the screen associated with
+ * \a pDrawable.
+ *
+ * \return \c Success or error code.
+ */
+typedef int (*DRI2GetParamProcPtr) (ClientPtr client,
+ DrawablePtr pDrawable,
+ CARD64 param,
+ BOOL *is_param_recognized,
+ CARD64 *value);
+
+/**
* Version of the DRI2InfoRec structure defined in this header
*/
-#define DRI2INFOREC_VERSION 6
+#define DRI2INFOREC_VERSION 7
typedef struct {
unsigned int version; /**< Version of this struct */
@@ -211,6 +225,10 @@ typedef struct {
DRI2ReuseBufferNotifyProcPtr ReuseBufferNotify;
DRI2SwapLimitValidateProcPtr SwapLimitValidate;
+
+ /* added in version 7 */
+
+ DRI2GetParamProcPtr GetParam;
} DRI2InfoRec, *DRI2InfoPtr;
extern _X_EXPORT int DRI2EventBase;
@@ -308,4 +326,10 @@ extern _X_EXPORT void DRI2WaitMSCComplete(ClientPtr client, DrawablePtr pDraw,
int frame, unsigned int tv_sec,
unsigned int tv_usec);
+extern _X_EXPORT int DRI2GetParam(ClientPtr client,
+ DrawablePtr pDrawable,
+ CARD64 param,
+ BOOL *is_param_recognized,
+ CARD64 *value);
+
#endif
diff --git a/xorg-server/hw/xfree86/dri2/dri2ext.c b/xorg-server/hw/xfree86/dri2/dri2ext.c
index 61578f3c1..c6f5b4e11 100644
--- a/xorg-server/hw/xfree86/dri2/dri2ext.c
+++ b/xorg-server/hw/xfree86/dri2/dri2ext.c
@@ -535,6 +535,37 @@ ProcDRI2WaitSBC(ClientPtr client)
}
static int
+ProcDRI2GetParam(ClientPtr client)
+{
+ REQUEST(xDRI2GetParamReq);
+ xDRI2GetParamReply rep;
+ DrawablePtr pDrawable;
+ CARD64 value;
+ int status;
+
+ REQUEST_SIZE_MATCH(xDRI2GetParamReq);
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+
+ if (!validDrawable(client, stuff->drawable, DixReadAccess,
+ &pDrawable, &status))
+ return status;
+
+ status = DRI2GetParam(client, pDrawable, stuff->param,
+ &rep.is_param_recognized, &value);
+ rep.value_hi = value >> 32;
+ rep.value_lo = value & 0xffffffff;
+
+ if (status != Success)
+ return status;
+
+ WriteToClient(client, sizeof(xDRI2GetParamReply), &rep);
+
+ return status;
+}
+
+static int
ProcDRI2Dispatch(ClientPtr client)
{
REQUEST(xReq);
@@ -572,6 +603,8 @@ ProcDRI2Dispatch(ClientPtr client)
return ProcDRI2WaitSBC(client);
case X_DRI2SwapInterval:
return ProcDRI2SwapInterval(client);
+ case X_DRI2GetParam:
+ return ProcDRI2GetParam(client);
default:
return BadRequest;
}
diff --git a/xorg-server/xkb/XKBMAlloc.c b/xorg-server/xkb/XKBMAlloc.c
index 645e90544..3ffd5dad1 100644
--- a/xorg-server/xkb/XKBMAlloc.c
+++ b/xorg-server/xkb/XKBMAlloc.c
@@ -375,8 +375,10 @@ XkbResizeKeyType(XkbDescPtr xkb,
nResize = 0;
for (nTotal = 1, i = xkb->min_key_code; i <= xkb->max_key_code; i++) {
width = XkbKeyGroupsWidth(xkb, i);
- if (width < type->num_levels)
+ if (width < type->num_levels || width >= new_num_lvls) {
+ nTotal += XkbKeyNumSyms(xkb,i);
continue;
+ }
for (match = 0, g = XkbKeyNumGroups(xkb, i) - 1;
(g >= 0) && (!match); g--) {
if (XkbKeyKeyTypeIndex(xkb, i, g) == type_ndx) {
@@ -384,7 +386,7 @@ XkbResizeKeyType(XkbDescPtr xkb,
match = 1;
}
}
- if ((!match) || (width >= new_num_lvls))
+ if (!match)
nTotal += XkbKeyNumSyms(xkb, i);
else {
nTotal += XkbKeyNumGroups(xkb, i) * new_num_lvls;
diff --git a/xorg-server/xkeyboard-config/symbols/is b/xorg-server/xkeyboard-config/symbols/is
index f8e0ce133..e5f5d82a5 100644
--- a/xorg-server/xkeyboard-config/symbols/is
+++ b/xorg-server/xkeyboard-config/symbols/is
@@ -21,14 +21,14 @@ xkb_symbols "basic" {
key <AE12> { [ minus, underscore, dead_cedilla, dead_ogonek ] };
key <AD11> { [ eth, ETH, dead_diaeresis, dead_abovering ] };
- key <AD12> { [apostrophe, question, dead_tilde, dead_macron ] };
+ key <AD12> { [apostrophe, question, asciitilde, dead_macron ] };
key <AC10> { [ ae, AE, asciicircum, dead_doubleacute ] };
key <AC11> { [dead_acute, dead_acute, dead_circumflex, dead_caron ] };
key <TLDE> { [dead_abovering, dead_diaeresis, notsign, hyphen ] };
// <AC12> = <BKSL>
- key <BKSL> { [ plus, asterisk, dead_grave, dead_breve ] };
+ key <BKSL> { [ plus, asterisk, grave, dead_breve ] };
// <AB00> = <LSGT>, is in file "pc": pc105
key <AB10> { [ thorn, THORN, dead_belowdot, dead_abovedot ] };