- Implement the save/load handler for this feature
- Check the "Use Click Sound" item state accordingly depending if it's enabled or disabled
- Use PlaySoundW() to play the wave sound file from resource
- Add the WAV sound click file. The work is made thanks to Midori Mizuno
24 files changed:
add_rc_deps(rsrc.rc ${osk_rc_deps})
add_executable(osk main.c settings.c rsrc.rc)
set_module_type(osk win32gui UNICODE)
add_rc_deps(rsrc.rc ${osk_rc_deps})
add_executable(osk main.c settings.c rsrc.rc)
set_module_type(osk win32gui UNICODE)
-add_importlibs(osk comdlg32 shell32 user32 gdi32 advapi32 comctl32 msvcrt kernel32)
+add_importlibs(osk comdlg32 shell32 user32 gdi32 advapi32 comctl32 msvcrt kernel32 winmm)
add_cd_file(TARGET osk DESTINATION reactos/system32 FOR all)
add_cd_file(TARGET osk DESTINATION reactos/system32 FOR all)
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
- MENUITEM "&Use Click Sound", IDM_CLICK_SOUND, GRAYED
+ MENUITEM "&Use Click Sound", IDM_CLICK_SOUND
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
- MENUITEM "&Use Click Sound", IDM_CLICK_SOUND, GRAYED
+ MENUITEM "&Use Click Sound", IDM_CLICK_SOUND
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
- MENUITEM "&Use Click Sound", IDM_CLICK_SOUND, GRAYED
+ MENUITEM "&Use Click Sound", IDM_CLICK_SOUND
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
- MENUITEM "&Use Click Sound", IDM_CLICK_SOUND, GRAYED
+ MENUITEM "&Use Click Sound", IDM_CLICK_SOUND
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
- MENUITEM "&Use Click Sound", IDM_CLICK_SOUND, GRAYED
+ MENUITEM "&Use Click Sound", IDM_CLICK_SOUND
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
- MENUITEM "&Use Click Sound", IDM_CLICK_SOUND, GRAYED
+ MENUITEM "&Use Click Sound", IDM_CLICK_SOUND
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
- MENUITEM "&Use Click Sound", IDM_CLICK_SOUND, GRAYED
+ MENUITEM "&Use Click Sound", IDM_CLICK_SOUND
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
- MENUITEM "&Use Click Sound", IDM_CLICK_SOUND, GRAYED
+ MENUITEM "&Use Click Sound", IDM_CLICK_SOUND
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
- MENUITEM "&Use Click Sound", IDM_CLICK_SOUND, GRAYED
+ MENUITEM "&Use Click Sound", IDM_CLICK_SOUND
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
- MENUITEM "&Use Click Sound", IDM_CLICK_SOUND, GRAYED
+ MENUITEM "&Use Click Sound", IDM_CLICK_SOUND
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Sempre in primo piano", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Sempre in primo piano", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
- MENUITEM "&Usa suono al click", IDM_CLICK_SOUND, GRAYED
+ MENUITEM "&Usa suono al click", IDM_CLICK_SOUND
MENUITEM SEPARATOR
MENUITEM "&Modalità di scrittura...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
MENUITEM SEPARATOR
MENUITEM "&Modalità di scrittura...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
- MENUITEM "&Use Click Sound", IDM_CLICK_SOUND, GRAYED
+ MENUITEM "&Use Click Sound", IDM_CLICK_SOUND
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Întotdeauna în sus", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Întotdeauna în sus", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
- MENUITEM "&Folosește sunetul de clic", IDM_CLICK_SOUND, GRAYED
+ MENUITEM "&Folosește sunetul de clic", IDM_CLICK_SOUND
MENUITEM SEPARATOR
MENUITEM "&Modalitatea de scriere...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
MENUITEM SEPARATOR
MENUITEM "&Modalitatea de scriere...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
- MENUITEM "&Use Click Sound", IDM_CLICK_SOUND, GRAYED
+ MENUITEM "&Use Click Sound", IDM_CLICK_SOUND
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
- MENUITEM "&Use Click Sound", IDM_CLICK_SOUND, GRAYED
+ MENUITEM "&Use Click Sound", IDM_CLICK_SOUND
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
- MENUITEM "&Use Click Sound", IDM_CLICK_SOUND, GRAYED
+ MENUITEM "&Use Click Sound", IDM_CLICK_SOUND
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
BEGIN
MENUITEM "Always on Top", IDM_ON_TOP, CHECKED, GRAYED
MENUITEM SEPARATOR
- MENUITEM "&Use Click Sound", IDM_CLICK_SOUND, GRAYED
+ MENUITEM "&Use Click Sound", IDM_CLICK_SOUND
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
MENUITEM SEPARATOR
MENUITEM "&Typing Mode...", IDM_TYPE_MODE, GRAYED
MENUITEM SEPARATOR
CheckMenuItem(GetMenu(hDlg), IDM_ENHANCED_KB, MF_BYCOMMAND | MF_UNCHECKED);
}
CheckMenuItem(GetMenu(hDlg), IDM_ENHANCED_KB, MF_BYCOMMAND | MF_UNCHECKED);
}
+ /* Check if the "Click Sound" option was chosen before (and if so, then tick the menu item) */
+ if (Globals.bSoundClick)
+ {
+ CheckMenuItem(GetMenu(hDlg), IDM_CLICK_SOUND, MF_BYCOMMAND | MF_CHECKED);
+ }
+
/* Set the application's icon */
hIcon = LoadImageW(Globals.hInstance, MAKEINTRESOURCEW(IDI_OSK), IMAGE_ICON, 0, 0, LR_SHARED | LR_DEFAULTSIZE);
hIconSm = CopyImage(hIcon, IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_COPYFROMRESOURCE);
/* Set the application's icon */
hIcon = LoadImageW(Globals.hInstance, MAKEINTRESOURCEW(IDI_OSK), IMAGE_ICON, 0, 0, LR_SHARED | LR_DEFAULTSIZE);
hIconSm = CopyImage(hIcon, IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_COPYFROMRESOURCE);
SendInput(1, &Input, sizeof(Input));
}
SendInput(1, &Input, sizeof(Input));
}
+ /* Play the sound during clicking event (only if "Use Click Sound" menu option is ticked) */
+ if (Globals.bSoundClick)
+ {
+ PlaySoundW(MAKEINTRESOURCEW(IDI_SOUNDCLICK), GetModuleHandle(NULL), SND_RESOURCE | SND_ASYNC);
+ }
+
+ case IDM_CLICK_SOUND:
+ {
+ /*
+ This case is triggered when the user attempts to click on the menu item. Before doing anything,
+ we must check the condition state of such menu item so that we can tick/untick the menu item accordingly.
+ */
+ if (!Globals.bSoundClick)
+ {
+ Globals.bSoundClick = TRUE;
+ CheckMenuItem(GetMenu(hDlg), IDM_CLICK_SOUND, MF_BYCOMMAND | MF_CHECKED);
+ }
+ else
+ {
+ Globals.bSoundClick = FALSE;
+ CheckMenuItem(GetMenu(hDlg), IDM_CLICK_SOUND, MF_BYCOMMAND | MF_UNCHECKED);
+ }
+
+ break;
+ }
+
case IDM_ABOUT:
{
OSK_About();
case IDM_ABOUT:
{
OSK_About();
HWND hActiveWnd;
BOOL bShowWarning;
BOOL bIsEnhancedKeyboard;
HWND hActiveWnd;
BOOL bShowWarning;
BOOL bIsEnhancedKeyboard;
} OSK_GLOBALS;
/* DEFINES ********************************************************************/
} OSK_GLOBALS;
/* DEFINES ********************************************************************/
#define MAIN_DIALOG_ENHANCED_KB 2000
#define MAIN_DIALOG_STANDARD_KB 2001
#define MAIN_DIALOG_ENHANCED_KB 2000
#define MAIN_DIALOG_STANDARD_KB 2001
+#define IDI_SOUNDCLICK 50
+
#define IDC_LED_NUM 100
#define IDC_LED_CAPS 101
#define IDC_LED_SCROLL 102
#define IDC_LED_NUM 100
#define IDC_LED_CAPS 101
#define IDC_LED_SCROLL 102
#include <reactos/version.rc>
#include <reactos/version.rc>
-IDI_OSK ICON "res/osk.ico"
+IDI_OSK ICON "res/osk.ico"
+IDI_SOUNDCLICK WAVE "res/click.wav"
IDI_BACK ICON "res/back.ico"
IDI_BACK ICON "res/back.ico"
{
HKEY hKey;
LONG lResult;
{
HKEY hKey;
LONG lResult;
- DWORD dwShowWarningData, dwLayout;
+ DWORD dwShowWarningData, dwLayout, dwSoundOnClick;
DWORD cbData = sizeof(DWORD);
DWORD cbData = sizeof(DWORD);
- /* Set the structure members to TRUE */
+ /* Set the structure members to TRUE (and the bSoundClick member to FALSE) */
Globals.bShowWarning = TRUE;
Globals.bIsEnhancedKeyboard = TRUE;
Globals.bShowWarning = TRUE;
Globals.bIsEnhancedKeyboard = TRUE;
+ Globals.bSoundClick = FALSE;
/* Open the key, so that we can query it */
lResult = RegOpenKeyExW(HKEY_CURRENT_USER,
/* Open the key, so that we can query it */
lResult = RegOpenKeyExW(HKEY_CURRENT_USER,
/* Load the dialog layout value */
Globals.bIsEnhancedKeyboard = (dwLayout != 0);
/* Load the dialog layout value */
Globals.bIsEnhancedKeyboard = (dwLayout != 0);
+
+ /* Query the key */
+ lResult = RegQueryValueExW(hKey,
+ L"OnSoundClick",
+ 0,
+ 0,
+ (BYTE *)&dwSoundOnClick,
+ &cbData);
+
+ if (lResult != ERROR_SUCCESS)
+ {
+ /* Bail out and return FALSE if we fail */
+ RegCloseKey(hKey);
+ return FALSE;
+ }
+
+ /* Load the sound on click value event */
+ Globals.bSoundClick = (dwSoundOnClick != 0);
/* If we're here then we succeed, close the key and return TRUE */
RegCloseKey(hKey);
/* If we're here then we succeed, close the key and return TRUE */
RegCloseKey(hKey);
{
HKEY hKey;
LONG lResult;
{
HKEY hKey;
LONG lResult;
- DWORD dwShowWarningData, dwLayout;
+ DWORD dwShowWarningData, dwLayout, dwSoundOnClick;
/* If no key has been made, create one */
lResult = RegCreateKeyExW(HKEY_CURRENT_USER,
/* If no key has been made, create one */
lResult = RegCreateKeyExW(HKEY_CURRENT_USER,
+ /* The value will be appended to the sound on click event */
+ dwSoundOnClick = Globals.bSoundClick;
+
+ lResult = RegSetValueExW(hKey,
+ L"OnSoundClick",
+ 0,
+ REG_DWORD,
+ (BYTE *)&dwSoundOnClick,
+ sizeof(dwSoundOnClick));
+
+ if (lResult != ERROR_SUCCESS)
+ {
+ /* Bail out and return FALSE if we fail */
+ RegCloseKey(hKey);
+ return FALSE;
+ }
+
/* If we're here then we succeed, close the key and return TRUE */
RegCloseKey(hKey);
return TRUE;
/* If we're here then we succeed, close the key and return TRUE */
RegCloseKey(hKey);
return TRUE;