// Copyright status: this file is in the public domain. #include #include "lx.h" #include "proto.h" #include "internal.h" void lx_ChangeKeyboardControl_va(LX_CONN *xc, ...) { va_list ap; int key; int arg_KeyClickPercent; int arg_BellPercent; int arg_BellPitch; int arg_BellDuration; int arg_LED_n; LX_XID arg_LED_action; int proto_LED_action; int arg_Repeat_key; LX_XID arg_Repeat_action; int proto_Repeat_action; unsigned int mask; int o; unsigned char req[40]; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,"lx_ChangeKeyboardControl_va"); return; } lx__nochain(xc); mask = 0; va_start(ap,xc); while <"args"> (1) { key = va_arg(ap,int); #define SIMPLE(name,type,min,max,bit)\ case LX__KCV_##name: \ arg_##name = va_arg(ap,type); \ if ((arg_##name < min) || (arg_##name > max)) \ { lx__bad_call(xc,"lx_ChangeKeyboardControl_va"); \ return; \ } \ mask |= bit; \ break; switch (key) { SIMPLE(KeyClickPercent,int,-128,127,0x0001) SIMPLE(BellPercent,int,-128,127,0x0002) SIMPLE(BellPitch,int,-32768,32767,0x0004) SIMPLE(BellDuration,int,-32768,32767,0x0008) case LX__KCV_LED: arg_LED_n = va_arg(ap,int); if ((arg_LED_n < -1) || (arg_LED_n > 255)) { lx__bad_call(xc,"lx_ChangeKeyboardControl_va"); return; } arg_LED_action = va_arg(ap,unsigned long int); proto_LED_action = lx__keyboardcontrolledaction_to_proto(arg_LED_action); if (proto_LED_action < 0) { lx__bad_call(xc,"lx_ChangeKeyboardControl_va"); return; } mask |= (arg_LED_n < 0) ? 0x0020 : 0x0030; break; case LX__KCV_Repeat: arg_Repeat_key = va_arg(ap,int); if ((arg_Repeat_key < -1) || (arg_Repeat_key > 255)) { lx__bad_call(xc,"lx_ChangeKeyboardControl_va"); return; } arg_Repeat_action = va_arg(ap,unsigned long int); proto_Repeat_action = lx__keyboardcontrolrepeataction_to_proto(arg_Repeat_action); if (proto_Repeat_action < 0) { lx__bad_call(xc,"lx_ChangeKeyboardControl_va"); return; } mask |= (arg_Repeat_key < 0) ? 0x0080 : 0x00c0; break; case LX__CWV_END: break <"args">; default: lx_abort(); break; } #undef SIMPLE } va_end(ap); req[0] = XP_REQ_ChangeKeyboardControl; req[1] = 0; // req[2] and [3] filled in later w_card32(&req[4],mask); o = 8; #define FOO(bit,var) do { if (mask & (bit)) { mask &= ~(bit); w_card32(&req[o],(var)); o += 4; } } while (0) FOO(0x0001,arg_KeyClickPercent); FOO(0x0002,arg_BellPercent); FOO(0x0004,arg_BellPitch); FOO(0x0008,arg_BellDuration); FOO(0x0010,arg_LED_n); FOO(0x0020,proto_LED_action); FOO(0x0040,arg_Repeat_key); FOO(0x0080,proto_Repeat_action); #undef FOO w_card16(&req[2],o>>2); lx__send_req(xc,&req[0],o); }