joy.cpl: Tab for force feedback tests.
diff --git a/dlls/joy.cpl/joy.h b/dlls/joy.cpl/joy.h
index 07c13fa..13efe1b 100644
--- a/dlls/joy.cpl/joy.h
+++ b/dlls/joy.cpl/joy.h
@@ -29,11 +29,22 @@
 
 extern HMODULE hcpl;
 
+struct Effect {
+    IDirectInputEffect *effect;
+    DIEFFECT params;
+    DIEFFECTINFOW info;
+};
+
 struct Joystick {
     IDirectInputDevice8W *device;
     DIDEVICEINSTANCEW instance;
     int num_buttons;
     int num_axes;
+    BOOL forcefeedback;
+    int num_effects;
+    int cur_effect;
+    int chosen_effect;
+    struct Effect *effects;
 };
 
 #define TEST_MAX_BUTTONS    32
@@ -43,6 +54,7 @@
     IDirectInput8W *di;
     struct Joystick *joysticks;
     int num_joysticks;
+    int num_ff;
     int cur_joystick;
     int chosen_joystick;
     HWND buttons[TEST_MAX_BUTTONS];
@@ -76,6 +88,9 @@
 #define IDC_JOYSTICKBUTTON  3000
 #define IDC_JOYSTICKAXES    4000
 
+#define IDC_FFSELECTCOMBO   2009
+#define IDC_FFEFFECTLIST    2010
+
 /* constants */
 #define TEST_POLL_TIME      100
 
@@ -95,4 +110,7 @@
 #define TEST_AXIS_MIN       -40
 #define TEST_AXIS_MAX       40
 
+#define FF_PLAY_TIME        2*DI_SECONDS
+#define FF_PERIOD_TIME      FF_PLAY_TIME/4
+
 #endif
diff --git a/dlls/joy.cpl/joy.rc b/dlls/joy.cpl/joy.rc
index 22d9253..0eb4378 100644
--- a/dlls/joy.cpl/joy.rc
+++ b/dlls/joy.cpl/joy.rc
@@ -59,6 +59,10 @@
 CAPTION "Test Force Feedback"
 FONT 8, "Ms Shell Dlg"
 {
+    COMBOBOX        IDC_FFSELECTCOMBO, 5, 5, 100, 30, CBS_DROPDOWNLIST | CBS_HASSTRINGS
+    LTEXT           "Available Effects", IDC_STATIC, 10, 30, 100, 10
+    LISTBOX         IDC_FFEFFECTLIST, 10, 40, 180, 70, WS_TABSTOP | WS_VSCROLL | LBS_NOTIFY
+    LTEXT           "Press any button in the controller to activate the chosen effect.", IDC_STATIC, 10, 110, 210, 25
 }
 
 #define WINE_FILENAME_STR "joy.cpl"
diff --git a/dlls/joy.cpl/main.c b/dlls/joy.cpl/main.c
index e9b3a72..5c6ccb2 100644
--- a/dlls/joy.cpl/main.c
+++ b/dlls/joy.cpl/main.c
@@ -88,6 +88,9 @@
 
     joystick->num_buttons = caps.dwButtons;
     joystick->num_axes = caps.dwAxes;
+    joystick->forcefeedback = caps.dwFlags & DIDC_FORCEFEEDBACK;
+
+    if (joystick->forcefeedback) data->num_ff++;
 
     return DIENUM_CONTINUE;
 }
@@ -111,10 +114,19 @@
  */
 static void destroy_joysticks(struct JoystickData *data)
 {
-    int i;
+    int i, j;
 
     for (i = 0; i < data->num_joysticks; i++)
     {
+
+        if (data->joysticks[i].forcefeedback)
+        {
+            for (j = 0; j < data->joysticks[i].num_effects; j++)
+            IDirectInputEffect_Release(data->joysticks[i].effects[j].effect);
+
+            HeapFree(GetProcessHeap(), 0, data->joysticks[i].effects);
+        }
+
         IDirectInputDevice8_Unacquire(data->joysticks[i].device);
         IDirectInputDevice8_Release(data->joysticks[i].device);
     }
@@ -437,6 +449,255 @@
     return FALSE;
 }
 
