Implemented processing for actions: SPI_GET/SETGRIDGRANULARITY,
SPI_GET/SETICONTITLEWRAP, SPI_GET/SETMENUDROPALIGNMENT,
SPI_GET/SETDOUBLECLKWIDTH, SPI_GET/SETDOUBLECLKHEIGHT,
SPI_GET/SETDOUBLECLICKTIME.
diff --git a/dlls/user/user_main.c b/dlls/user/user_main.c
index fa830b6..9607f46 100644
--- a/dlls/user/user_main.c
+++ b/dlls/user/user_main.c
@@ -230,9 +230,6 @@
/* Initialize message spying */
if (!SPY_Init()) return FALSE;
- /* Set double click time */
- SetDoubleClickTime( GetProfileIntA("windows","DoubleClickSpeed",452) );
-
/* Create message queue of initial thread */
InitThreadInput16( 0, 0 );
diff --git a/include/sysmetrics.h b/include/sysmetrics.h
index d582b3f..70df706 100644
--- a/include/sysmetrics.h
+++ b/include/sysmetrics.h
@@ -10,6 +10,7 @@
extern void SYSMETRICS_Init(void); /* sysmetrics.c */
extern INT SYSMETRICS_Set( INT index, INT value ); /* sysmetrics.c */
extern void SYSCOLOR_Init(void); /* syscolor.c */
+extern void SYSPARAMS_GetDoubleClickSize( INT *width, INT *height );
/* Wine extensions */
#define SM_WINE_BPP (SM_CMETRICS+1) /* screen bpp */
diff --git a/windows/message.c b/windows/message.c
index fdd7981..517751c 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -38,7 +38,6 @@
#define WM_NCMOUSELAST WM_NCMBUTTONDBLCLK
static BYTE QueueKeyStateTable[256];
-static UINT doubleClickSpeed = 452;
/***********************************************************************
@@ -407,7 +406,7 @@
{
if ((msg->message == clk_msg.message) &&
(msg->hwnd == clk_msg.hwnd) &&
- (msg->time - clk_msg.time < doubleClickSpeed) &&
+ (msg->time - clk_msg.time < GetDoubleClickTime()) &&
(abs(msg->pt.x - clk_msg.pt.x) < GetSystemMetrics(SM_CXDOUBLECLK)/2) &&
(abs(msg->pt.y - clk_msg.pt.y) < GetSystemMetrics(SM_CYDOUBLECLK)/2))
{
@@ -651,25 +650,6 @@
}
-/**********************************************************************
- * SetDoubleClickTime (USER32.@)
- */
-BOOL WINAPI SetDoubleClickTime( UINT interval )
-{
- doubleClickSpeed = interval ? interval : 500;
- return TRUE;
-}
-
-
-/**********************************************************************
- * GetDoubleClickTime (USER32.@)
- */
-UINT WINAPI GetDoubleClickTime(void)
-{
- return doubleClickSpeed;
-}
-
-
/***********************************************************************
* WaitMessage (USER.112) Suspend thread pending messages
* WaitMessage (USER32.@) Suspend thread pending messages
diff --git a/windows/sysmetrics.c b/windows/sysmetrics.c
index 78d1f6a..1c61f29 100644
--- a/windows/sysmetrics.c
+++ b/windows/sysmetrics.c
@@ -180,10 +180,10 @@
sysMetrics[SM_CYSIZE] = sysMetrics[SM_CXSIZE];
sysMetrics[SM_CXMINTRACK] = sysMetrics[SM_CXMIN];
sysMetrics[SM_CYMINTRACK] = sysMetrics[SM_CYMIN];
- sysMetrics[SM_CXDOUBLECLK] =
- (GetProfileIntA("Windows", "DoubleClickWidth", 4) + 1) & ~1;
- sysMetrics[SM_CYDOUBLECLK] =
- (GetProfileIntA("Windows","DoubleClickHeight", 4) + 1) & ~1;
+
+ sysMetrics[SM_CXDOUBLECLK] = 4;
+ sysMetrics[SM_CYDOUBLECLK] = 4;
+ SYSPARAMS_GetDoubleClickSize( &sysMetrics[SM_CXDOUBLECLK], &sysMetrics[SM_CYDOUBLECLK] );
sysMetrics[SM_CXICONSPACING] = 75;
SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0,
@@ -192,8 +192,8 @@
SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0,
&sysMetrics[SM_CYICONSPACING], 0 );
- sysMetrics[SM_MENUDROPALIGNMENT] =
- GetProfileIntA("Windows", "MenuDropAlignment", 0);
+ SystemParametersInfoA( SPI_GETMENUDROPALIGNMENT, 0,
+ &sysMetrics[SM_MENUDROPALIGNMENT], 0 );
sysMetrics[SM_PENWINDOWS] = 0;
sysMetrics[SM_DBCSENABLED] = 0;
diff --git a/windows/sysparams.c b/windows/sysparams.c
index 5653302..497b976 100644
--- a/windows/sysparams.c
+++ b/windows/sysparams.c
@@ -31,10 +31,16 @@
#define SPI_SETKEYBOARDSPEED_IDX 3
#define SPI_ICONHORIZONTALSPACING_IDX 4
#define SPI_SETSCREENSAVETIMEOUT_IDX 5
-#define SPI_SETKEYBOARDDELAY_IDX 6
-#define SPI_ICONVERTICALSPACING_IDX 7
-#define SPI_SETSHOWSOUNDS_IDX 8
-#define SPI_SETSCREENSAVERRUNNING_IDX 9
+#define SPI_SETGRIDGRANULARITY_IDX 6
+#define SPI_SETKEYBOARDDELAY_IDX 7
+#define SPI_ICONVERTICALSPACING_IDX 8
+#define SPI_SETICONTITLEWRAP_IDX 9
+#define SPI_SETMENUDROPALIGNMENT_IDX 10
+#define SPI_SETDOUBLECLKWIDTH_IDX 11
+#define SPI_SETDOUBLECLKHEIGHT_IDX 12
+#define SPI_SETDOUBLECLICKTIME_IDX 13
+#define SPI_SETSHOWSOUNDS_IDX 14
+#define SPI_SETSCREENSAVERRUNNING_IDX 15
#define SPI_WINE_IDX SPI_SETSCREENSAVERRUNNING_IDX
/**
@@ -58,10 +64,22 @@
#define SPI_ICONHORIZONTALSPACING_VALNAME "IconSpacing"
#define SPI_SETSCREENSAVETIMEOUT_REGKEY "Control Panel\\Desktop"
#define SPI_SETSCREENSAVETIMEOUT_VALNAME "ScreenSaveTimeOut"
+#define SPI_SETGRIDGRANULARITY_REGKEY "Control Panel\\Desktop"
+#define SPI_SETGRIDGRANULARITY_VALNAME "GridGranularity"
#define SPI_SETKEYBOARDDELAY_REGKEY "Control Panel\\Keyboard"
#define SPI_SETKEYBOARDDELAY_VALNAME "KeyboardDelay"
#define SPI_ICONVERTICALSPACING_REGKEY "Control Panel\\Desktop"
#define SPI_ICONVERTICALSPACING_VALNAME "IconVerticalSpacing"
+#define SPI_SETICONTITLEWRAP_REGKEY "Control Panel\\Desktop"
+#define SPI_SETICONTITLEWRAP_VALNAME "IconTitleWrap"
+#define SPI_SETMENUDROPALIGNMENT_REGKEY "Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows"
+#define SPI_SETMENUDROPALIGNMENT_VALNAME "MenuDropAlignment"
+#define SPI_SETDOUBLECLKWIDTH_REGKEY "Control Panel\\Mouse"
+#define SPI_SETDOUBLECLKWIDTH_VALNAME "DoubleClickWidth"
+#define SPI_SETDOUBLECLKHEIGHT_REGKEY "Control Panel\\Mouse"
+#define SPI_SETDOUBLECLKHEIGHT_VALNAME "DoubleClickHeight"
+#define SPI_SETDOUBLECLICKTIME_REGKEY "Control Panel\\Mouse"
+#define SPI_SETDOUBLECLICKTIME_VALNAME "DoubleClickSpeed"
#define SPI_SETSHOWSOUNDS_REGKEY "Control Panel\\Accessibility\\ShowSounds"
#define SPI_SETSHOWSOUNDS_VALNAME "On"
#define SPI_SETSCREENSAVERRUNNING_REGKEY "Control Panel\\Desktop"
@@ -83,7 +101,10 @@
static int border = 1;
static int keyboard_speed = 31;
static int screensave_timeout = 300;
+static int grid_granularity = 0;
static int keyboard_delay = 1;
+static BOOL icon_title_wrap = TRUE;
+static int double_click_time = 500;
static BOOL screensaver_running = FALSE;
/***********************************************************************
@@ -221,7 +242,10 @@
WINE_RELOAD_SPI(SPI_ICONHORIZONTALSPACING);
WINE_RELOAD_SPI(SPI_ICONVERTICALSPACING);
WINE_IGNORE_SPI(SPI_SETSCREENSAVEACTIVE);
+ WINE_RELOAD_SPI(SPI_SETDOUBLECLKWIDTH);
+ WINE_RELOAD_SPI(SPI_SETDOUBLECLKHEIGHT);
WINE_RELOAD_SPI(SPI_SETSHOWSOUNDS);
+ WINE_RELOAD_SPI(SPI_SETMENUDROPALIGNMENT);
default:
if (uiAction)
@@ -233,7 +257,10 @@
WINE_INVALIDATE_SPI(SPI_SETMOUSE);
WINE_INVALIDATE_SPI(SPI_SETKEYBOARDSPEED);
WINE_INVALIDATE_SPI(SPI_SETSCREENSAVETIMEOUT);
+ WINE_INVALIDATE_SPI(SPI_SETGRIDGRANULARITY);
WINE_INVALIDATE_SPI(SPI_SETKEYBOARDDELAY);
+ WINE_INVALIDATE_SPI(SPI_SETICONTITLEWRAP);
+ WINE_INVALIDATE_SPI(SPI_SETDOUBLECLICKTIME);
WINE_INVALIDATE_SPI(SPI_SETSCREENSAVERRUNNING);
default:
FIXME( "Unknown action reset: %u\n", uiAction );
@@ -355,6 +382,41 @@
return ret;
}
+
+/***********************************************************************
+ * SYSPARAMS_GetDoubleClickSize
+ *
+ * There is no SPI_GETDOUBLECLK* so we export this function instead.
+ */
+void SYSPARAMS_GetDoubleClickSize( INT *width, INT *height )
+{
+ char buf[10];
+
+ if (!spi_loaded[SPI_SETDOUBLECLKWIDTH_IDX])
+ {
+ char buf[10];
+
+ if (SYSPARAMS_Load( SPI_SETDOUBLECLKWIDTH_REGKEY,
+ SPI_SETDOUBLECLKWIDTH_VALNAME, buf ))
+ {
+ SYSMETRICS_Set( SM_CXDOUBLECLK, atoi( buf ) );
+ }
+ spi_loaded[SPI_SETDOUBLECLKWIDTH_IDX] = TRUE;
+ }
+ if (!spi_loaded[SPI_SETDOUBLECLKHEIGHT_IDX])
+ {
+ if (SYSPARAMS_Load( SPI_SETDOUBLECLKHEIGHT_REGKEY,
+ SPI_SETDOUBLECLKHEIGHT_VALNAME, buf ))
+ {
+ SYSMETRICS_Set( SM_CYDOUBLECLK, atoi( buf ) );
+ }
+ spi_loaded[SPI_SETDOUBLECLKHEIGHT_IDX] = TRUE;
+ }
+ *width = GetSystemMetrics( SM_CXDOUBLECLK );
+ *height = GetSystemMetrics( SM_CYDOUBLECLK );
+}
+
+
/***********************************************************************
* SystemParametersInfoA (USER32.@)
*
@@ -646,10 +708,40 @@
break;
}
- case SPI_GETGRIDGRANULARITY: /* 18 */
- *(INT *)pvParam = GetProfileIntA( "desktop", "GridGranularity", 1 );
+ case SPI_GETGRIDGRANULARITY: /* 18 */
+ spi_idx = SPI_SETGRIDGRANULARITY_IDX;
+ if (!spi_loaded[spi_idx])
+ {
+ char buf[10];
+
+ if (SYSPARAMS_Load( SPI_SETGRIDGRANULARITY_REGKEY,
+ SPI_SETGRIDGRANULARITY_VALNAME,
+ buf ))
+ grid_granularity = atoi( buf );
+
+ spi_loaded[spi_idx] = TRUE;
+ }
+ *(INT *)pvParam = grid_granularity;
break;
- WINE_SPI_FIXME(SPI_SETGRIDGRANULARITY); /* 19 */
+
+ case SPI_SETGRIDGRANULARITY: /* 19 */
+ {
+ char buf[10];
+
+ spi_idx = SPI_SETGRIDGRANULARITY_IDX;
+ sprintf(buf, "%u", uiParam);
+
+ if (SYSPARAMS_Save( SPI_SETGRIDGRANULARITY_REGKEY,
+ SPI_SETGRIDGRANULARITY_VALNAME,
+ buf, fWinIni ))
+ {
+ grid_granularity = uiParam;
+ spi_loaded[spi_idx] = TRUE;
+ }
+ else
+ ret = FALSE;
+ break;
+ }
case SPI_SETDESKWALLPAPER: /* 20 */
ret = SetDeskWallPaper( (LPSTR)pvParam );
@@ -745,18 +837,111 @@
break;
- case SPI_GETICONTITLEWRAP: /* 25 */
- *(BOOL *)pvParam = GetProfileIntA( "desktop", "IconTitleWrap", TRUE );
- break;
- WINE_SPI_FIXME(SPI_SETICONTITLEWRAP); /* 26 */
+ case SPI_GETICONTITLEWRAP: /* 25 */
+ spi_idx = SPI_SETICONTITLEWRAP_IDX;
+ if (!spi_loaded[spi_idx])
+ {
+ char buf[5];
- case SPI_GETMENUDROPALIGNMENT: /* 27 */
- *(BOOL *)pvParam = GetSystemMetrics( SM_MENUDROPALIGNMENT ); /* XXX check this */
- break;
- WINE_SPI_FIXME(SPI_SETMENUDROPALIGNMENT); /* 28 */
+ if (SYSPARAMS_Load( SPI_SETICONTITLEWRAP_REGKEY,
+ SPI_SETICONTITLEWRAP_VALNAME, buf ))
+ icon_title_wrap = atoi(buf);
+ spi_loaded[spi_idx] = TRUE;
+ }
+
+ *(BOOL *)pvParam = icon_title_wrap;
+ break;
- WINE_SPI_WARN(SPI_SETDOUBLECLKWIDTH); /* 29 */
- WINE_SPI_WARN(SPI_SETDOUBLECLKHEIGHT); /* 30 */
+ case SPI_SETICONTITLEWRAP: /* 26 */
+ {
+ char buf[5];
+
+ spi_idx = SPI_SETICONTITLEWRAP_IDX;
+ sprintf(buf, "%u", uiParam);
+ if (SYSPARAMS_Save( SPI_SETICONTITLEWRAP_REGKEY,
+ SPI_SETICONTITLEWRAP_VALNAME,
+ buf, fWinIni ))
+ {
+ icon_title_wrap = uiParam;
+ spi_loaded[spi_idx] = TRUE;
+ }
+ else
+ ret = FALSE;
+ break;
+ }
+
+ case SPI_GETMENUDROPALIGNMENT: /* 27 */
+ spi_idx = SPI_SETMENUDROPALIGNMENT_IDX;
+
+ if (!spi_loaded[spi_idx])
+ {
+ char buf[5];
+
+ if (SYSPARAMS_Load( SPI_SETMENUDROPALIGNMENT_REGKEY,
+ SPI_SETMENUDROPALIGNMENT_VALNAME, buf ))
+ {
+ SYSMETRICS_Set( SM_MENUDROPALIGNMENT, atoi( buf ) );
+ }
+ spi_loaded[spi_idx] = TRUE;
+ }
+
+
+ *(BOOL *)pvParam = GetSystemMetrics( SM_MENUDROPALIGNMENT );
+ break;
+
+ case SPI_SETMENUDROPALIGNMENT: /* 28 */
+ {
+ char buf[5];
+ spi_idx = SPI_SETMENUDROPALIGNMENT_IDX;
+
+ sprintf(buf, "%u", uiParam);
+ if (SYSPARAMS_Save( SPI_SETMENUDROPALIGNMENT_REGKEY,
+ SPI_SETMENUDROPALIGNMENT_VALNAME,
+ buf, fWinIni ))
+ {
+ SYSMETRICS_Set( SM_MENUDROPALIGNMENT, uiParam );
+ spi_loaded[spi_idx] = TRUE;
+ }
+ else
+ ret = FALSE;
+ break;
+ }
+
+ case SPI_SETDOUBLECLKWIDTH: /* 29 */
+ {
+ char buf[10];
+ spi_idx = SPI_SETDOUBLECLKWIDTH_IDX;
+
+ sprintf(buf, "%u", uiParam);
+ if (SYSPARAMS_Save( SPI_SETDOUBLECLKWIDTH_REGKEY,
+ SPI_SETDOUBLECLKWIDTH_VALNAME,
+ buf, fWinIni ))
+ {
+ SYSMETRICS_Set( SM_CXDOUBLECLK, uiParam );
+ spi_loaded[spi_idx] = TRUE;
+ }
+ else
+ ret = FALSE;
+ break;
+ }
+
+ case SPI_SETDOUBLECLKHEIGHT: /* 30 */
+ {
+ char buf[10];
+ spi_idx = SPI_SETDOUBLECLKHEIGHT_IDX;
+
+ sprintf(buf, "%u", uiParam);
+ if (SYSPARAMS_Save( SPI_SETDOUBLECLKHEIGHT_REGKEY,
+ SPI_SETDOUBLECLKHEIGHT_VALNAME,
+ buf, fWinIni ))
+ {
+ SYSMETRICS_Set( SM_CYDOUBLECLK, uiParam );
+ spi_loaded[spi_idx] = TRUE;
+ }
+ else
+ ret = FALSE;
+ break;
+ }
case SPI_GETICONTITLELOGFONT: /* 31 */
{
@@ -780,7 +965,27 @@
break;
}
- WINE_SPI_WARN(SPI_SETDOUBLECLICKTIME); /* 32 */
+ case SPI_SETDOUBLECLICKTIME: /* 32 */
+ {
+ char buf[10];
+
+ spi_idx = SPI_SETDOUBLECLICKTIME_IDX;
+ sprintf(buf, "%u", uiParam);
+
+ if (SYSPARAMS_Save( SPI_SETDOUBLECLICKTIME_REGKEY,
+ SPI_SETDOUBLECLICKTIME_VALNAME,
+ buf, fWinIni ))
+ {
+ if (!uiParam)
+ uiParam = 500;
+ double_click_time = uiParam;
+ spi_loaded[spi_idx] = TRUE;
+ }
+ else
+ ret = FALSE;
+ break;
+ }
+
WINE_SPI_FIXME(SPI_SETMOUSEBUTTONSWAP); /* 33 */
WINE_SPI_FIXME(SPI_SETICONTITLELOGFONT); /* 34 */
@@ -1320,3 +1525,34 @@
}
return ret;
}
+
+
+/**********************************************************************
+ * SetDoubleClickTime (USER32.@)
+ */
+BOOL WINAPI SetDoubleClickTime( UINT interval )
+{
+ return SystemParametersInfoA(SPI_SETDOUBLECLICKTIME, interval, 0, 0);
+}
+
+
+/**********************************************************************
+ * GetDoubleClickTime (USER32.@)
+ */
+UINT WINAPI GetDoubleClickTime(void)
+{
+ char buf[10];
+
+ if (!spi_loaded[SPI_SETDOUBLECLICKTIME_IDX])
+ {
+ if (SYSPARAMS_Load( SPI_SETDOUBLECLICKTIME_REGKEY,
+ SPI_SETDOUBLECLICKTIME_VALNAME,
+ buf ))
+ {
+ double_click_time = atoi( buf );
+ if (!double_click_time) double_click_time = 500;
+ }
+ spi_loaded[SPI_SETDOUBLECLICKTIME_IDX] = TRUE;
+ }
+ return double_click_time;
+}