Lucas Zawacki : joy.cpl: Correct misplaced elements when using high DPIs.

Alexandre Julliard julliard at winehq.org
Tue Aug 14 12:59:51 CDT 2012


Module: wine
Branch: master
Commit: fc944144e36b7bc9e0644504a5b6d87c99dcf8f1
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=fc944144e36b7bc9e0644504a5b6d87c99dcf8f1

Author: Lucas Zawacki <lfzawacki at gmail.com>
Date:   Mon Aug 13 20:36:54 2012 -0300

joy.cpl: Correct misplaced elements when using high DPIs.

---

 dlls/joy.cpl/joy.h  |   53 +++++++++++++++++++------------------
 dlls/joy.cpl/main.c |   71 ++++++++++++++++++++++++++++++++++++--------------
 2 files changed, 78 insertions(+), 46 deletions(-)

diff --git a/dlls/joy.cpl/joy.h b/dlls/joy.cpl/joy.h
index e40a71b..16d7a0b 100644
--- a/dlls/joy.cpl/joy.h
+++ b/dlls/joy.cpl/joy.h
@@ -50,6 +50,13 @@ struct Joystick {
 #define TEST_MAX_BUTTONS    32
 #define TEST_MAX_AXES       4
 
+struct Graphics {
+    HWND hwnd;
+    HWND buttons[TEST_MAX_BUTTONS];
+    HWND axes[TEST_MAX_AXES];
+    HWND ff_axis;
+};
+
 struct JoystickData {
     IDirectInput8W *di;
     struct Joystick *joysticks;
@@ -57,9 +64,7 @@ struct JoystickData {
     int num_ff;
     int cur_joystick;
     int chosen_joystick;
-    HWND buttons[TEST_MAX_BUTTONS];
-    HWND axes[TEST_MAX_AXES];
-    HWND ff_axis;
+    struct Graphics graphics;
     BOOL stop;
 };
 
@@ -86,36 +91,32 @@ struct JoystickData {
 #define IDC_TESTGROUPZRZ    2007
 #define IDC_TESTGROUPPOV    2008
 
-#define IDC_JOYSTICKBUTTON  3000
-#define IDC_JOYSTICKAXES    4000
-
 #define IDC_FFSELECTCOMBO   2009
 #define IDC_FFEFFECTLIST    2010
-#define IDC_FFAXIS          2011
 
 /* constants */
 #define TEST_POLL_TIME      100
 
 #define TEST_BUTTON_COL_MAX 8
-#define TEST_BUTTON_X       15
-#define TEST_BUTTON_Y       200
-#define TEST_NEXT_BUTTON_X  45
-#define TEST_NEXT_BUTTON_Y  40
-#define TEST_BUTTON_SIZE_X  30
-#define TEST_BUTTON_SIZE_Y  25
-
-#define TEST_AXIS_X         65
-#define TEST_AXIS_Y         98
-#define TEST_NEXT_AXIS_X    115
-#define TEST_AXIS_SIZE_X    5
-#define TEST_AXIS_SIZE_Y    5
-#define TEST_AXIS_MIN       -40
-#define TEST_AXIS_MAX       40
-
-#define FF_AXIS_X           373
-#define FF_AXIS_Y           98
-#define FF_AXIS_SIZE_X      5
-#define FF_AXIS_SIZE_Y      5
+#define TEST_BUTTON_X       8
+#define TEST_BUTTON_Y       122
+#define TEST_NEXT_BUTTON_X  30
+#define TEST_NEXT_BUTTON_Y  25
+#define TEST_BUTTON_SIZE_X  20
+#define TEST_BUTTON_SIZE_Y  18
+
+#define TEST_AXIS_X         43
+#define TEST_AXIS_Y         60
+#define TEST_NEXT_AXIS_X    77
+#define TEST_AXIS_SIZE_X    3
+#define TEST_AXIS_SIZE_Y    3
+#define TEST_AXIS_MIN       -25
+#define TEST_AXIS_MAX       25
+
+#define FF_AXIS_X           248
+#define FF_AXIS_Y           60
+#define FF_AXIS_SIZE_X      3
+#define FF_AXIS_SIZE_Y      3
 
 #define FF_PLAY_TIME        2*DI_SECONDS
 #define FF_PERIOD_TIME      FF_PLAY_TIME/4
diff --git a/dlls/joy.cpl/main.c b/dlls/joy.cpl/main.c
index 54771b0..354dfd7 100644
--- a/dlls/joy.cpl/main.c
+++ b/dlls/joy.cpl/main.c
@@ -166,6 +166,9 @@ static INT_PTR CALLBACK list_dlgproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM
                 SendDlgItemMessageW(hwnd, IDC_JOYSTICKLIST, LB_ADDSTRING, 0, (LPARAM) joy->instance.tszInstanceName);
             }
 
+            /* Store the hwnd to be used with MapDialogRect for unit conversions */
+            data->graphics.hwnd = hwnd;
+
             return TRUE;
         }
 
@@ -260,7 +263,7 @@ static DWORD WINAPI input_thread(void *param)
         /* Indicate pressed buttons */
         for (i = 0; i < data->joysticks[data->chosen_joystick].num_buttons; i++)
             if (state.rgbButtons[i])
-                SendMessageW(data->buttons[i], BM_SETSTATE, TRUE, 0);
+                SendMessageW(data->graphics.buttons[i], BM_SETSTATE, TRUE, 0);
 
         /* Indicate axis positions, axes showing are hardcoded for now */
         axes_pos[0][0] = state.lX;
@@ -281,16 +284,21 @@ static DWORD WINAPI input_thread(void *param)
         }
 
         for (i = 0; i < TEST_MAX_AXES; i++)