+/*********************************************************************
+ * Joystick force feedback testing functions
+ *
+ */
+
+static void initialize_effects_list(HWND hwnd, struct Joystick* joy)
+{
+    int i;
+
+    SendDlgItemMessageW(hwnd, IDC_FFEFFECTLIST, LB_RESETCONTENT, 0, 0);
+
+    for (i=0; i < joy->num_effects; i++)
+    {
+        /* Effect names start with GUID_, so we'll skip this part */
+        WCHAR *name = joy->effects[i].info.tszName + 5;
+        SendDlgItemMessageW(hwnd, IDC_FFEFFECTLIST, LB_ADDSTRING, 0, (LPARAM) name);
+    }
+}
+
+static void ff_handle_joychange(HWND hwnd, struct JoystickData *data)
+{
+    int sel;
+
+    if (data->num_ff == 0) return;
+
+    sel = SendDlgItemMessageW(hwnd, IDC_FFSELECTCOMBO, CB_GETCURSEL, 0, 0);
+    data->chosen_joystick = SendDlgItemMessageW(hwnd, IDC_FFSELECTCOMBO, CB_GETITEMDATA, sel, 0);
+    initialize_effects_list(hwnd, &data->joysticks[data->chosen_joystick]);
+}
+
+static void ff_handle_effectchange(HWND hwnd, struct Joystick *joy)
+{
+    int sel = SendDlgItemMessageW(hwnd, IDC_FFEFFECTLIST, LB_GETCURSEL, 0, 0);
+
+    if (sel < 0) return;
+
+    joy->chosen_effect = sel;
+}
+
+static DWORD WINAPI ff_input_thread(void *param)
+{
+    struct JoystickData *data = param;
+    DIJOYSTATE state;
+
+    ZeroMemory(&state, sizeof(state));
+
+    while (!data->stop)
+    {
+        int i;
+        struct Joystick *joy = &data->joysticks[data->chosen_joystick];
+        int chosen_effect = joy->chosen_effect;
+
+        /* Skip this if we have no effects */
+        if (joy->num_effects == 0 || chosen_effect < 0) continue;
+
+        poll_input(joy, &state);
+
+        for (i=0; i < joy->num_buttons; i++)
+            if (state.rgbButtons[i])
+            {
+                IDirectInputEffect_Start(joy->effects[chosen_effect].effect, 1, 0);
+                break;
+            }
+
+        Sleep(TEST_POLL_TIME);
+    }
+
+    return 0;
+}
+
+/***********************************************************************
+ *  ff_effects_callback [internal]
+ *   Enumerates, creates, sets the some parameters and stores all ff effects
+ *   supported by the joystick. Works like enum_callback, counting the effects
+ *   first and then storing them.
+ */
+static BOOL CALLBACK ff_effects_callback(const DIEFFECTINFOW *pdei, void *pvRef)
+{
+    HRESULT hr;
+    DIEFFECT dieffect;
+    DWORD axes[2] = {DIJOFS_X, DIJOFS_Y};
+    int direction[2] = {0, 0};
+    struct Joystick *joystick = pvRef;
+
+    if (joystick->effects == NULL)
+    {
+        joystick->num_effects += 1;
+        return DIENUM_CONTINUE;
+    }
+
+    hr = IDirectInputDevice8_Acquire(joystick->device);
+
+    if (FAILED(hr)) return DIENUM_CONTINUE;
+
+    ZeroMemory(&dieffect, sizeof(dieffect));
+
+    dieffect.dwSize = sizeof(dieffect);
+    dieffect.dwFlags = DIEFF_CARTESIAN;
+    dieffect.dwDuration = FF_PLAY_TIME;
+
+    dieffect.cAxes = 2;
+    dieffect.rgdwAxes = axes;
+    dieffect.rglDirection = direction;
+
+    if (IsEqualGUID(&pdei->guid, &GUID_RampForce))
+    {
+        DIRAMPFORCE rforce;
+
+        rforce.lStart = 0;
+        rforce.lEnd = DI_FFNOMINALMAX;
+
+        dieffect.cbTypeSpecificParams = sizeof(rforce);
+        dieffect.lpvTypeSpecificParams = &rforce;
+        dieffect.dwFlags |= DIEP_TYPESPECIFICPARAMS;
+    }
+    else if (IsEqualGUID(&pdei->guid, &GUID_ConstantForce))
+    {
+        DICONSTANTFORCE cforce;
+
+        cforce.lMagnitude = DI_FFNOMINALMAX;
+
+        dieffect.cbTypeSpecificParams = sizeof(cforce);
+        dieffect.lpvTypeSpecificParams = &cforce;
+        dieffect.dwFlags |= DIEP_TYPESPECIFICPARAMS;
+    }
+    else if (IsEqualGUID(&pdei->guid, &GUID_Sine) ||
+             IsEqualGUID(&pdei->guid, &GUID_Square) ||
+             IsEqualGUID(&pdei->guid, &GUID_Triangle) ||
+             IsEqualGUID(&pdei->guid, &GUID_SawtoothUp) ||
+             IsEqualGUID(&pdei->guid, &GUID_SawtoothDown))
+    {
+        DIPERIODIC pforce;
+
+        pforce.dwMagnitude = DI_FFNOMINALMAX;
+        pforce.lOffset = 0;
+        pforce.dwPhase = 0;
+        pforce.dwPeriod = FF_PERIOD_TIME;
+
+        dieffect.cbTypeSpecificParams = sizeof(pforce);
+        dieffect.lpvTypeSpecificParams = &pforce;
+        dieffect.dwFlags |= DIEP_TYPESPECIFICPARAMS;
+    }
+
+    hr = IDirectInputDevice2_CreateEffect(
+        joystick->device, &pdei->guid, &dieffect, &joystick->effects[joystick->cur_effect].effect, NULL);
+
+    joystick->effects[joystick->cur_effect].params = dieffect;
+    joystick->effects[joystick->cur_effect].info = *pdei;
+    joystick->cur_effect += 1;
+
+    return DIENUM_CONTINUE;
+}
+
+/*********************************************************************
+ * ff_dlgproc [internal]
+ *
+ */
+static INT_PTR CALLBACK ff_dlgproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
+{
+    static HANDLE thread;
+    static struct JoystickData *data;
+    TRACE("(%p, 0x%08x/%d, 0x%lx)\n", hwnd, msg, msg, lparam);
+
+    switch (msg)
+    {
+        case WM_INITDIALOG:
+        {
+            int i, cur = 0;
+
+            data = (struct JoystickData*) ((PROPSHEETPAGEW*)lparam)->lParam;
+
+            /* Add joysticks with FF support to the combobox and get the effects */
+            for (i = 0; i < data->num_joysticks; i++)
+            {
+                struct Joystick *joy = &data->joysticks[i];
+
+                if (joy->forcefeedback)
+                {
+                    SendDlgItemMessageW(hwnd, IDC_FFSELECTCOMBO, CB_ADDSTRING, 0, (LPARAM) joy->instance.tszInstanceName);
+                    SendDlgItemMessageW(hwnd, IDC_FFSELECTCOMBO, CB_SETITEMDATA, cur, i);
+
+                    cur++;
+
+                    /* Count device effects and then store them */
+                    joy->num_effects = 0;
+                    joy->effects = NULL;
+                    IDirectInputDevice8_EnumEffects(joy->device, ff_effects_callback, (void *) joy, 0);
+                    joy->effects = HeapAlloc(GetProcessHeap(), 0, sizeof(struct Effect) * joy->num_effects);
+
+                    joy->cur_effect = 0;
+                    IDirectInputDevice8_EnumEffects(joy->device, ff_effects_callback, (void*) joy, 0);
+                    FIXME("%d --- %d\n", joy->num_effects, joy->cur_effect);
+                    joy->num_effects = joy->cur_effect;
+
+                }
+            }
+
+            return TRUE;
+        }
+
+        case WM_COMMAND:
+            switch(wparam)
+            {
+                case MAKEWPARAM(IDC_FFSELECTCOMBO, CBN_SELCHANGE):
+                    ff_handle_joychange(hwnd, data);
+
+                    SendDlgItemMessageW(hwnd, IDC_FFEFFECTLIST, LB_SETCURSEL, 0, 0);
+                    ff_handle_effectchange(hwnd, &data->joysticks[data->chosen_joystick]);
+                break;
+
+                case MAKEWPARAM(IDC_FFEFFECTLIST, LBN_SELCHANGE):
+                    ff_handle_effectchange(hwnd, &data->joysticks[data->chosen_joystick]);
+                break;
+            }
+            return TRUE;
+
+        case WM_NOTIFY:
+            switch(((LPNMHDR)lparam)->code)
+            {
+                case PSN_SETACTIVE:
+                    if (data->num_ff > 0)
+                    {
+                        DWORD tid;
+
+                        data->stop = FALSE;
+                        /* Set the first joystick as default */
+                        SendDlgItemMessageW(hwnd, IDC_FFSELECTCOMBO, CB_SETCURSEL, 0, 0);
+                        ff_handle_joychange(hwnd, data);
+
+                        SendDlgItemMessageW(hwnd, IDC_FFEFFECTLIST, LB_SETCURSEL, 0, 0);
+                        ff_handle_effectchange(hwnd, &data->joysticks[data->chosen_joystick]);
+
+                        thread = CreateThread(NULL, 0, ff_input_thread, (void*) data, 0, &tid);
+                    }
+                break;
+
+                case PSN_RESET: /* intentional fall-through */
+                case PSN_KILLACTIVE:
+                    /* Stop ff thread */
+                    data->stop = TRUE;
+                    MsgWaitForMultipleObjects(1, &thread, FALSE, INFINITE, 0);
+                    CloseHandle(thread);
+                break;
+            }
+            return TRUE;
+    }
+    return FALSE;
+}
+
 /******************************************************************************
  * propsheet_callback [internal]
  */
