1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
15:
16: 17: 18: 19: 20: 21:
22:
23: #include "kbpd.h"
24:
25:
26:
27: 28: 29:
30: EXPORT ER kpNotifyEvent( void *evt, W size )
31: {
32: ER ercd;
33:
34:
35: if ( kpMgrInfo.eventMbf == InvalidID ) return E_OK;
36:
37:
38: ercd = tk_snd_mbf(kpMgrInfo.eventMbf, evt, size, TMO_FEVR);
39: if ( ercd != E_OK ) {
40: DEBUG_PRINT(("kpNotifyEvent, tk_snd_mbf err = %d\n", ercd));
41: return ercd;
42: }
43:
44: return E_OK;
45: }
46:
47: 48: 49:
50: EXPORT ER kpNotifyMetaEvent( void )
51: {
52: KeyEvt keyEvt;
53: ER err;
54:
55:
56: keyEvt.h.evttyp = TDE_KEYMETA;
57: keyEvt.keytop = 0;
58: keyEvt.code = 0;
59: keyEvt.stat = kpMgrInfo.kpState.stat;
60:
61:
62: err = kpNotifyEvent(&keyEvt, sizeof(keyEvt));
63: if ( err != E_OK ) {
64: DEBUG_PRINT(("kpNotifyMetaEvent, err = %d\n", err));
65: return err;
66: }
67:
68: return E_OK;
69: }
70:
71: 72: 73:
74: EXPORT ER kpNotifyPdEvent( TDEvtTyp devEvt, UW nodsp )
75: {
76: PdEvt pdEvt;
77: ER err;
78:
79:
80: kpMgrInfo.kpState.stat.nodsp = nodsp;
81:
82:
83: pdEvt.h.evttyp = devEvt;
84: pdEvt.stat = kpMgrInfo.kpState;
85:
86:
87: err = kpNotifyEvent(&pdEvt, sizeof(pdEvt));
88: if ( err != E_OK ) {
89: DEBUG_PRINT(("kpNotifyPdEvent, err = %d\n", err));
90: return err;
91: }
92:
93: return E_OK;
94: }
95:
96:
97:
98: 99: 100:
101: EXPORT UH kpToKeycode( KeyTop keytop, KpMetaBut *meta )
102: {
103: #define keyTab kbdef->keyDef.keytab
104:
105: KbDef *kbdef;
106: W sel;
107: UH code;
108:
109: kbdef = GetKbDef(meta->o.kbsel, keytop.u.kid);
110: if ( kbdef == NULL ) {
111: 112:
113: kbdef = GetKbDef(0, keytop.u.kid);
114: if ( kbdef == NULL ) return InvalidKeycode;
115: }
116:
117: if ( keytop.u.kcode >= keyTab.keymax ) return InvalidKeycode;
118:
119: sel = (*(UW*)meta & 0xfc) >> 2;
120: code = keyTab.kct[keyTab.keymax * keyTab.kctsel[sel] + keytop.u.kcode];
121:
122: return code;
123:
124: #undef keyTab
125: }
126:
127: 128: 129: 130: 131:
132: EXPORT W kpGetKeyKind( KeyTop keytop )
133: {
134: UH code;
135:
136:
137: code = kpToKeycode(keytop, (KpMetaBut*)&kpMgrInfo.kpState.stat);
138:
139: switch ( code ) {
140:
141: case KC_SHT_R: return SK_SHIFT_R;
142: case KC_SHT_L: return SK_SHIFT_L;
143: case KC_EXP: return SK_EXPANSION;
144: case KC_CMD: return SK_COMMAND;
145:
146:
147: case KC_CC_U: return IK_CC_U;
148: case KC_CC_D: return IK_CC_D;
149: case KC_CC_R: return IK_CC_R;
150: case KC_CC_L: return IK_CC_L;
151: }
152: return NormalKey;
153: }
154:
155: 156: 157: 158:
159: EXPORT BOOL kpChangeShiftLock( InnEvtType type, ShiftKeyKind skind )
160: {
161: KpMetaBut meta;
162: KpMetaBut *stat = (KpMetaBut*)&kpMgrInfo.kpState.stat;
163:
164: meta.o = kpMgrInfo.kpState.stat;
165:
166: if ( (type & IE_BUTUP) != 0 ) type = IE_BUTUP;
167:
168: switch ( type ) {
169: case IE_KEYUP:
170: case IE_BUTUP:
171: meta.u.tmpShift = 0;
172: break;
173:
174: case IE_S_REL:
175: meta.u.tmpShift &= ~skind;
176: meta.u.shiftLock &= ~skind;
177: break;
178:
179: case IE_S_SCLK:
180: if ( kpMgrInfo.kb.keyMode.tslock ) {
181:
182: if ( (meta.u.shiftLock & skind) != 0 ) {
183: meta.u.shiftLock &= ~skind;
184: break;
185: }
186: if ( (meta.u.tmpShift & skind) != 0 ) {
187: meta.u.tmpShift &= ~skind;
188: meta.u.shiftLock |= skind;
189: break;
190: }
191: meta.u.tmpShift |= skind;
192: } else {
193: if ( (meta.u.shiftLock & skind) == 0 ) {
194: meta.u.tmpShift ^= skind;
195: } else {
196: meta.u.shiftLock &= ~skind;
197: }
198: }
199: break;
200:
201: case IE_S_DCLK:
202: meta.u.tmpShift &= ~skind;
203: meta.u.shiftLock |= skind;
204: break;
205:
206: default:
207: return FALSE;
208: }
209:
210: if ( meta.u.tmpShift == stat->u.tmpShift
211: && meta.u.shiftLock == stat->u.shiftLock ) return FALSE;
212:
213:
214: stat->u.tmpShift = meta.u.tmpShift;
215: stat->u.shiftLock = meta.u.shiftLock;
216: stat->u.shift = meta.u.tmpShift | meta.u.shiftLock | kpMgrInfo.spress;
217:
218: return TRUE;
219: }
220:
221: 222: 223:
224: EXPORT W kpKeyTopCode( KeyTop keytop, UW kbsel )
225: {
226: KbDef *kbdef;
227: W keytopcode, keytopofs;
228:
229: kbdef = GetKbDef(kbsel, keytop.u.kid);
230: if ( kbdef == NULL ) {
231: 232:
233: kbdef = GetKbDef(0, keytop.u.kid);
234: }
235: keytopofs = ( kbdef == NULL )? 0: kbdef->keyDef.keytopofs;
236:
237: keytopcode = keytop.u.kcode + keytopofs;
238: if ( keytopcode >= KEYMAX ) return InvalidKeytop;
239:
240: return keytopcode;
241: }
242:
243: 244: 245:
246: EXPORT void kpSetOrResetKeyMap( KeyTop keytop, UW kbsel, UW press )
247: {
248: W i;
249: UB *idx;
250:
251: if ( (i = kpKeyTopCode(keytop, kbsel)) != InvalidKeytop ) {
252: idx = &kpMgrInfo.kb.keyMap[i >> 3];
253: if ( press ) *idx |= 0x80 >> (i & 7);
254: else *idx &= ~0x80 >> (i & 7);
255: }
256: }
257:
258: 259: 260:
261: EXPORT void kpAllResetKeyMap( void )
262: {
263: MEMSET(kpMgrInfo.kb.keyMap, 0, sizeof(KeyMap));
264: }
265:
266:
267:
268: 269: 270: 271: 272:
273: EXPORT void kpPdPreProcess( PdInput *msg )
274: {
275: if ( kpMgrInfo.pd.pdMode.attr.reverse ) {
276:
277: if ( msg->stat.xyrev && !msg->stat.abs ) {
278:
279: msg->xpos = - msg->xpos;
280: msg->ypos = - msg->ypos;
281: }
282: if ( msg->stat.butrev ) {
283:
284: SWAP(UW, msg->stat.main, msg->stat.sub);
285: }
286: }
287:
288: if ( kpMgrInfo.pd.pdMode.attr.qpress ) {
289: if ( msg->stat.onebut && msg->stat.qpress ) {
290:
291: msg->stat.main = 1;
292: }
293: }
294: }
295:
296: 297: 298:
299: LOCAL H normalizePositionX( W xpos )
300: {
301: #define xmax (kpMgrInfo.pd.pdRange.xmax)
302:
303: if ( xpos < 0 ) return 0;
304: if ( xpos >= xmax ) return xmax - 1;
305: return xpos;
306:
307: #undef xmax
308: }
309:
310: 311: 312:
313: LOCAL H normalizePositionY( W ypos )
314: {
315: #define ymax (kpMgrInfo.pd.pdRange.ymax)
316:
317: if ( ypos < 0 ) return 0;
318: if ( ypos >= ymax ) return ymax - 1;
319: return ypos;
320:
321: #undef ymax
322: }
323:
324: 325: 326: 327: 328:
329: EXPORT BOOL kpMovePointer( W xpos, W ypos )
330: {
331: xpos = normalizePositionX(xpos);
332: ypos = normalizePositionY(ypos);
333:
334: if ( kpMgrInfo.kpState.xpos == xpos
335: && kpMgrInfo.kpState.ypos == ypos ) return FALSE;
336:
337:
338: kpMgrInfo.kpState.xpos = xpos;
339: kpMgrInfo.kpState.ypos = ypos;
340:
341: return TRUE;
342: }
343:
344: 345: 346:
347: EXPORT ER kpMovePointerAndNotify( H xpos, H ypos )
348: {
349: BOOL move;
350: ER err = E_OK;
351:
352:
353: move = kpMovePointer(xpos, ypos);
354:
355: if ( move ) {
356:
357: err = kpNotifyPdEvent(TDE_PDMOVE, 0);
358: }
359:
360: return err;
361: }
362:
363: 364: 365: 366:
367: EXPORT TDEvtTyp kpPdMoveEvent( InnerEvent *evt )
368: {
369: W x, y;
370: TDEvtTyp devEvt = 0;
371:
372: x = evt->i.pd.x;
373: y = evt->i.pd.y;
374:
375: if ( evt->i.pd.stat.o.abs ) {
376:
377: PdRange *range = &kpMgrInfo.pd.pdRange;
378:
379: x = range->xmax * x / PDIN_XMAX;
380: y = range->ymax * y / PDIN_YMAX;
381:
382: #if 0
383: if ( !kpMgrInfo.pd.pdMode.attr.absolute
384: && !evt->i.pd.stat.o.norel ) {
385:
386: if ( evt->i.pd.stat.o.vst ) {
387:
388: kpMgrInfo.firstXpos = x;
389: kpMgrInfo.firstYpos = y;
390: }
391:
392: x = x - kpMgrInfo.firstXpos;
393: y = y - kpMgrInfo.firstYpos;
394:
395: kpMgrInfo.firstXpos += x;
396: kpMgrInfo.firstYpos += y;
397: x += kpMgrInfo.kpState.xpos;
398: y += kpMgrInfo.kpState.ypos;
399: }
400: #endif
401: } else {
402:
403: x += kpMgrInfo.kpState.xpos;
404: y += kpMgrInfo.kpState.ypos;
405: }
406:
407:
408: if ( kpMovePointer(x, y) ) {
409: devEvt = TDE_PDMOVE;
410: }
411:
412: return devEvt;
413: }
414:
415: 416: 417: 418:
419: EXPORT TDEvtTyp kpPdButEvent( InnerEvent *evt )
420: {
421: if ( (evt->type & IE_MBUTDOWN) != 0 ) {
422: kpMgrInfo.kpState.stat.main = 1;
423: }
424: if ( (evt->type & IE_MBUTUP) != 0 ) {
425: kpMgrInfo.kpState.stat.main = 0;
426: }
427: if ( (evt->type & IE_SBUTDOWN) != 0 ) {
428: kpMgrInfo.kpState.stat.sub = 1;
429: }
430: if ( (evt->type & IE_SBUTUP) != 0 ) {
431: kpMgrInfo.kpState.stat.sub = 0;
432: }
433:
434: return TDE_PDBUT;
435: }