XKB: Explicitly decode action data

Rather than requiring a one-to-one correspondence between XKM and struct
formats in action data, explicitly fill the action data, so we can break
API.

Signed-off-by: Daniel Stone <daniel@fooishbar.org>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Daniel Stone 2008-10-15 18:07:52 +01:00
parent 699824a357
commit edeb033f29
1 changed files with 91 additions and 7 deletions

View File

@ -417,6 +417,7 @@ xkmSymInterpretDesc wire;
unsigned tmp;
int nRead=0;
XkbCompatMapPtr compat;
XkbAction *act;
if ((tmp= XkmGetCountedString(file,name,100))<1) {
_XkbLibError(_XkbErrBadLength,"ReadXkmCompatMap",0);
@ -447,13 +448,96 @@ XkbCompatMapPtr compat;
interp->virtual_mod= wire.virtualMod;
interp->flags= wire.flags;
interp->act.type= wire.actionType;
interp->act.data[0]= wire.actionData[0];
interp->act.data[1]= wire.actionData[1];
interp->act.data[2]= wire.actionData[2];
interp->act.data[3]= wire.actionData[3];
interp->act.data[4]= wire.actionData[4];
interp->act.data[5]= wire.actionData[5];
interp->act.data[6]= wire.actionData[6];
act = (XkbAction *) &interp->act;
switch (interp->act.type) {
case XkbSA_SetMods:
case XkbSA_LatchMods:
case XkbSA_LockMods:
act->mods.flags = wire.actionData[0];
act->mods.mask = wire.actionData[1];
act->mods.real_mods = wire.actionData[2];
act->mods.vmods1 = wire.actionData[3];
act->mods.vmods2 = wire.actionData[4];
break;
case XkbSA_SetGroup:
case XkbSA_LatchGroup:
case XkbSA_LockGroup:
act->group.flags = wire.actionData[0];
act->group.group_XXX = wire.actionData[1];
break;
case XkbSA_MovePtr:
act->ptr.flags = wire.actionData[0];
act->ptr.high_XXX = wire.actionData[1];
act->ptr.low_XXX = wire.actionData[2];
act->ptr.high_YYY = wire.actionData[3];
act->ptr.low_YYY = wire.actionData[4];
break;
case XkbSA_PtrBtn:
case XkbSA_LockPtrBtn:
act->btn.flags = wire.actionData[0];
act->btn.count = wire.actionData[1];
act->btn.button = wire.actionData[2];
break;
case XkbSA_DeviceBtn:
case XkbSA_LockDeviceBtn:
act->devbtn.flags = wire.actionData[0];
act->devbtn.count = wire.actionData[1];
act->devbtn.button = wire.actionData[2];
act->devbtn.device = wire.actionData[3];
break;
case XkbSA_SetPtrDflt:
act->dflt.flags = wire.actionData[0];
act->dflt.affect = wire.actionData[1];
act->dflt.valueXXX = wire.actionData[2];
break;
case XkbSA_ISOLock:
act->iso.flags = wire.actionData[0];
act->iso.mask = wire.actionData[1];
act->iso.real_mods = wire.actionData[2];
act->iso.group_XXX = wire.actionData[3];
act->iso.affect = wire.actionData[4];
act->iso.vmods1 = wire.actionData[5];
act->iso.vmods2 = wire.actionData[6];
break;
case XkbSA_SwitchScreen:
act->screen.flags = wire.actionData[0];
act->screen.screenXXX = wire.actionData[1];
break;
case XkbSA_SetControls:
case XkbSA_LockControls:
act->ctrls.flags = wire.actionData[0];
act->ctrls.ctrls3 = wire.actionData[1];
act->ctrls.ctrls2 = wire.actionData[2];
act->ctrls.ctrls1 = wire.actionData[3];
act->ctrls.ctrls0 = wire.actionData[4];
break;
case XkbSA_RedirectKey:
act->redirect.new_key = wire.actionData[0];
act->redirect.mods_mask = wire.actionData[1];
act->redirect.mods = wire.actionData[2];
act->redirect.vmods_mask0 = wire.actionData[3];
act->redirect.vmods_mask1 = wire.actionData[4];
act->redirect.vmods0 = wire.actionData[4];
act->redirect.vmods1 = wire.actionData[5];
break;
case XkbSA_DeviceValuator:
act->devval.device = wire.actionData[0];
act->devval.v1_what = wire.actionData[1];
act->devval.v1_ndx = wire.actionData[2];
act->devval.v1_value = wire.actionData[3];
act->devval.v2_what = wire.actionData[4];
act->devval.v2_ndx = wire.actionData[5];
act->devval.v2_what = wire.actionData[6];
break;
case XkbSA_XFree86Private:
case XkbSA_Terminate:
/* no args, kinda (note: untrue for xfree86). */
break;
case XkbSA_ActionMessage:
/* unsupported. */
break;
}
}
if ((num_si>0)&&(changes)) {
changes->compat.first_si= 0;