@@ -491,7 +752,7 @@
     psp[id].dwSize = sizeof (PROPSHEETPAGEW);
     psp[id].hInstance = hcpl;
     psp[id].u.pszTemplate = MAKEINTRESOURCEW(IDD_FORCEFEEDBACK);
-    psp[id].pfnDlgProc = NULL;
+    psp[id].pfnDlgProc = ff_dlgproc;
     psp[id].lParam = (INT_PTR) data;
     id++;
 
diff --git a/po/ar.po b/po/ar.po
index 493c443..6729491 100644
--- a/po/ar.po
+++ b/po/ar.po
@@ -3428,6 +3428,14 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+msgid "Available Effects"
+msgstr ""
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 #, fuzzy
 msgid "Game Controllers"
diff --git a/po/bg.po b/po/bg.po
index 0b44dac..856e959 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -3454,6 +3454,15 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+#, fuzzy
+msgid "Available Effects"
+msgstr "На&пред"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 #, fuzzy
 msgid "Game Controllers"
diff --git a/po/ca.po b/po/ca.po
index c9624d5..c26ea3b 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -3503,6 +3503,16 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "Formats disponibles"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 #, fuzzy
 #| msgid "Create Control"
diff --git a/po/cs.po b/po/cs.po
index 942c516..042404f 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -3502,6 +3502,16 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "Dostupné formáty"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 #, fuzzy
 #| msgid "Create Control"
