diff --git a/reactos/baseaddress.rbuild b/reactos/baseaddress.rbuild
index 7bada9e0b75..a8498f83ca0 100644
--- a/reactos/baseaddress.rbuild
+++ b/reactos/baseaddress.rbuild
@@ -7,6 +7,7 @@
+
diff --git a/reactos/dll/cpl/cpl.rbuild b/reactos/dll/cpl/cpl.rbuild
index 8f6dd3d388d..4049431b428 100644
--- a/reactos/dll/cpl/cpl.rbuild
+++ b/reactos/dll/cpl/cpl.rbuild
@@ -19,6 +19,9 @@
+
+
+
diff --git a/reactos/dll/cpl/joy/joy.c b/reactos/dll/cpl/joy/joy.c
new file mode 100644
index 00000000000..70dcb2a5aee
--- /dev/null
+++ b/reactos/dll/cpl/joy/joy.c
@@ -0,0 +1,302 @@
+/*
+ * ReactOS
+ * Copyright (C) 2004 ReactOS Team
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ *
+ * PROJECT: ReactOS Software Control Panel
+ * FILE: dll/cpl/joy/joy.c
+ * PURPOSE: ReactOS Software Control Panel
+ * PROGRAMMER: Dmitry Chapyshev (lentind@yandex.ru)
+ * UPDATE HISTORY:
+ * 10-18-2007 Created
+ */
+
+#include "joy.h"
+
+#define NUM_APPLETS (1)
+
+LONG CALLBACK SystemApplet(VOID);
+HINSTANCE hApplet = 0;
+HWND MainDlg;
+
+/* Applets */
+
+APPLET Applets[NUM_APPLETS] =
+{
+ {IDI_CPLSYSTEM, IDS_CPLSYSTEMNAME, IDS_CPLSYSTEMDESCRIPTION, SystemApplet}
+};
+
+VOID AddColumns(HWND hList)
+{
+ LV_COLUMN dummy;
+ RECT rect;
+ int Size;
+ TCHAR szBuf[256];
+
+ GetClientRect(hList, &rect);
+ ZeroMemory(&dummy, sizeof(LV_COLUMN));
+ dummy.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
+ dummy.iSubItem = 0;
+ LoadString(hApplet, IDS_STATUS, szBuf, sizeof(szBuf) / sizeof(TCHAR));
+ dummy.pszText = (LPTSTR)szBuf;
+ Size = rect.right - rect.left - 250;
+ dummy.cx = Size;
+ (void)ListView_InsertColumn(hList, 0, &dummy);
+
+ GetClientRect(hList, &rect);
+ ZeroMemory(&dummy, sizeof(LV_COLUMN));
+ dummy.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
+ dummy.iSubItem = 0;
+ LoadString(hApplet, IDS_CONTROLLER, szBuf, sizeof(szBuf) / sizeof(TCHAR));
+ dummy.pszText = (LPTSTR)szBuf;
+ dummy.cx = rect.right - rect.left - Size;
+ (void)ListView_InsertColumn(hList, 0, &dummy);
+}
+
+INT_PTR CALLBACK
+AdvancedPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ UNREFERENCED_PARAMETER(lParam);
+
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+
+ break;
+
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDOK:
+ EndDialog(hwndDlg,LOWORD(wParam));
+ break;
+ case IDCANCEL:
+ EndDialog(hwndDlg,LOWORD(wParam));
+ break;
+ }
+ break;
+ case WM_NOTIFY:
+
+ break;
+ case WM_SYSCOMMAND:
+ switch (LOWORD(wParam))
+ {
+ case SC_CONTEXTHELP:
+ // not implemented
+ break;
+ }
+ break;
+ }
+ return 0;
+}
+
+INT_PTR CALLBACK
+CustomPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ UNREFERENCED_PARAMETER(lParam);
+
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+
+ break;
+
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDOK:
+ EndDialog(hwndDlg,LOWORD(wParam));
+ break;
+ case IDCANCEL:
+ EndDialog(hwndDlg,LOWORD(wParam));
+ break;
+ }
+ break;
+ case WM_NOTIFY:
+
+ break;
+ case WM_SYSCOMMAND:
+ switch (LOWORD(wParam))
+ {
+ case SC_CONTEXTHELP:
+ // not implemented
+ break;
+ }
+ break;
+ }
+ return 0;
+}
+
+INT_PTR CALLBACK
+AddPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ UNREFERENCED_PARAMETER(lParam);
+
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+
+ break;
+
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDC_CUSTOM_BUTTON:
+ DialogBox(hApplet,
+ MAKEINTRESOURCE(IDD_CUSTOM),
+ hwndDlg,
+ CustomPageProc);
+ break;
+ case IDOK:
+ EndDialog(hwndDlg,LOWORD(wParam));
+ break;
+ case IDCANCEL:
+ EndDialog(hwndDlg,LOWORD(wParam));
+ break;
+ }
+ break;
+ case WM_NOTIFY:
+
+ break;
+ case WM_SYSCOMMAND:
+ switch (LOWORD(wParam))
+ {
+ case SC_CONTEXTHELP:
+ // not implemented
+ break;
+ }
+ break;
+ }
+ return 0;
+}
+
+/* Property page dialog callback */
+INT_PTR CALLBACK
+MainPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ UNREFERENCED_PARAMETER(lParam);
+
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ AddColumns(GetDlgItem(hwndDlg,IDC_CONTROLLER_LIST));
+ break;
+
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDC_ADD_BUTTON:
+ DialogBox(hApplet,
+ MAKEINTRESOURCE(IDD_ADD),
+ hwndDlg,
+ AddPageProc);
+ break;
+ case IDC_ADVANCED_BUTTON:
+ DialogBox(hApplet,
+ MAKEINTRESOURCE(IDD_ADVANCED),
+ hwndDlg,
+ AdvancedPageProc);
+ break;
+ case IDOK:
+ EndDialog(hwndDlg,LOWORD(wParam));
+ break;
+ }
+ break;
+ case WM_NOTIFY:
+
+ break;
+ case WM_SYSCOMMAND:
+ switch (LOWORD(wParam))
+ {
+ case SC_CLOSE:
+ EndDialog(hwndDlg,LOWORD(wParam));
+ break;
+ case SC_CONTEXTHELP:
+ // not implemented
+ break;
+ }
+ break;
+ }
+ return 0;
+}
+
+/* First Applet */
+LONG CALLBACK
+SystemApplet(VOID)
+{
+ DialogBox(hApplet,
+ MAKEINTRESOURCE(IDD_PROPPAGEMAIN),
+ MainDlg,
+ MainPageProc);
+
+ return (LONG)TRUE;
+}
+
+/* Control Panel Callback */
+LONG CALLBACK
+CPlApplet(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
+{
+ CPLINFO *CPlInfo;
+ DWORD i;
+
+ UNREFERENCED_PARAMETER(hwndCPl);
+
+ i = (DWORD)lParam1;
+ switch (uMsg)
+ {
+ case CPL_INIT:
+ return TRUE;
+
+ case CPL_GETCOUNT:
+ return NUM_APPLETS;
+
+ case CPL_INQUIRE:
+ CPlInfo = (CPLINFO*)lParam2;
+ CPlInfo->lData = 0;
+ CPlInfo->idIcon = Applets[i].idIcon;
+ CPlInfo->idName = Applets[i].idName;
+ CPlInfo->idInfo = Applets[i].idDescription;
+ break;
+
+ case CPL_DBLCLK:
+ {
+ MainDlg = hwndCPl;
+ Applets[i].AppletProc();
+ }
+ break;
+ }
+
+ return FALSE;
+}
+
+BOOL WINAPI
+DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
+{
+ UNREFERENCED_PARAMETER(lpvReserved);
+
+ switch (dwReason)
+ {
+ case DLL_PROCESS_ATTACH:
+ case DLL_THREAD_ATTACH:
+ CoInitialize(NULL);
+ hApplet = hinstDLL;
+ break;
+ }
+
+ return TRUE;
+}
diff --git a/reactos/dll/cpl/joy/joy.def b/reactos/dll/cpl/joy/joy.def
new file mode 100644
index 00000000000..a8754e417e4
--- /dev/null
+++ b/reactos/dll/cpl/joy/joy.def
@@ -0,0 +1,6 @@
+LIBRARY joy.cpl
+
+EXPORTS
+CPlApplet
+
+; EOF
diff --git a/reactos/dll/cpl/joy/joy.h b/reactos/dll/cpl/joy/joy.h
new file mode 100644
index 00000000000..7983e80f23b
--- /dev/null
+++ b/reactos/dll/cpl/joy/joy.h
@@ -0,0 +1,40 @@
+#ifndef __CPL_JOY_H
+#define __CPL_JOY_H
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "resource.h"
+
+typedef LONG (CALLBACK *CPLAPPLET_PROC)(VOID);
+
+typedef struct
+{
+ int idIcon;
+ int idName;
+ int idDescription;
+ CPLAPPLET_PROC AppletProc;
+} APPLET, *PAPPLET;
+
+typedef struct
+{
+ WCHAR szTarget[MAX_PATH];
+ WCHAR szWorkingDirectory[MAX_PATH];
+ WCHAR szDescription[MAX_PATH];
+ WCHAR szLinkName[MAX_PATH];
+}CREATE_LINK_CONTEXT, *PCREATE_LINK_CONTEXT;
+
+
+extern HINSTANCE hApplet;
+
+void ShowLastWin32Error(HWND hWndOwner);
+
+#endif /* __CPL_JOY_H */
+
+/* EOF */
diff --git a/reactos/dll/cpl/joy/joy.rbuild b/reactos/dll/cpl/joy/joy.rbuild
new file mode 100644
index 00000000000..f277e79a79b
--- /dev/null
+++ b/reactos/dll/cpl/joy/joy.rbuild
@@ -0,0 +1,19 @@
+
+
+
+
+ .
+
+ 0x600
+ 0x501
+ kernel32
+ advapi32
+ user32
+ comctl32
+ msvcrt
+ ole32
+ uuid
+ shell32
+ joy.c
+ joy.rc
+
diff --git a/reactos/dll/cpl/joy/joy.rc b/reactos/dll/cpl/joy/joy.rc
new file mode 100644
index 00000000000..32775a52c72
--- /dev/null
+++ b/reactos/dll/cpl/joy/joy.rc
@@ -0,0 +1,20 @@
+#include "resource.h"
+#include
+
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+
+#define REACTOS_VERSION_DLL
+#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Software Control Panel\0"
+#define REACTOS_STR_INTERNAL_NAME "joy\0"
+#define REACTOS_STR_ORIGINAL_FILENAME "joy.cpl\0"
+#ifdef _MSC_VER
+#include <../../../reactos/version.rc>
+#else
+#include
+#endif
+
+123 24 DISCARDABLE "manifest.xml"
+
+IDI_CPLSYSTEM ICON "resources/applet.ico"
+
+#include "rsrc.rc"
diff --git a/reactos/dll/cpl/joy/lang/en-US.rc b/reactos/dll/cpl/joy/lang/en-US.rc
new file mode 100644
index 00000000000..46b08bc9f39
--- /dev/null
+++ b/reactos/dll/cpl/joy/lang/en-US.rc
@@ -0,0 +1,84 @@
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+
+IDD_PROPPAGEMAIN DIALOGEX 0, 0, 252, 205
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_CAPTION
+EXSTYLE WS_EX_CONTEXTHELP
+CAPTION "Game Controllers"
+FONT 8, "MS Shell Dlg"
+{
+ ICON IDI_CPLSYSTEM, -1, 7, 7, 20, 20
+ LTEXT "These settings help you configure the game controllers installed on your computer.", -1, 33, 7, 214, 20, NOT WS_GROUP
+ GROUPBOX "I&nstalled game controllers", -1, 7, 34, 238, 117
+ CONTROL "List1", IDC_CONTROLLER_LIST, "SysListView32", WS_BORDER | WS_GROUP | WS_TABSTOP | 0x0000808D, 14, 44, 224, 80
+ PUSHBUTTON "&Add...", IDC_ADD_BUTTON, 35, 129, 65, 14
+ PUSHBUTTON "&Remove", IDC_REMOVE_BUTTON, 104, 129, 65, 14, WS_DISABLED
+ PUSHBUTTON "&Properties", IDC_PROPERTIES_BUTTON, 173, 129, 65, 14, WS_DISABLED
+ PUSHBUTTON "A&dvanced...", IDC_ADVANCED_BUTTON, 111, 157, 65, 14
+ PUSHBUTTON "&Troubleshoot...", IDC_TROUBLESHOOT_BUTTON, 180, 157, 65, 14
+ PUSHBUTTON "OK", IDOK, 195, 185, 50, 14
+}
+
+IDD_ADD DIALOGEX 0, 0, 265, 200
+STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | WS_POPUPWINDOW | WS_CAPTION
+EXSTYLE WS_EX_CONTEXTHELP
+CAPTION "Add Game Controller"
+FONT 8, "MS Shell Dlg"
+{
+ ICON IDI_CPLSYSTEM, -1, 8, 7, 20, 20
+ LTEXT "Select a game controller from the list below, and then click OK. If your game controller does not appear in the list, click Custom.", -1, 35, 7, 210, 33
+ LTEXT "&Game controllers:", -1, 8, 45, 126, 8
+ LISTBOX IDC_GAME_CONTROLLERS_LIST, 7, 55, 251, 57, LBS_STANDARD | LBS_NOINTEGRALHEIGHT | LBS_WANTKEYBOARDINPUT | WS_HSCROLL | WS_TABSTOP
+ AUTOCHECKBOX "&Enable rudders and pedals", IDC_ENABLE_RUDDERS_CHECKBOX, 7, 114, 100, 10, WS_GROUP
+ LTEXT "&Game Port:", -1, 7, 134, 38, 8, NOT WS_VISIBLE
+ COMBOBOX IDC_GAME_PORT_COMBO, 7, 147, 140, 50, CBS_DROPDOWNLIST | CBS_SORT | NOT WS_VISIBLE | WS_VSCROLL
+ PUSHBUTTON "&Custom...", IDC_CUSTOM_BUTTON, 208, 147, 50, 14
+ CONTROL "", -25525, "STATIC", SS_ETCHEDHORZ, 7, 170, 251, 1
+ DEFPUSHBUTTON "OK", IDOK, 155, 179, 50, 14
+ PUSHBUTTON "Cancel", IDCANCEL, 208, 179, 50, 14
+}
+
+IDD_CUSTOM DIALOGEX 0, 0, 265, 183, 0
+STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | WS_POPUPWINDOW | WS_CAPTION
+EXSTYLE WS_EX_CONTEXTHELP
+CAPTION "Custom Game Controller"
+FONT 8, "MS Shell Dlg"
+{
+ GROUPBOX "Special characteristics", -1, 7, 7, 245, 52
+ AUTORADIOBUTTON "&Joystick", IDC_JOYSTICK_RADIO, 17, 23, 55, 10
+ AUTORADIOBUTTON "&Flight yoke or flight stick", IDC_FLIGHT_YOKE_RADIO, 147, 23, 89, 10
+ AUTORADIOBUTTON "&Game pad", IDC_GAME_PAD_RADIO, 17, 40, 65, 10
+ AUTORADIOBUTTON "&Race car controller", IDC_RACE_CAR_RADIO, 147, 40, 93, 10
+ GROUPBOX "&Axes", -1, 7, 67, 116, 44, WS_GROUP
+ COMBOBOX IDC_AXES_COMBO, 37, 79, 48, 50, CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL
+ AUTORADIOBUTTON "Rudder/Pedals", IDC_RUDDER_PEDALS_RADIO, 14, 97, 63, 10, NOT WS_VISIBLE
+ AUTORADIOBUTTON "Z Axis", IDC_Z_AXIS_RADIO, 81, 97, 35, 10, NOT WS_VISIBLE
+ GROUPBOX "&Buttons", -1, 137, 67, 116, 44
+ COMBOBOX IDC_BUTTONS_COMBO, 178, 79, 48, 50, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL, WS_EX_CLIENTEDGE
+ AUTOCHECKBOX "Includes a &point of view control", IDC_INC_POINT_CHECKBOX, 7, 123, 115, 10
+ LTEXT "C&ontroller name:", -1, 7, 139, 200, 9
+ EDITTEXT IDC_CONTROLLER_NAME_EDIT, 7, 150, 116, 15, ES_AUTOHSCROLL, WS_EX_CLIENTEDGE | WS_EX_STATICEDGE
+ DEFPUSHBUTTON "OK", IDOK, 137, 150, 50, 14
+ PUSHBUTTON "Cancel", IDCANCEL, 203, 150, 50, 14
+}
+
+IDD_ADVANCED DIALOGEX 0, 0, 220, 86
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_CAPTION
+EXSTYLE WS_EX_CONTEXTHELP
+CAPTION "Advanced Settings"
+FONT 8, "MS Shell Dlg"
+{
+ ICON IDI_CPLSYSTEM, -1, 7, 24, 20, 20
+ DEFPUSHBUTTON "OK", IDOK, 106, 65, 50, 14
+ PUSHBUTTON "Cancel", IDCANCEL, 163, 65, 50, 14
+ LTEXT "Select the device you want to use with older programs.", -1, 7, 7, 208, 10
+ LTEXT "&Preferred device:", -1, 34, 24, 70, 10
+ COMBOBOX IDC_PREFERRED_DEV_COMBO, 34, 38, 179, 75, CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL
+}
+
+STRINGTABLE
+BEGIN
+ IDS_CPLSYSTEMNAME "Game Controllers"
+ IDS_CPLSYSTEMDESCRIPTION "Add, remove, and configure game controller hardware such as joysticks and gamepads."
+ IDS_CONTROLLER "Controller"
+ IDS_STATUS "Status"
+END
diff --git a/reactos/dll/cpl/joy/lang/ru-RU.rc b/reactos/dll/cpl/joy/lang/ru-RU.rc
new file mode 100644
index 00000000000..61a88d94697
--- /dev/null
+++ b/reactos/dll/cpl/joy/lang/ru-RU.rc
@@ -0,0 +1,84 @@
+LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
+
+IDD_PROPPAGEMAIN DIALOGEX 0, 0, 252, 205
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_CAPTION
+EXSTYLE WS_EX_CONTEXTHELP
+CAPTION "Игровые устройства"
+FONT 8, "MS Shell Dlg"
+{
+ ICON IDI_CPLSYSTEM, -1, 7, 7, 20, 20
+ LTEXT "Эти параметры позволяют настроить игровые устройства, установленные на компьютере.", -1, 33, 7, 214, 20, NOT WS_GROUP
+ GROUPBOX "Установленные &игровые устройства", -1, 7, 34, 238, 117
+ CONTROL "List1", IDC_CONTROLLER_LIST, "SysListView32", WS_BORDER | WS_GROUP | WS_TABSTOP | 0x0000808D, 14, 44, 224, 80
+ PUSHBUTTON "До&бавить...", IDC_ADD_BUTTON, 35, 129, 65, 14
+ PUSHBUTTON "&Удалить", IDC_REMOVE_BUTTON, 104, 129, 65, 14, WS_DISABLED
+ PUSHBUTTON "Сво&йства", IDC_PROPERTIES_BUTTON, 173, 129, 65, 14, WS_DISABLED
+ PUSHBUTTON "Д&ополнительно...", IDC_ADVANCED_BUTTON, 101, 157, 70, 14
+ PUSHBUTTON "Диа&гностика...", IDC_TROUBLESHOOT_BUTTON, 175, 157, 70, 14
+ PUSHBUTTON "OK", IDOK, 195, 185, 50, 14
+}
+
+IDD_ADD DIALOGEX 0, 0, 265, 200
+STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | WS_POPUPWINDOW | WS_CAPTION
+EXSTYLE WS_EX_CONTEXTHELP
+CAPTION "Добавление игрового устройства"
+FONT 8, "MS Shell Dlg"
+{
+ ICON IDI_CPLSYSTEM, -1, 8, 7, 20, 20
+ LTEXT "Выберите игровой контроллер в расположенном ниже списке и нажмите кнопку ОК. Если ваш игровой контроллер отсутствует в списке, нажмите кнопку ""Другой"".", -1, 35, 7, 210, 33
+ LTEXT "&Игровые устройства:", -1, 8, 45, 126, 8
+ LISTBOX IDC_GAME_CONTROLLERS_LIST, 7, 55, 251, 57, LBS_STANDARD | LBS_NOINTEGRALHEIGHT | LBS_WANTKEYBOARDINPUT | WS_HSCROLL | WS_TABSTOP
+ AUTOCHECKBOX "&Подключить руль или педали", IDC_ENABLE_RUDDERS_CHECKBOX, 7, 114, 120, 10, WS_GROUP
+ LTEXT "&Игровой порт:", -1, 7, 134, 38, 8, NOT WS_VISIBLE
+ COMBOBOX IDC_GAME_PORT_COMBO, 7, 147, 140, 50, CBS_DROPDOWNLIST | CBS_SORT | NOT WS_VISIBLE | WS_VSCROLL
+ PUSHBUTTON "&Другой...", IDC_CUSTOM_BUTTON, 208, 147, 50, 14
+ CONTROL "", -25525, "STATIC", SS_ETCHEDHORZ, 7, 170, 251, 1
+ DEFPUSHBUTTON "OK", IDOK, 155, 179, 50, 14
+ PUSHBUTTON "Отмена", IDCANCEL, 208, 179, 50, 14
+}
+
+IDD_CUSTOM DIALOGEX 0, 0, 265, 183, 0
+STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | WS_POPUPWINDOW | WS_CAPTION
+EXSTYLE WS_EX_CONTEXTHELP
+CAPTION "Особое игровое устройство"
+FONT 8, "MS Shell Dlg"
+{
+ GROUPBOX "Особенности", -1, 7, 7, 245, 52
+ AUTORADIOBUTTON "&Джойстик", IDC_JOYSTICK_RADIO, 17, 23, 55, 10
+ AUTORADIOBUTTON "&Штурвал или рукоятка управления", IDC_FLIGHT_YOKE_RADIO, 100, 23, 143, 10
+ AUTORADIOBUTTON "&Игровой планшет", IDC_GAME_PAD_RADIO, 17, 40, 75, 10
+ AUTORADIOBUTTON "Управление гоночной &автомашиной", IDC_RACE_CAR_RADIO, 100, 40, 143, 10
+ GROUPBOX "&Степень свободы", -1, 7, 67, 116, 44, WS_GROUP
+ COMBOBOX IDC_AXES_COMBO, 37, 79, 48, 50, CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL
+ AUTORADIOBUTTON "Руль управления или педали", IDC_RUDDER_PEDALS_RADIO, 14, 97, 63, 10, NOT WS_VISIBLE
+ AUTORADIOBUTTON "Ось Z", IDC_Z_AXIS_RADIO, 81, 97, 35, 10, NOT WS_VISIBLE
+ GROUPBOX "К&нопки", -1, 137, 67, 116, 44
+ COMBOBOX IDC_BUTTONS_COMBO, 178, 79, 48, 50, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL, WS_EX_CLIENTEDGE
+ AUTOCHECKBOX "Имеется &переключатель POV", IDC_INC_POINT_CHECKBOX, 7, 123, 115, 10
+ LTEXT "&Контролер:", -1, 7, 139, 200, 9
+ EDITTEXT IDC_CONTROLLER_NAME_EDIT, 7, 150, 116, 15, ES_AUTOHSCROLL, WS_EX_CLIENTEDGE | WS_EX_STATICEDGE
+ DEFPUSHBUTTON "OK", IDOK, 137, 150, 50, 14
+ PUSHBUTTON "Отмена", IDCANCEL, 203, 150, 50, 14
+}
+
+IDD_ADVANCED DIALOGEX 0, 0, 220, 86
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_CAPTION
+EXSTYLE WS_EX_CONTEXTHELP
+CAPTION "Дополнительные параметры"
+FONT 8, "MS Shell Dlg"
+{
+ ICON IDI_CPLSYSTEM, -1, 7, 24, 20, 20
+ LTEXT "Выберите устройство, которое следует использовать со старыми программами.", -1, 7, 5, 208, 17
+ LTEXT "&Предпочитаемое устройство:", -1, 34, 24, 180, 10
+ COMBOBOX IDC_PREFERRED_DEV_COMBO, 34, 38, 179, 75, CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL
+ DEFPUSHBUTTON "OK", IDOK, 106, 65, 50, 14
+ PUSHBUTTON "Отмена", IDCANCEL, 163, 65, 50, 14
+}
+
+STRINGTABLE
+BEGIN
+ IDS_CPLSYSTEMNAME "Игровые устройства"
+ IDS_CPLSYSTEMDESCRIPTION "Добавление, удаление и настройка параметров игровых устройств, например, джойстиков или игровых планшетов."
+ IDS_CONTROLLER "Устройство"
+ IDS_STATUS "Состояние"
+END
diff --git a/reactos/dll/cpl/joy/manifest.xml b/reactos/dll/cpl/joy/manifest.xml
new file mode 100644
index 00000000000..4b535606583
--- /dev/null
+++ b/reactos/dll/cpl/joy/manifest.xml
@@ -0,0 +1,24 @@
+
+
+
+ ReactOS System Control Panel
+
+
+
+
+
+
+
+
diff --git a/reactos/dll/cpl/joy/resource.h b/reactos/dll/cpl/joy/resource.h
new file mode 100644
index 00000000000..a2083da057f
--- /dev/null
+++ b/reactos/dll/cpl/joy/resource.h
@@ -0,0 +1,44 @@
+#ifndef __CPL_RESOURCE_H
+#define __CPL_RESOURCE_H
+
+/* icons */
+#define IDI_CPLSYSTEM 102
+
+/* dialogs */
+#define IDD_PROPPAGEMAIN 101
+#define IDD_ADD 119
+#define IDD_CUSTOM 4099
+#define IDD_ADVANCED 8188
+
+/* strings */
+#define IDS_CPLSYSTEMNAME 1076
+#define IDS_CPLSYSTEMDESCRIPTION 1099
+#define IDS_CONTROLLER 1151
+#define IDS_STATUS 1152
+
+/* controls */
+#define IDC_CONTROLLER_LIST 1020
+#define IDC_ADD_BUTTON 1011
+#define IDC_REMOVE_BUTTON 1028
+#define IDC_PROPERTIES_BUTTON 1002
+#define IDC_ADVANCED_BUTTON 1311
+#define IDC_TROUBLESHOOT_BUTTON 1007
+#define IDC_CUSTOM_BUTTON 1169
+#define IDC_GAME_PORT_COMBO 1168
+#define IDC_GAME_CONTROLLERS_LIST 1057
+#define IDC_ENABLE_RUDDERS_CHECKBOX 1000
+#define IDC_JOYSTICK_RADIO 1054
+#define IDC_FLIGHT_YOKE_RADIO 1051
+#define IDC_GAME_PAD_RADIO 1052
+#define IDC_RACE_CAR_RADIO 1053
+#define IDC_AXES_COMBO 1030
+#define IDC_RUDDER_PEDALS_RADIO 1172
+#define IDC_Z_AXIS_RADIO 1174
+#define IDC_BUTTONS_COMBO 1048
+#define IDC_INC_POINT_CHECKBOX 1072
+#define IDC_CONTROLLER_NAME_EDIT 1056
+#define IDC_PREFERRED_DEV_COMBO 8195
+
+#endif /* __CPL_RESOURCE_H */
+
+/* EOF */
diff --git a/reactos/dll/cpl/joy/resources/applet.ico b/reactos/dll/cpl/joy/resources/applet.ico
new file mode 100644
index 00000000000..f3b952f8dc4
Binary files /dev/null and b/reactos/dll/cpl/joy/resources/applet.ico differ
diff --git a/reactos/dll/cpl/joy/rsrc.rc b/reactos/dll/cpl/joy/rsrc.rc
new file mode 100644
index 00000000000..2754a25cc68
--- /dev/null
+++ b/reactos/dll/cpl/joy/rsrc.rc
@@ -0,0 +1,5 @@
+#include "resource.h"
+#include
+
+#include "lang/en-US.rc"
+#include "lang/ru-RU.rc"