Wine-devel
Threads by month
- ----- 2026 -----
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
November 2017
- 68 participants
- 380 discussions
[PATCH 1/7] wsdapi: Add wsdapi_internal.h for shared internal function and macro definitions.
by Owen Rudge 21 Nov '17
by Owen Rudge 21 Nov '17
21 Nov '17
This patch series adds the initial implementation of the PublishEx
function for the IWSDiscoveryPublisher interface. A large XML structure
needs to be built up to create the message - the actual sending will
follow in a further series.
Signed-off-by: Owen Rudge <orudge(a)codeweavers.com>
---
dlls/wsdapi/address.c | 6 +-----
dlls/wsdapi/wsdapi_internal.h | 35 +++++++++++++++++++++++++++++++++++
dlls/wsdapi/xml.c | 7 +------
3 files changed, 37 insertions(+), 11 deletions(-)
create mode 100644 dlls/wsdapi/wsdapi_internal.h
1
0
Signed-off-by: Vincent Povirk <vincent(a)codeweavers.com>
---
dlls/gphoto2.ds/gphoto2_i.h | 6 ++--
dlls/gphoto2.ds/gphoto2_main.c | 64 +++++++++++++++++++++++++++++++-----------
2 files changed, 49 insertions(+), 21 deletions(-)
diff --git a/dlls/gphoto2.ds/gphoto2_i.h b/dlls/gphoto2.ds/gphoto2_i.h
index edc4d919fe8..9ab8bbbf33b 100644
--- a/dlls/gphoto2.ds/gphoto2_i.h
+++ b/dlls/gphoto2.ds/gphoto2_i.h
@@ -73,12 +73,10 @@ struct gphoto2_file {
/* internal information about an active data source */
struct tagActiveDS
{
- TW_IDENTITY identity; /* identity */
+ TW_IDENTITY identity; /* identity of the data source */
+ TW_IDENTITY appIdentity; /* identity of the app */
TW_UINT16 currentState; /* current state */
- TW_EVENT pendingEvent; /* pending event to be sent to
- application */
TW_UINT16 twCC; /* condition code */
- HWND hwndOwner; /* window handle of the app */
HWND progressWnd; /* window handle of the scanning window */
#ifdef HAVE_GPHOTO2
diff --git a/dlls/gphoto2.ds/gphoto2_main.c b/dlls/gphoto2.ds/gphoto2_main.c
index acc3aa67892..28100414cc7 100644
--- a/dlls/gphoto2.ds/gphoto2_main.c
+++ b/dlls/gphoto2.ds/gphoto2_main.c
@@ -33,6 +33,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(twain);
+DSMENTRYPROC GPHOTO2_dsmentry;
#ifdef HAVE_GPHOTO2
static char* GPHOTO2_StrDup(const char* str)
@@ -295,11 +296,25 @@ static TW_UINT16 GPHOTO2_FileSystemRename (pTW_IDENTITY pOrigin,
return TWRC_FAILURE;
}
+static void GPHOTO2_Notify (TW_UINT16 message)
+{
+ GPHOTO2_dsmentry (&activeDS.identity, &activeDS.appIdentity, DG_CONTROL, DAT_NULL, message, NULL);
+}
+
+/* DG_CONTROL/DAT_ENTRYPOINT/MSG_SET */
+static TW_UINT16 GPHOTO2_SetEntryPoint (pTW_IDENTITY pOrigin, TW_MEMREF pData)
+{
+ TW_ENTRYPOINT *entry = (TW_ENTRYPOINT*)pData;
+
+ GPHOTO2_dsmentry = entry->DSM_Entry;
+
+ return TWRC_SUCCESS;
+}
+
/* DG_CONTROL/DAT_EVENT/MSG_PROCESSEVENT */
static TW_UINT16 GPHOTO2_ProcessEvent (pTW_IDENTITY pOrigin,
TW_MEMREF pData)
{
- TW_UINT16 twRC = TWRC_SUCCESS;
pTW_EVENT pEvent = (pTW_EVENT) pData;
TRACE("DG_CONTROL/DAT_EVENT/MSG_PROCESSEVENT\n");
@@ -309,16 +324,9 @@ static TW_UINT16 GPHOTO2_ProcessEvent (pTW_IDENTITY pOrigin,
return TWRC_FAILURE;
}
- if (activeDS.pendingEvent.TWMessage != MSG_NULL) {
- pEvent->TWMessage = activeDS.pendingEvent.TWMessage;
- activeDS.pendingEvent.TWMessage = MSG_NULL;
- twRC = TWRC_SUCCESS;
- } else {
- pEvent->TWMessage = MSG_NULL; /* no message to the application */
- twRC = TWRC_NOTDSEVENT;
- }
+ pEvent->TWMessage = MSG_NULL; /* no message to the application */
activeDS.twCC = TWCC_SUCCESS;
- return twRC;
+ return TWRC_NOTDSEVENT;
}
/* DG_CONTROL/DAT_PASSTHRU/MSG_PASSTHRU */
@@ -356,7 +364,7 @@ static TW_UINT16 GPHOTO2_PendingXfersEndXfer (pTW_IDENTITY pOrigin,
} else {
activeDS.currentState = 5;
/* Notify the application that it can close the data source */
- activeDS.pendingEvent.TWMessage = MSG_CLOSEDSREQ;
+ GPHOTO2_Notify(MSG_CLOSEDSREQ);
/* close any Transferring dialog */
TransferringDialogBox(activeDS.progressWnd,-1);
activeDS.progressWnd = 0;
@@ -502,25 +510,23 @@ static TW_UINT16 GPHOTO2_EnableDSUserInterface (pTW_IDENTITY pOrigin,
activeDS.twCC = TWCC_SEQERROR;
return TWRC_FAILURE;
}
- activeDS.hwndOwner = pUserInterface->hParent;
if (pUserInterface->ShowUI)
{
BOOL rc;
activeDS.currentState = 5; /* Transitions to state 5 */
rc = DoCameraUI();
if (!rc) {
- activeDS.pendingEvent.TWMessage = MSG_CLOSEDSREQ;
+ GPHOTO2_Notify(MSG_CLOSEDSREQ);
} else {
/* FIXME: The GUI should have marked the files to download... */
- activeDS.pendingEvent.TWMessage = MSG_XFERREADY;
+ GPHOTO2_Notify(MSG_XFERREADY);
activeDS.currentState = 6; /* Transitions to state 6 directly */
}
} else {
/* no UI will be displayed, so source is ready to transfer data */
- activeDS.pendingEvent.TWMessage = MSG_XFERREADY;
+ GPHOTO2_Notify(MSG_XFERREADY);
activeDS.currentState = 6; /* Transitions to state 6 directly */
}
- activeDS.hwndOwner = pUserInterface->hParent;
activeDS.twCC = TWCC_SUCCESS;
return TWRC_SUCCESS;
}
@@ -704,6 +710,13 @@ static TW_UINT16 GPHOTO2_SourceControlHandler (
}
break;
+ case DAT_ENTRYPOINT:
+ if (MSG == MSG_SET)
+ twRC = GPHOTO2_SetEntryPoint (pOrigin, pData);
+ else
+ twRC = TWRC_FAILURE;
+ break;
+
case DAT_EVENT:
if (MSG == MSG_PROCESSEVENT)
twRC = GPHOTO2_ProcessEvent (pOrigin, pData);
@@ -1086,7 +1099,7 @@ GPHOTO2_GetIdentity( pTW_IDENTITY pOrigin, pTW_IDENTITY self) {
TRACE("%d cameras detected.\n", count);
self->ProtocolMajor = TWON_PROTOCOLMAJOR;
self->ProtocolMinor = TWON_PROTOCOLMINOR;
- self->SupportedGroups = DG_CONTROL | DG_IMAGE;
+ self->SupportedGroups = DG_CONTROL | DG_IMAGE | DF_DS2;
lstrcpynA (self->Manufacturer, "The Wine Team", sizeof(self->Manufacturer) - 1);
lstrcpynA (self->ProductFamily, "GPhoto2 Camera", sizeof(self->ProductFamily) - 1);
@@ -1111,6 +1124,21 @@ GPHOTO2_OpenDS( pTW_IDENTITY pOrigin, pTW_IDENTITY self) {
GPPortInfo info;
const char *model, *port;
+ if (GPHOTO2_dsmentry == NULL)
+ {
+ static const WCHAR twain32W[] = {'t','w','a','i','n','_','3','2',0};
+ HMODULE moddsm = GetModuleHandleW(twain32W);
+
+ if (moddsm)
+ GPHOTO2_dsmentry = (void*)GetProcAddress(moddsm, "DSM_Entry");
+
+ if (!GPHOTO2_dsmentry)
+ {
+ ERR("can't find DSM entry point\n");
+ return TWRC_FAILURE;
+ }
+ }
+
if (TWRC_SUCCESS != gphoto2_auto_detect())
return TWRC_FAILURE;
@@ -1193,6 +1221,8 @@ GPHOTO2_OpenDS( pTW_IDENTITY pOrigin, pTW_IDENTITY self) {
activeDS.pixelflavor = TWPF_CHOCOLATE;
activeDS.pixeltype = TWPT_RGB;
activeDS.capXferMech = TWSX_MEMORY;
+ activeDS.identity.Id = self->Id;
+ activeDS.appIdentity = *pOrigin;
TRACE("OK!\n");
return TWRC_SUCCESS;
}
--
2.11.0
2
1
21 Nov '17
Tell the user that a "wine-mono package" is missing instead
of a "Mono package" to make clear that not native mono is meant.
Fixed Bug 44054.
Note that I could fix the arabic translation,
and that a few of the messages in other languages seem to be
mistakenly about gecko.
Signed-off-by: Fabian Maurer <dark.shadow4(a)web.de>
---
dlls/appwiz.cpl/appwiz.rc | 2 +-
po/ar.po | 2 +-
po/bg.po | 2 +-
po/ca.po | 4 ++--
po/cs.po | 4 ++--
po/da.po | 2 +-
po/de.po | 4 ++--
po/el.po | 2 +-
po/en.po | 4 ++--
po/en_US.po | 4 ++--
po/eo.po | 2 +-
po/es.po | 2 +-
po/fa.po | 2 +-
po/fi.po | 4 ++--
po/fr.po | 4 ++--
po/he.po | 2 +-
po/hi.po | 2 +-
po/hr.po | 4 ++--
po/hu.po | 2 +-
po/it.po | 2 +-
po/ja.po | 4 ++--
po/ko.po | 4 ++--
po/lt.po | 4 ++--
po/ml.po | 2 +-
po/nb_NO.po | 4 ++--
po/nl.po | 4 ++--
po/or.po | 2 +-
po/pa.po | 2 +-
po/pl.po | 4 ++--
po/pt_BR.po | 4 ++--
po/pt_PT.po | 4 ++--
po/rm.po | 2 +-
po/ro.po | 2 +-
po/ru.po | 4 ++--
po/sk.po | 2 +-
po/sl.po | 2 +-
po/sr_RS(a)cyrillic.po | 2 +-
po/sr_RS(a)latin.po | 2 +-
po/sv.po | 4 ++--
po/te.po | 2 +-
po/th.po | 2 +-
po/tr.po | 4 ++--
po/uk.po | 4 ++--
po/wa.po | 2 +-
po/wine.pot | 2 +-
po/zh_CN.po | 4 ++--
po/zh_TW.po | 4 ++--
47 files changed, 69 insertions(+), 69 deletions(-)
diff --git a/dlls/appwiz.cpl/appwiz.rc b/dlls/appwiz.cpl/appwiz.rc
index 049e1d88ef..5c8b31b525 100644
--- a/dlls/appwiz.cpl/appwiz.rc
+++ b/dlls/appwiz.cpl/appwiz.rc
@@ -114,7 +114,7 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN
CAPTION "Wine Mono Installer"
FONT 8, "MS Shell Dlg"
{
- CONTROL "Wine could not find a Mono package which is needed for .NET applications " \
+ CONTROL "Wine could not find a wine-mono package which is needed for .NET applications " \
"to work correctly. Wine can automatically download and install it for you.\n\n" \
"Note: it is recommended to use your distribution's packages instead. " \
"See <a href=\"http://wiki.winehq.org/Mono\">http://wiki.winehq.org/Mono</a> for details.",
diff --git a/po/ar.po b/po/ar.po
index a0d34bc16a..dc6d1e5771 100644
--- a/po/ar.po
+++ b/po/ar.po
@@ -158,7 +158,7 @@ msgstr "مُثبّت آلة مونو"
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/bg.po b/po/bg.po
index 8b8110e1eb..cd6bc0d95c 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -167,7 +167,7 @@ msgstr ""
#: appwiz.rc:118
#, fuzzy
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/ca.po b/po/ca.po
index 4421ec976d..11e3bcf172 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -165,14 +165,14 @@ msgstr "Instal·lador del Wine Mono"
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
"href=\"http://wiki.winehq.org/Mono\">http://wiki.winehq.org/Mono</a> for "
"details."
msgstr ""
-"El Wine no ha pogut trobar un paquet del Mono que es necessita perquè les "
+"El Wine no ha pogut trobar un paquet del wine-mono que es necessita perquè les "
"aplicacions .NET funcionin correctament. El Wine el pot baixar i instal·lar "
"automàticament per vós.\n"
"\n"
diff --git a/po/cs.po b/po/cs.po
index 1f23cb570f..263bb6f1e2 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -163,14 +163,14 @@ msgstr "Instalátor Wine Mono"
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
"href=\"http://wiki.winehq.org/Mono\">http://wiki.winehq.org/Mono</a> for "
"details."
msgstr ""
-"Wine se nepodařilo najít balíček Mono potřebný pro správnou funkčnost .NET "
+"Wine se nepodařilo najít balíček wine-mono potřebný pro správnou funkčnost .NET "
"aplikací. Wine ho pro Vás může automaticky stáhnout a nainstalovat.\n"
"\n"
"Poznámka: Je doporučeno využít namísto toho balíček Vaší distribuce. Pro "
diff --git a/po/da.po b/po/da.po
index bff20ef8f9..75c78e1673 100644
--- a/po/da.po
+++ b/po/da.po
@@ -172,7 +172,7 @@ msgstr "Wine Gecko Installationsprogram"
#| "<a href=\"http://wiki.winehq.org/Gecko\">http://wiki.winehq.org/Gecko</a> "
#| "for details."
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/de.po b/po/de.po
index 8e8fe3de62..a5248c53d9 100644
--- a/po/de.po
+++ b/po/de.po
@@ -165,14 +165,14 @@ msgstr "Wine-Mono-Installation"
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
"href=\"http://wiki.winehq.org/Mono\">http://wiki.winehq.org/Mono</a> for "
"details."
msgstr ""
-"Wine konnte das Mono-Paket nicht finden. Es wird von .NET-Programmen "
+"Wine konnte das wine-mono-Paket nicht finden. Es wird von .NET-Programmen "
"benötigt, damit diese richtig funktionieren. Wine kann das Paket für Sie "
"herunterladen und installieren.\n"
"\n"
diff --git a/po/el.po b/po/el.po
index f20d19d286..3f2d9b7266 100644
--- a/po/el.po
+++ b/po/el.po
@@ -155,7 +155,7 @@ msgstr ""
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/en.po b/po/en.po
index 5a0695b732..54c82e3385 100644
--- a/po/en.po
+++ b/po/en.po
@@ -162,14 +162,14 @@ msgstr "Wine Mono Installer"
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
"href=\"http://wiki.winehq.org/Mono\">http://wiki.winehq.org/Mono</a> for "
"details."
msgstr ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/en_US.po b/po/en_US.po
index b5b19c3c54..019110477b 100644
--- a/po/en_US.po
+++ b/po/en_US.po
@@ -162,14 +162,14 @@ msgstr "Wine Mono Installer"
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
"href=\"http://wiki.winehq.org/Mono\">http://wiki.winehq.org/Mono</a> for "
"details."
msgstr ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/eo.po b/po/eo.po
index 22a251113a..8716f665ab 100644
--- a/po/eo.po
+++ b/po/eo.po
@@ -162,7 +162,7 @@ msgstr "Instalilo de Wine-Gecko"
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/es.po b/po/es.po
index f7c03701b6..46f02081d7 100644
--- a/po/es.po
+++ b/po/es.po
@@ -174,7 +174,7 @@ msgstr "Instalador Wine Gecko"
#| "<a href=\"http://wiki.winehq.org/Gecko\">http://wiki.winehq.org/Gecko</a> "
#| "for details."
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/fa.po b/po/fa.po
index bcb78c7427..f4b1651a92 100644
--- a/po/fa.po
+++ b/po/fa.po
@@ -155,7 +155,7 @@ msgstr ""
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/fi.po b/po/fi.po
index a0d39c0cb8..9cf9034aea 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -160,14 +160,14 @@ msgstr "Wine Mono -asennusohjelma"
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
"href=\"http://wiki.winehq.org/Mono\">http://wiki.winehq.org/Mono</a> for "
"details."
msgstr ""
-"Wine ei löytänyt Mono-pakettia, jota tarvitaan, jotta .NET-sovellukset "
+"Wine ei löytänyt wine-mono-pakettia, jota tarvitaan, jotta .NET-sovellukset "
"toimisivat oikein. Wine voi ladata ja asentaa sen puolestasi.\n"
"\n"
"Huomaa, että on suositeltavampaa käyttää oman jakelusi paketteja. "
diff --git a/po/fr.po b/po/fr.po
index cd923cbabf..ff8d965d07 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -164,14 +164,14 @@ msgstr "Programme d'installation de Mono pour Wine"
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
"href=\"http://wiki.winehq.org/Mono\">http://wiki.winehq.org/Mono</a> for "
"details."
msgstr ""
-"Wine n'a pu trouver de paquet Mono, qui est nécessaire pour que les "
+"Wine n'a pu trouver de paquet wine-mono, qui est nécessaire pour que les "
"applications .NET fonctionnent correctement. Wine peut automatiquement le "
"télécharger et l'installer pour vous.\n"
"\n"
diff --git a/po/he.po b/po/he.po
index f5b8771cde..f5f01e9e06 100644
--- a/po/he.po
+++ b/po/he.po
@@ -171,7 +171,7 @@ msgstr "התקנת Gecko על Wine"
#: appwiz.rc:118
#, fuzzy
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/hi.po b/po/hi.po
index 09aae732f5..e52b483f32 100644
--- a/po/hi.po
+++ b/po/hi.po
@@ -152,7 +152,7 @@ msgstr ""
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/hr.po b/po/hr.po
index 2c82d50691..604c45d6b7 100644
--- a/po/hr.po
+++ b/po/hr.po
@@ -162,14 +162,14 @@ msgstr "Wine Mono instalacijski program"
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
"href=\"http://wiki.winehq.org/Mono\">http://wiki.winehq.org/Mono</a> for "
"details."
msgstr ""
-"Wine nije uspio pronaći Mono paket koji je neophodan za ispravno "
+"Wine nije uspio pronaći wine-mono paket koji je neophodan za ispravno "
"funkcioniranje .NET aplikacija. Wine može automatski preuzeti i instalirati "
"program.\n"
"\n"
diff --git a/po/hu.po b/po/hu.po
index ab37d74986..29400cc318 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -175,7 +175,7 @@ msgstr "Wine Gecko telepítő"
#| "<a href=\"http://wiki.winehq.org/Gecko\">http://wiki.winehq.org/Gecko</a> "
#| "for details."
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/it.po b/po/it.po
index 5cba4110d2..e7ca3f76b5 100644
--- a/po/it.po
+++ b/po/it.po
@@ -180,7 +180,7 @@ msgstr "Installer di Wine Gecko"
#| "<a href=\"http://wiki.winehq.org/Gecko\">http://wiki.winehq.org/Gecko</a> "
#| "for details."
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/ja.po b/po/ja.po
index 4e7a24fc82..7cb1cace2a 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -163,14 +163,14 @@ msgstr "Wine Mono インストーラ"
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
"href=\"http://wiki.winehq.org/Mono\">http://wiki.winehq.org/Mono</a> for "
"details."
msgstr ""
-"Mono パッケージを見つけられません。このパッケージは .NET アプリケーションが正"
+"wine-mono パッケージを見つけられません。このパッケージは .NET アプリケーションが正"
"しく動作するために必要です。 Wine で Mono パッケージを自動的にダウンロード"
"し、インストールできます。\n"
"\n"
diff --git a/po/ko.po b/po/ko.po
index 26642216de..3af6b01984 100644
--- a/po/ko.po
+++ b/po/ko.po
@@ -161,14 +161,14 @@ msgstr "Wine Mono 설치관리자"
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
"href=\"http://wiki.winehq.org/Mono\">http://wiki.winehq.org/Mono</a> for "
"details."
msgstr ""
-"Wine은 닷넷 응용프로그램을 제대로 실행시키기 위해 필요한 Mono 패키지를 찾을 "
+"Wine은 닷넷 응용프로그램을 제대로 실행시키기 위해 필요한 wine-mono 패키지를 찾을 "
"수없습니다. Wine은 당신을 위해서 자동으로 다운로드하고 설치할 것입니다.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/lt.po b/po/lt.po
index 6c4fc9cdf4..a4ec212b02 100644
--- a/po/lt.po
+++ b/po/lt.po
@@ -164,14 +164,14 @@ msgstr "„Wine“ „Mono“ diegimo programa"
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
"href=\"http://wiki.winehq.org/Mono\">http://wiki.winehq.org/Mono</a> for "
"details."
msgstr ""
-"„Wine“ nepavyko rasti „Mono“ paketo reikalingo .NET programoms teisingai "
+"„Wine“ nepavyko rasti „wine-mono“ paketo reikalingo .NET programoms teisingai "
"veikti. „Wine“ gali automatiškai atsiųsti ir įdiegti šį paketą.\n"
"\n"
"Pastaba: rekomenduojama naudoti distribucijos paketus. Daugiau informacijos "
diff --git a/po/ml.po b/po/ml.po
index 9da616115f..243858d3d3 100644
--- a/po/ml.po
+++ b/po/ml.po
@@ -152,7 +152,7 @@ msgstr ""
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/nb_NO.po b/po/nb_NO.po
index 631f95faa5..192cc63996 100644
--- a/po/nb_NO.po
+++ b/po/nb_NO.po
@@ -163,14 +163,14 @@ msgstr "Installere Wine Mono"
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
"href=\"http://wiki.winehq.org/Mono\">http://wiki.winehq.org/Mono</a> for "
"details."
msgstr ""
-"Wine fant ikke Mono-pakken, som er nødvendig for at .NET programmer skal "
+"Wine fant ikke wine-mono-pakken, som er nødvendig for at .NET programmer skal "
"fungere ordentlig. Wine kan laste ned og installere denne pakken for deg.\n"
"\n"
"Merk: det anbefales at du bruker Mono-pakken som følger med operativsystemet "
diff --git a/po/nl.po b/po/nl.po
index 616dafa965..94bc1ea531 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -164,14 +164,14 @@ msgstr "Wine-Mono-Installatie"
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
"href=\"http://wiki.winehq.org/Mono\">http://wiki.winehq.org/Mono</a> for "
"details."
msgstr ""
-"Wine kon geen Mono-pakket vinden. Mono is nodig voor programma's die gebruik "
+"Wine kon geen wine-mono-pakket vinden. Mono is nodig voor programma's die gebruik "
"maken van het .NET raamwerk . Wine kan het automatisch voor u downloaden en "
"installeren.\n"
"\n"
diff --git a/po/or.po b/po/or.po
index f2cea1d5fe..c856b4b7f2 100644
--- a/po/or.po
+++ b/po/or.po
@@ -152,7 +152,7 @@ msgstr ""
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/pa.po b/po/pa.po
index 9ccdc45aff..4b31087c93 100644
--- a/po/pa.po
+++ b/po/pa.po
@@ -152,7 +152,7 @@ msgstr ""
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/pl.po b/po/pl.po
index 49316642a7..a889ce4c13 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -169,14 +169,14 @@ msgstr "Instalator Wine Mono"
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
"href=\"http://wiki.winehq.org/Mono\">http://wiki.winehq.org/Mono</a> for "
"details."
msgstr ""
-"Nie znaleziono paczki Mono potrzebnej do prawidłowego działania "
+"Nie znaleziono paczki wine-mono potrzebnej do prawidłowego działania "
"aplikacjiNET. Wine może sam pobrać i zainstalować tę paczkę dla ciebie.\n"
"\n"
"Uwaga: Zalecamy użycie paczki z twojej dystrybucji. Po szczegóły zajrzyj na "
diff --git a/po/pt_BR.po b/po/pt_BR.po
index f13e069883..80c045fef7 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -163,14 +163,14 @@ msgstr "Instalador Wine Mono"
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
"href=\"http://wiki.winehq.org/Mono\">http://wiki.winehq.org/Mono</a> for "
"details."
msgstr ""
-"O Wine não pôde encontrar o pacote Mono que é necessário para aplicativos ."
+"O Wine não pôde encontrar o pacote wine-mono que é necessário para aplicativos ."
"NET funcionarem corretamente. O Wine pode automaticamente efetuar o download "
"e instalá-lo para você.\n"
"\n"
diff --git a/po/pt_PT.po b/po/pt_PT.po
index dc103da78c..b3c2d9ea76 100644
--- a/po/pt_PT.po
+++ b/po/pt_PT.po
@@ -163,14 +163,14 @@ msgstr "Instalador Wine Mono"
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
"href=\"http://wiki.winehq.org/Mono\">http://wiki.winehq.org/Mono</a> for "
"details."
msgstr ""
-"O Wine não conseguiu encontrar o pacote Mono que é necessário para "
+"O Wine não conseguiu encontrar o pacote wine-mono que é necessário para "
"aplicações com HTML embutido funcionarem corretamente. O Wine pode "
"automaticamente efetuar o download e instalá-lo por si.\n"
"\n"
diff --git a/po/rm.po b/po/rm.po
index 565e31330d..61c6a494a2 100644
--- a/po/rm.po
+++ b/po/rm.po
@@ -157,7 +157,7 @@ msgstr ""
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/ro.po b/po/ro.po
index f8e6643c02..80f829849d 100644
--- a/po/ro.po
+++ b/po/ro.po
@@ -157,7 +157,7 @@ msgstr "Instalator Wine Mono"
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/ru.po b/po/ru.po
index 33c03756e7..412e00c31f 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -165,14 +165,14 @@ msgstr "Установка Wine Mono"
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
"href=\"http://wiki.winehq.org/Mono\">http://wiki.winehq.org/Mono</a> for "
"details."
msgstr ""
-"Wine не может найти пакет Mono, который необходим для корректной работы .NET "
+"Wine не может найти пакет wine-mono, который необходим для корректной работы .NET "
"приложений. Wine может автоматически загрузить и установить его.\n"
"\n"
"Примечание: рекомендуется использовать пакет, предоставляемый вашим "
diff --git a/po/sk.po b/po/sk.po
index 894e057ee8..b02643089a 100644
--- a/po/sk.po
+++ b/po/sk.po
@@ -180,7 +180,7 @@ msgstr "Wine Gecko inštalátor"
#| "<a href=\"http://wiki.winehq.org/Gecko\">http://wiki.winehq.org/Gecko</a> "
#| "for details."
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/sl.po b/po/sl.po
index a76dbbf163..6622431efa 100644
--- a/po/sl.po
+++ b/po/sl.po
@@ -179,7 +179,7 @@ msgstr "Namestitev Wine Gecko"
#| "<a href=\"http://wiki.winehq.org/Gecko\">http://wiki.winehq.org/Gecko</a> "
#| "for details."
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/sr_RS(a)cyrillic.po b/po/sr_RS(a)cyrillic.po
index fea02fcf6f..12b0a1e0f0 100644
--- a/po/sr_RS(a)cyrillic.po
+++ b/po/sr_RS(a)cyrillic.po
@@ -165,7 +165,7 @@ msgstr "Wine Gecko инсталациони програм"
#: appwiz.rc:118
#, fuzzy
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/sr_RS(a)latin.po b/po/sr_RS(a)latin.po
index ce31e7ec76..a5f69674ec 100644
--- a/po/sr_RS(a)latin.po
+++ b/po/sr_RS(a)latin.po
@@ -165,7 +165,7 @@ msgstr "Wine Gecko instalacioni program"
#: appwiz.rc:118
#, fuzzy
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/sv.po b/po/sv.po
index 1cf205d819..d65aae8916 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -162,14 +162,14 @@ msgstr "Wine Mono Installationsprogram"
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
"href=\"http://wiki.winehq.org/Mono\">http://wiki.winehq.org/Mono</a> for "
"details."
msgstr ""
-"Wine kunde inte hitta paketet Mono vilket krävs för att .NET-program ska "
+"Wine kunde inte hitta paketet wine-mono vilket krävs för att .NET-program ska "
"fungera korrekt. Wine kan hämta och installera det automatiskt åt dig.\n"
"\n"
"Obs: Du rekommenderas att använda din distributions paket i stället. Se <a "
diff --git a/po/te.po b/po/te.po
index c570afc262..07d9814fb5 100644
--- a/po/te.po
+++ b/po/te.po
@@ -152,7 +152,7 @@ msgstr ""
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/th.po b/po/th.po
index 7803202cd8..eb576babed 100644
--- a/po/th.po
+++ b/po/th.po
@@ -156,7 +156,7 @@ msgstr ""
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/tr.po b/po/tr.po
index a41a663298..5cdc74a980 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -164,14 +164,14 @@ msgstr "Wine Mono Yükleyicisi"
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
"href=\"http://wiki.winehq.org/Mono\">http://wiki.winehq.org/Mono</a> for "
"details."
msgstr ""
-"Wine, .NET uygulamalarının düzgün çalışması için gerekli olan Mono paketini "
+"Wine, .NET uygulamalarının düzgün çalışması için gerekli olan wine-mono paketini "
"bulamadı. Wine, paketi sizin için otomatik indirip yükleyebilir.\n"
"\n"
"Not: kendi dağıtımınızın paketlerini kullanmanız önerilir. Ayrıntılar için "
diff --git a/po/uk.po b/po/uk.po
index 807b89a125..a5f036f7d1 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -161,14 +161,14 @@ msgstr "Встановлювач Wine Mono"
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
"href=\"http://wiki.winehq.org/Mono\">http://wiki.winehq.org/Mono</a> for "
"details."
msgstr ""
-"Wine не може знайти пакунок Mono, який потрібний для коректної роботи .NET "
+"Wine не може знайти пакунок wine-mono, який потрібний для коректної роботи .NET "
"додатків. Wine може автоматично завантажити та встановити його для Вас.\n"
"\n"
"Зауважте: Рекомендується використати пакет з вашого дистрибутиву. Детальніше "
diff --git a/po/wa.po b/po/wa.po
index 57f3192439..71f5fce284 100644
--- a/po/wa.po
+++ b/po/wa.po
@@ -159,7 +159,7 @@ msgstr ""
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/wine.pot b/po/wine.pot
index 856f3a255c..b91a85224b 100644
--- a/po/wine.pot
+++ b/po/wine.pot
@@ -147,7 +147,7 @@ msgstr ""
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
diff --git a/po/zh_CN.po b/po/zh_CN.po
index ba25385ae2..feffd4adec 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -156,14 +156,14 @@ msgstr "Wine Mono 安装器"
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
"href=\"http://wiki.winehq.org/Mono\">http://wiki.winehq.org/Mono</a> for "
"details."
msgstr ""
-"Wine 未找到到用于支持 .NET 应用的 Mono 组件。Wine 可以自动并下载安装它。\n"
+"Wine 未找到到用于支持 .NET 应用的 wine-mono 组件。Wine 可以自动并下载安装它。\n"
"\n"
"注意: 推荐您安装为发行版定制的软件包。具体请参看 <a href=\"http://wiki."
"winehq.org/Mono\">http://wiki.winehq.org/Mono</a>。"
diff --git a/po/zh_TW.po b/po/zh_TW.po
index 5ab509e821..9a1ad62005 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -158,14 +158,14 @@ msgstr "Wine Mono 安裝程式"
#: appwiz.rc:118
msgid ""
-"Wine could not find a Mono package which is needed for .NET applications to "
+"Wine could not find a wine-mono package which is needed for .NET applications to "
"work correctly. Wine can automatically download and install it for you.\n"
"\n"
"Note: it is recommended to use your distribution's packages instead. See <a "
"href=\"http://wiki.winehq.org/Mono\">http://wiki.winehq.org/Mono</a> for "
"details."
msgstr ""
-"Wine 需要安裝 Mono 套件才能正確執行 .NET 應用程式。Wine 可以自動幫您下載並安"
+"Wine 需要安裝 wine-mono 套件才能正確執行 .NET 應用程式。Wine 可以自動幫您下載並安"
"裝它。\n"
"\n"
"備註:建議您使用發行版所附的套件。詳情請見 <a href=\"http://wiki.winehq.org/"
--
2.15.0
1
0
21 Nov '17
Signed-off-by: Aric Stewart <aric(a)codeweavers.com>
---
dlls/hidclass.sys/pnp.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
1
0
[PATCH] gdiplus/tests: Some tests for GdipGetFontCollectionFamilyList() and system collection
by Nikolay Sivov 21 Nov '17
by Nikolay Sivov 21 Nov '17
21 Nov '17
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/gdiplus/tests/font.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 55 insertions(+)
diff --git a/dlls/gdiplus/tests/font.c b/dlls/gdiplus/tests/font.c
index 2cae48192e..6c7738cf90 100644
--- a/dlls/gdiplus/tests/font.c
+++ b/dlls/gdiplus/tests/font.c
@@ -1110,6 +1110,60 @@ todo_wine
DeleteDC(hdc);
}
+static void test_GdipGetFontCollectionFamilyList(void)
+{
+ GpFontFamily *family, *family2;
+ GpFontCollection *collection;
+ INT found, count;
+ GpStatus status;
+
+ status = GdipNewInstalledFontCollection(&collection);
+ ok(status == Ok, "Failed to get system collection, status %d.\n", status);
+
+ count = 0;
+ status = GdipGetFontCollectionFamilyCount(collection, &count);
+ ok(status == Ok, "Failed to get family count, status %d.\n", status);
+ ok(count > 0, "Unexpected empty collection.\n");
+
+ status = GdipGetFontCollectionFamilyList(NULL, 0, NULL, NULL);
+ ok(status == InvalidParameter, "Unexpected status %d.\n", status);
+
+ found = 123;
+ status = GdipGetFontCollectionFamilyList(NULL, 0, NULL, &found);
+ ok(status == InvalidParameter, "Unexpected status %d.\n", status);
+ ok(found == 123, "Unexpected list count %d.\n", found);
+
+ status = GdipGetFontCollectionFamilyList(collection, 0, NULL, NULL);
+ ok(status == InvalidParameter, "Unexpected status %d.\n", status);
+
+ found = 123;
+ status = GdipGetFontCollectionFamilyList(collection, 0, NULL, &found);
+ ok(status == InvalidParameter, "Unexpected status %d.\n", status);
+ ok(found == 123, "Unexpected list count %d.\n", found);
+
+ found = 123;
+ status = GdipGetFontCollectionFamilyList(collection, 1, NULL, &found);
+ ok(status == InvalidParameter, "Unexpected status %d.\n", status);
+ ok(found == 123, "Unexpected list count %d.\n", found);
+
+ family = NULL;
+ found = 0;
+ status = GdipGetFontCollectionFamilyList(collection, 1, &family, &found);
+ ok(status == Ok, "Failed to get family list, status %d.\n", status);
+ ok(found == 1, "Unexpected list count %d.\n", found);
+ ok(family != NULL, "Expected family instance.\n");
+
+ family = NULL;
+ found = 0;
+ status = GdipGetFontCollectionFamilyList(collection, 1, &family2, &found);
+ ok(status == Ok, "Failed to get family list, status %d.\n", status);
+ ok(found == 1, "Unexpected list count %d.\n", found);
+ ok(family2 != family, "Unexpected family instance.\n");
+
+ GdipDeleteFontFamily(family);
+ GdipDeleteFontFamily(family2);
+}
+
START_TEST(font)
{
struct GdiplusStartupInput gdiplusStartupInput;
@@ -1139,6 +1193,7 @@ START_TEST(font)
test_getgenerics();
test_installedfonts();
test_heightgivendpi();
+ test_GdipGetFontCollectionFamilyList();
GdiplusShutdown(gdiplusToken);
}
--
2.15.0
2
1
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/d2d1/bitmap.c | 1 +
dlls/d2d1/tests/d2d1.c | 5 +++++
2 files changed, 6 insertions(+)
diff --git a/dlls/d2d1/bitmap.c b/dlls/d2d1/bitmap.c
index 6d9c352924..b03482ae43 100644
--- a/dlls/d2d1/bitmap.c
+++ b/dlls/d2d1/bitmap.c
@@ -34,6 +34,7 @@ static HRESULT STDMETHODCALLTYPE d2d_bitmap_QueryInterface(ID2D1Bitmap *iface, R
TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
if (IsEqualGUID(iid, &IID_ID2D1Bitmap)
+ || IsEqualGUID(iid, &IID_ID2D1Image)
|| IsEqualGUID(iid, &IID_ID2D1Resource)
|| IsEqualGUID(iid, &IID_IUnknown))
{
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index 3a28e38d67..4cc90b6272 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -1476,6 +1476,7 @@ static void test_bitmap_brush(void)
IDXGISurface *surface;
ID2D1Factory *factory;
D2D1_COLOR_F color;
+ ID2D1Image *image;
D2D1_SIZE_U size;
unsigned int i;
ULONG refcount;
@@ -1535,6 +1536,10 @@ static void test_bitmap_brush(void)
hr = ID2D1RenderTarget_CreateBitmap(rt, size, bitmap_data, 4 * sizeof(*bitmap_data), &bitmap_desc, &bitmap);
ok(SUCCEEDED(hr), "Failed to create bitmap, hr %#x.\n", hr);
+ hr = ID2D1Bitmap_QueryInterface(bitmap, &IID_ID2D1Image, (void **)&image);
+ ok(SUCCEEDED(hr), "Failed to get ID2D1Image, hr %#x.\n", hr);
+ ID2D1Image_Release(image);
+
/* Creating a brush with a NULL bitmap crashes on Vista, but works fine on
* Windows 7+. */
hr = ID2D1RenderTarget_CreateBitmapBrush(rt, bitmap, NULL, NULL, &brush);
--
2.15.0
2
1
[PATCH] ole32/tests: Use a separate data source for the file dib to avoid confusion.
by Huw Davies 21 Nov '17
by Huw Davies 21 Nov '17
21 Nov '17
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/ole32/tests/ole2.c | 51 ++++++++++++++++++++++++++++---------------------
1 file changed, 29 insertions(+), 22 deletions(-)
diff --git a/dlls/ole32/tests/ole2.c b/dlls/ole32/tests/ole2.c
index 1a982b404c..07157a7dd6 100644
--- a/dlls/ole32/tests/ole2.c
+++ b/dlls/ole32/tests/ole2.c
@@ -199,19 +199,14 @@ static void inline check_expected_method_fmt(const char *method_name, const FORM
} while (0)
/* 2 x 1 x 32 bpp dib. PelsPerMeter = 200x400 */
-static BYTE dib[] =
-{
- 0x42, 0x4d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,
-
- 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00,
- 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00,
-
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x00,
- 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00,
-
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+static const BYTE dib[] =
+{
+ 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xc8, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
static void create_dib( STGMEDIUM *med )
@@ -219,9 +214,9 @@ static void create_dib( STGMEDIUM *med )
void *ptr;
med->tymed = TYMED_HGLOBAL;
- U(med)->hGlobal = GlobalAlloc( GMEM_MOVEABLE, sizeof(dib) - sizeof(BITMAPFILEHEADER) );
+ U(med)->hGlobal = GlobalAlloc( GMEM_MOVEABLE, sizeof(dib) );
ptr = GlobalLock( U(med)->hGlobal );
- memcpy( ptr, dib + sizeof(BITMAPFILEHEADER), sizeof(dib) - sizeof(BITMAPFILEHEADER) );
+ memcpy( ptr, dib, sizeof(dib) );
GlobalUnlock( U(med)->hGlobal );
med->pUnkForRelease = NULL;
}
@@ -2038,9 +2033,21 @@ static void test_data_cache(void)
IStorage_Release(pStorage);
}
-
static const WCHAR CONTENTS[] = {'C','O','N','T','E','N','T','S',0};
+/* 2 x 1 x 32 bpp dib. PelsPerMeter = 200x400 */
+static BYTE file_dib[] =
+{
+ 0x42, 0x4d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x00,
+ 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+};
+
static IStorage *create_storage( int num )
{
IStorage *stg;
@@ -2056,10 +2063,10 @@ static IStorage *create_storage( int num )
ok( hr == S_OK, "got %08x\n", hr);
if (num == 1) /* Set biXPelsPerMeter = 0 */
{
- dib[0x26] = 0;
- dib[0x27] = 0;
+ file_dib[0x26] = 0;
+ file_dib[0x27] = 0;
}
- hr = IStream_Write( stm, dib, sizeof(dib), &written );
+ hr = IStream_Write( stm, file_dib, sizeof(file_dib), &written );
ok( hr == S_OK, "got %08x\n", hr);
IStream_Release( stm );
return stg;
@@ -2114,7 +2121,7 @@ static void test_data_cache_dib_contents_stream(int num)
"got %lu\n", GlobalSize( U(med).hGlobal ) );
ptr = GlobalLock( U(med).hGlobal );
- expect_info = *(BITMAPINFOHEADER *)(dib + sizeof(BITMAPFILEHEADER));
+ expect_info = *(BITMAPINFOHEADER *)(file_dib + sizeof(BITMAPFILEHEADER));
if (expect_info.biXPelsPerMeter == 0 || expect_info.biYPelsPerMeter == 0)
{
HDC hdc = GetDC( 0 );
@@ -2123,8 +2130,8 @@ static void test_data_cache_dib_contents_stream(int num)
ReleaseDC( 0, hdc );
}
ok( !memcmp( ptr, &expect_info, sizeof(expect_info) ), "mismatch\n" );
- ok( !memcmp( ptr + sizeof(expect_info), dib + sizeof(BITMAPFILEHEADER) + sizeof(expect_info),
- sizeof(dib) - sizeof(BITMAPFILEHEADER) - sizeof(expect_info) ), "mismatch\n" );
+ ok( !memcmp( ptr + sizeof(expect_info), file_dib + sizeof(BITMAPFILEHEADER) + sizeof(expect_info),
+ sizeof(file_dib) - sizeof(BITMAPFILEHEADER) - sizeof(expect_info) ), "mismatch\n" );
GlobalUnlock( U(med).hGlobal );
ReleaseStgMedium( &med );
--
2.12.0
1
0
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/gdiplus/tests/image.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c
index 0b444effb1..9aed7919a7 100644
--- a/dlls/gdiplus/tests/image.c
+++ b/dlls/gdiplus/tests/image.c
@@ -4397,7 +4397,7 @@ static void test_DrawImage_scale(void)
{ 1.2, PixelOffsetModeHalf, image_120_half, TRUE },
{ 1.5, PixelOffsetModeHalf, image_150_half, TRUE },
{ 1.8, PixelOffsetModeHalf, image_180 },
- { 2.0, PixelOffsetModeHalf, image_200_half, TRUE },
+ { 2.0, PixelOffsetModeHalf, image_200_half },
{ 2.5, PixelOffsetModeHalf, image_250_half, TRUE },
{ 0.8, PixelOffsetModeHighQuality, image_080 }, /* 21 */
@@ -4405,7 +4405,7 @@ static void test_DrawImage_scale(void)
{ 1.2, PixelOffsetModeHighQuality, image_120_half, TRUE },
{ 1.5, PixelOffsetModeHighQuality, image_150_half, TRUE },
{ 1.8, PixelOffsetModeHighQuality, image_180 },
- { 2.0, PixelOffsetModeHighQuality, image_200_half, TRUE },
+ { 2.0, PixelOffsetModeHighQuality, image_200_half },
{ 2.5, PixelOffsetModeHighQuality, image_250_half, TRUE },
};
BYTE src_2x1[6] = { 0x80,0x80,0x80,0x80,0x80,0x80 };
@@ -4450,15 +4450,15 @@ static void test_DrawImage_scale(void)
expect(Ok, status);
match = memcmp(dst_8x1, td[i].image, sizeof(dst_8x1)) == 0;
- todo_wine_if (!match && td[i].todo)
- ok(match, "%d: data should match\n", i);
+ todo_wine_if (td[i].todo)
+ ok(match, "%d: data didn't match:", i);
if (!match)
{
UINT i, size = sizeof(dst_8x1);
const BYTE *bits = dst_8x1;
for (i = 0; i < size; i++)
- trace(" %02x", bits[i]);
- trace("\n");
+ printf(" %02x", bits[i]);
+ printf("\n");
}
}
--
2.15.0
3
4
Improvements:
- Don't use timer for TME_LEAVE and react immediately on mouse motion.
It improves user experience for controls depending on this API like toolbar.
- Fail when called with invalid flags
- Hold tracking info for each win32 thread independently
- Merge tracking requests if possible (leave+hover)
- Return hover time 0 when hover tracking is disabled
Patch v2 fixes compiler warnings and some style issues.
Signed-off-by: Rafał Harabień <rafalh1992(a)o2.pl>
---
dlls/user32/input.c | 234 ++++++++++++++++++++++++---------------------
dlls/user32/message.c | 5 +
dlls/user32/tests/msg.c | 165 ++++++++++++++++++++++++++++++++
dlls/user32/user_private.h | 11 +++
dlls/winex11.drv/event.c | 2 +-
dlls/winex11.drv/mouse.c | 29 ++++++
dlls/winex11.drv/window.c | 2 +-
dlls/winex11.drv/x11drv.h | 1 +
8 files changed, 337 insertions(+), 112 deletions(-)
diff --git a/dlls/user32/input.c b/dlls/user32/input.c
index c475b19..5b589a5 100644
--- a/dlls/user32/input.c
+++ b/dlls/user32/input.c
@@ -1243,48 +1243,59 @@ BOOL WINAPI UnloadKeyboardLayout(HKL hkl)
return USER_Driver->pUnloadKeyboardLayout(hkl);
}
-typedef struct __TRACKINGLIST {
- TRACKMOUSEEVENT tme;
- POINT pos; /* center of hover rectangle */
-} _TRACKINGLIST;
-/* FIXME: move tracking stuff into a per thread data */
-static _TRACKINGLIST tracking_info;
-static UINT_PTR timer;
+void maybe_clean_tracking_info(struct tracking_info *tracking_info)
+{
+ if (!(tracking_info->tme.dwFlags & (TME_HOVER | TME_LEAVE)))
+ {
+ tracking_info->tme.hwndTrack = 0;
+ tracking_info->tme.dwFlags = 0;
+ }
+ if (!(tracking_info->tme.dwFlags & TME_HOVER))
+ tracking_info->tme.dwHoverTime = 0;
+}
-static void check_mouse_leave(HWND hwnd, int hittest)
+void check_mouse_leave(HWND hwnd, int hittest)
{
- if (tracking_info.tme.hwndTrack != hwnd)
+ struct tracking_info *tracking_info = &get_user_thread_info()->tracking_info;
+
+ TRACE("hwnd %p hittest %d\n", hwnd, hittest);
+
+ if (!(tracking_info->tme.dwFlags & TME_LEAVE))
+ return;
+
+ if (tracking_info->tme.hwndTrack != hwnd)
{
- if (tracking_info.tme.dwFlags & TME_NONCLIENT)
- PostMessageW(tracking_info.tme.hwndTrack, WM_NCMOUSELEAVE, 0, 0);
+ if (tracking_info->tme.dwFlags & TME_NONCLIENT)
+ PostMessageW(tracking_info->tme.hwndTrack, WM_NCMOUSELEAVE, 0, 0);
else
- PostMessageW(tracking_info.tme.hwndTrack, WM_MOUSELEAVE, 0, 0);
+ PostMessageW(tracking_info->tme.hwndTrack, WM_MOUSELEAVE, 0, 0);
/* remove the TME_LEAVE flag */
- tracking_info.tme.dwFlags &= ~TME_LEAVE;
+ tracking_info->tme.dwFlags &= ~TME_LEAVE;
}
else
{
if (hittest == HTCLIENT)
{
- if (tracking_info.tme.dwFlags & TME_NONCLIENT)
+ if (tracking_info->tme.dwFlags & TME_NONCLIENT)
{
- PostMessageW(tracking_info.tme.hwndTrack, WM_NCMOUSELEAVE, 0, 0);
+ PostMessageW(tracking_info->tme.hwndTrack, WM_NCMOUSELEAVE, 0, 0);
/* remove the TME_LEAVE flag */
- tracking_info.tme.dwFlags &= ~TME_LEAVE;
+ tracking_info->tme.dwFlags &= ~TME_LEAVE;
}
}
else
{
- if (!(tracking_info.tme.dwFlags & TME_NONCLIENT))
+ if (!(tracking_info->tme.dwFlags & TME_NONCLIENT))
{
- PostMessageW(tracking_info.tme.hwndTrack, WM_MOUSELEAVE, 0, 0);
+ PostMessageW(tracking_info->tme.hwndTrack, WM_MOUSELEAVE, 0, 0);
/* remove the TME_LEAVE flag */
- tracking_info.tme.dwFlags &= ~TME_LEAVE;
+ tracking_info->tme.dwFlags &= ~TME_LEAVE;
}
}
}
+ maybe_clean_tracking_info(tracking_info);
}
static void CALLBACK TrackMouseEventProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent,
@@ -1292,6 +1303,7 @@ static void CALLBACK TrackMouseEventProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent,
{
POINT pos;
INT hoverwidth = 0, hoverheight = 0, hittest;
+ struct tracking_info *tracking_info = &get_user_thread_info()->tracking_info;
TRACE("hwnd %p, msg %04x, id %04lx, time %u\n", hwnd, uMsg, idEvent, dwTime);
@@ -1304,31 +1316,24 @@ static void CALLBACK TrackMouseEventProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent,
SystemParametersInfoW(SPI_GETMOUSEHOVERHEIGHT, 0, &hoverheight, 0);
TRACE("tracked pos %s, current pos %s, hover width %d, hover height %d\n",
- wine_dbgstr_point(&tracking_info.pos), wine_dbgstr_point(&pos),
+ wine_dbgstr_point(&tracking_info->pos), wine_dbgstr_point(&pos),
hoverwidth, hoverheight);
- /* see if this tracking event is looking for TME_LEAVE and that the */
- /* mouse has left the window */
- if (tracking_info.tme.dwFlags & TME_LEAVE)
- {
- check_mouse_leave(hwnd, hittest);
- }
-
- if (tracking_info.tme.hwndTrack != hwnd)
+ if (tracking_info->tme.hwndTrack != hwnd)
{
/* mouse is gone, stop tracking mouse hover */
- tracking_info.tme.dwFlags &= ~TME_HOVER;
+ tracking_info->tme.dwFlags &= ~TME_HOVER;
}
/* see if we are tracking hovering for this hwnd */
- if (tracking_info.tme.dwFlags & TME_HOVER)
+ if (tracking_info->tme.dwFlags & TME_HOVER)
{
/* has the cursor moved outside the rectangle centered around pos? */
- if ((abs(pos.x - tracking_info.pos.x) > (hoverwidth / 2)) ||
- (abs(pos.y - tracking_info.pos.y) > (hoverheight / 2)))
+ if ((abs(pos.x - tracking_info->pos.x) > (hoverwidth / 2)) ||
+ (abs(pos.y - tracking_info->pos.y) > (hoverheight / 2)))
{
/* record this new position as the current position */
- tracking_info.pos = pos;
+ tracking_info->pos = pos;
}
else
{
@@ -1337,29 +1342,88 @@ static void CALLBACK TrackMouseEventProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent,
ScreenToClient(hwnd, &pos);
TRACE("client cursor pos %s\n", wine_dbgstr_point(&pos));
- PostMessageW(tracking_info.tme.hwndTrack, WM_MOUSEHOVER,
+ PostMessageW(tracking_info->tme.hwndTrack, WM_MOUSEHOVER,
get_key_state(), MAKELPARAM( pos.x, pos.y ));
}
else
{
- if (tracking_info.tme.dwFlags & TME_NONCLIENT)
- PostMessageW(tracking_info.tme.hwndTrack, WM_NCMOUSEHOVER,
+ if (tracking_info->tme.dwFlags & TME_NONCLIENT)
+ PostMessageW(tracking_info->tme.hwndTrack, WM_NCMOUSEHOVER,
hittest, MAKELPARAM( pos.x, pos.y ));
}
/* stop tracking mouse hover */
- tracking_info.tme.dwFlags &= ~TME_HOVER;
+ tracking_info->tme.dwFlags &= ~TME_HOVER;
}
}
/* stop the timer if the tracking list is empty */
- if (!(tracking_info.tme.dwFlags & (TME_HOVER | TME_LEAVE)))
+ if (!(tracking_info->tme.dwFlags & TME_HOVER))
+ {
+ KillSystemTimer(tracking_info->tme.hwndTrack, tracking_info->timer);
+ tracking_info->timer = 0;
+ }
+ maybe_clean_tracking_info(tracking_info);
+}
+
+void track_mouse_event_internal(HWND hwnd_track, DWORD flags, DWORD hover_time)
+{
+ HWND hwnd;
+ POINT pos;
+ INT hittest;
+ struct tracking_info *tracking_info = &get_user_thread_info()->tracking_info;
+
+ if (flags & TME_HOVER)
+ {
+ /* if HOVER_DEFAULT or 0 was specified replace this with the system's current value. */
+ if (hover_time == HOVER_DEFAULT || hover_time == 0)
+ SystemParametersInfoW(SPI_GETMOUSEHOVERTIME, 0, &hover_time, 0);
+ }
+
+ if (flags & TME_CANCEL)
+ {
+ if (tracking_info->tme.hwndTrack == hwnd_track)
+ {
+ /* cancel old tracking request */
+ tracking_info->tme.dwFlags &= ~(flags & ~TME_CANCEL);
+
+ /* if we aren't tracking on hover or leave remove this entry */
+ if (!(tracking_info->tme.dwFlags & TME_HOVER) && tracking_info->timer)
+ {
+ KillSystemTimer(tracking_info->tme.hwndTrack, tracking_info->timer);
+ tracking_info->timer = 0;
+ }
+ maybe_clean_tracking_info(tracking_info);
+ }
+ }
+ else
{
- KillSystemTimer(tracking_info.tme.hwndTrack, timer);
- timer = 0;
- tracking_info.tme.hwndTrack = 0;
- tracking_info.tme.dwFlags = 0;
- tracking_info.tme.dwHoverTime = 0;
+ /* check what window is under cursor */
+ GetCursorPos(&pos);
+ hwnd = WINPOS_WindowFromPoint(hwnd_track, pos, &hittest);
+ TRACE("point %s hwnd %p hittest %d\n", wine_dbgstr_point(&pos), hwnd, hittest);
+
+ if (hwnd_track != hwnd)
+ PostMessageW(hwnd_track, WM_MOUSELEAVE, 0, 0);
+ else
+ {
+ /* save tracking request */
+ tracking_info->tme.hwndTrack = hwnd_track;
+ tracking_info->tme.dwFlags |= flags;
+ if (flags & TME_HOVER)
+ tracking_info->tme.dwHoverTime = hover_time;
+
+ /* Initialize HoverInfo variables even if not hover tracking */
+ tracking_info->pos = pos;
+
+ if (flags & TME_HOVER)
+ {
+ /* recreate timer */
+ if (tracking_info->timer)
+ KillSystemTimer(tracking_info->tme.hwndTrack, tracking_info->timer);
+ tracking_info->timer = SetSystemTimer(tracking_info->tme.hwndTrack, (UINT_PTR)&tracking_info->tme, hover_time, TrackMouseEventProc);
+ }
+ }
}
}
@@ -1389,23 +1453,30 @@ static void CALLBACK TrackMouseEventProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent,
BOOL WINAPI
TrackMouseEvent (TRACKMOUSEEVENT *ptme)
{
- HWND hwnd;
- POINT pos;
- DWORD hover_time;
- INT hittest;
+ DWORD invalid_flags;
+ struct tracking_info *tracking_info = &get_user_thread_info()->tracking_info;
TRACE("%x, %x, %p, %u\n", ptme->cbSize, ptme->dwFlags, ptme->hwndTrack, ptme->dwHoverTime);
- if (ptme->cbSize != sizeof(TRACKMOUSEEVENT)) {
+ if (ptme->cbSize != sizeof(TRACKMOUSEEVENT))
+ {
WARN("wrong TRACKMOUSEEVENT size from app\n");
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
+ invalid_flags = ptme->dwFlags & ~(TME_QUERY | TME_CANCEL | TME_HOVER | TME_LEAVE | TME_NONCLIENT);
+ if (invalid_flags != 0)
+ {
+ WARN("Unknown flag(s) %08x\n", invalid_flags);
+ SetLastError(ERROR_INVALID_FLAGS);
+ return FALSE;
+ }
+
/* fill the TRACKMOUSEEVENT struct with the current tracking for the given hwnd */
- if (ptme->dwFlags & TME_QUERY )
+ if (ptme->dwFlags & TME_QUERY)
{
- *ptme = tracking_info.tme;
+ *ptme = tracking_info->tme;
/* set cbSize in the case it's not initialized yet */
ptme->cbSize = sizeof(TRACKMOUSEEVENT);
@@ -1418,68 +1489,11 @@ TrackMouseEvent (TRACKMOUSEEVENT *ptme)
return FALSE;
}
- hover_time = (ptme->dwFlags & TME_HOVER) ? ptme->dwHoverTime : HOVER_DEFAULT;
-
- /* if HOVER_DEFAULT was specified replace this with the system's current value.
- * TME_LEAVE doesn't need to specify hover time so use default */
- if (hover_time == HOVER_DEFAULT || hover_time == 0)
- SystemParametersInfoW(SPI_GETMOUSEHOVERTIME, 0, &hover_time, 0);
-
- GetCursorPos(&pos);
- hwnd = WINPOS_WindowFromPoint(ptme->hwndTrack, pos, &hittest);
- TRACE("point %s hwnd %p hittest %d\n", wine_dbgstr_point(&pos), hwnd, hittest);
-
- if (ptme->dwFlags & ~(TME_CANCEL | TME_HOVER | TME_LEAVE | TME_NONCLIENT))
- FIXME("Unknown flag(s) %08x\n", ptme->dwFlags & ~(TME_CANCEL | TME_HOVER | TME_LEAVE | TME_NONCLIENT));
-
- if (ptme->dwFlags & TME_CANCEL)
- {
- if (tracking_info.tme.hwndTrack == ptme->hwndTrack)
- {
- tracking_info.tme.dwFlags &= ~(ptme->dwFlags & ~TME_CANCEL);
-
- /* if we aren't tracking on hover or leave remove this entry */
- if (!(tracking_info.tme.dwFlags & (TME_HOVER | TME_LEAVE)))
- {
- KillSystemTimer(tracking_info.tme.hwndTrack, timer);
- timer = 0;
- tracking_info.tme.hwndTrack = 0;
- tracking_info.tme.dwFlags = 0;
- tracking_info.tme.dwHoverTime = 0;
- }
- }
- } else {
- /* In our implementation it's possible that another window will receive a
- * WM_MOUSEMOVE and call TrackMouseEvent before TrackMouseEventProc is
- * called. In such a situation post the WM_MOUSELEAVE now */
- if (tracking_info.tme.dwFlags & TME_LEAVE && tracking_info.tme.hwndTrack != NULL)
- check_mouse_leave(hwnd, hittest);
-
- if (timer)
- {
- KillSystemTimer(tracking_info.tme.hwndTrack, timer);
- timer = 0;
- tracking_info.tme.hwndTrack = 0;
- tracking_info.tme.dwFlags = 0;
- tracking_info.tme.dwHoverTime = 0;
- }
-
- if (ptme->hwndTrack == hwnd)
- {
- /* Adding new mouse event to the tracking list */
- tracking_info.tme = *ptme;
- tracking_info.tme.dwHoverTime = hover_time;
-
- /* Initialize HoverInfo variables even if not hover tracking */
- tracking_info.pos = pos;
-
- timer = SetSystemTimer(tracking_info.tme.hwndTrack, (UINT_PTR)&tracking_info.tme, hover_time, TrackMouseEventProc);
- }
- }
-
- return TRUE;
+ /* use internal message to get access to user_thread_info for tracked window */
+ return SendNotifyMessageW(ptme->hwndTrack, WM_WINE_TRACKMOUSEEVENT, ptme->dwFlags, ptme->dwHoverTime);
}
+
/***********************************************************************
* GetMouseMovePointsEx [USER32]
*
diff --git a/dlls/user32/message.c b/dlls/user32/message.c
index 406eff3..21710c3 100644
--- a/dlls/user32/message.c
+++ b/dlls/user32/message.c
@@ -1888,6 +1888,9 @@ static LRESULT handle_internal_message( HWND hwnd, UINT msg, WPARAM wparam, LPAR
return USER_Driver->pClipCursor( &rect );
}
return USER_Driver->pClipCursor( NULL );
+ case WM_WINE_TRACKMOUSEEVENT:
+ track_mouse_event_internal(hwnd, (DWORD)wparam, (DWORD)lparam);
+ return 0;
default:
if (msg >= WM_WINE_FIRST_DRIVER_MSG && msg <= WM_WINE_LAST_DRIVER_MSG)
return USER_Driver->pWindowMessage( hwnd, msg, wparam, lparam );
@@ -2503,6 +2506,8 @@ static BOOL process_mouse_message( MSG *msg, UINT hw_id, ULONG_PTR extra_info, H
else
{
msg->hwnd = WINPOS_WindowFromPoint( msg->hwnd, msg->pt, &hittest );
+ /* TrackMouseEvent support */
+ check_mouse_leave(msg->hwnd, hittest);
}
if (!msg->hwnd || !WIN_IsCurrentThread( msg->hwnd ))
diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c
index 64c7967..0c7eb8e 100644
--- a/dlls/user32/tests/msg.c
+++ b/dlls/user32/tests/msg.c
@@ -7817,6 +7817,18 @@ static DWORD WINAPI thread_proc(void *param)
while (GetMessageA(&msg, 0, 0, 0))
{
+ if ((msg.message == WM_TIMER || msg.message == WM_SYSTIMER) && msg.lParam)
+ {
+ struct recvd_message s_msg;
+
+ s_msg.hwnd = msg.hwnd;
+ s_msg.message = msg.message;
+ s_msg.flags = sent|wparam|lparam;
+ s_msg.wParam = msg.wParam;
+ s_msg.lParam = msg.lParam;
+ s_msg.descr = "msg_loop";
+ add_message(&s_msg);
+ }
TranslateMessage(&msg);
DispatchMessageA(&msg);
}
@@ -11938,6 +11950,11 @@ static const struct message WmMouseHoverSeq[] = {
{ 0 }
};
+static const struct message WmMouseLeaveSeq[] = {
+ { WM_MOUSELEAVE, sent|wparam, 0 },
+ { 0 }
+};
+
static void pump_msg_loop_timeout(DWORD timeout, BOOL inject_mouse_move)
{
MSG msg;
@@ -11989,6 +12006,9 @@ static void test_TrackMouseEvent(void)
HWND hwnd, hchild;
RECT rc_parent, rc_child;
UINT default_hover_time, hover_width = 0, hover_height = 0;
+ struct wnd_event wnd_event;
+ HANDLE hthread;
+ DWORD tid;
#define track_hover(track_hwnd, track_hover_time) \
tme.cbSize = sizeof(tme); \
@@ -11999,6 +12019,15 @@ static void test_TrackMouseEvent(void)
ret = pTrackMouseEvent(&tme); \
ok(ret, "TrackMouseEvent(TME_HOVER) error %d\n", GetLastError())
+#define track_leave(track_hwnd) \
+ tme.cbSize = sizeof(tme); \
+ tme.dwFlags = TME_LEAVE; \
+ tme.hwndTrack = track_hwnd; \
+ tme.dwHoverTime = 0xdeadbeef; \
+ SetLastError(0xdeadbeef); \
+ ret = pTrackMouseEvent(&tme); \
+ ok(ret, "TrackMouseEvent(TME_LEAVE) error %d\n", GetLastError());
+
#define track_query(expected_track_flags, expected_track_hwnd, expected_hover_time) \
tme.cbSize = sizeof(tme); \
tme.dwFlags = TME_QUERY; \
@@ -12024,6 +12053,15 @@ static void test_TrackMouseEvent(void)
ret = pTrackMouseEvent(&tme); \
ok(ret, "TrackMouseEvent(TME_HOVER | TME_CANCEL) error %d\n", GetLastError())
+#define track_leave_cancel(track_hwnd) \
+ tme.cbSize = sizeof(tme); \
+ tme.dwFlags = TME_LEAVE | TME_CANCEL; \
+ tme.hwndTrack = track_hwnd; \
+ tme.dwHoverTime = 0xdeadbeef; \
+ SetLastError(0xdeadbeef); \
+ ret = pTrackMouseEvent(&tme); \
+ ok(ret, "TrackMouseEvent(TME_LEAVE | TME_CANCEL) error %d\n", GetLastError())
+
default_hover_time = 0xdeadbeef;
SetLastError(0xdeadbeef);
ret = SystemParametersInfoA(SPI_GETMOUSEHOVERTIME, 0, &default_hover_time, 0);
@@ -12090,6 +12128,17 @@ static void test_TrackMouseEvent(void)
ok(GetLastError() == ERROR_INVALID_WINDOW_HANDLE || broken(GetLastError() == 0xdeadbeef),
"not expected error %u\n", GetLastError());
+ /* Invalid flags */
+ tme.cbSize = sizeof(tme);
+ tme.dwFlags = ~TME_CANCEL;
+ tme.hwndTrack = hwnd;
+ tme.dwHoverTime = HOVER_DEFAULT;
+ SetLastError(0xdeadbeef);
+ ret = pTrackMouseEvent(&tme);
+ ok(!ret, "TrackMouseEvent should fail\n");
+ ok(GetLastError() == ERROR_INVALID_FLAGS, "not expected error %u\n", GetLastError());
+ track_query(0, NULL, 0);
+
GetWindowRect(hwnd, &rc_parent);
GetWindowRect(hchild, &rc_child);
SetCursorPos(rc_child.left - 10, rc_child.top - 10);
@@ -12159,11 +12208,127 @@ static void test_TrackMouseEvent(void)
track_query(TME_HOVER, hwnd, default_hover_time);
track_hover_cancel(hwnd);
+ /* cursor is over child window */
+ mouse_event(MOUSEEVENTF_MOVE, 20, 20, 0, 0); /* rc_child.left + 10, rc_child.top + 10 */
+ flush_events();
+ flush_sequence();
+
+ /* cancel TME_LEAVE */
+ track_leave(hchild);
+ ok(GetLastError() == 0xdeadbeef, "not expected error %u\n", GetLastError());
+ track_query(TME_LEAVE, hchild, 0);
+ track_leave_cancel(hchild);
+ track_query(0, NULL, 0);
+ pump_msg_loop_timeout(default_hover_time, FALSE);
+ ok_sequence(WmEmptySeq, "WmEmptySeq", FALSE);
+
+ /* requests for the same window are merged */
+ track_hover(hchild, HOVER_DEFAULT);
+ track_query(TME_HOVER, hchild, default_hover_time);
+ track_leave(hchild);
+ ok(GetLastError() == 0xdeadbeef, "not expected error %u\n", GetLastError());
+ track_query(TME_LEAVE|TME_HOVER, hchild, default_hover_time);
+ track_hover_cancel(hchild);
+ track_query(TME_LEAVE, hchild, 0);
+ /* TME_LEAVE for window not being under cursor doesn't change TME_QUERY result */
+ track_leave(hwnd);
+ track_query(TME_LEAVE, hchild, 0);
+ track_leave_cancel(hchild);
+ track_query(0, NULL, 0);
+ flush_events();
+ flush_sequence();
+
+ /* try changing hover time */
+ track_hover(hchild, 0);
+ track_query(TME_HOVER, hchild, default_hover_time);
+ track_hover(hchild, 1);
+ track_query(TME_HOVER, hchild, 1);
+ track_hover(hchild, HOVER_DEFAULT);
+ track_query(TME_HOVER, hchild, default_hover_time);
+ track_hover(hchild, default_hover_time*2);
+ track_query(TME_HOVER, hchild, default_hover_time*2);
+ track_hover_cancel(hchild);
+
+ /* test TME_LEAVE */
+ track_leave(hchild);
+ ok(GetLastError() == 0xdeadbeef, "not expected error %u\n", GetLastError());
+ track_query(TME_LEAVE, hchild, 0);
+ ok(!GetCapture(), "expected NULL\n");
+ mouse_event(MOUSEEVENTF_MOVE, -20, 0, 0, 0); /* rc_child.left - 10, rc_child.top + 10 */
+ pump_msg_loop_timeout(0, FALSE);
+ ok_sequence(WmMouseLeaveSeq, "WmMouseLeaveSeq", FALSE);
+ track_query(0, NULL, 0);
+
+ /* window is not under cursor - immediate WM_MOUSELEAVE is expected */
+ track_leave(hchild);
+ ok(GetLastError() == 0xdeadbeef, "not expected error %u\n", GetLastError());
+ track_query(0, NULL, 0);
+ pump_msg_loop_timeout(0, FALSE);
+ ok_sequence(WmMouseLeaveSeq, "WmMouseLeaveSeq", FALSE);
+
+ mouse_event(MOUSEEVENTF_MOVE, 20, 0, 0, 0); /* rc_child.left + 10, rc_child.top + 10 */
+ flush_events();
+ flush_sequence();
+
+ /* move cursor outside top-window */
+ track_leave(hchild);
+ track_query(TME_LEAVE, hchild, 0);
+ mouse_event(MOUSEEVENTF_MOVE, 500, 0, 0, 0); /* rc_child.left + 510, rc_child.top + 10 */
+ pump_msg_loop_timeout(0, FALSE);
+ ok_sequence(WmMouseLeaveSeq, "WmMouseLeaveSeq", FALSE);
+ track_query(0, NULL, 0);
+
DestroyWindow(hwnd);
+ /* Try tracking cursor over window from other thread */
+ wnd_event.start_event = CreateEventW(NULL, 0, 0, NULL);
+ if (!wnd_event.start_event)
+ {
+ win_skip("CreateEventW failed\n");
+ return;
+ }
+ hthread = CreateThread(NULL, 0, thread_proc, &wnd_event, 0, &tid);
+ ok(hthread != NULL, "CreateThread failed, error %d\n", GetLastError());
+ ok(WaitForSingleObject(wnd_event.start_event, INFINITE) == WAIT_OBJECT_0, "WaitForSingleObject failed\n");
+ CloseHandle(wnd_event.start_event);
+ SetCursorPos(150, 150);
+ ShowWindow(wnd_event.hwnd, SW_SHOW);
+ flush_events();
+ flush_sequence();
+
+ /* window is under cursor */
+ track_hover(wnd_event.hwnd, HOVER_DEFAULT);
+ track_query(0, NULL, 0);
+ pump_msg_loop_timeout(default_hover_time, TRUE);
+ ok_sequence(WmMouseHoverSeq, "WmMouseHoverSeq", FALSE);
+
+ track_leave(wnd_event.hwnd);
+ ok(GetLastError() == 0xdeadbeef, "not expected error %u\n", GetLastError());
+ track_query(0, NULL, 0);
+ pump_msg_loop_timeout(default_hover_time, FALSE);
+ ok_sequence(WmEmptySeq, "WmEmptySeq", FALSE);
+
+ /* window is not under cursor */
+ SetCursorPos(600, 150);
+ pump_msg_loop_timeout(default_hover_time, FALSE);
+ ok_sequence(WmMouseLeaveSeq, "WmMouseLeaveSeq", FALSE);
+
+ track_leave(wnd_event.hwnd);
+ ok(GetLastError() == 0xdeadbeef, "not expected error %u\n", GetLastError());
+ track_query(0, NULL, 0);
+ pump_msg_loop_timeout(default_hover_time, FALSE);
+ ok_sequence(WmMouseLeaveSeq, "WmMouseLeaveSeq", FALSE);
+
+ ret = PostMessageA(wnd_event.hwnd, WM_QUIT, 0, 0);
+ ok( ret, "PostMessageA(WM_QUIT) error %d\n", GetLastError());
+ ok(WaitForSingleObject(hthread, INFINITE) == WAIT_OBJECT_0, "WaitForSingleObject failed\n");
+ CloseHandle(hthread);
+
#undef track_hover
#undef track_query
+#undef track_leave
#undef track_hover_cancel
+#undef track_leave_cancel
}
diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h
index 052fdd8..efff279 100644
--- a/dlls/user32/user_private.h
+++ b/dlls/user32/user_private.h
@@ -53,6 +53,7 @@ enum wine_internal_message
WM_WINE_KEYBOARD_LL_HOOK,
WM_WINE_MOUSE_LL_HOOK,
WM_WINE_CLIPCURSOR,
+ WM_WINE_TRACKMOUSEEVENT,
WM_WINE_FIRST_DRIVER_MSG = 0x80001000, /* range of messages reserved for the USER driver */
WM_WINE_LAST_DRIVER_MSG = 0x80001fff
};
@@ -163,6 +164,13 @@ struct wm_char_mapping_data
MSG get_msg;
};
+/* data for TrackMouseEvent */
+struct tracking_info {
+ TRACKMOUSEEVENT tme;
+ POINT pos; /* center of hover rectangle */
+ UINT_PTR timer;
+};
+
/* this is the structure stored in TEB->Win32ClientInfo */
/* no attempt is made to keep the layout compatible with the Windows one */
struct user_thread_info
@@ -185,6 +193,7 @@ struct user_thread_info
HWND top_window; /* Desktop window */
HWND msg_window; /* HWND_MESSAGE parent window */
RAWINPUT *rawinput;
+ struct tracking_info tracking_info;
};
C_ASSERT( sizeof(struct user_thread_info) <= sizeof(((TEB *)0)->Win32ClientInfo) );
@@ -225,6 +234,8 @@ struct tagWND;
extern void CLIPBOARD_ReleaseOwner( HWND hwnd ) DECLSPEC_HIDDEN;
extern BOOL FOCUS_MouseActivate( HWND hwnd ) DECLSPEC_HIDDEN;
extern BOOL set_capture_window( HWND hwnd, UINT gui_flags, HWND *prev_ret ) DECLSPEC_HIDDEN;
+extern void check_mouse_leave(HWND hwnd, int hittest) DECLSPEC_HIDDEN;
+extern void track_mouse_event_internal(HWND hwnd, DWORD flags, DWORD hover_time) DECLSPEC_HIDDEN;
extern void free_dce( struct dce *dce, HWND hwnd ) DECLSPEC_HIDDEN;
extern void invalidate_dce( struct tagWND *win, const RECT *rect ) DECLSPEC_HIDDEN;
extern void erase_now( HWND hwnd, UINT rdw_flags ) DECLSPEC_HIDDEN;
diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c
index a0bfe05..cc8dac8 100644
--- a/dlls/winex11.drv/event.c
+++ b/dlls/winex11.drv/event.c
@@ -114,7 +114,7 @@ static x11drv_event_handler handlers[MAX_EVENT_HANDLERS] =
X11DRV_ButtonRelease, /* 5 ButtonRelease */
X11DRV_MotionNotify, /* 6 MotionNotify */
X11DRV_EnterNotify, /* 7 EnterNotify */
- NULL, /* 8 LeaveNotify */
+ X11DRV_LeaveNotify, /* 8 LeaveNotify */
X11DRV_FocusIn, /* 9 FocusIn */
X11DRV_FocusOut, /* 10 FocusOut */
X11DRV_KeymapNotify, /* 11 KeymapNotify */
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
index 5ace405..092c381 100644
--- a/dlls/winex11.drv/mouse.c
+++ b/dlls/winex11.drv/mouse.c
@@ -1447,6 +1447,7 @@ BOOL CDECL X11DRV_GetCursorPos(LPPOINT pos)
*pos = root_to_virtual_screen( winX, winY );
TRACE( "pointer at %s server pos %s\n", wine_dbgstr_point(pos), wine_dbgstr_point(&old) );
}
+
return ret;
}
@@ -1690,6 +1691,34 @@ BOOL X11DRV_EnterNotify( HWND hwnd, XEvent *xev )
return TRUE;
}
+/***********************************************************************
+ * X11DRV_LeaveNotify
+ */
+BOOL X11DRV_LeaveNotify( HWND hwnd, XEvent *xev )
+{
+ XCrossingEvent *event = &xev->xcrossing;
+ INPUT input;
+
+ TRACE( "hwnd %p/%lx pos %d,%d detail %d\n", hwnd, event->window, event->x, event->y, event->detail );
+
+ if (event->detail == NotifyVirtual) return FALSE;
+ if (hwnd == x11drv_thread_data()->grab_hwnd) return FALSE;
+
+ /* simulate a mouse motion event - needed for TrackMouseEvent */
+ input.u.mi.dx = event->x;
+ input.u.mi.dy = event->y;
+ input.u.mi.mouseData = 0;
+ input.u.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE;
+ input.u.mi.time = EVENT_x11_time_to_win32_time( event->time );
+ input.u.mi.dwExtraInfo = 0;
+
+ /* Note: not calling is_old_motion_event because leave message is not simulated when warping cursor */
+
+ send_mouse_input( hwnd, event->window, event->state, &input );
+ return TRUE;
+}
+
+
#ifdef HAVE_X11_EXTENSIONS_XINPUT2_H
/***********************************************************************
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
index d35328c..2626c93 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -326,7 +326,7 @@ static int get_window_attributes( struct x11drv_win_data *data, XSetWindowAttrib
attr->backing_store = NotUseful;
attr->border_pixel = 0;
attr->event_mask = (ExposureMask | PointerMotionMask |
- ButtonPressMask | ButtonReleaseMask | EnterWindowMask |
+ ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask |
KeyPressMask | KeyReleaseMask | FocusChangeMask |
KeymapStateMask | StructureNotifyMask);
if (data->managed) attr->event_mask |= PropertyChangeMask;
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 938ff22..1ee1c15 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -508,6 +508,7 @@ extern BOOL X11DRV_ButtonPress( HWND hwnd, XEvent *event ) DECLSPEC_HIDDEN;
extern BOOL X11DRV_ButtonRelease( HWND hwnd, XEvent *event ) DECLSPEC_HIDDEN;
extern BOOL X11DRV_MotionNotify( HWND hwnd, XEvent *event ) DECLSPEC_HIDDEN;
extern BOOL X11DRV_EnterNotify( HWND hwnd, XEvent *event ) DECLSPEC_HIDDEN;
+extern BOOL X11DRV_LeaveNotify( HWND hwnd, XEvent *event ) DECLSPEC_HIDDEN;
extern BOOL X11DRV_KeyEvent( HWND hwnd, XEvent *event ) DECLSPEC_HIDDEN;
extern BOOL X11DRV_KeymapNotify( HWND hwnd, XEvent *event ) DECLSPEC_HIDDEN;
extern BOOL X11DRV_DestroyNotify( HWND hwnd, XEvent *event ) DECLSPEC_HIDDEN;
--
2.7.4
2
1
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
Fixes failures on Arabic and Hebrew Windows.
v2: Use LOCALE_IREADINGLAYOUT, a Windows 7 feature, to detect RTL
locales because it looks like Hebrew and Arabic propsheet resources
didn't exist until Windows 7 anyway.
---
dlls/comctl32/tests/propsheet.c | 32 +++++++++++++++++++++++++++++---
1 file changed, 29 insertions(+), 3 deletions(-)
diff --git a/dlls/comctl32/tests/propsheet.c b/dlls/comctl32/tests/propsheet.c
index a3f910d2d5..ec53e6bc7c 100644
--- a/dlls/comctl32/tests/propsheet.c
+++ b/dlls/comctl32/tests/propsheet.c
@@ -29,11 +29,19 @@
static HWND parenthwnd;
static HWND sheethwnd;
+static BOOL rtl;
static LONG active_page = -1;
#define IDC_APPLY_BUTTON 12321
+static void detect_locale(void)
+{
+ DWORD reading_layout;
+ rtl = GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_IREADINGLAYOUT | LOCALE_RETURN_NUMBER,
+ (void *)&reading_layout, sizeof(reading_layout)) && reading_layout == 1;
+}
+
/* try to make sure pending X events have been processed before continuing */
static void flush_events(void)
{
@@ -496,19 +504,28 @@ static void test_buttons(void)
button = GetDlgItem(hdlg, IDCANCEL);
GetWindowRect(button, &rc);
ok(rc.top == top, "Cancel button should have same top as OK button\n");
- ok(rc.left > prevRight, "Cancel button should be to the right of OK button\n");
+ if (rtl)
+ ok(rc.left < prevRight, "Cancel button should be to the left of OK button\n");
+ else
+ ok(rc.left > prevRight, "Cancel button should be to the right of OK button\n");
prevRight = rc.right;
button = GetDlgItem(hdlg, IDC_APPLY_BUTTON);
GetWindowRect(button, &rc);
ok(rc.top == top, "Apply button should have same top as OK button\n");
- ok(rc.left > prevRight, "Apply button should be to the right of Cancel button\n");
+ if (rtl)
+ ok(rc.left < prevRight, "Apply button should be to the left of Cancel button\n");
+ else
+ ok(rc.left > prevRight, "Apply button should be to the right of Cancel button\n");
prevRight = rc.right;
button = GetDlgItem(hdlg, IDHELP);
GetWindowRect(button, &rc);
ok(rc.top == top, "Help button should have same top as OK button\n");
- ok(rc.left > prevRight, "Help button should be to the right of Apply button\n");
+ if (rtl)
+ ok(rc.left < prevRight, "Help button should be to the left of Apply button\n");
+ else
+ ok(rc.left > prevRight, "Help button should be to the right of Apply button\n");
DestroyWindow(hdlg);
}
@@ -1124,6 +1141,15 @@ static void test_CreatePropertySheetPage(void)
START_TEST(propsheet)
{
+ detect_locale();
+ if (rtl)
+ {
+ /* use locale-specific RTL resources when on an RTL locale */
+ /* without this, propsheets on RTL locales use English LTR resources */
+ trace("RTL locale detected\n");
+ SetProcessDefaultLayout(LAYOUT_RTL);
+ }
+
test_title();
test_nopage();
test_disableowner();
--
2.15.0
1
0