diff --git a/po/da.po b/po/da.po
index 85ebffe..6f03497 100644
--- a/po/da.po
+++ b/po/da.po
@@ -3474,6 +3474,16 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "Tilgængelige formater"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 #, fuzzy
 #| msgid "Create Control"
diff --git a/po/de.po b/po/de.po
index 7463643..341cbf7 100644
--- a/po/de.po
+++ b/po/de.po
@@ -3461,6 +3461,16 @@
 msgid "Test Force Feedback"
 msgstr "Force Feedback testen"
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "Verfügbare Formate"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 msgid "Game Controllers"
 msgstr "Gamecontroller"
diff --git a/po/el.po b/po/el.po
index 5bd5204..fbb74fb 100644
--- a/po/el.po
+++ b/po/el.po
@@ -3388,6 +3388,16 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "A&vailable buttons:"
+msgid "Available Effects"
+msgstr "Δ&ιαθέσιμα κουμπιά:"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 #, fuzzy
 msgid "Game Controllers"
diff --git a/po/en.po b/po/en.po
index c6cd41a..d5821db 100644
--- a/po/en.po
+++ b/po/en.po
@@ -3452,6 +3452,14 @@
 msgid "Test Force Feedback"
 msgstr "Test Force Feedback"
 
+#: joy.rc:63
+msgid "Available Effects"
+msgstr "Available Effects"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr "Press any button in the controller to activate the chosen effect."
+
 #: joy.rc:28
 msgid "Game Controllers"
 msgstr "Game Controllers"
