2 Copyright 2004-2020 Chris Tallon
4 This file is part of VOMP.
6 VOMP is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 VOMP is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with VOMP. If not, see <https://www.gnu.org/licenses/>.
20 #include "vompreswin.h"
25 #define W_G_HCW(type,code) ( (((ULLONG)(type))<<32) | code)
27 #define W_HCW_VK 1 /* virtual key */
28 #define W_HCW_AP 2 /* App command */
29 #define W_HCW_RI 3 /* remote control */
30 #define W_HCW_CH 4 /* char */
32 const char* InputWin::myModName = "InputWin";
44 if (initted) return false;
46 event = CreateEvent(NULL, /*FALSE*/TRUE, FALSE, NULL);
50 void InputWin::shutdown()
53 Log::getInstance()->log("InputWin", Log::DEBUG, "Shutdown called");
59 UCHAR RemoteWin::getButtonPress(int waitType)
62 how = 1 - start new wait
63 how = 2 - continue wait
80 } else { //We do not distingish between 2 and 3
84 WaitForSingleObject(event,wait);
89 return NA_SIGNAL; //Since we have no signals on windows, we simulate this
101 UCHAR InputWin::TranslateHWCFixed(HWC_TYPE code)
105 case W_G_HCW(W_HCW_VK,VK_DOWN):
107 case W_G_HCW(W_HCW_VK,VK_UP):
109 case W_G_HCW(W_HCW_VK,VK_LEFT):
111 case W_G_HCW(W_HCW_VK,VK_RIGHT):
113 case W_G_HCW(W_HCW_CH,'m'):
115 case W_G_HCW(W_HCW_VK,VK_BACK):
117 case W_G_HCW(W_HCW_VK,VK_RETURN):
118 case W_G_HCW(W_HCW_VK,VK_SPACE):
120 /* Menu IDs, no sense to make it user selectable */
121 case W_G_HCW(W_HCW_AP,APPCOMMAND_BROWSER_BACKWARD):
123 case W_G_HCW(W_HCW_AP,APPCOMMAND_MEDIA_CHANNEL_DOWN):
125 case W_G_HCW(W_HCW_AP,APPCOMMAND_MEDIA_CHANNEL_UP):
127 case W_G_HCW(W_HCW_AP,APPCOMMAND_MEDIA_FAST_FORWARD):
129 case W_G_HCW(W_HCW_AP,APPCOMMAND_VOLUME_MUTE):
131 case W_G_HCW(W_HCW_AP,APPCOMMAND_MEDIA_PAUSE):
133 case W_G_HCW(W_HCW_AP,APPCOMMAND_MEDIA_PLAY):
135 case W_G_HCW(W_HCW_AP,APPCOMMAND_MEDIA_RECORD):
137 case W_G_HCW(W_HCW_AP,APPCOMMAND_MEDIA_PREVIOUSTRACK):
139 case W_G_HCW(W_HCW_AP,APPCOMMAND_MEDIA_REWIND):
141 case W_G_HCW(W_HCW_AP,APPCOMMAND_MEDIA_NEXTTRACK):
143 case W_G_HCW(W_HCW_AP,APPCOMMAND_MEDIA_STOP):
145 case W_G_HCW(W_HCW_AP,APPCOMMAND_VOLUME_DOWN):
147 case W_G_HCW(W_HCW_AP,APPCOMMAND_VOLUME_UP):
149 case W_G_HCW(W_HCW_AP,VOMP_YELLOW):
151 case W_G_HCW(W_HCW_AP,VOMP_BLUE):
153 case W_G_HCW(W_HCW_AP,VOMP_RED):
155 case W_G_HCW(W_HCW_AP,VOMP_GREEN):
157 case W_G_HCW(W_HCW_AP,VOMP_ENTER):
159 case W_G_HCW(W_HCW_AP,VOMP_CANCEL):
161 case W_G_HCW(W_HCW_AP,VOMP_UP):
163 case W_G_HCW(W_HCW_AP,VOMP_DOWN):
165 case W_G_HCW(W_HCW_AP,VOMP_LEFT):
167 case W_G_HCW(W_HCW_AP,VOMP_RIGHT):
176 const char* InputWin::getHardCodedHardwareKeyNameForVompKey(UCHAR vompKey)
191 return tr("Backspace, Back");
193 return tr("Return, Space");
195 return tr("Insrt, C+Insrt, Pg down");
197 return tr("+, C++, Pg up");
225 void InputWin::InitHWCListwithDefaults()
227 //Processing VK_Messages
228 translist[W_G_HCW(W_HCW_CH,'9')] = NINE;
229 translist[W_G_HCW(W_HCW_CH,'8')] = EIGHT;
230 translist[W_G_HCW(W_HCW_CH,'7')] = SEVEN;
231 translist[W_G_HCW(W_HCW_CH,'6')] = SIX;
232 translist[W_G_HCW(W_HCW_CH,'5')] = FIVE;
233 translist[W_G_HCW(W_HCW_CH,'4')] = FOUR;
234 translist[W_G_HCW(W_HCW_CH,'3')] = THREE;
235 translist[W_G_HCW(W_HCW_CH,'2')] = TWO;
236 translist[W_G_HCW(W_HCW_CH,'1')] = ONE;
237 translist[W_G_HCW(W_HCW_CH,'0')] = ZERO;
238 translist[W_G_HCW(W_HCW_CH,'*')] = STAR;
239 translist[W_G_HCW(W_HCW_CH,'#')] = HASH;
240 translist[W_G_HCW(W_HCW_CH,'j')] = GO; //j for JUMP TO instead of go to
241 translist[W_G_HCW(W_HCW_CH,'r')] = RED;
242 translist[W_G_HCW(W_HCW_CH,'g')] = GREEN;
243 translist[W_G_HCW(W_HCW_CH,'y')] = YELLOW;
244 translist[W_G_HCW(W_HCW_CH,'b')] = BLUE;
245 //Processing RI Messages
246 translist[W_G_HCW(W_HCW_RI,0x35c)] = GREEN;
247 translist[W_G_HCW(W_HCW_RI,0x35b)] = RED;
248 translist[W_G_HCW(W_HCW_RI,0x35d)] = YELLOW;
249 translist[W_G_HCW(W_HCW_RI,0x35e)] = BLUE;
250 translist[W_G_HCW(W_HCW_RI,0x30d)] = MENU; //MCE Button, used for Menu
251 translist[W_G_HCW(W_HCW_RI,0x348)] = RECORD; //Record Television
252 translist[W_G_HCW(W_HCW_RI,0x325)] = PLAY; //Playback Televison
253 translist[W_G_HCW(W_HCW_RI,0x324)] = PLAY; //Playback DVD
254 translist[W_G_HCW(W_HCW_RI,0x209)] = OK; //Properties
255 translist[W_G_HCW(W_HCW_RI,0x35a)] = OK; //Teletext?
258 std::string InputWin::getHardwareKeyName(HWC_TYPE hardwareKey)
261 ULONG type = hardwareKey >> 32;
268 ULONG vk = (ULONG)hardwareKey;
269 ULONG scancode = MapVirtualKey(vk,0);
270 GetKeyNameText(scancode << 16, rt, 10);
275 ULONG ch = (ULONG)hardwareKey;
276 ULONG scancode = OemKeyScan(ch);
277 GetKeyNameText(scancode << 16, rt, 10);
282 ULONG ri = (ULONG)hardwareKey;
283 sprintf(rt, "R: %X", ri);
288 std::string retval = rt;
292 int InputWin::ReceiveButtonVK(UINT button)
295 //should we use a translation table ? No APPCOMMAND iS DWORD!
296 switch (button) { //Processing VK_Messages
340 case 'J'://j for JUMP TO instead of go to
358 }; //All other commands are process via APPCOMMAND_MESSAGES
359 if (pb==NA_NONE) return 0;*/
361 UCHAR pb = TranslateHWC(W_G_HCW(W_HCW_VK,button));
362 if (pb==NA_UNKNOWN || pb==NA_NONE) return 0;
374 int InputWin::ReceiveButtonCH(UINT button)
376 UCHAR pb = TranslateHWC(W_G_HCW(W_HCW_CH,button));
377 if (pb==NA_UNKNOWN || pb==NA_NONE) return 0;
390 int InputWin::ReceiveButtonAP(UINT button)
393 //should we use a translation table ? No APPCOMMAND iS DWORD!
394 switch (button) { //Processing VK_Messages
395 case APPCOMMAND_BROWSER_BACKWARD:
397 case APPCOMMAND_MEDIA_CHANNEL_DOWN:
398 pb=CHANNELDOWN;break;
399 case APPCOMMAND_MEDIA_CHANNEL_UP:
401 case APPCOMMAND_MEDIA_FAST_FORWARD:
403 case APPCOMMAND_VOLUME_MUTE:
405 case APPCOMMAND_MEDIA_PAUSE:
407 case APPCOMMAND_MEDIA_PLAY:
409 case APPCOMMAND_MEDIA_RECORD:
411 case APPCOMMAND_MEDIA_PREVIOUSTRACK:
413 case APPCOMMAND_MEDIA_REWIND:
415 case APPCOMMAND_MEDIA_NEXTTRACK:
416 pb=SKIPFORWARD;break;
417 case APPCOMMAND_MEDIA_STOP:
419 case APPCOMMAND_VOLUME_DOWN:
421 case APPCOMMAND_VOLUME_UP:
445 //if (pb==NA_NONE) return 0;
448 UCHAR pb = TranslateHWC(W_G_HCW(W_HCW_AP,button));
449 if (pb==NA_UNKNOWN || pb==NA_NONE) return 0;
461 int InputWin::ReceiveButtonRI(UINT button)
465 /* Note Codes above 0x29c are not listed in the specs on usb.org
466 therefore they are used by try, they might be device dependent
467 thus please supply codes of your remote control */
468 /* switch (button) { //Processing VK_Messages
477 case 0x30d: //MCE Button, used for Menu
479 case 0x348: //Record Television
481 case 0x28d: //Attach File Mmh, how should we assign this
483 case 0x325: //Playback Televison
485 case 0x324: //Playback DVD
487 case 0x209: //Properties
488 case 0x35a: //Teletext?
493 if (pb==NA_NONE) return 0;*/
495 UCHAR pb = TranslateHWC(W_G_HCW(W_HCW_RI,button));
496 if (pb==NA_UNKNOWN || pb==NA_NONE) return 0;
509 void InputWin::Signal()