-            SetWindowPos(data->axes[i], 0,
-                        TEST_AXIS_X + TEST_NEXT_AXIS_X*i + axes_pos[i][0],
-                        TEST_AXIS_Y + axes_pos[i][1],
-                        0, 0, SWP_NOZORDER | SWP_NOSIZE);
+        {
+            RECT r;
+
+            r.left = (TEST_AXIS_X + TEST_NEXT_AXIS_X*i + axes_pos[i][0]);
+            r.top = (TEST_AXIS_Y + axes_pos[i][1]);
+            MapDialogRect(data->graphics.hwnd, &r);
+
+            SetWindowPos(data->graphics.axes[i], 0, r.left, r.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
+        }
 
         Sleep(TEST_POLL_TIME);
 
         /* Reset button state */
         for (i = 0; i < data->joysticks[data->chosen_joystick].num_buttons; i++)
-            SendMessageW(data->buttons[i], BM_SETSTATE, FALSE, 0);
+            SendMessageW(data->graphics.buttons[i], BM_SETSTATE, FALSE, 0);
     }
 
     return 0;
@@ -306,7 +314,7 @@ static void test_handle_joychange(HWND hwnd, struct JoystickData *data)
 
     /* Enable only  buttons present in the device */
     for (i = 0; i < TEST_MAX_BUTTONS; i++)
-        ShowWindow(data->buttons[i], i <= data->joysticks[data->chosen_joystick].num_buttons);
+        ShowWindow(data->graphics.buttons[i], i <= data->joysticks[data->chosen_joystick].num_buttons);
 }
 
 /*********************************************************************
@@ -331,17 +339,24 @@ static void draw_joystick_buttons(HWND hwnd, struct JoystickData* data)
 
     for (i = 0; i < TEST_MAX_BUTTONS; i++)
     {
+        RECT r;
+
         if ((i % TEST_BUTTON_COL_MAX) == 0 && i != 0)
         {
             row += 1;
             col = 0;
         }
 
+        r.left = (TEST_BUTTON_X + TEST_NEXT_BUTTON_X*col);
+        r.top = (TEST_BUTTON_Y + TEST_NEXT_BUTTON_Y*row);
+        r.right = r.left + TEST_BUTTON_SIZE_X;
+        r.bottom = r.top + TEST_BUTTON_SIZE_Y;
+        MapDialogRect(hwnd, &r);
+
         button_number_to_wchar(i + 1, button_label);
 
-        data->buttons[i] = CreateWindowW(button_class, button_label, WS_CHILD,
-            TEST_BUTTON_X + TEST_NEXT_BUTTON_X*col, TEST_BUTTON_Y + TEST_NEXT_BUTTON_Y*row,
-            TEST_BUTTON_SIZE_X, TEST_BUTTON_SIZE_Y,
+        data->graphics.buttons[i] = CreateWindowW(button_class, button_label, WS_CHILD,
+            r.left, r.top, r.right - r.left, r.bottom - r.top,
             hwnd, NULL, NULL, hinst);
 
         col += 1;
@@ -360,13 +375,19 @@ static void draw_joystick_axes(HWND hwnd, struct JoystickData* data)
 
     for (i = 0; i < TEST_MAX_AXES; i++)
     {
+        RECT r;
         /* Set axis box name */
         SetWindowTextW(GetDlgItem(hwnd, axes_idc[i]), axes_names[i]);
 
