Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1231 lines
32 KiB

///////////////////////////////////////////////////////////////////////////////
//
// hotkey.c
// Process Hotket Dialog
//
//
// History:
// 11 May 95 SteveCat
// Ported to Windows NT and Unicode, cleaned up
//
//
// NOTE/BUGS
//
// Copyright (C) 1994-1995 Microsoft Corporation
//
///////////////////////////////////////////////////////////////////////////////
//==========================================================================
// Include files
//==========================================================================
#include "main.h"
#include "rc.h"
#if defined(TAIWAN)
#include "imehelp.h"
#endif
#include <imm.h>
//#include <ime31.h>
#define VK_OEM_SEMICLN 0xba // ; :
#define VK_OEM_EQUAL 0xbb // = +
#define VK_OEM_COMMA 0xbc // , <
#define VK_OEM_MINUS 0xbd // - _
#define VK_OEM_PERIOD 0xbe // . >
#define VK_OEM_SLASH 0xbf // / ?
#define VK_OEM_3 0xc0 // ` ~
#define VK_OEM_LBRACKET 0xdb // [ {
#define VK_OEM_BSLASH 0xdc // \ |
#define VK_OEM_RBRACKET 0xdd // ] }
#define VK_OEM_QUOTE 0xde // ' "
///////////////////////////////////////////////////////////////////////////////
// forward declarations
///////////////////////////////////////////////////////////////////////////////
extern HINSTANCE g_hInst; // from main.c
void HourGlass( BOOL fOn );
BOOL CALLBACK HOTKEYDlg( HWND, UINT, WPARAM, LPARAM );
BOOL InitHOTKEYDlg( HWND );
BOOL SetModifiers( HWND, int );
BOOL ItemChanged( HWND, int );
BOOL SetVKeyValue( HWND, int, UINT );
BOOL SetHotKey( HWND );
BOOL AppendKeyValue( TCHAR *, int, int, UINT, UINT );
BOOL ListBoxChg( HWND );
#if defined(TAIWAN)
#define IMEHELP_FILE "imecpl.hlp" // Help file for the ime control panel
#endif
#if defined(TAIWAN)
// charset
//#define NATIVE_CHARSET CHINESEBIG5_CHARSET
#define NATIVE_LANGUAGE 0x0404
#define PRIVATE_IME_NO 3
#endif
#if defined(CHINA)
// charset
#define NATIVE_LANGUAGE 0x0804
#define PRIVATE_IME_NO 0
#endif
#define PREDEFINED_NO 3
//#define NON_IME_NO PREDEFINED_NO+PRIVATE_IME_NO
#if defined(CHINA)
#define NON_IME_NO 3
#else
#define NON_IME_NO 6
#endif
#define MAX_IME_NO 32
//#define TOTAL_ITEMS_NO NON_IME_NO+MAX_IME_NO
#if defined(CHINA)
#define TOTAL_ITEMS_NO 35
#else
#define TOTAL_ITEMS_NO 38
#endif
#define MAX_KEY_NO 29
#define KEY_VALUE_ADDR 60
#define MAX_LIST_PATH 90
#define LIST_MARGIN 2 // slop for making the list box look good
#define MAX(a,b) ((a)>(b)?(a):(b))
typedef struct
{
UINT idHKName;
DWORD dwHotKeyID;
TCHAR szHKName[MAX_LIST_PATH];
TCHAR szComm[MAX_PATH];
UINT uModifiers;
UINT uVkey;
} HOTKEYDESC;
HOTKEYDESC HKinfo[TOTAL_ITEMS_NO] = {
#if defined(TAIWAN)
{ IDS_RESEND_RESULSTR, IME_ITHOTKEY_RESEND_RESULTSTR, TEXT(""), TEXT(""), 0, 0 },
{ IDS_PREVIOUS_COMPOS, IME_ITHOTKEY_PREVIOUS_COMPOSITION, TEXT(""), TEXT(""), 0, 0 },
{ IDS_UISTYLE_TOGGLE, IME_ITHOTKEY_UISTYLE_TOGGLE, TEXT(""), TEXT(""), 0, 0 },
{ IDS_IME_NONIME_TOG, IME_THOTKEY_IME_NONIME_TOGGLE, TEXT(""), TEXT(""), 0, 0 },
{ IDS_SHAPE_TOGGLE, IME_THOTKEY_SHAPE_TOGGLE, TEXT(""), TEXT(""), 0, 0 },
{ IDS_SYMBOL_TOGGLE, IME_THOTKEY_SYMBOL_TOGGLE, TEXT(""), TEXT(""), 0, 0 },
{ IDS_DIRECT_SWITCH, IME_HOTKEY_DSWITCH_FIRST, TEXT(""), TEXT(""), 0, 0 },
#endif
#if defined(CHINA)
{ IDS_IME_NONIME_TOG, IME_CHOTKEY_IME_NONIME_TOGGLE, TEXT(""), TEXT(""), 0, 0 },
{ IDS_SHAPE_TOGGLE, IME_CHOTKEY_SHAPE_TOGGLE, TEXT(""), TEXT(""), 0, 0 },
{ IDS_SYMBOL_TOGGLE, IME_CHOTKEY_SYMBOL_TOGGLE, TEXT(""), TEXT(""), 0, 0 },
{ IDS_DIRECT_SWITCH, IME_HOTKEY_DSWITCH_FIRST, TEXT(""), TEXT(""), 0, 0 },
#endif
};
typedef struct
{
UINT idVKName;
UINT uVKValue;
TCHAR szVKName[MAX_PATH];
} VKEYDESC;
VKEYDESC VKinfo[] = {
{ IDS_VK_NONE, 0x00, TEXT("") },
{ IDS_VK_SPACE, VK_SPACE, TEXT("") },
{ IDS_VK_PRIOR, VK_PRIOR, TEXT("") },
{ IDS_VK_NEXT, VK_NEXT, TEXT("") },
{ IDS_VK_END, VK_END, TEXT("") },
{ IDS_VK_HOME, VK_HOME, TEXT("") },
{ IDS_VK_F1, VK_F1, TEXT("") },
{ IDS_VK_F2, VK_F2, TEXT("") },
{ IDS_VK_F3, VK_F3, TEXT("") },
{ IDS_VK_F4, VK_F4, TEXT("") },
{ IDS_VK_F5, VK_F5, TEXT("") },
{ IDS_VK_F6, VK_F6, TEXT("") },
{ IDS_VK_F7, VK_F7, TEXT("") },
{ IDS_VK_F8, VK_F8, TEXT("") },
{ IDS_VK_F9, VK_F9, TEXT("") },
{ IDS_VK_F10, VK_F10, TEXT("") },
{ IDS_VK_F11, VK_F11, TEXT("") },
{ IDS_VK_F12, VK_F12, TEXT("") },
{ IDS_VK_OEM_SEMICLN, VK_OEM_SEMICLN, TEXT("") },
{ IDS_VK_OEM_EQUAL, VK_OEM_EQUAL, TEXT("") },
{ IDS_VK_OEM_COMMA, VK_OEM_COMMA, TEXT("") },
{ IDS_VK_OEM_MINUS, VK_OEM_MINUS, TEXT("") },
{ IDS_VK_OEM_PERIOD, VK_OEM_PERIOD, TEXT("") },
{ IDS_VK_OEM_SLASH, VK_OEM_SLASH, TEXT("") },
{ IDS_VK_OEM_3, VK_OEM_3, TEXT("") },
{ IDS_VK_OEM_LBRACKET, VK_OEM_LBRACKET, TEXT("") },
{ IDS_VK_OEM_BSLASH, VK_OEM_BSLASH, TEXT("") },
{ IDS_VK_OEM_RBRACKET, VK_OEM_RBRACKET, TEXT("") },
{ IDS_VK_OEM_QUOTE, VK_OEM_QUOTE, TEXT("") },
};
TCHAR Show_Msg[MAX_PATH];
TCHAR szImeName[MAX_IME_NO][16];
HKL hKLbuf[MAX_IME_NO];
DWORD dwHKID[MAX_IME_NO];
UINT uModifiers_buf[TOTAL_ITEMS_NO];
UINT uVkey_buf[TOTAL_ITEMS_NO];
int nIMEs;
BOOL CALLBACK HOTKEYDlg( HWND hDlg, UINT message , WPARAM wParam, LPARAM lParam )
{
NMHDR FAR *lpnm;
LPPROPSHEETPAGE lpPropSheet = (LPPROPSHEETPAGE)(GetWindowLong( hDlg, DWL_USER ));
#if defined(TAIWAN)
#ifndef WINNT
#pragma data_seg(".text")
#endif
const static DWORD aHotKeyHelpIDs[] = { // Context Help IDs
HOTKEY_LISTBOX, IDH_HOTKEY_LISTBOX,
HOTKEY_COMBOBOX, IDH_HOTKEY_COMBOBOX,
HOTKEY_BUTTON_CTRL, IDH_HOTKEY_BUTTON_CTRL,
HOTKEY_BUTTON_ALT, IDH_HOTKEY_BUTTON_ALT,
HOTKEY_BUTTON_SHIFT, IDH_HOTKEY_BUTTON_SHIFT,
HOTKEY_BUTTON_LEFT, IDH_HOTKEY_BUTTON_LEFT,
HOTKEY_BUTTON_RIGHT, IDH_HOTKEY_BUTTON_RIGHT,
HOTKEY_EDIT, IDH_HOTKEY_EDIT,
0, 0
};
#ifndef WINNT
#pragma data_seg()
#endif
#endif
switch( message )
{
case WM_NOTIFY:
lpnm = (NMHDR FAR *)lParam;
switch( lpnm->code )
{
case PSN_SETACTIVE:
break;
case PSN_KILLACTIVE:
break;
case PSN_APPLY:
HourGlass( TRUE );
SetHotKey( hDlg );
HourGlass( FALSE );
break;
case PSN_RESET:
break;
case PSN_HASHELP:
break;
case PSN_HELP:
break;
default:
return FALSE;
}
break;
case WM_INITDIALOG:
return InitHOTKEYDlg( hDlg );
case WM_DESTROY:
SetWindowLong( hDlg, DWL_USER, (LONG)NULL );
break;
#if defined(TAIWAN)
case WM_HELP:
WinHelp(((LPHELPINFO) lParam)->hItemHandle, IMEHELP_FILE,
HELP_WM_HELP, (DWORD)(LPVOID) aHotKeyHelpIDs);
break;
case WM_CONTEXTMENU: // right mouse click
WinHelp((HWND) wParam, IMEHELP_FILE, HELP_CONTEXTMENU,
(DWORD)(LPVOID) aHotKeyHelpIDs);
break;
#else
case WM_HELP:
break;
#endif
case WM_CONTEXTMENU: // right mouse click
break;
case WM_COMMAND:
switch( LOWORD( wParam ) )
{
case HOTKEY_LISTBOX:
if( HIWORD( wParam ) == LBN_SELCHANGE )
ListBoxChg( hDlg );
break;
case HOTKEY_COMBOBOX:
if( HIWORD(wParam) == CBN_SELCHANGE)
SendMessage(GetParent(hDlg), PSM_CHANGED,
(WPARAM)hDlg, 0L);
if( HIWORD(wParam) == CBN_EDITCHANGE)
SendMessage(GetParent(hDlg), PSM_CHANGED,
(WPARAM)hDlg, 0L);
break;
case HOTKEY_BUTTON_CTRL:
case HOTKEY_BUTTON_ALT:
case HOTKEY_BUTTON_SHIFT:
case HOTKEY_BUTTON_LEFT:
case HOTKEY_BUTTON_RIGHT:
if( HIWORD(wParam) == BN_CLICKED)
SendMessage(GetParent(hDlg), PSM_CHANGED,
(WPARAM)hDlg, 0L);
break;
default:
break;
}
break;
default:
return FALSE;
}
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
//
// InitHOTKEYDlg
//
//
// History:
// 03-20-95 Created.
//
///////////////////////////////////////////////////////////////////////////////
BOOL InitHOTKEYDlg( HWND hDlg )
{
HWND hwndListBox;
HGLOBAL hKLMem;
HKL FAR *lpKLMem;
HKL hKL;
int nLayouts, i, j, nDSmsg, nLen, nSpace, nMode;
DWORD dwID;
INT uModifiers, uVkey;
HDC hDC;
SIZE sSize;
LONG lSpace;
TCHAR szTemp[10] = TEXT(" ");
hDC = GetDC( hDlg );
GetTextExtentPoint32( hDC, szTemp, 1, &sSize );
lSpace = sSize.cx;
hwndListBox = GetDlgItem( hDlg, HOTKEY_LISTBOX );
//
// Get message of Vkey Values
//
for( i = 0; i < MAX_KEY_NO; i++)
{
LoadString( g_hInst, VKinfo[i].idVKName,
VKinfo[i].szVKName, ARRAYSIZE( VKinfo[i].szVKName ) );
}
//
// Get message of hot key Items and add to list box
//
for( i = 0; i < NON_IME_NO; i++)
{
LoadString( g_hInst, HKinfo[i].idHKName,
HKinfo[i].szHKName, ARAYSIZE( HKinfo[i].szHKName ) );
//
// Fill blank after end of string
//
nLen= lstrlen( HKinfo[i].szHKName );
//
// Replace following statement with loop [stevecat]
//
// FillMemory( &HKinfo[i].szHKName[nLen], MAX_LIST_PATH-nLen, TEXT(' '));
//
for( j = 0; j < MAX_LIST_PATH - nLen; j++ )
HKinfo[i].szHKName[ nLen + j ] = TEXT(' ');
HKinfo[i].szHKName[ MAX_LIST_PATH - 1 ] = 0;
GetTextExtentPoint32( hDC, HKinfo[i].szHKName, nLen, &sSize );
nSpace = (260 - sSize.cx) / lSpace;
nMode = (260 - sSize.cx) % lSpace;
nSpace += nLen;
ImmGetHotKey( HKinfo[i].dwHotKeyID, (LPUINT)&uModifiers_buf[i],
(LPUINT)&uVkey_buf[i], NULL );
AppendKeyValue( HKinfo[i].szHKName, nSpace, nMode, uModifiers_buf[i],
uVkey_buf[i]);
SendMessage( hwndListBox,LB_ADDSTRING, 0, (LONG) HKinfo[i].szHKName );
}
LoadString( g_hInst, HKinfo[NON_IME_NO].idHKName,
HKinfo[NON_IME_NO].szHKName,
ARRAYSIZE( HKinfo[NON_IME_NO].szHKName ));
//
// Get message of hot key Comments
//
for( i = 0; i <= NON_IME_NO; i++)
{
#if defined(TAIWAN)
LoadString( g_hInst, IDS_COMM_RESEND_RESULSTR+i,
HKinfo[i].szComm, ARRAYSIZE( HKinfo[i].szComm ) );
#endif
#if defined(CHINA)
LoadString( g_hInst, IDS_IME_NONIME_TOG+i,
HKinfo[i].szComm, ARRAYSIZE( HKinfo[i].szComm ) );
#endif
}
//
// Get IME name
//
nLayouts = GetKeyboardLayoutList( 0, NULL );
hKLMem = GlobalAlloc( GHND, sizeof( HKL ) * nLayouts );
if( !hKLMem )
{
return TRUE;
}
lpKLMem = (HKL FAR *) GlobalLock( hKLMem );
if( !lpKLMem )
{
GlobalFree( hKLMem );
return TRUE;
}
GetKeyboardLayoutList( nLayouts, lpKLMem );
for( i = 0, nIMEs = 0; i < nLayouts; i++ )
{
hKL = *(lpKLMem + i);
if( LOWORD( hKL ) != NATIVE_LANGUAGE )
{
//
// not support other language
//
continue;
}
if( !ImmEscape( hKL, (HIMC) NULL, IME_ESC_IME_NAME, szImeName[ nIMEs ]) )
{
//
// this IME not support this (English)
//
continue;
}
hKLbuf[ nIMEs ] = hKL;
nIMEs++;
}
GlobalUnlock( hKLMem );
GlobalFree( hKLMem );
//
// Initialize Direct Switch IME information
//
for( i = 0; i < MAX_IME_NO; i++ )
{
dwHKID[ i ] = 0;
uModifiers_buf[ NON_IME_NO + i ] = 0;
uVkey_buf[ NON_IME_NO + i ] = 0;
}
//
// Get IME hot key ID & key value
//
for( dwID = IME_HOTKEY_DSWITCH_FIRST; dwID < IME_HOTKEY_DSWITCH_LAST; dwID++ )
{
hKL = 0;
ImmGetHotKey( dwID, (LPUINT)&uModifiers, (LPUINT)&uVkey, &hKL );
if( hKL != 0 )
{
for( i = 0; i < nIMEs; i++ )
{
if( hKL == hKLbuf[ i ] )
{
dwHKID[ i ] = dwID;
uModifiers_buf[ NON_IME_NO + i ] = uModifiers;
uVkey_buf[ NON_IME_NO + i ] = uVkey;
break;
}
}
}
}
//
// Set IME Hot key Item and Hot key value to List Box
//
nDSmsg = lstrlen( HKinfo[ NON_IME_NO ].szHKName );
for( i = 0; i < nIMEs; i++)
{
HKinfo[ NON_IME_NO ].szHKName[ nDSmsg ] = 0;
lstrcat( HKinfo[ NON_IME_NO ].szHKName, szImeName[ i ] );
nLen = lstrlen( HKinfo[ NON_IME_NO ].szHKName );
GetTextExtentPoint32( hDC, HKinfo[ NON_IME_NO ].szHKName, nLen, &sSize );
nSpace = (260 - sSize.cx) / lSpace;
nMode = (260 - sSize.cx) % lSpace;
nSpace += nLen;
//
// Fill blank after end of string
//
nLen = lstrlen( HKinfo[ NON_IME_NO ].szHKName );
//
// Replace following statement with loop [stevecat]
//
// FillMemory( &HKinfo[NON_IME_NO].szHKName[nLen],
// MAX_LIST_PATH - nLen, TEXT(' '));
//
for( j = 0; j < MAX_LIST_PATH - nLen; j++ )
HKinfo[ NON_IME_NO ].szHKName[ nLen + j ] = TEXT(' ');
HKinfo[ NON_IME_NO ].szHKName[ MAX_LIST_PATH - 1 ] = 0;
AppendKeyValue( HKinfo[ NON_IME_NO ].szHKName, nSpace, nMode,
uModifiers_buf[ i + NON_IME_NO ], uVkey_buf[ i + NON_IME_NO ] );
SendMessage( hwndListBox, LB_ADDSTRING, 0,
(LONG) HKinfo[ NON_IME_NO ].szHKName );
}
SendMessage( hwndListBox, LB_SETCURSEL, 0, 0 );
SetModifiers( hDlg, 0 );
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
//
// SetModifiers
//
//
// History:
// 03-20-95 Created.
//
///////////////////////////////////////////////////////////////////////////////
BOOL SetModifiers( HWND hDlg, int lb_addr )
{
UINT uModifiers, uVkey;
uModifiers = uModifiers_buf[lb_addr];
uVkey = uVkey_buf[lb_addr];
//
// Set check box ON/OFF , by check uModifiers mode
//
if( uModifiers & MOD_CONTROL )
SendDlgItemMessage( hDlg, HOTKEY_BUTTON_CTRL, BM_SETCHECK, 1, 0 );
else
SendDlgItemMessage( hDlg, HOTKEY_BUTTON_CTRL, BM_SETCHECK, 0, 0 );
if( uModifiers & MOD_ALT )
SendDlgItemMessage( hDlg, HOTKEY_BUTTON_ALT, BM_SETCHECK, 1, 0 );
else
SendDlgItemMessage( hDlg, HOTKEY_BUTTON_ALT, BM_SETCHECK, 0, 0 );
if( uModifiers & MOD_SHIFT )
SendDlgItemMessage( hDlg, HOTKEY_BUTTON_SHIFT, BM_SETCHECK, 1, 0 );
else
SendDlgItemMessage( hDlg, HOTKEY_BUTTON_SHIFT, BM_SETCHECK, 0, 0 );
if( uModifiers & MOD_LEFT )
SendDlgItemMessage( hDlg, HOTKEY_BUTTON_LEFT, BM_SETCHECK, 1, 0 );
else
SendDlgItemMessage( hDlg, HOTKEY_BUTTON_LEFT, BM_SETCHECK, 0, 0 );
if( uModifiers & MOD_RIGHT )
SendDlgItemMessage( hDlg, HOTKEY_BUTTON_RIGHT, BM_SETCHECK, 1, 0 );
else
SendDlgItemMessage( hDlg, HOTKEY_BUTTON_RIGHT, BM_SETCHECK, 0, 0 );
EnableWindow(GetDlgItem( hDlg, HOTKEY_COMBOBOX), TRUE); //@D01A
EnableWindow(GetDlgItem( hDlg, HOTKEY_BUTTON_CTRL), TRUE); //@D01A
EnableWindow(GetDlgItem( hDlg, HOTKEY_BUTTON_ALT), TRUE); //@D01A
EnableWindow(GetDlgItem( hDlg, HOTKEY_BUTTON_SHIFT), TRUE); //@D01A
#if defined(CHINA)
EnableWindow(GetDlgItem( hDlg, HOTKEY_BUTTON_LEFT), TRUE);
EnableWindow(GetDlgItem( hDlg, HOTKEY_BUTTON_RIGHT), TRUE);
#endif
#if defined(TAIWAN)
if( lb_addr >= NON_IME_NO )
{
EnableWindow( GetDlgItem( hDlg, HOTKEY_BUTTON_LEFT ), TRUE );
EnableWindow( GetDlgItem( hDlg, HOTKEY_BUTTON_RIGHT ), TRUE );
wsprintf( Show_Msg, HKinfo[NON_IME_NO].szComm,
szImeName[lb_addr - NON_IME_NO]);
SetDlgItemText( hDlg, HOTKEY_EDIT, Show_Msg );
}
else
{
if( lb_addr >= PRIVATE_IME_NO )
{
EnableWindow( GetDlgItem( hDlg, HOTKEY_BUTTON_LEFT ), TRUE );
if( HKinfo[lb_addr].dwHotKeyID != IME_THOTKEY_SYMBOL_TOGGLE) //@D01A
{ //@D01A
EnableWindow(GetDlgItem( hDlg, HOTKEY_COMBOBOX), FALSE); //@D01A
EnableWindow(GetDlgItem( hDlg, HOTKEY_BUTTON_CTRL), FALSE); //@D01A
EnableWindow(GetDlgItem( hDlg, HOTKEY_BUTTON_ALT), FALSE); //@D01A
EnableWindow(GetDlgItem( hDlg, HOTKEY_BUTTON_SHIFT), FALSE);//@D01A
} //@D01A
}
else
{
//
// Private IME hot key can not disable Left mode
//
SendDlgItemMessage( hDlg, HOTKEY_BUTTON_LEFT, BM_SETCHECK, 1, 0 );
EnableWindow( GetDlgItem( hDlg, HOTKEY_BUTTON_LEFT ), FALSE );
}
//
// Only Direct Switch IME key can disable Right mode, grayed it.
//
SendDlgItemMessage( hDlg, HOTKEY_BUTTON_RIGHT, BM_SETCHECK, 1, 0 );
EnableWindow( GetDlgItem( hDlg, HOTKEY_BUTTON_RIGHT ), FALSE );
}
#endif
SetDlgItemText( hDlg, HOTKEY_EDIT, HKinfo[lb_addr].szComm );
SetVKeyValue( hDlg, lb_addr, uVkey );
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
//
// SetVKeyValue
//
//
// History:
// 03-20-95 Created.
//
///////////////////////////////////////////////////////////////////////////////
BOOL SetVKeyValue( HWND hDlg, int lb_addr, UINT uVkey )
{
HWND hwndCombo;
DWORD dwIndex;
TCHAR szVKname[10] = TEXT("A");
int i;
static UINT uDSwitch=1;
hwndCombo = GetDlgItem( hDlg, HOTKEY_COMBOBOX );
if( lb_addr >= NON_IME_NO )
{
if( !uDSwitch )
{
SendMessage( hwndCombo, CB_RESETCONTENT, 0,0 );
//
// Add (none) item to list box
//
SendMessage( hwndCombo, CB_ADDSTRING, 0, (LONG) VKinfo[0].szVKName );
for( i = TEXT('0'); i <= TEXT('9'); i++)
{
szVKname[0] = i;
SendMessage( hwndCombo, CB_ADDSTRING, 0, (LONG) szVKname );
}
uDSwitch=1;
}
if( uVkey >= TEXT('0') && uVkey <= TEXT('9'))
{
dwIndex = uVkey - TEXT('0')+1;
SendMessage( hwndCombo, CB_SETCURSEL, dwIndex, 0 );
}
else
{
SendMessage( hwndCombo, CB_SETCURSEL, 0, 0 );
}
}
else
{
if( uDSwitch )
{
SendMessage( hwndCombo, CB_RESETCONTENT, 0, 0 );
for( i = 0; i < MAX_KEY_NO; i++)
{
SendMessage( hwndCombo, CB_ADDSTRING, 0,
(LONG) VKinfo[i].szVKName );
}
for( i = TEXT('A'); i <= TEXT('Z'); i++)
{
szVKname[0] = i;
SendMessage( hwndCombo, CB_ADDSTRING, 0, (LONG) szVKname );
}
uDSwitch = 0;
}
if( uVkey >= TEXT('A') && uVkey <= TEXT('Z'))
{
dwIndex = uVkey - TEXT('A') + MAX_KEY_NO;
SendMessage( hwndCombo, CB_SETCURSEL, dwIndex, 0 );
}
else
{
for( i = 0; i < MAX_KEY_NO; i++)
{
if( uVkey == VKinfo[i].uVKValue )
{
dwIndex = i;
SendMessage( hwndCombo, CB_SETCURSEL, dwIndex, 0 );
break;
}
}
if( i == MAX_KEY_NO )
{
// wsprintf( Show_Msg, TEXT("uVkey = %x"),uVkey );
// MessageBox( hDlg, Show_Msg, NULL, MB_OK );
SendMessage( hwndCombo, CB_SETCURSEL, 0, 0 );
}
}
}
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
//
// ItemChanged
//
//
// History:
// 03-20-95 Created.
//
///////////////////////////////////////////////////////////////////////////////
BOOL ItemChanged( HWND hDlg, int lb_addr )
{
HWND hwndListBox;
DWORD dwIndex;
int i,cb_addr,nLen;
UINT uModifiers,uVkey;
TCHAR szText[100];
dwIndex = SendMessage( GetDlgItem( hDlg, HOTKEY_COMBOBOX ),
CB_GETCURSEL, 0, 0 );
if( dwIndex == CB_ERR )
{
//
// Check user input null character ?
//
if( SendMessage( GetDlgItem( hDlg, HOTKEY_COMBOBOX ),
WM_GETTEXT, ARRAYSIZE( szText ), (LPARAM) szText ) == 0 )
{
MessageBeep( 0 );
return FALSE;
}
dwIndex = SendMessage( GetDlgItem( hDlg, HOTKEY_COMBOBOX ),
CB_FINDSTRING, (WPARAM)(-1), (LPARAM) szText );
//
// Check user input is on the combo box ?
//
if( dwIndex == CB_ERR )
{
LoadString( g_hInst, IDS_ERR_COMBO_VALUE,
Show_Msg, ARRAYSIZE( Show_Msg ) );
MessageBox( hDlg, Show_Msg, NULL, MB_OK );
return FALSE;
}
}
cb_addr=dwIndex;
if( cb_addr == 0 )
{
if( uVkey_buf[lb_addr] != 0 )
{
//
// User want to remove this hotkey
//
//
// big cause used as temp buffer also
//
TCHAR RemoveMsg[MAX_PATH];
TCHAR DialogMsg[MAX_PATH];
LoadString( g_hInst, IDS_MSG_REMOVEHOTKEY, DialogMsg, MAX_PATH );
LoadString( g_hInst, IDS_MSG_CONFIRM, RemoveMsg, MAX_PATH );
if( MessageBox( hDlg, DialogMsg, RemoveMsg,
MB_ICONQUESTION | MB_YESNO ) != IDYES )
{
return FALSE;
}
}
uModifiers = 0;
uVkey = 0;
}
else
{
//
// Get Vkey value from Combo Box
//
if( lb_addr >= NON_IME_NO )
{
uVkey = TEXT('0') + cb_addr - 1;
}
else
{
if( cb_addr >= MAX_KEY_NO )
{
uVkey = TEXT('A') + cb_addr - MAX_KEY_NO;
}
else
{
uVkey = VKinfo[cb_addr].uVKValue;
}
}
//
// Get Modifiers from Check box
//
uModifiers = 0;
if( SendDlgItemMessage( hDlg, HOTKEY_BUTTON_LEFT, BM_GETCHECK, 0, 0 )
== BST_CHECKED )
uModifiers |= MOD_LEFT;
if( SendDlgItemMessage( hDlg, HOTKEY_BUTTON_RIGHT, BM_GETCHECK, 0, 0 )
== BST_CHECKED )
uModifiers |= MOD_RIGHT;
if( !uModifiers )
{
//
// Left/Right must select at least one
//
LoadString( g_hInst, IDS_ERR_LEFT_RIGHT,
Show_Msg, ARRAYSIZE( Show_Msg ) );
MessageBox( hDlg, Show_Msg, NULL, MB_OK );
return FALSE;
}
if( SendDlgItemMessage( hDlg, HOTKEY_BUTTON_CTRL, BM_GETCHECK, 0, 0 )
== BST_CHECKED )
uModifiers |= MOD_CONTROL;
if( SendDlgItemMessage( hDlg, HOTKEY_BUTTON_ALT, BM_GETCHECK, 0, 0 )
== BST_CHECKED )
uModifiers |= MOD_ALT;
if( SendDlgItemMessage( hDlg, HOTKEY_BUTTON_SHIFT, BM_GETCHECK, 0, 0 )
== BST_CHECKED )
uModifiers |= MOD_SHIFT;
//
// Search Vkey & Modifiers buffer, avoid same hot key
//
for( i = 0; i < nIMEs+NON_IME_NO; i++)
{
if( i == lb_addr )
continue;
if( (uVkey == uVkey_buf[i]) &&
((uModifiers & (MOD_CONTROL | MOD_ALT | MOD_SHIFT ) )
== (uModifiers_buf[i] & (MOD_CONTROL | MOD_ALT | MOD_SHIFT ))))
{
LoadString( g_hInst, IDS_ERR_SAME_HOTKEY,
Show_Msg, ARRAYSIZE( Show_Msg ) );
MessageBox( hDlg, Show_Msg, NULL, MB_OK );
return FALSE;
}
}
}
//
// Check Hot key value had changed
//
if( (uModifiers_buf[lb_addr] != uModifiers ) || (uVkey_buf[lb_addr] != uVkey ))
{
uModifiers_buf[lb_addr] = uModifiers;
uVkey_buf[lb_addr] = uVkey;
hwndListBox = GetDlgItem( hDlg, HOTKEY_LISTBOX );
SendMessage( hwndListBox, LB_GETTEXT, lb_addr, (LONG) szText );
nLen = lstrlen( szText );
//
// Search nonblank address
//
for( i=nLen; i != 0 && szText[i] != TEXT(' '); i--)
;
AppendKeyValue( szText, i+1, 0, uModifiers, uVkey );
SendMessage( hwndListBox, LB_DELETESTRING, lb_addr, 0 );
SendMessage( hwndListBox, LB_INSERTSTRING, lb_addr, (LONG) szText );
SendMessage( GetParent( hDlg ), PSM_CHANGED, (WPARAM)hDlg, 0L );
}
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
//
// SetHotKey
//
//
// History:
// 03-20-95 Created.
//
///////////////////////////////////////////////////////////////////////////////
BOOL SetHotKey( HWND hDlg )
{
HKL hKL;
DWORD dwID,dwIndex;
UINT uModifiers,uVkey;
int i,lb_addr;
//
// First, Get current data
//
dwIndex = SendMessage( GetDlgItem( hDlg, HOTKEY_LISTBOX ),
LB_GETCURSEL, 0, 0 );
lb_addr = dwIndex;
ItemChanged( hDlg, lb_addr );
SetModifiers( hDlg, lb_addr );
//
// Second, remove hot key
//
for( i = 0; i < NON_IME_NO; i++)
{
if( uVkey_buf[i] == 0 )
{
ImmGetHotKey( HKinfo[i].dwHotKeyID, (LPUINT)&uModifiers,
(LPUINT)&uVkey, NULL );
if( !ImmSetHotKey( HKinfo[i].dwHotKeyID, uModifiers,
uVkey_buf[i], NULL ) )
{
// MessageBox( hDlg, TEXT("Internal Error"), NULL, MB_OK );
}
}
}
for( i = 0; i < nIMEs; i++)
{
if( uVkey_buf[i+NON_IME_NO] == 0 )
{
if( dwHKID[i+NON_IME_NO] == 0 )
continue;
ImmGetHotKey( dwHKID[i+NON_IME_NO], (LPUINT)&uModifiers,
(LPUINT)&uVkey, &hKL );
if( !ImmSetHotKey( dwHKID[i+NON_IME_NO], uModifiers,
uVkey_buf[i+NON_IME_NO], hKL ))
{
// wsprintf( Show_Msg,TEXT("ID=%x modi=%x vkey=%x hkl=%x"),dwHKID[i], uModifiers,uVkey_buf[i+NON_IME_NO], hKLbuf[i]);
// MessageBox( hDlg, Show_Msg, TEXT("Internal Error"), MB_OK );
}
}
}
//
// Third, Set new hot key
//
for( i = 0; i < NON_IME_NO; i++)
{
if( uVkey_buf[i] != 0 )
{
if( !ImmSetHotKey( HKinfo[i].dwHotKeyID, uModifiers_buf[i],
uVkey_buf[i], NULL ) )
{
// MessageBox( hDlg, TEXT("Internal Error"), NULL, MB_OK );
}
}
}
for( i = 0; i < nIMEs; i++)
{
if( uVkey_buf[i+NON_IME_NO] != 0 )
{
//
// Check this hot key is new one ?
//
if( dwHKID[i] == 0 )
{
//
// Search a Null ID for new hot key
//
for( dwID = IME_HOTKEY_DSWITCH_FIRST;
dwID<IME_HOTKEY_DSWITCH_LAST; dwID++)
{
if( !ImmGetHotKey( dwID, (LPUINT)&uModifiers,
(LPUINT)&uVkey, &hKL ) )
{
dwHKID[i]=dwID;
break;
}
}
}
//
// Set hot key value
//
if( !ImmSetHotKey( dwHKID[i], uModifiers_buf[i+NON_IME_NO],
uVkey_buf[i+NON_IME_NO], hKLbuf[i]) )
{
// wsprintf( Show_Msg,TEXT("ID=%x modi=%x vkey=%x hkl=%x"),dwHKID[i], uModifiers,uVkey_buf[i+NON_IME_NO], hKLbuf[i]);
// MessageBox( hDlg, Show_Msg, TEXT("Internal Error"), MB_OK );
}
}
}
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
//
// SetHotKey
//
//
// History:
// 03-20-95 Created.
//
///////////////////////////////////////////////////////////////////////////////
BOOL AppendKeyValue( TCHAR *szHkName,
int nSpace,
int nMode,
UINT uModifiers,
UINT uVkey )
{
TCHAR *szKeyValue;
TCHAR szKeyname[2] = TEXT(" ");
int i;
szKeyValue= szHkName;
// szKeyValue[KEY_VALUE_ADDR]=0;
szKeyValue[nSpace]=0;
// for( i=0; i<nMode; i++)
// szKeyValue[nSpace+i]=TEXT('|');
// szKeyValue[nSpace+i]=0;
if( uVkey == 0 )
{
lstrcat( szKeyValue, VKinfo[0].szVKName );
}
else
{
if( uModifiers & MOD_CONTROL )
lstrcat( szKeyValue, TEXT("Ctrl+"));
if( uModifiers & MOD_ALT )
lstrcat( szKeyValue, TEXT("Alt+"));
if( uModifiers & MOD_SHIFT )
lstrcat( szKeyValue, TEXT("Shift+"));
if( (uVkey >= TEXT('0') && uVkey <= TEXT('9')) ||
(uVkey >= TEXT('A') && uVkey <= TEXT('Z')) )
{
szKeyname[0] = (TCHAR)uVkey;
lstrcat( szKeyValue, szKeyname );
}
else
{
for( i = 0; i < MAX_KEY_NO; i++)
{
if( uVkey == VKinfo[i].uVKValue )
{
lstrcat( szKeyValue, VKinfo[i].szVKName );
break;
}
}
if( i == MAX_KEY_NO )
{
//
// internal error, set to <none>
//
lstrcat( szKeyValue, VKinfo[0].szVKName );
}
}
}
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
//
// SetHotKey
//
//
// History:
// 03-20-95 Created.
//
///////////////////////////////////////////////////////////////////////////////
BOOL ListBoxChg( HWND hDlg )
{
DWORD dwIndex;
static int lb_addr = 0;
dwIndex = SendMessage( GetDlgItem( hDlg, HOTKEY_LISTBOX ),
LB_GETCURSEL, 0, 0 );
if( (int)dwIndex != lb_addr )
{
if( !ItemChanged( hDlg, lb_addr ))
{
SendMessage( GetDlgItem( hDlg, HOTKEY_LISTBOX ),
LB_SETCURSEL, (LONG)lb_addr, 0 );
}
else
{
lb_addr = dwIndex;
SetModifiers( hDlg, lb_addr );
}
}
return TRUE;
}