diff --git a/po/en_US.po b/po/en_US.po
index c8c4e18..903658d 100644
--- a/po/en_US.po
+++ b/po/en_US.po
@@ -3454,6 +3454,14 @@
 msgid "Test Force Feedback"
 msgstr "Test Force Feedback"
 
+#: joy.rc:63
+msgid "Available Effects"
+msgstr "Available Effects"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr "Press any button in the controller to activate the chosen effect."
+
 #: joy.rc:28
 msgid "Game Controllers"
 msgstr "Game Controllers"
diff --git a/po/eo.po b/po/eo.po
index 3a2b627..590b9b8 100644
--- a/po/eo.po
+++ b/po/eo.po
@@ -3369,6 +3369,16 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "Disponeblaj formatoj"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 #, fuzzy
 #| msgid "Create Control"
diff --git a/po/es.po b/po/es.po
index 1d99ff5..94f0235 100644
--- a/po/es.po
+++ b/po/es.po
@@ -3488,6 +3488,16 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "Formatos disponibles"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 #, fuzzy
 #| msgid "Create Control"
diff --git a/po/fa.po b/po/fa.po
index da32a09..0aa6b87 100644
--- a/po/fa.po
+++ b/po/fa.po
@@ -3428,6 +3428,14 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+msgid "Available Effects"
+msgstr ""
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 #, fuzzy
 msgid "Game Controllers"
diff --git a/po/fi.po b/po/fi.po
index 8b0b6ec..4da181b 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -3449,6 +3449,16 @@
 msgid "Test Force Feedback"
 msgstr "Testaa voimapalautetta"
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "Mahdolliset muodot"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 msgid "Game Controllers"
 msgstr "Peliohjaimet"
diff --git a/po/fr.po b/po/fr.po
index 7d6ccd7..12f9bff 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -3478,6 +3478,16 @@
 msgid "Test Force Feedback"
 msgstr "Tester le retour de force"
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "Formats disponibles"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 msgid "Game Controllers"
 msgstr "Contrôleurs de jeu"
diff --git a/po/he.po b/po/he.po
index b2d025d..891b181 100644
--- a/po/he.po
+++ b/po/he.po
@@ -3456,6 +3456,16 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "התבניות הזמינות"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 #, fuzzy
 #| msgid "Create Control"
diff --git a/po/hi.po b/po/hi.po
index 287daf0..be6cfa2 100644
--- a/po/hi.po
+++ b/po/hi.po
@@ -3366,6 +3366,14 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+msgid "Available Effects"
+msgstr ""
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 msgid "Game Controllers"
 msgstr ""
diff --git a/po/hu.po b/po/hu.po
index 4296a05..f3ad461 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -3490,6 +3490,16 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "Elérhető formátumok"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 #, fuzzy
 #| msgid "Create Control"
diff --git a/po/it.po b/po/it.po
index c8f878a..1ceeda2 100644
--- a/po/it.po
+++ b/po/it.po
@@ -3503,6 +3503,16 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "Formati disponibili"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 #, fuzzy
 #| msgid "Create Control"
