chgfctl.c revision 4642e01f
105b261ecSmrg/************************************************************ 205b261ecSmrg 305b261ecSmrgCopyright 1989, 1998 The Open Group 405b261ecSmrg 505b261ecSmrgPermission to use, copy, modify, distribute, and sell this software and its 605b261ecSmrgdocumentation for any purpose is hereby granted without fee, provided that 705b261ecSmrgthe above copyright notice appear in all copies and that both that 805b261ecSmrgcopyright notice and this permission notice appear in supporting 905b261ecSmrgdocumentation. 1005b261ecSmrg 1105b261ecSmrgThe above copyright notice and this permission notice shall be included in 1205b261ecSmrgall copies or substantial portions of the Software. 1305b261ecSmrg 1405b261ecSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1505b261ecSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1605b261ecSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1705b261ecSmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 1805b261ecSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 1905b261ecSmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2005b261ecSmrg 2105b261ecSmrgExcept as contained in this notice, the name of The Open Group shall not be 2205b261ecSmrgused in advertising or otherwise to promote the sale, use or other dealings 2305b261ecSmrgin this Software without prior written authorization from The Open Group. 2405b261ecSmrg 2505b261ecSmrgCopyright 1989 by Hewlett-Packard Company, Palo Alto, California. 2605b261ecSmrg 2705b261ecSmrg All Rights Reserved 2805b261ecSmrg 2905b261ecSmrgPermission to use, copy, modify, and distribute this software and its 3005b261ecSmrgdocumentation for any purpose and without fee is hereby granted, 3105b261ecSmrgprovided that the above copyright notice appear in all copies and that 3205b261ecSmrgboth that copyright notice and this permission notice appear in 3305b261ecSmrgsupporting documentation, and that the name of Hewlett-Packard not be 3405b261ecSmrgused in advertising or publicity pertaining to distribution of the 3505b261ecSmrgsoftware without specific, written prior permission. 3605b261ecSmrg 3705b261ecSmrgHEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 3805b261ecSmrgALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 3905b261ecSmrgHEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 4005b261ecSmrgANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 4105b261ecSmrgWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 4205b261ecSmrgARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 4305b261ecSmrgSOFTWARE. 4405b261ecSmrg 4505b261ecSmrg********************************************************/ 4605b261ecSmrg 4705b261ecSmrg/******************************************************************** 4805b261ecSmrg * 4905b261ecSmrg * Change feedback control attributes for an extension device. 5005b261ecSmrg * 5105b261ecSmrg */ 5205b261ecSmrg 5305b261ecSmrg#define NEED_EVENTS /* for inputstr.h */ 5405b261ecSmrg#define NEED_REPLIES 5505b261ecSmrg#ifdef HAVE_DIX_CONFIG_H 5605b261ecSmrg#include <dix-config.h> 5705b261ecSmrg#endif 5805b261ecSmrg 5905b261ecSmrg#include "inputstr.h" /* DeviceIntPtr */ 6005b261ecSmrg#include <X11/extensions/XI.h> 6105b261ecSmrg#include <X11/extensions/XIproto.h> /* control constants */ 6205b261ecSmrg 6305b261ecSmrg#include "exglobals.h" 6405b261ecSmrg 6505b261ecSmrg#include "chgfctl.h" 6605b261ecSmrg 6705b261ecSmrg#define DO_ALL (-1) 6805b261ecSmrg 6905b261ecSmrg/*********************************************************************** 7005b261ecSmrg * 7105b261ecSmrg * This procedure changes the control attributes for an extension device, 7205b261ecSmrg * for clients on machines with a different byte ordering than the server. 7305b261ecSmrg * 7405b261ecSmrg */ 7505b261ecSmrg 7605b261ecSmrgint 7705b261ecSmrgSProcXChangeFeedbackControl(ClientPtr client) 7805b261ecSmrg{ 7905b261ecSmrg char n; 8005b261ecSmrg 8105b261ecSmrg REQUEST(xChangeFeedbackControlReq); 8205b261ecSmrg swaps(&stuff->length, n); 8305b261ecSmrg REQUEST_AT_LEAST_SIZE(xChangeFeedbackControlReq); 8405b261ecSmrg swapl(&stuff->mask, n); 8505b261ecSmrg return (ProcXChangeFeedbackControl(client)); 8605b261ecSmrg} 8705b261ecSmrg 8805b261ecSmrg/****************************************************************************** 8905b261ecSmrg * 9005b261ecSmrg * This procedure changes KbdFeedbackClass data. 9105b261ecSmrg * 9205b261ecSmrg */ 9305b261ecSmrg 9405b261ecSmrgstatic int 9505b261ecSmrgChangeKbdFeedback(ClientPtr client, DeviceIntPtr dev, long unsigned int mask, 9605b261ecSmrg KbdFeedbackPtr k, xKbdFeedbackCtl * f) 9705b261ecSmrg{ 9805b261ecSmrg char n; 9905b261ecSmrg KeybdCtrl kctrl; 10005b261ecSmrg int t; 10105b261ecSmrg int key = DO_ALL; 10205b261ecSmrg 10305b261ecSmrg if (client->swapped) { 10405b261ecSmrg swaps(&f->length, n); 10505b261ecSmrg swaps(&f->pitch, n); 10605b261ecSmrg swaps(&f->duration, n); 10705b261ecSmrg swapl(&f->led_mask, n); 10805b261ecSmrg swapl(&f->led_values, n); 10905b261ecSmrg } 11005b261ecSmrg 11105b261ecSmrg kctrl = k->ctrl; 11205b261ecSmrg if (mask & DvKeyClickPercent) { 11305b261ecSmrg t = f->click; 11405b261ecSmrg if (t == -1) 11505b261ecSmrg t = defaultKeyboardControl.click; 11605b261ecSmrg else if (t < 0 || t > 100) { 11705b261ecSmrg client->errorValue = t; 1184642e01fSmrg return BadValue; 11905b261ecSmrg } 12005b261ecSmrg kctrl.click = t; 12105b261ecSmrg } 12205b261ecSmrg 12305b261ecSmrg if (mask & DvPercent) { 12405b261ecSmrg t = f->percent; 12505b261ecSmrg if (t == -1) 12605b261ecSmrg t = defaultKeyboardControl.bell; 12705b261ecSmrg else if (t < 0 || t > 100) { 12805b261ecSmrg client->errorValue = t; 1294642e01fSmrg return BadValue; 13005b261ecSmrg } 13105b261ecSmrg kctrl.bell = t; 13205b261ecSmrg } 13305b261ecSmrg 13405b261ecSmrg if (mask & DvPitch) { 13505b261ecSmrg t = f->pitch; 13605b261ecSmrg if (t == -1) 13705b261ecSmrg t = defaultKeyboardControl.bell_pitch; 13805b261ecSmrg else if (t < 0) { 13905b261ecSmrg client->errorValue = t; 1404642e01fSmrg return BadValue; 14105b261ecSmrg } 14205b261ecSmrg kctrl.bell_pitch = t; 14305b261ecSmrg } 14405b261ecSmrg 14505b261ecSmrg if (mask & DvDuration) { 14605b261ecSmrg t = f->duration; 14705b261ecSmrg if (t == -1) 14805b261ecSmrg t = defaultKeyboardControl.bell_duration; 14905b261ecSmrg else if (t < 0) { 15005b261ecSmrg client->errorValue = t; 1514642e01fSmrg return BadValue; 15205b261ecSmrg } 15305b261ecSmrg kctrl.bell_duration = t; 15405b261ecSmrg } 15505b261ecSmrg 15605b261ecSmrg if (mask & DvLed) { 15705b261ecSmrg kctrl.leds &= ~(f->led_mask); 15805b261ecSmrg kctrl.leds |= (f->led_mask & f->led_values); 15905b261ecSmrg } 16005b261ecSmrg 16105b261ecSmrg if (mask & DvKey) { 16205b261ecSmrg key = (KeyCode) f->key; 16305b261ecSmrg if (key < 8 || key > 255) { 16405b261ecSmrg client->errorValue = key; 1654642e01fSmrg return BadValue; 16605b261ecSmrg } 1674642e01fSmrg if (!(mask & DvAutoRepeatMode)) 1684642e01fSmrg return BadMatch; 16905b261ecSmrg } 17005b261ecSmrg 17105b261ecSmrg if (mask & DvAutoRepeatMode) { 17205b261ecSmrg int inx = (key >> 3); 17305b261ecSmrg int kmask = (1 << (key & 7)); 17405b261ecSmrg 17505b261ecSmrg t = (CARD8) f->auto_repeat_mode; 17605b261ecSmrg if (t == AutoRepeatModeOff) { 17705b261ecSmrg if (key == DO_ALL) 17805b261ecSmrg kctrl.autoRepeat = FALSE; 17905b261ecSmrg else 18005b261ecSmrg kctrl.autoRepeats[inx] &= ~kmask; 18105b261ecSmrg } else if (t == AutoRepeatModeOn) { 18205b261ecSmrg if (key == DO_ALL) 18305b261ecSmrg kctrl.autoRepeat = TRUE; 18405b261ecSmrg else 18505b261ecSmrg kctrl.autoRepeats[inx] |= kmask; 18605b261ecSmrg } else if (t == AutoRepeatModeDefault) { 18705b261ecSmrg if (key == DO_ALL) 18805b261ecSmrg kctrl.autoRepeat = defaultKeyboardControl.autoRepeat; 18905b261ecSmrg else 19005b261ecSmrg kctrl.autoRepeats[inx] &= ~kmask; 19105b261ecSmrg kctrl.autoRepeats[inx] = 19205b261ecSmrg (kctrl.autoRepeats[inx] & ~kmask) | 19305b261ecSmrg (defaultKeyboardControl.autoRepeats[inx] & kmask); 19405b261ecSmrg } else { 19505b261ecSmrg client->errorValue = t; 1964642e01fSmrg return BadValue; 19705b261ecSmrg } 19805b261ecSmrg } 19905b261ecSmrg 20005b261ecSmrg k->ctrl = kctrl; 20105b261ecSmrg (*k->CtrlProc) (dev, &k->ctrl); 20205b261ecSmrg return Success; 20305b261ecSmrg} 20405b261ecSmrg 20505b261ecSmrg/****************************************************************************** 20605b261ecSmrg * 20705b261ecSmrg * This procedure changes PtrFeedbackClass data. 20805b261ecSmrg * 20905b261ecSmrg */ 21005b261ecSmrg 21105b261ecSmrgstatic int 21205b261ecSmrgChangePtrFeedback(ClientPtr client, DeviceIntPtr dev, long unsigned int mask, 21305b261ecSmrg PtrFeedbackPtr p, xPtrFeedbackCtl * f) 21405b261ecSmrg{ 21505b261ecSmrg char n; 21605b261ecSmrg PtrCtrl pctrl; /* might get BadValue part way through */ 21705b261ecSmrg 21805b261ecSmrg if (client->swapped) { 21905b261ecSmrg swaps(&f->length, n); 22005b261ecSmrg swaps(&f->num, n); 22105b261ecSmrg swaps(&f->denom, n); 22205b261ecSmrg swaps(&f->thresh, n); 22305b261ecSmrg } 22405b261ecSmrg 22505b261ecSmrg pctrl = p->ctrl; 22605b261ecSmrg if (mask & DvAccelNum) { 22705b261ecSmrg int accelNum; 22805b261ecSmrg 22905b261ecSmrg accelNum = f->num; 23005b261ecSmrg if (accelNum == -1) 23105b261ecSmrg pctrl.num = defaultPointerControl.num; 23205b261ecSmrg else if (accelNum < 0) { 23305b261ecSmrg client->errorValue = accelNum; 2344642e01fSmrg return BadValue; 23505b261ecSmrg } else 23605b261ecSmrg pctrl.num = accelNum; 23705b261ecSmrg } 23805b261ecSmrg 23905b261ecSmrg if (mask & DvAccelDenom) { 24005b261ecSmrg int accelDenom; 24105b261ecSmrg 24205b261ecSmrg accelDenom = f->denom; 24305b261ecSmrg if (accelDenom == -1) 24405b261ecSmrg pctrl.den = defaultPointerControl.den; 24505b261ecSmrg else if (accelDenom <= 0) { 24605b261ecSmrg client->errorValue = accelDenom; 2474642e01fSmrg return BadValue; 24805b261ecSmrg } else 24905b261ecSmrg pctrl.den = accelDenom; 25005b261ecSmrg } 25105b261ecSmrg 25205b261ecSmrg if (mask & DvThreshold) { 25305b261ecSmrg int threshold; 25405b261ecSmrg 25505b261ecSmrg threshold = f->thresh; 25605b261ecSmrg if (threshold == -1) 25705b261ecSmrg pctrl.threshold = defaultPointerControl.threshold; 25805b261ecSmrg else if (threshold < 0) { 25905b261ecSmrg client->errorValue = threshold; 2604642e01fSmrg return BadValue; 26105b261ecSmrg } else 26205b261ecSmrg pctrl.threshold = threshold; 26305b261ecSmrg } 26405b261ecSmrg 26505b261ecSmrg p->ctrl = pctrl; 26605b261ecSmrg (*p->CtrlProc) (dev, &p->ctrl); 26705b261ecSmrg return Success; 26805b261ecSmrg} 26905b261ecSmrg 27005b261ecSmrg/****************************************************************************** 27105b261ecSmrg * 27205b261ecSmrg * This procedure changes IntegerFeedbackClass data. 27305b261ecSmrg * 27405b261ecSmrg */ 27505b261ecSmrg 27605b261ecSmrgstatic int 27705b261ecSmrgChangeIntegerFeedback(ClientPtr client, DeviceIntPtr dev, 27805b261ecSmrg long unsigned int mask, IntegerFeedbackPtr i, 27905b261ecSmrg xIntegerFeedbackCtl * f) 28005b261ecSmrg{ 28105b261ecSmrg char n; 28205b261ecSmrg 28305b261ecSmrg if (client->swapped) { 28405b261ecSmrg swaps(&f->length, n); 28505b261ecSmrg swapl(&f->int_to_display, n); 28605b261ecSmrg } 28705b261ecSmrg 28805b261ecSmrg i->ctrl.integer_displayed = f->int_to_display; 28905b261ecSmrg (*i->CtrlProc) (dev, &i->ctrl); 29005b261ecSmrg return Success; 29105b261ecSmrg} 29205b261ecSmrg 29305b261ecSmrg/****************************************************************************** 29405b261ecSmrg * 29505b261ecSmrg * This procedure changes StringFeedbackClass data. 29605b261ecSmrg * 29705b261ecSmrg */ 29805b261ecSmrg 29905b261ecSmrgstatic int 30005b261ecSmrgChangeStringFeedback(ClientPtr client, DeviceIntPtr dev, 30105b261ecSmrg long unsigned int mask, StringFeedbackPtr s, 30205b261ecSmrg xStringFeedbackCtl * f) 30305b261ecSmrg{ 30405b261ecSmrg char n; 30505b261ecSmrg int i, j; 30605b261ecSmrg KeySym *syms, *sup_syms; 30705b261ecSmrg 30805b261ecSmrg syms = (KeySym *) (f + 1); 30905b261ecSmrg if (client->swapped) { 31005b261ecSmrg swaps(&f->length, n); /* swapped num_keysyms in calling proc */ 31105b261ecSmrg SwapLongs((CARD32 *) syms, f->num_keysyms); 31205b261ecSmrg } 31305b261ecSmrg 3144642e01fSmrg if (f->num_keysyms > s->ctrl.max_symbols) 3154642e01fSmrg return BadValue; 3164642e01fSmrg 31705b261ecSmrg sup_syms = s->ctrl.symbols_supported; 31805b261ecSmrg for (i = 0; i < f->num_keysyms; i++) { 31905b261ecSmrg for (j = 0; j < s->ctrl.num_symbols_supported; j++) 32005b261ecSmrg if (*(syms + i) == *(sup_syms + j)) 32105b261ecSmrg break; 3224642e01fSmrg if (j == s->ctrl.num_symbols_supported) 3234642e01fSmrg return BadMatch; 32405b261ecSmrg } 32505b261ecSmrg 32605b261ecSmrg s->ctrl.num_symbols_displayed = f->num_keysyms; 32705b261ecSmrg for (i = 0; i < f->num_keysyms; i++) 32805b261ecSmrg *(s->ctrl.symbols_displayed + i) = *(syms + i); 32905b261ecSmrg (*s->CtrlProc) (dev, &s->ctrl); 33005b261ecSmrg return Success; 33105b261ecSmrg} 33205b261ecSmrg 33305b261ecSmrg/****************************************************************************** 33405b261ecSmrg * 33505b261ecSmrg * This procedure changes BellFeedbackClass data. 33605b261ecSmrg * 33705b261ecSmrg */ 33805b261ecSmrg 33905b261ecSmrgstatic int 34005b261ecSmrgChangeBellFeedback(ClientPtr client, DeviceIntPtr dev, 34105b261ecSmrg long unsigned int mask, BellFeedbackPtr b, 34205b261ecSmrg xBellFeedbackCtl * f) 34305b261ecSmrg{ 34405b261ecSmrg char n; 34505b261ecSmrg int t; 34605b261ecSmrg BellCtrl bctrl; /* might get BadValue part way through */ 34705b261ecSmrg 34805b261ecSmrg if (client->swapped) { 34905b261ecSmrg swaps(&f->length, n); 35005b261ecSmrg swaps(&f->pitch, n); 35105b261ecSmrg swaps(&f->duration, n); 35205b261ecSmrg } 35305b261ecSmrg 35405b261ecSmrg bctrl = b->ctrl; 35505b261ecSmrg if (mask & DvPercent) { 35605b261ecSmrg t = f->percent; 35705b261ecSmrg if (t == -1) 35805b261ecSmrg t = defaultKeyboardControl.bell; 35905b261ecSmrg else if (t < 0 || t > 100) { 36005b261ecSmrg client->errorValue = t; 3614642e01fSmrg return BadValue; 36205b261ecSmrg } 36305b261ecSmrg bctrl.percent = t; 36405b261ecSmrg } 36505b261ecSmrg 36605b261ecSmrg if (mask & DvPitch) { 36705b261ecSmrg t = f->pitch; 36805b261ecSmrg if (t == -1) 36905b261ecSmrg t = defaultKeyboardControl.bell_pitch; 37005b261ecSmrg else if (t < 0) { 37105b261ecSmrg client->errorValue = t; 3724642e01fSmrg return BadValue; 37305b261ecSmrg } 37405b261ecSmrg bctrl.pitch = t; 37505b261ecSmrg } 37605b261ecSmrg 37705b261ecSmrg if (mask & DvDuration) { 37805b261ecSmrg t = f->duration; 37905b261ecSmrg if (t == -1) 38005b261ecSmrg t = defaultKeyboardControl.bell_duration; 38105b261ecSmrg else if (t < 0) { 38205b261ecSmrg client->errorValue = t; 3834642e01fSmrg return BadValue; 38405b261ecSmrg } 38505b261ecSmrg bctrl.duration = t; 38605b261ecSmrg } 38705b261ecSmrg b->ctrl = bctrl; 38805b261ecSmrg (*b->CtrlProc) (dev, &b->ctrl); 38905b261ecSmrg return Success; 39005b261ecSmrg} 39105b261ecSmrg 39205b261ecSmrg/****************************************************************************** 39305b261ecSmrg * 39405b261ecSmrg * This procedure changes LedFeedbackClass data. 39505b261ecSmrg * 39605b261ecSmrg */ 39705b261ecSmrg 39805b261ecSmrgstatic int 39905b261ecSmrgChangeLedFeedback(ClientPtr client, DeviceIntPtr dev, long unsigned int mask, 40005b261ecSmrg LedFeedbackPtr l, xLedFeedbackCtl * f) 40105b261ecSmrg{ 40205b261ecSmrg char n; 40305b261ecSmrg LedCtrl lctrl; /* might get BadValue part way through */ 40405b261ecSmrg 40505b261ecSmrg if (client->swapped) { 40605b261ecSmrg swaps(&f->length, n); 40705b261ecSmrg swapl(&f->led_values, n); 40805b261ecSmrg swapl(&f->led_mask, n); 40905b261ecSmrg } 41005b261ecSmrg 41105b261ecSmrg f->led_mask &= l->ctrl.led_mask; /* set only supported leds */ 41205b261ecSmrg f->led_values &= l->ctrl.led_mask; /* set only supported leds */ 41305b261ecSmrg if (mask & DvLed) { 41405b261ecSmrg lctrl.led_mask = f->led_mask; 41505b261ecSmrg lctrl.led_values = f->led_values; 41605b261ecSmrg (*l->CtrlProc) (dev, &lctrl); 41705b261ecSmrg l->ctrl.led_values &= ~(f->led_mask); /* zero changed leds */ 41805b261ecSmrg l->ctrl.led_values |= (f->led_mask & f->led_values); /* OR in set leds */ 41905b261ecSmrg } 42005b261ecSmrg 42105b261ecSmrg return Success; 42205b261ecSmrg} 42305b261ecSmrg 42405b261ecSmrg/*********************************************************************** 42505b261ecSmrg * 42605b261ecSmrg * Change the control attributes. 42705b261ecSmrg * 42805b261ecSmrg */ 42905b261ecSmrg 43005b261ecSmrgint 43105b261ecSmrgProcXChangeFeedbackControl(ClientPtr client) 43205b261ecSmrg{ 43305b261ecSmrg unsigned len; 43405b261ecSmrg DeviceIntPtr dev; 43505b261ecSmrg KbdFeedbackPtr k; 43605b261ecSmrg PtrFeedbackPtr p; 43705b261ecSmrg IntegerFeedbackPtr i; 43805b261ecSmrg StringFeedbackPtr s; 43905b261ecSmrg BellFeedbackPtr b; 44005b261ecSmrg LedFeedbackPtr l; 4414642e01fSmrg int rc; 44205b261ecSmrg 44305b261ecSmrg REQUEST(xChangeFeedbackControlReq); 44405b261ecSmrg REQUEST_AT_LEAST_SIZE(xChangeFeedbackControlReq); 44505b261ecSmrg 44605b261ecSmrg len = stuff->length - (sizeof(xChangeFeedbackControlReq) >> 2); 4474642e01fSmrg rc = dixLookupDevice(&dev, stuff->deviceid, client, DixManageAccess); 4484642e01fSmrg if (rc != Success) 4494642e01fSmrg return rc; 45005b261ecSmrg 45105b261ecSmrg switch (stuff->feedbackid) { 45205b261ecSmrg case KbdFeedbackClass: 4534642e01fSmrg if (len != (sizeof(xKbdFeedbackCtl) >> 2)) 4544642e01fSmrg return BadLength; 4554642e01fSmrg 45605b261ecSmrg for (k = dev->kbdfeed; k; k = k->next) 4574642e01fSmrg if (k->ctrl.id == ((xKbdFeedbackCtl *) & stuff[1])->id) 4584642e01fSmrg return ChangeKbdFeedback(client, dev, stuff->mask, k, 4594642e01fSmrg (xKbdFeedbackCtl *) & stuff[1]); 46005b261ecSmrg break; 46105b261ecSmrg case PtrFeedbackClass: 4624642e01fSmrg if (len != (sizeof(xPtrFeedbackCtl) >> 2)) 4634642e01fSmrg return BadLength; 4644642e01fSmrg 46505b261ecSmrg for (p = dev->ptrfeed; p; p = p->next) 4664642e01fSmrg if (p->ctrl.id == ((xPtrFeedbackCtl *) & stuff[1])->id) 4674642e01fSmrg return ChangePtrFeedback(client, dev, stuff->mask, p, 4684642e01fSmrg (xPtrFeedbackCtl *) & stuff[1]); 46905b261ecSmrg break; 47005b261ecSmrg case StringFeedbackClass: 47105b261ecSmrg { 47205b261ecSmrg char n; 47305b261ecSmrg xStringFeedbackCtl *f = ((xStringFeedbackCtl *) & stuff[1]); 47405b261ecSmrg 47505b261ecSmrg if (client->swapped) { 47605b261ecSmrg swaps(&f->num_keysyms, n); 47705b261ecSmrg } 4784642e01fSmrg if (len != ((sizeof(xStringFeedbackCtl) >> 2) + f->num_keysyms)) 4794642e01fSmrg return BadLength; 4804642e01fSmrg 48105b261ecSmrg for (s = dev->stringfeed; s; s = s->next) 4824642e01fSmrg if (s->ctrl.id == ((xStringFeedbackCtl *) & stuff[1])->id) 4834642e01fSmrg return ChangeStringFeedback(client, dev, stuff->mask, s, 4844642e01fSmrg (xStringFeedbackCtl *) & stuff[1]); 48505b261ecSmrg break; 48605b261ecSmrg } 48705b261ecSmrg case IntegerFeedbackClass: 4884642e01fSmrg if (len != (sizeof(xIntegerFeedbackCtl) >> 2)) 4894642e01fSmrg return BadLength; 4904642e01fSmrg 49105b261ecSmrg for (i = dev->intfeed; i; i = i->next) 4924642e01fSmrg if (i->ctrl.id == ((xIntegerFeedbackCtl *) & stuff[1])->id) 4934642e01fSmrg return ChangeIntegerFeedback(client, dev, stuff->mask, i, 4944642e01fSmrg (xIntegerFeedbackCtl *)&stuff[1]); 49505b261ecSmrg break; 49605b261ecSmrg case LedFeedbackClass: 4974642e01fSmrg if (len != (sizeof(xLedFeedbackCtl) >> 2)) 4984642e01fSmrg return BadLength; 4994642e01fSmrg 50005b261ecSmrg for (l = dev->leds; l; l = l->next) 5014642e01fSmrg if (l->ctrl.id == ((xLedFeedbackCtl *) & stuff[1])->id) 5024642e01fSmrg return ChangeLedFeedback(client, dev, stuff->mask, l, 5034642e01fSmrg (xLedFeedbackCtl *) & stuff[1]); 50405b261ecSmrg break; 50505b261ecSmrg case BellFeedbackClass: 5064642e01fSmrg if (len != (sizeof(xBellFeedbackCtl) >> 2)) 5074642e01fSmrg return BadLength; 5084642e01fSmrg 50905b261ecSmrg for (b = dev->bell; b; b = b->next) 5104642e01fSmrg if (b->ctrl.id == ((xBellFeedbackCtl *) & stuff[1])->id) 5114642e01fSmrg return ChangeBellFeedback(client, dev, stuff->mask, b, 5124642e01fSmrg (xBellFeedbackCtl *) & stuff[1]); 51305b261ecSmrg break; 51405b261ecSmrg default: 51505b261ecSmrg break; 51605b261ecSmrg } 51705b261ecSmrg 5184642e01fSmrg return BadMatch; 51905b261ecSmrg} 52005b261ecSmrg 521