-        data->axes[i] = CreateWindowW( button_class, NULL, WS_CHILD | WS_VISIBLE,
-            TEST_AXIS_X + TEST_NEXT_AXIS_X*i, TEST_AXIS_Y,
-            TEST_AXIS_SIZE_X, TEST_AXIS_SIZE_Y,
-            hwnd, (HMENU) IDC_JOYSTICKAXES + i, NULL, hinst);
+        r.left = (TEST_AXIS_X + TEST_NEXT_AXIS_X*i);
+        r.top = TEST_AXIS_Y;
+        r.right = r.left + TEST_AXIS_SIZE_X;
+        r.bottom = r.top + TEST_AXIS_SIZE_Y;
+        MapDialogRect(hwnd, &r);
+
+        data->graphics.axes[i] = CreateWindowW( button_class, NULL, WS_CHILD | WS_VISIBLE,
+            r.left, r.top, r.right - r.left, r.bottom - r.top,
+            hwnd, NULL, NULL, hinst);
     }
 }
 
@@ -452,12 +473,18 @@ static void draw_ff_axis(HWND hwnd, struct JoystickData *data)
 {
     HINSTANCE hinst = (HINSTANCE) GetWindowLongPtrW(hwnd, GWLP_HINSTANCE);
     static WCHAR button_class[] = {'B','u','t','t','o','n','\0'};
+    RECT r;
+
+    r.left = FF_AXIS_X;
+    r.top = FF_AXIS_Y;
+    r.right = r.left + FF_AXIS_SIZE_X;
+    r.bottom = r.top + FF_AXIS_SIZE_Y;
+    MapDialogRect(hwnd, &r);
 
     /* Draw direction axis */
-    data->ff_axis = CreateWindowW( button_class, NULL, WS_CHILD | WS_VISIBLE,
-        FF_AXIS_X, FF_AXIS_Y,
-        FF_AXIS_SIZE_X, FF_AXIS_SIZE_Y,
-        hwnd, (HMENU) IDC_FFAXIS, NULL, hinst);
+    data->graphics.ff_axis = CreateWindowW( button_class, NULL, WS_CHILD | WS_VISIBLE,
+        r.left, r.top, r.right - r.left, r.bottom - r.top,
+        hwnd, NULL, NULL, hinst);
 }
 
 static void initialize_effects_list(HWND hwnd, struct Joystick* joy)
@@ -508,6 +535,7 @@ static DWORD WINAPI ff_input_thread(void *param)
         int chosen_effect = joy->chosen_effect;
         DIEFFECT *dieffect;
         DWORD flags = DIEP_AXES | DIEP_DIRECTION | DIEP_NORESTART;
+        RECT r;
 
         /* Skip this if we have no effects */
         if (joy->num_effects == 0 || chosen_effect < 0) continue;
@@ -519,8 +547,11 @@ static DWORD WINAPI ff_input_thread(void *param)
         dieffect->rgdwAxes[0] = state.lX;
         dieffect->rgdwAxes[1] = state.lY;
 
-        SetWindowPos(data->ff_axis, 0, FF_AXIS_X + state.lX, FF_AXIS_Y + state.lY,
-                     0, 0, SWP_NOZORDER | SWP_NOSIZE);
+        r.left = FF_AXIS_X + state.lX;
+        r.top = FF_AXIS_Y + state.lY;
+        MapDialogRect(data->graphics.hwnd, &r);
+
+        SetWindowPos(data->graphics.ff_axis, 0, r.left, r.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
 
         for (i=0; i < joy->num_buttons; i++)
             if (state.rgbButtons[i])




More information about the wine-cvs mailing list