diff --git a/po/ja.po b/po/ja.po
index 3ac1082..d345c79 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -3446,6 +3446,16 @@
 msgid "Test Force Feedback"
 msgstr "フォース フィードバックのテスト"
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "利用できる形式"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 msgid "Game Controllers"
 msgstr "ゲーム コントローラ"
diff --git a/po/ko.po b/po/ko.po
index da0088b..09cbc37 100644
--- a/po/ko.po
+++ b/po/ko.po
@@ -3444,6 +3444,16 @@
 msgid "Test Force Feedback"
 msgstr "강제 피드백 시험"
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "가능한 형식"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 msgid "Game Controllers"
 msgstr "게임 컨트롤러"
diff --git a/po/lt.po b/po/lt.po
index ee51bf1..4d11dc4 100644
--- a/po/lt.po
+++ b/po/lt.po
@@ -3462,6 +3462,16 @@
 msgid "Test Force Feedback"
 msgstr "Testuoti „Force Feedback“"
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "Galimi formatai"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 msgid "Game Controllers"
 msgstr "Žaidimų valdikliai"
diff --git a/po/ml.po b/po/ml.po
index 2d235c8..6a15883 100644
--- a/po/ml.po
+++ b/po/ml.po
@@ -3366,6 +3366,14 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+msgid "Available Effects"
+msgstr ""
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 msgid "Game Controllers"
 msgstr ""
diff --git a/po/nb_NO.po b/po/nb_NO.po
index e3256d4..3ee22d3 100644
--- a/po/nb_NO.po
+++ b/po/nb_NO.po
@@ -3600,6 +3600,16 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "Tilgjengelige formater"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 #, fuzzy
 #| msgid "Create Control"
diff --git a/po/nl.po b/po/nl.po
index bbf42a9..b2a5d41 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -3517,6 +3517,16 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "Beschikbare formaten"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 #, fuzzy
 #| msgid "Create Control"
diff --git a/po/or.po b/po/or.po
index 4b77a37..c62c66f 100644
--- a/po/or.po
+++ b/po/or.po
@@ -3366,6 +3366,14 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+msgid "Available Effects"
+msgstr ""
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 msgid "Game Controllers"
 msgstr ""
diff --git a/po/pa.po b/po/pa.po
index 36bc386..c8627ea 100644
--- a/po/pa.po
+++ b/po/pa.po
@@ -3366,6 +3366,14 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+msgid "Available Effects"
+msgstr ""
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 msgid "Game Controllers"
 msgstr ""
diff --git a/po/pl.po b/po/pl.po
index 2334309..b36492d 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -3474,6 +3474,16 @@
 msgid "Test Force Feedback"
 msgstr "Testuj odczucie siły zwrotnej"
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "Dostępne formaty"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 msgid "Game Controllers"
 msgstr "Kontrolery gier"
diff --git a/po/pt_BR.po b/po/pt_BR.po
index 8990e86..3e2e078 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -3501,6 +3501,16 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "Formatos Disponíveis"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 #, fuzzy
 #| msgid "Create Control"
diff --git a/po/pt_PT.po b/po/pt_PT.po
index 8b07863..010b3c0 100644
--- a/po/pt_PT.po
+++ b/po/pt_PT.po
@@ -3500,6 +3500,16 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "Formatos Disponíveis"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 #, fuzzy
 #| msgid "Create Control"
diff --git a/po/rm.po b/po/rm.po
index e128856..d8c323e 100644
--- a/po/rm.po
+++ b/po/rm.po
@@ -3394,6 +3394,14 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+msgid "Available Effects"
+msgstr ""
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 msgid "Game Controllers"
 msgstr ""
diff --git a/po/ro.po b/po/ro.po
index 88761ff..f8deac0 100644
--- a/po/ro.po
+++ b/po/ro.po
@@ -3460,6 +3460,16 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "Formate disponibile"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 #, fuzzy
 #| msgid "Create Control"
diff --git a/po/ru.po b/po/ru.po
index 7aff702..b0592cf 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -3467,6 +3467,16 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "Доступные форматы"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 #, fuzzy
 #| msgid "Create Control"
