From 013f9f9c46b6e57f5ad2fa4161e9c858c1bc51fd Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sat, 2 Jun 2012 12:56:39 +0000 Subject: andalso plusified git-svn-id: http://svn.miranda-ng.org/main/trunk@261 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/KeyboardNotify/keyboard.cpp | 118 ++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 plugins/KeyboardNotify/keyboard.cpp (limited to 'plugins/KeyboardNotify/keyboard.cpp') diff --git a/plugins/KeyboardNotify/keyboard.cpp b/plugins/KeyboardNotify/keyboard.cpp new file mode 100644 index 0000000000..cb77a88827 --- /dev/null +++ b/plugins/KeyboardNotify/keyboard.cpp @@ -0,0 +1,118 @@ +/* + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#define WIN32_LEAN_AND_MEAN + +#include +#include +#include +#include "keypresses.h" +#include +#include + + +// Globals +extern BOOL bWindowsNT; +extern BYTE bEmulateKeypresses; +HANDLE hKbdDev[10] = {INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE}; + +// Defines +#define MAX_KBDHANDLES 10 +#define IOCTL_KEYBOARD_SET_INDICATORS CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0002, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_KEYBOARD_QUERY_TYPEMATIC CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0008, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_KEYBOARD_QUERY_INDICATORS CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0010, METHOD_BUFFERED, FILE_ANY_ACCESS) + +typedef struct _KEYBOARD_INDICATOR_PARAMETERS { + USHORT UnitId; // Unit identifier. + USHORT LedFlags; // LED indicator state. + +} KEYBOARD_INDICATOR_PARAMETERS, *PKEYBOARD_INDICATOR_PARAMETERS; + + +void outportb(UINT portid, BYTE value) +{ + __asm mov edx,portid + __asm mov al,value + __asm out dx,al +} + + +BOOL OpenKeyboardDevice() +{ + int i = 0; + TCHAR aux1[MAX_PATH+1], aux2[MAX_PATH+1]; + + if (!bWindowsNT) + return TRUE; + + do { + _snwprintf(aux1, sizeof(aux1), _T("Kbd%d"), i); + _snwprintf(aux2, sizeof(aux2), _T("\\Device\\KeyboardClass%d"), i); + DefineDosDevice(DDD_RAW_TARGET_PATH, aux1, aux2); + + _snwprintf(aux1, sizeof(aux1), _T("\\\\.\\Kbd%d"), i); + hKbdDev[i] = CreateFile(aux1, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); + + } while (hKbdDev[i] != INVALID_HANDLE_VALUE && ++i < MAX_KBDHANDLES); + + return hKbdDev[0] != INVALID_HANDLE_VALUE; +} + +BOOL ToggleKeyboardLights(BYTE byte) +{ + int i; BOOL result = FALSE; + KEYBOARD_INDICATOR_PARAMETERS InputBuffer; // Input buffer for DeviceIoControl + ULONG DataLength = sizeof(KEYBOARD_INDICATOR_PARAMETERS); + ULONG ReturnedLength; // Number of bytes returned in output buffer + + if (bEmulateKeypresses) + return keypresses_ToggleKeyboardLights(byte); + + if (!bWindowsNT) { + outportb(0x60, 0xED); + Sleep(10); + outportb(0x60, byte); + return TRUE; + } + + InputBuffer.UnitId = 0; + InputBuffer.LedFlags = byte; + + for (i=0; i < MAX_KBDHANDLES && hKbdDev[i] != INVALID_HANDLE_VALUE; i++) + result |= DeviceIoControl(hKbdDev[i], IOCTL_KEYBOARD_SET_INDICATORS, &InputBuffer, DataLength, NULL, 0, &ReturnedLength, NULL); + + return result; +} + +void CloseKeyboardDevice() +{ + int i = 0; + TCHAR aux[MAX_PATH+1]; + + if (!bWindowsNT) + return; + + do { + if (hKbdDev[i] != INVALID_HANDLE_VALUE) + CloseHandle(hKbdDev[i]); + + _snwprintf(aux, sizeof(aux), _T("Kbd%d"), i); + DefineDosDevice(DDD_REMOVE_DEFINITION, aux, NULL); + + } while (hKbdDev[i] != INVALID_HANDLE_VALUE && ++i < MAX_KBDHANDLES); +} -- cgit v1.2.3