diff --git a/po/sk.po b/po/sk.po
index 28206f9..eb9deb9 100644
--- a/po/sk.po
+++ b/po/sk.po
@@ -3402,6 +3402,16 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "Dostupné formáty"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 msgid "Game Controllers"
 msgstr ""
diff --git a/po/sl.po b/po/sl.po
index 277278b..3d0b81c 100644
--- a/po/sl.po
+++ b/po/sl.po
@@ -3492,6 +3492,16 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "Razpoložljive oblike"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 #, fuzzy
 #| msgid "Create Control"
diff --git a/po/sr_RS@cyrillic.po b/po/sr_RS@cyrillic.po
index 0f19a68..9a7c169 100644
--- a/po/sr_RS@cyrillic.po
+++ b/po/sr_RS@cyrillic.po
@@ -3485,6 +3485,15 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+#, fuzzy
+msgid "Available Effects"
+msgstr "Н&апред"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 #, fuzzy
 #| msgid "Create Control"
diff --git a/po/sr_RS@latin.po b/po/sr_RS@latin.po
index 78b7332..7764f18 100644
--- a/po/sr_RS@latin.po
+++ b/po/sr_RS@latin.po
@@ -3563,6 +3563,15 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+#, fuzzy
+msgid "Available Effects"
+msgstr "N&apred"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 #, fuzzy
 #| msgid "Create Control"
diff --git a/po/sv.po b/po/sv.po
index b761700..1c0a7fe 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -3444,6 +3444,16 @@
 msgid "Test Force Feedback"
 msgstr "Testa kraftåterkoppling"
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "Tillgängliga format"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 msgid "Game Controllers"
 msgstr "Spelkontroller"
diff --git a/po/te.po b/po/te.po
index 389e589..4e00f13 100644
--- a/po/te.po
+++ b/po/te.po
@@ -3366,6 +3366,14 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+msgid "Available Effects"
+msgstr ""
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 msgid "Game Controllers"
 msgstr ""
diff --git a/po/th.po b/po/th.po
index 732bebf..d091d83 100644
--- a/po/th.po
+++ b/po/th.po
@@ -3405,6 +3405,16 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "A&vailable buttons:"
+msgid "Available Effects"
+msgstr "ทีเลือกได้:"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 #, fuzzy
 msgid "Game Controllers"
diff --git a/po/tr.po b/po/tr.po
index 53e7411..68583bc 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -3359,6 +3359,16 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "Mevcut biçimler"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 #, fuzzy
 #| msgid "Create Control"
diff --git a/po/uk.po b/po/uk.po
index 710694a..432e9d2 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -3481,6 +3481,16 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "Доступні формати"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 #, fuzzy
 #| msgid "Create Control"
diff --git a/po/wa.po b/po/wa.po
index 6d64108..a2190d0 100644
--- a/po/wa.po
+++ b/po/wa.po
@@ -3413,6 +3413,14 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+msgid "Available Effects"
+msgstr ""
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 msgid "Game Controllers"
 msgstr ""
diff --git a/po/wine.pot b/po/wine.pot
index 3d32dd2..f9bfd13 100644
--- a/po/wine.pot
+++ b/po/wine.pot
@@ -3328,6 +3328,14 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+msgid "Available Effects"
+msgstr ""
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 msgid "Game Controllers"
 msgstr ""
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 194174e..309d873 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -3379,6 +3379,16 @@
 msgid "Test Force Feedback"
 msgstr ""
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "可选格式"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 #, fuzzy
 #| msgid "Create Control"
diff --git a/po/zh_TW.po b/po/zh_TW.po
index 10d848e..1f1df23 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -3408,6 +3408,16 @@
 msgid "Test Force Feedback"
 msgstr "測試應力回饋"
 
+#: joy.rc:63
+#, fuzzy
+#| msgid "Available formats"
+msgid "Available Effects"
+msgstr "可用格式"
+
+#: joy.rc:65
+msgid "Press any button in the controller to activate the chosen effect."
+msgstr ""
+
 #: joy.rc:28
 msgid "Game Controllers"
 msgstr "遊戲控制器"