Author: fireball
Date: Tue Nov 23 22:12:41 2010
New Revision: 49760
URL:
http://svn.reactos.org/svn/reactos?rev=49760&view=rev
Log:
- Sync up to Wine-1.3.7.
Added:
branches/arwinss/reactos/dll/win32/user32/resources/user32_He.rc
- copied unchanged from r49721,
vendor/wine/dlls/user32/current/resources/user32_He.rc
Modified:
branches/arwinss/reactos/dll/win32/gdi32/ (props changed)
branches/arwinss/reactos/dll/win32/gdi32/dc.c
branches/arwinss/reactos/dll/win32/gdi32/dib.c
branches/arwinss/reactos/dll/win32/gdi32/driver.c
branches/arwinss/reactos/dll/win32/gdi32/enhmfdrv/init.c
branches/arwinss/reactos/dll/win32/gdi32/font.c
branches/arwinss/reactos/dll/win32/gdi32/gdi_private.h
branches/arwinss/reactos/dll/win32/gdi32/icm.c
branches/arwinss/reactos/dll/win32/gdi32/mapping.c
branches/arwinss/reactos/dll/win32/gdi32/mfdrv/init.c
branches/arwinss/reactos/dll/win32/gdi32/mfdrv/objects.c
branches/arwinss/reactos/dll/win32/gdi32/opengl.c
branches/arwinss/reactos/dll/win32/user32/ (props changed)
branches/arwinss/reactos/dll/win32/user32/button.c
branches/arwinss/reactos/dll/win32/user32/resources/user32_Sr.rc
branches/arwinss/reactos/dll/win32/user32/win.c
branches/arwinss/reactos/dll/win32/winent.drv/gdidrv.c
branches/arwinss/reactos/dll/win32/winent.drv/winent.drv.spec
branches/arwinss/reactos/dll/win32/winex11.drv/ (props changed)
branches/arwinss/reactos/dll/win32/winex11.drv/brush.c
branches/arwinss/reactos/dll/win32/winex11.drv/event.c
branches/arwinss/reactos/dll/win32/winex11.drv/graphics.c
branches/arwinss/reactos/dll/win32/winex11.drv/mouse.c
branches/arwinss/reactos/dll/win32/winex11.drv/opengl.c
branches/arwinss/reactos/dll/win32/winex11.drv/palette.c
branches/arwinss/reactos/dll/win32/winex11.drv/systray.c
branches/arwinss/reactos/dll/win32/winex11.drv/window.c
branches/arwinss/reactos/dll/win32/winex11.drv/winex11.drv.spec
branches/arwinss/reactos/dll/win32/winex11.drv/x11drv.h
branches/arwinss/reactos/dll/win32/winex11.drv/x11drv_main.c
branches/arwinss/reactos/subsystems/win32/win32k/wine/ (props changed)
branches/arwinss/reactos/subsystems/win32/win32k/wine/window.c (contents, props
changed)
Propchange: branches/arwinss/reactos/dll/win32/gdi32/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Nov 23 22:12:41 2010
@@ -1,3 +1,3 @@
/branches/ros-amd64-bringup/reactos/dll/win32/gdi32:35746,35789,36614,36930,38148,38151,38265,38268,39333,39345,40991,41000,41027-41028,41050,41052,41082-41086,41549,43080
/trunk/reactos/dll/win32/gdi32:42000-44999,45011,45097-45099,45319,45418-45419,45535-45539,45687-45688,47605,48678
-/vendor/wine/dlls/gdi32/current:43136,43149,43398,43708,44151,44715,45044,45206,45455,45646,45910,46314,46696,46915,47274,47321,47585,47798,47861,48418,48677,49173
+/vendor/wine/dlls/gdi32/current:43136,43149,43398,43708,44151,44715,45044,45206,45455,45646,45910,46314,46696,46915,47274,47321,47585,47798,47861,48418,48677,49173,49721
Modified: branches/arwinss/reactos/dll/win32/gdi32/dc.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/gdi32…
==============================================================================
--- branches/arwinss/reactos/dll/win32/gdi32/dc.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/gdi32/dc.c [iso-8859-1] Tue Nov 23 22:12:41 2010
@@ -30,7 +30,6 @@
#include "winreg.h"
#include "winternl.h"
#include "winerror.h"
-#include "wownt32.h"
#include "gdi_private.h"
#include "wine/unicode.h"
#include "wine/debug.h"
Modified: branches/arwinss/reactos/dll/win32/gdi32/dib.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/gdi32…
==============================================================================
--- branches/arwinss/reactos/dll/win32/gdi32/dib.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/gdi32/dib.c [iso-8859-1] Tue Nov 23 22:12:41 2010
@@ -66,7 +66,6 @@
#include "windef.h"
#include "winbase.h"
-#include "wownt32.h"
#include "gdi_private.h"
#include "wine/debug.h"
Modified: branches/arwinss/reactos/dll/win32/gdi32/driver.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/gdi32…
==============================================================================
--- branches/arwinss/reactos/dll/win32/gdi32/driver.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/gdi32/driver.c [iso-8859-1] Tue Nov 23 22:12:41
2010
@@ -96,6 +96,7 @@
GET_FUNC(EndPage);
GET_FUNC(EndPath);
GET_FUNC(EnumDeviceFonts);
+ GET_FUNC(EnumICMProfiles);
GET_FUNC(ExcludeClipRect);
GET_FUNC(ExtDeviceMode);
GET_FUNC(ExtEscape);
Modified: branches/arwinss/reactos/dll/win32/gdi32/enhmfdrv/init.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/gdi32…
==============================================================================
--- branches/arwinss/reactos/dll/win32/gdi32/enhmfdrv/init.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/gdi32/enhmfdrv/init.c [iso-8859-1] Tue Nov 23
22:12:41 2010
@@ -58,6 +58,7 @@
NULL, /* pEndPage */
EMFDRV_EndPath, /* pEndPath */
NULL, /* pEnumDeviceFonts */
+ NULL, /* pEnumICMProfiles */
EMFDRV_ExcludeClipRect, /* pExcludeClipRect */
NULL, /* pExtDeviceMode */
NULL, /* pExtEscape */
Modified: branches/arwinss/reactos/dll/win32/gdi32/font.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/gdi32…
==============================================================================
--- branches/arwinss/reactos/dll/win32/gdi32/font.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/gdi32/font.c [iso-8859-1] Tue Nov 23 22:12:41 2010
@@ -31,7 +31,6 @@
#include "windef.h"
#include "winbase.h"
#include "winnls.h"
-#include "wownt32.h"
#include "gdi_private.h"
#include "wine/exception.h"
#include "wine/unicode.h"
Modified: branches/arwinss/reactos/dll/win32/gdi32/gdi_private.h
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/gdi32…
==============================================================================
--- branches/arwinss/reactos/dll/win32/gdi32/gdi_private.h [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/gdi32/gdi_private.h [iso-8859-1] Tue Nov 23
22:12:41 2010
@@ -99,6 +99,7 @@
INT (CDECL *pEndDoc)(PHYSDEV);
INT (CDECL *pEndPage)(PHYSDEV);
BOOL (CDECL *pEndPath)(PHYSDEV);
+ INT (CDECL *pEnumICMProfiles)(PHYSDEV,ICMENUMPROCW,LPARAM);
BOOL (CDECL *pEnumDeviceFonts)(PHYSDEV,LPLOGFONTW,FONTENUMPROCW,LPARAM);
INT (CDECL *pExcludeClipRect)(PHYSDEV,INT,INT,INT,INT);
INT (CDECL
*pExtDeviceMode)(LPSTR,HWND,LPDEVMODEA,LPSTR,LPSTR,LPDEVMODEA,LPSTR,DWORD);
Modified: branches/arwinss/reactos/dll/win32/gdi32/icm.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/gdi32…
==============================================================================
--- branches/arwinss/reactos/dll/win32/gdi32/icm.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/gdi32/icm.c [iso-8859-1] Tue Nov 23 22:12:41 2010
@@ -38,13 +38,62 @@
WINE_DEFAULT_DEBUG_CHANNEL(icm);
+struct enum_profiles
+{
+ BOOL unicode;
+ union
+ {
+ ICMENUMPROCA funcA;
+ ICMENUMPROCW funcW;
+ } callback;
+ LPARAM data;
+};
+
+INT CALLBACK enum_profiles_callback( LPWSTR filename, LPARAM lparam )
+{
+ int len, ret = -1;
+ struct enum_profiles *ep = (struct enum_profiles *)lparam;
+ char *filenameA;
+
+ if (ep->unicode)
+ return ep->callback.funcW( filename, ep->data );
+
+ len = WideCharToMultiByte( CP_ACP, 0, filename, -1, NULL, 0, NULL, NULL );
+ filenameA = HeapAlloc( GetProcessHeap(), 0, len );
+ if (filenameA)
+ {
+ WideCharToMultiByte( CP_ACP, 0, filename, -1, filenameA, len, NULL, NULL );
+ ret = ep->callback.funcA( filenameA, ep->data );
+ HeapFree( GetProcessHeap(), 0, filenameA );
+ }
+ return ret;
+}
+
/***********************************************************************
* EnumICMProfilesA (GDI32.@)
*/
INT WINAPI EnumICMProfilesA(HDC hdc, ICMENUMPROCA func, LPARAM lparam)
{
- FIXME("%p, %p, 0x%08lx stub\n", hdc, func, lparam);
- return -1;
+ DC *dc;
+ INT ret = -1;
+
+ TRACE("%p, %p, 0x%08lx\n", hdc, func, lparam);
+
+ if (!func) return -1;
+ if ((dc = get_dc_ptr(hdc)))
+ {
+ if (dc->funcs->pEnumICMProfiles)
+ {
+ struct enum_profiles ep;
+
+ ep.unicode = FALSE;
+ ep.callback.funcA = func;
+ ep.data = lparam;
+ ret = dc->funcs->pEnumICMProfiles(dc->physDev,
enum_profiles_callback, (LPARAM)&ep);
+ }
+ release_dc_ptr(dc);
+ }
+ return ret;
}
/***********************************************************************
@@ -52,8 +101,26 @@
*/
INT WINAPI EnumICMProfilesW(HDC hdc, ICMENUMPROCW func, LPARAM lparam)
{
- FIXME("%p, %p, 0x%08lx stub\n", hdc, func, lparam);
- return -1;
+ DC *dc;
+ INT ret = -1;
+
+ TRACE("%p, %p, 0x%08lx\n", hdc, func, lparam);
+
+ if (!func) return -1;
+ if ((dc = get_dc_ptr(hdc)))
+ {
+ if (dc->funcs->pEnumICMProfiles)
+ {
+ struct enum_profiles ep;
+
+ ep.unicode = TRUE;
+ ep.callback.funcW = func;
+ ep.data = lparam;
+ ret = dc->funcs->pEnumICMProfiles(dc->physDev,
enum_profiles_callback, (LPARAM)&ep);
+ }
+ release_dc_ptr(dc);
+ }
+ return ret;
}
/**********************************************************************
@@ -137,6 +204,17 @@
BOOL WINAPI SetICMProfileA(HDC hdc, LPSTR filename)
{
FIXME("%p %s stub\n", hdc, debugstr_a(filename));
+
+ if (!filename)
+ {
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return FALSE;
+ }
+ if (!hdc)
+ {
+ SetLastError( ERROR_INVALID_HANDLE );
+ return FALSE;
+ }
return TRUE;
}
@@ -146,6 +224,17 @@
BOOL WINAPI SetICMProfileW(HDC hdc, LPWSTR filename)
{
FIXME("%p %s stub\n", hdc, debugstr_w(filename));
+
+ if (!filename)
+ {
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return FALSE;
+ }
+ if (!hdc)
+ {
+ SetLastError( ERROR_INVALID_HANDLE );
+ return FALSE;
+ }
return TRUE;
}
Modified: branches/arwinss/reactos/dll/win32/gdi32/mapping.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/gdi32…
==============================================================================
--- branches/arwinss/reactos/dll/win32/gdi32/mapping.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/gdi32/mapping.c [iso-8859-1] Tue Nov 23 22:12:41
2010
@@ -23,7 +23,6 @@
#include "windef.h"
#include "winbase.h"
#include "wingdi.h"
-#include "wownt32.h"
#include "gdi_private.h"
#include "wine/debug.h"
Modified: branches/arwinss/reactos/dll/win32/gdi32/mfdrv/init.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/gdi32…
==============================================================================
--- branches/arwinss/reactos/dll/win32/gdi32/mfdrv/init.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/gdi32/mfdrv/init.c [iso-8859-1] Tue Nov 23 22:12:41
2010
@@ -56,6 +56,7 @@
NULL, /* pEndPage */
MFDRV_EndPath, /* pEndPath */
NULL, /* pEnumDeviceFonts */
+ NULL, /* pEnumICMProfiles */
MFDRV_ExcludeClipRect, /* pExcludeClipRect */
NULL, /* pExtDeviceMode */
MFDRV_ExtEscape, /* pExtEscape */
Modified: branches/arwinss/reactos/dll/win32/gdi32/mfdrv/objects.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/gdi32…
==============================================================================
--- branches/arwinss/reactos/dll/win32/gdi32/mfdrv/objects.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/gdi32/mfdrv/objects.c [iso-8859-1] Tue Nov 23
22:12:41 2010
@@ -26,7 +26,6 @@
#include "windef.h"
#include "winbase.h"
#include "wingdi.h"
-#include "wownt32.h"
#include "wine/wingdi16.h"
#include "mfdrv/metafiledrv.h"
#include "gdi_private.h"
Modified: branches/arwinss/reactos/dll/win32/gdi32/opengl.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/gdi32…
==============================================================================
--- branches/arwinss/reactos/dll/win32/gdi32/opengl.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/gdi32/opengl.c [iso-8859-1] Tue Nov 23 22:12:41
2010
@@ -135,11 +135,18 @@
TRACE("hglrc: (%p)\n", hglrc);
if(ctx == NULL)
- return FALSE;
+ {
+ SetLastError(ERROR_INVALID_HANDLE);
+ return FALSE;
+ }
/* Retrieve the HDC associated with the context to access the display driver */
dc = get_dc_ptr(ctx->hdc);
- if (!dc) return FALSE;
+ if (!dc)
+ {
+ SetLastError(ERROR_INVALID_HANDLE);
+ return FALSE;
+ }
if (!dc->funcs->pwglDeleteContext) FIXME(" :stub\n");
else ret = dc->funcs->pwglDeleteContext(hglrc);
Propchange: branches/arwinss/reactos/dll/win32/user32/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Nov 23 22:12:41 2010
@@ -1,3 +1,3 @@
/branches/ros-amd64-bringup/reactos/dll/win32/user32:35746,35789,36614,36930,38148,38151,38265,38268,39333,39345,40991,41000,41027-41028,41050,41052,41082-41086,41549,43080
/trunk/reactos/dll/win32/user32:42000-44999,45011,45097-45099,45319,45418-45419,45535-45539,45687-45688,47605,48678
-/vendor/wine/dlls/user32/current:43136,43149,43398,43708,44151,44715,45044,45206,45455,45646,45910,46314,46696,46915,47274,47321,47585,47798,47861,48147,48418,48677,49173
+/vendor/wine/dlls/user32/current:43136,43149,43398,43708,44151,44715,45044,45206,45455,45646,45910,46314,46696,46915,47274,47321,47585,47798,47861,48147,48418,48677,49173,49721
Modified: branches/arwinss/reactos/dll/win32/user32/button.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/user3…
==============================================================================
--- branches/arwinss/reactos/dll/win32/user32/button.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/user32/button.c [iso-8859-1] Tue Nov 23 22:12:41
2010
@@ -113,7 +113,7 @@
static void OB_Paint( HWND hwnd, HDC hDC, UINT action );
static void BUTTON_CheckAutoRadioButton( HWND hwnd );
-#define MAX_BTN_TYPE 12
+#define MAX_BTN_TYPE 16
static const WORD maxCheckState[MAX_BTN_TYPE] =
{
@@ -127,7 +127,7 @@
BUTTON_UNCHECKED, /* BS_GROUPBOX */
BUTTON_UNCHECKED, /* BS_USERBUTTON */
BUTTON_CHECKED, /* BS_AUTORADIOBUTTON */
- BUTTON_UNCHECKED, /* Not defined */
+ BUTTON_UNCHECKED, /* BS_PUSHBOX */
BUTTON_UNCHECKED /* BS_OWNERDRAW */
};
@@ -145,7 +145,7 @@
GB_Paint, /* BS_GROUPBOX */
UB_Paint, /* BS_USERBUTTON */
CB_Paint, /* BS_AUTORADIOBUTTON */
- NULL, /* Not defined */
+ NULL, /* BS_PUSHBOX */
OB_Paint /* BS_OWNERDRAW */
};
Modified: branches/arwinss/reactos/dll/win32/user32/resources/user32_Sr.rc
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/user3…
==============================================================================
--- branches/arwinss/reactos/dll/win32/user32/resources/user32_Sr.rc [iso-8859-1]
(original)
+++ branches/arwinss/reactos/dll/win32/user32/resources/user32_Sr.rc [iso-8859-1] Tue Nov
23 22:12:41 2010
@@ -1,6 +1,7 @@
/*
* Copyright 2010 Nenad Vujic
* Paul Vriens
+ * Copyright 2010 ÄorÄe VasiljeviÄ
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,29 +26,29 @@
SYSMENU MENU
{
- MENUITEM "&Obnovi", 61728
- MENUITEM "&Pomeri", 61456
+ MENUITEM "&Povrati", 61728
+ MENUITEM "Pr&emesti", 61456
MENUITEM "&VeliÄina", 61440
- MENUITEM "&Smanji", 61472
- MENUITEM "&Ceo ekran", 61488
+ MENUITEM "&Umanji", 61472
+ MENUITEM "U&veÄaj", 61488
MENUITEM SEPARATOR
MENUITEM "&Zatvori\tAlt-F4", 61536
MENUITEM SEPARATOR
- MENUITEM "O &Wine...", 61761
+ MENUITEM "&O Wine-u...", 61761
}
EDITMENU MENU
{
POPUP ""
BEGIN
- MENUITEM "&Opozovi", EM_UNDO
+ MENUITEM "&Opozivi", EM_UNDO
MENUITEM SEPARATOR
- MENUITEM "Ise&ci", WM_CUT
- MENUITEM "&Kopiraj", WM_COPY
+ MENUITEM "&Iseci", WM_CUT
+ MENUITEM "&Umnoži", WM_COPY
MENUITEM "&Ubaci", WM_PASTE
- MENUITEM "O&briši", WM_CLEAR
+ MENUITEM "Iz&briši", WM_CLEAR
MENUITEM SEPARATOR
- MENUITEM "Izaberi &Sve", EM_SETSEL
+ MENUITEM "Izaberi &sve", EM_SETSEL
END
}
@@ -56,62 +57,61 @@
BEGIN
ICON "", 1088, 8, 20, 16, 16, WS_CHILD | WS_VISIBLE
LTEXT "", 100, 32, 4, 176, 48, WS_CHILD | WS_VISIBLE | WS_GROUP |
SS_NOPREFIX
- PUSHBUTTON "&OK", 1, 16, 56, 40, 14, WS_CHILD | WS_VISIBLE |
WS_TABSTOP
- PUSHBUTTON "O&tkaži", 2, 64, 56, 40, 14, WS_CHILD | WS_VISIBLE |
WS_TABSTOP
+ PUSHBUTTON "&U redu", 1, 16, 56, 40, 14, WS_CHILD | WS_VISIBLE |
WS_TABSTOP
+ PUSHBUTTON "&Otkaži", 2, 64, 56, 40, 14, WS_CHILD | WS_VISIBLE |
WS_TABSTOP
PUSHBUTTON "&Prekini", 3, 112, 56, 40, 14, WS_CHILD | WS_VISIBLE |
WS_TABSTOP
- PUSHBUTTON "Po&kusaj ponovo", 4, 160, 56, 40, 14, WS_CHILD | WS_VISIBLE
| WS_TABSTOP
- PUSHBUTTON "&Ignoriši", 5, 208, 56, 40, 14, WS_CHILD | WS_VISIBLE |
WS_TABSTOP
+ PUSHBUTTON "Pokušaj &ponovo", 4, 160, 56, 40, 14, WS_CHILD |
WS_VISIBLE | WS_TABSTOP
+ PUSHBUTTON "&Zanemari", 5, 208, 56, 40, 14, WS_CHILD | WS_VISIBLE |
WS_TABSTOP
PUSHBUTTON "&Da", 6, 256, 56, 40, 14, WS_CHILD | WS_VISIBLE |
WS_TABSTOP
PUSHBUTTON "&Ne", 7, 304, 56, 40, 14, WS_CHILD | WS_VISIBLE |
WS_TABSTOP
- PUSHBUTTON "&Probaj ponovo", 10, 352, 56, 40, 14, WS_CHILD | WS_VISIBLE
| WS_TABSTOP
+ PUSHBUTTON "Pok&ušaj ponovo", 10, 352, 56, 40, 14, WS_CHILD |
WS_VISIBLE | WS_TABSTOP
PUSHBUTTON "&Nastavi", 11, 400, 56, 40, 14, WS_CHILD | WS_VISIBLE |
WS_TABSTOP
PUSHBUTTON "PomoÄ", 9, 448, 56, 40, 14, WS_CHILD | WS_VISIBLE |
WS_TABSTOP
END
MDI_MOREWINDOWS DIALOG 20, 20, 232, 122
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Izaberi prozor"
+CAPTION "Izbor"
FONT 8, "MS Shell Dlg"
BEGIN
LISTBOX MDI_IDC_LISTBOX, 5, 7, 222, 90, WS_VSCROLL | WS_HSCROLL /* defined in
mdi.h */
- DEFPUSHBUTTON "OK", IDOK, 75, 100, 35, 14
+ DEFPUSHBUTTON "U redu", IDOK, 75, 100, 35, 14
PUSHBUTTON "Otkaži", IDCANCEL, 120, 100, 35, 14
END
-
STRINGTABLE
{
IDS_ERROR "Greška"
- IDS_MDI_MOREWINDOWS "&Vise Prozora..."
+ IDS_MDI_MOREWINDOWS "&Više prozora..."
}
LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_CYRILLIC
SYSMENU MENU
{
- MENUITEM "&Ðбнови", 61728
- MENUITEM "&ÐомеÑи", 61456
+ MENUITEM "&ÐовÑаÑи", 61728
+ MENUITEM "ÐÑ&емеÑÑи", 61456
MENUITEM "&ÐелиÑина", 61440
- MENUITEM "С&маÑи", 61472
- MENUITEM "Цео &екÑан", 61488
+ MENUITEM "&УмаÑи", 61472
+ MENUITEM "У&веÑаÑ", 61488
MENUITEM SEPARATOR
MENUITEM "&ÐаÑвоÑи\tAlt-F4", 61536
MENUITEM SEPARATOR
- MENUITEM "&O Wine...", 61761
+ MENUITEM "&Ð Wine-Ñ...", 61761
}
EDITMENU MENU
{
POPUP ""
BEGIN
- MENUITEM "&Ðпозови", EM_UNDO
+ MENUITEM "&Ðпозиви", EM_UNDO
MENUITEM SEPARATOR
- MENUITEM "ÐÑе&Ñи", WM_CUT
- MENUITEM "&ÐопиÑаÑ", WM_COPY
+ MENUITEM "&ÐÑеÑи", WM_CUT
+ MENUITEM "&Умножи", WM_COPY
MENUITEM "&УбаÑи", WM_PASTE
- MENUITEM "&ÐбÑиÑи", WM_CLEAR
+ MENUITEM "Ðз&бÑиÑи", WM_CLEAR
MENUITEM SEPARATOR
- MENUITEM "ÐзабеÑи &Све", EM_SETSEL
+ MENUITEM "ÐзабеÑи &Ñве", EM_SETSEL
END
}
@@ -120,25 +120,25 @@
BEGIN
ICON "", 1088, 8, 20, 16, 16, WS_CHILD | WS_VISIBLE
LTEXT "", 100, 32, 4, 176, 48, WS_CHILD | WS_VISIBLE | WS_GROUP |
SS_NOPREFIX
- PUSHBUTTON "&ÐK", 1, 16, 56, 40, 14, WS_CHILD | WS_VISIBLE |
WS_TABSTOP
+ PUSHBUTTON "&У ÑедÑ", 1, 16, 56, 40, 14, WS_CHILD | WS_VISIBLE |
WS_TABSTOP
PUSHBUTTON "&ÐÑкажи", 2, 64, 56, 40, 14, WS_CHILD | WS_VISIBLE |
WS_TABSTOP
PUSHBUTTON "&ÐÑекини", 3, 112, 56, 40, 14, WS_CHILD | WS_VISIBLE
| WS_TABSTOP
- PUSHBUTTON "&ÐокÑÑÐ°Ñ Ð¿Ð¾Ð½Ð¾Ð²Ð¾", 4, 160, 56, 40, 14, WS_CHILD
| WS_VISIBLE | WS_TABSTOP
- PUSHBUTTON "&ÐгнÑиÑи", 5, 208, 56, 40, 14, WS_CHILD | WS_VISIBLE
| WS_TABSTOP
+ PUSHBUTTON "ÐокÑÑÐ°Ñ &поново", 4, 160, 56, 40, 14, WS_CHILD
| WS_VISIBLE | WS_TABSTOP
+ PUSHBUTTON "&ÐанемаÑи", 5, 208, 56, 40, 14, WS_CHILD |
WS_VISIBLE | WS_TABSTOP
PUSHBUTTON "&Ðа", 6, 256, 56, 40, 14, WS_CHILD | WS_VISIBLE |
WS_TABSTOP
PUSHBUTTON "&Ðе", 7, 304, 56, 40, 14, WS_CHILD | WS_VISIBLE |
WS_TABSTOP
- PUSHBUTTON "&ÐÑÐ¾Ð±Ð°Ñ Ð¿Ð¾Ð½Ð¾Ð²Ð¾", 10, 352, 56, 40, 14, WS_CHILD
| WS_VISIBLE | WS_TABSTOP
+ PUSHBUTTON "Ðок&ÑÑÐ°Ñ Ð¿Ð¾Ð½Ð¾Ð²Ð¾", 10, 352, 56, 40, 14,
WS_CHILD | WS_VISIBLE | WS_TABSTOP
PUSHBUTTON "&ÐаÑÑави", 11, 400, 56, 40, 14, WS_CHILD |
WS_VISIBLE | WS_TABSTOP
PUSHBUTTON "ÐомоÑ", 9, 448, 56, 40, 14, WS_CHILD | WS_VISIBLE |
WS_TABSTOP
END
MDI_MOREWINDOWS DIALOG 20, 20, 232, 122
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "ÐзабеÑи пÑозоÑ"
+CAPTION "ÐзбоÑ"
FONT 8, "MS Shell Dlg"
BEGIN
LISTBOX MDI_IDC_LISTBOX, 5, 7, 222, 90, WS_VSCROLL | WS_HSCROLL /* defined in
mdi.h */
- DEFPUSHBUTTON "ÐK", IDOK, 75, 100, 35, 14
+ DEFPUSHBUTTON "У ÑедÑ", IDOK, 75, 100, 35, 14
PUSHBUTTON "ÐÑкажи", IDCANCEL, 120, 100, 35, 14
END
Modified: branches/arwinss/reactos/dll/win32/user32/win.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/user3…
==============================================================================
--- branches/arwinss/reactos/dll/win32/user32/win.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/user32/win.c [iso-8859-1] Tue Nov 23 22:12:41 2010
@@ -1768,7 +1768,14 @@
{
while (list[i])
{
- if (GetWindowTextW( list[i], buffer, len + 1 ) && !strcmpiW( buffer,
title )) break;
+ if (GetWindowTextW( list[i], buffer, len + 1 ))
+ {
+ if (!strcmpiW( buffer, title )) break;
+ }
+ else
+ {
+ if (!title[0]) break;
+ }
i++;
}
}
Modified: branches/arwinss/reactos/dll/win32/winent.drv/gdidrv.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winen…
==============================================================================
--- branches/arwinss/reactos/dll/win32/winent.drv/gdidrv.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/winent.drv/gdidrv.c [iso-8859-1] Tue Nov 23
22:12:41 2010
@@ -420,6 +420,12 @@
{
UNIMPLEMENTED;
return FALSE;
+}
+
+INT CDECL RosDrv_EnumICMProfiles( NTDRV_PDEVICE *physDev, ICMENUMPROCW proc, LPARAM
lparam )
+{
+ UNIMPLEMENTED;
+ return 0;
}
COLORREF CDECL RosDrv_GetNearestColor( NTDRV_PDEVICE *physDev, COLORREF color )
Modified: branches/arwinss/reactos/dll/win32/winent.drv/winent.drv.spec
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winen…
==============================================================================
--- branches/arwinss/reactos/dll/win32/winent.drv/winent.drv.spec [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/winent.drv/winent.drv.spec [iso-8859-1] Tue Nov 23
22:12:41 2010
@@ -12,6 +12,7 @@
@ cdecl DeleteDC(ptr) RosDrv_DeleteDC
@ cdecl DescribePixelFormat(ptr long long ptr) RosDrv_DescribePixelFormat
@ cdecl Ellipse(ptr long long long long) RosDrv_Ellipse
+@ cdecl EnumICMProfiles(ptr ptr long) RosDrv_EnumICMProfiles
@ cdecl EnumDeviceFonts(ptr ptr ptr long) RosDrv_EnumDeviceFonts
@ cdecl ExtEscape(ptr long long ptr long ptr) RosDrv_ExtEscape
@ cdecl ExtFloodFill(ptr long long long long) RosDrv_ExtFloodFill
Propchange: branches/arwinss/reactos/dll/win32/winex11.drv/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Nov 23 22:12:41 2010
@@ -1,3 +1,3 @@
/branches/ros-amd64-bringup/reactos/dll/win32/winex11.drv:35746,35789,36614,36930,38148,38151,38265,38268,39333,39345,40991,41000,41027-41028,41050,41052,41082-41086,41549,43080
/trunk/reactos/dll/win32/winex11.drv:42000-44999,45011,45097-45099,45319,45418-45419,45535-45539,45687-45688,47605,48678
-/vendor/wine/dlls/winex11.drv/current:43149,43398,43708,44151,44715,45044,45206,45455,45646,45910,46314,46915,47274,47321,47798,47861,48147,48418,48677,49173
+/vendor/wine/dlls/winex11.drv/current:43149,43398,43708,44151,44715,45044,45206,45455,45646,45910,46314,46915,47274,47321,47798,47861,48147,48418,48677,49173,49721
Modified: branches/arwinss/reactos/dll/win32/winex11.drv/brush.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winex…
==============================================================================
--- branches/arwinss/reactos/dll/win32/winex11.drv/brush.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/winex11.drv/brush.c [iso-8859-1] Tue Nov 23
22:12:41 2010
@@ -183,17 +183,18 @@
*/
static void BRUSH_SelectSolidBrush( X11DRV_PDEVICE *physDev, COLORREF color )
{
+ COLORREF colorRGB = X11DRV_PALETTE_GetColor( physDev, color );
if ((physDev->depth > 1) && (screen_depth <= 8) &&
!X11DRV_IsSolidColor( color ))
{
/* Dithered brush */
- physDev->brush.pixmap = BRUSH_DitherColor( color, physDev->depth );
+ physDev->brush.pixmap = BRUSH_DitherColor( colorRGB, physDev->depth );
physDev->brush.fillStyle = FillTiled;
physDev->brush.pixel = 0;
}
- else if (physDev->depth == 1 && color != WHITE && color != BLACK)
+ else if (physDev->depth == 1 && colorRGB != WHITE && colorRGB !=
BLACK)
{
physDev->brush.pixel = 0;
- physDev->brush.pixmap = BRUSH_DitherMono( color );
+ physDev->brush.pixmap = BRUSH_DitherMono( colorRGB );
physDev->brush.fillStyle = FillTiled;
}
else
Modified: branches/arwinss/reactos/dll/win32/winex11.drv/event.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winex…
==============================================================================
--- branches/arwinss/reactos/dll/win32/winex11.drv/event.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/winex11.drv/event.c [iso-8859-1] Tue Nov 23
22:12:41 2010
@@ -73,14 +73,30 @@
#define DndURL 128 /* KDE drag&drop */
+#define XEMBED_EMBEDDED_NOTIFY 0
+#define XEMBED_WINDOW_ACTIVATE 1
+#define XEMBED_WINDOW_DEACTIVATE 2
+#define XEMBED_REQUEST_FOCUS 3
+#define XEMBED_FOCUS_IN 4
+#define XEMBED_FOCUS_OUT 5
+#define XEMBED_FOCUS_NEXT 6
+#define XEMBED_FOCUS_PREV 7
+#define XEMBED_MODALITY_ON 10
+#define XEMBED_MODALITY_OFF 11
+#define XEMBED_REGISTER_ACCELERATOR 12
+#define XEMBED_UNREGISTER_ACCELERATOR 13
+#define XEMBED_ACTIVATE_ACCELERATOR 14
+
/* Event handlers */
static void X11DRV_FocusIn( HWND hwnd, XEvent *event );
static void X11DRV_FocusOut( HWND hwnd, XEvent *event );
static void X11DRV_Expose( HWND hwnd, XEvent *event );
static void X11DRV_MapNotify( HWND hwnd, XEvent *event );
+static void X11DRV_ReparentNotify( HWND hwnd, XEvent *event );
static void X11DRV_ConfigureNotify( HWND hwnd, XEvent *event );
static void X11DRV_PropertyNotify( HWND hwnd, XEvent *event );
static void X11DRV_ClientMessage( HWND hwnd, XEvent *event );
+static void X11DRV_GravityNotify( HWND hwnd, XEvent *event );
struct event_handler
{
@@ -112,10 +128,10 @@
/* UnmapNotify */
{ MapNotify, X11DRV_MapNotify },
/* MapRequest */
- /* ReparentNotify */
+ { ReparentNotify, X11DRV_ReparentNotify },
{ ConfigureNotify, X11DRV_ConfigureNotify },
/* ConfigureRequest */
- /* GravityNotify */
+ { GravityNotify, X11DRV_GravityNotify },
/* ResizeRequest */
/* CirculateNotify */
/* CirculateRequest */
@@ -128,7 +144,7 @@
{ MappingNotify, X11DRV_MappingNotify },
};
-static int nb_event_handlers = 18; /* change this if you add handlers above */
+static int nb_event_handlers = 20; /* change this if you add handlers above */
/* return the name of an X event */
@@ -495,6 +511,17 @@
XSetInputFocus( display, win, RevertToParent, time );
wine_tsx11_unlock();
}
+}
+
+
+/**********************************************************************
+ * handle_manager_message
+ */
+static void handle_manager_message( HWND hwnd, XClientMessageEvent *event )
+{
+ if (hwnd != GetDesktopWindow()) return;
+ if (systray_atom && event->data.l[1] == systray_atom)
+ change_systray_owner( event->display, event->data.l[2] );
}
@@ -774,7 +801,7 @@
struct x11drv_win_data *data;
if (!(data = X11DRV_get_win_data( hwnd ))) return;
- if (!data->mapped) return;
+ if (!data->mapped || data->embedded) return;
if (!data->managed)
{
@@ -792,6 +819,8 @@
Atom type, *state;
int format, ret = 0;
unsigned long i, count, remaining;
+
+ if (!data->whole_window) return FALSE;
wine_tsx11_lock();
if (!XGetWindowProperty( display, data->whole_window, x11drv_atom(_NET_WM_STATE),
0,
@@ -815,6 +844,57 @@
/***********************************************************************
+ * X11DRV_ReparentNotify
+ */
+static void X11DRV_ReparentNotify( HWND hwnd, XEvent *xev )
+{
+ XReparentEvent *event = &xev->xreparent;
+ struct x11drv_win_data *data;
+ HWND parent, old_parent;
+ DWORD style;
+
+ if (!(data = X11DRV_get_win_data( hwnd ))) return;
+ if (!data->embedded) return;
+
+ if (data->whole_window)
+ {
+ if (event->parent == root_window)
+ {
+ TRACE( "%p/%lx reparented to root\n", hwnd, data->whole_window
);
+ data->embedder = 0;
+ SendMessageW( hwnd, WM_CLOSE, 0, 0 );
+ return;
+ }
+ data->embedder = event->parent;
+ }
+
+ TRACE( "%p/%lx reparented to %lx\n", hwnd, data->whole_window,
event->parent );
+
+ style = GetWindowLongW( hwnd, GWL_STYLE );
+ if (event->parent == root_window)
+ {
+ parent = GetDesktopWindow();
+ style = (style & ~WS_CHILD) | WS_POPUP;
+ }
+ else
+ {
+ if (!(parent = create_foreign_window( event->display, event->parent )))
return;
+ style = (style & ~WS_POPUP) | WS_CHILD;
+ }
+
+ ShowWindow( hwnd, SW_HIDE );
+ old_parent = SetParent( hwnd, parent );
+ SetWindowLongW( hwnd, GWL_STYLE, style );
+ SetWindowPos( hwnd, HWND_TOP, event->x, event->y, 0, 0,
+ SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOCOPYBITS |
+ ((style & WS_VISIBLE) ? SWP_SHOWWINDOW : 0) );
+
+ /* make old parent destroy itself if it no longer has children */
+ if (old_parent != GetDesktopWindow()) PostMessageW( old_parent, WM_CLOSE, 0, 0 );
+}
+
+
+/***********************************************************************
* X11DRV_ConfigureNotify
*/
void X11DRV_ConfigureNotify( HWND hwnd, XEvent *xev )
@@ -823,11 +903,16 @@
struct x11drv_win_data *data;
RECT rect;
UINT flags;
+ HWND parent;
+ BOOL root_coords;
int cx, cy, x = event->x, y = event->y;
if (!hwnd) return;
if (!(data = X11DRV_get_win_data( hwnd ))) return;
- if (!data->mapped || data->iconic || !data->managed) return;
+ if (!data->mapped || data->iconic) return;
+ if (data->whole_window && !data->managed) return;
+ /* ignore synthetic events on foreign windows */
+ if (event->send_event && !data->whole_window) return;
if (data->configure_serial && (long)(data->configure_serial -
event->serial) > 0)
{
TRACE( "win %p/%lx event %d,%d,%dx%d ignoring old serial %lu/%lu\n",
@@ -838,23 +923,26 @@
/* Get geometry */
- if (!event->send_event) /* normal event, need to map coordinates to the root */
+ parent = GetAncestor( hwnd, GA_PARENT );
+ root_coords = event->send_event; /* synthetic events are always in root coords
*/
+
+ if (!root_coords && parent == GetDesktopWindow()) /* normal event, map
coordinates to the root */
{
Window child;
wine_tsx11_lock();
- XTranslateCoordinates( event->display, data->whole_window, root_window,
+ XTranslateCoordinates( event->display, event->window, root_window,
0, 0, &x, &y, &child );
wine_tsx11_unlock();
+ root_coords = TRUE;
}
rect.left = x;
rect.top = y;
rect.right = x + event->width;
rect.bottom = y + event->height;
- OffsetRect( &rect, virtual_screen_rect.left, virtual_screen_rect.top );
+ if (root_coords) OffsetRect( &rect, virtual_screen_rect.left,
virtual_screen_rect.top );
TRACE( "win %p/%lx new X rect %d,%d,%dx%d (event %d,%d,%dx%d)\n",
hwnd, data->whole_window, rect.left, rect.top, rect.right-rect.left,
rect.bottom-rect.top,
event->x, event->y, event->width, event->height );
- X11DRV_X_to_window_rect( data, &rect );
if (is_net_wm_state_maximized( event->display, data ))
{
@@ -874,6 +962,9 @@
return;
}
}
+
+ X11DRV_X_to_window_rect( data, &rect );
+ if (root_coords) MapWindowPoints( 0, parent, (POINT *)&rect, 2 );
/* Compare what has changed */
@@ -883,6 +974,8 @@
cy = rect.bottom - rect.top;
flags = SWP_NOACTIVATE | SWP_NOZORDER;
+ if (!data->whole_window) flags |= SWP_NOCOPYBITS; /* we can't copy bits of
foreign windows */
+
if (data->window_rect.left == x && data->window_rect.top == y) flags |=
SWP_NOMOVE;
else
TRACE( "%p moving from (%d,%d) to (%d,%d)\n",
@@ -901,6 +994,34 @@
data->window_rect.bottom - data->window_rect.top, cx, cy );
SetWindowPos( hwnd, 0, x, y, cx, cy, flags );
+}
+
+
+/**********************************************************************
+ * X11DRV_GravityNotify
+ */
+static void X11DRV_GravityNotify( HWND hwnd, XEvent *xev )
+{
+ XGravityEvent *event = &xev->xgravity;
+ struct x11drv_win_data *data = X11DRV_get_win_data( hwnd );
+ RECT rect;
+
+ if (!data || data->whole_window) return; /* only handle this for foreign windows
*/
+
+ rect.left = event->x;
+ rect.top = event->y;
+ rect.right = rect.left + data->whole_rect.right - data->whole_rect.left;
+ rect.bottom = rect.top + data->whole_rect.bottom - data->whole_rect.top;
+
+ TRACE( "win %p/%lx new X rect %d,%d,%dx%d (event %d,%d)\n",
+ hwnd, data->whole_window, rect.left, rect.top, rect.right-rect.left,
rect.bottom-rect.top,
+ event->x, event->y );
+
+ X11DRV_X_to_window_rect( data, &rect );
+
+ if (data->window_rect.left != rect.left || data ->window_rect.top != rect.top)
+ SetWindowPos( hwnd, 0, rect.left, rect.top, 0, 0,
+ SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOCOPYBITS );
}
@@ -1335,6 +1456,30 @@
}
}
+
+/**********************************************************************
+ * handle_xembed_protocol
+ */
+static void handle_xembed_protocol( HWND hwnd, XClientMessageEvent *event )
+{
+ struct x11drv_win_data *data = X11DRV_get_win_data( hwnd );
+
+ if (!data) return;
+
+ switch (event->data.l[1])
+ {
+ case XEMBED_EMBEDDED_NOTIFY:
+ TRACE( "win %p/%lx XEMBED_EMBEDDED_NOTIFY owner %lx\n", hwnd,
event->window, event->data.l[3] );
+ data->embedder = event->data.l[3];
+ break;
+ default:
+ TRACE( "win %p/%lx XEMBED message %lu(%lu)\n",
+ hwnd, event->window, event->data.l[1], event->data.l[2] );
+ break;
+ }
+}
+
+
/**********************************************************************
* handle_dnd_protocol
*/
@@ -1366,7 +1511,9 @@
static const struct client_message_handler client_messages[] =
{
+ { XATOM_MANAGER, handle_manager_message },
{ XATOM_WM_PROTOCOLS, handle_wm_protocols },
+ { XATOM__XEMBED, handle_xembed_protocol },
{ XATOM_DndProtocol, handle_dnd_protocol },
{ XATOM_XdndEnter, X11DRV_XDND_EnterEvent },
{ XATOM_XdndPosition, X11DRV_XDND_PositionEvent },
@@ -1415,7 +1562,7 @@
switch(inputs->type)
{
case INPUT_MOUSE:
- X11DRV_send_mouse_input( 0, inputs->u.mi.dwFlags, inputs->u.mi.dx,
inputs->u.mi.dy,
+ X11DRV_send_mouse_input( 0, 0, inputs->u.mi.dwFlags, inputs->u.mi.dx,
inputs->u.mi.dy,
inputs->u.mi.mouseData, inputs->u.mi.time,
inputs->u.mi.dwExtraInfo, LLMHF_INJECTED );
break;
Modified: branches/arwinss/reactos/dll/win32/winex11.drv/graphics.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winex…
==============================================================================
--- branches/arwinss/reactos/dll/win32/winex11.drv/graphics.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/winex11.drv/graphics.c [iso-8859-1] Tue Nov 23
22:12:41 2010
@@ -1508,35 +1508,35 @@
extern void WINAPI A_SHAUpdate( sha_ctx *, const unsigned char *, unsigned int );
extern void WINAPI A_SHAFinal( sha_ctx *, unsigned char * );
+static const WCHAR mntr_key[] =
+
{'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\',
+
'W','i','n','d','o','w','s','
','N','T','\\','C','u','r','r','e','n','t',
+
'V','e','r','s','i','o','n','\\','I','C','M','\\','m','n','t','r',0};
+
+static const WCHAR color_path[] =
+
{'\\','s','p','o','o','l','\\','d','r','i','v','e','r','s','\\','c','o','l','o','r','\\',0};
+
/***********************************************************************
* GetICMProfile (X11DRV.@)
*/
BOOL CDECL X11DRV_GetICMProfile( X11DRV_PDEVICE *physDev, LPDWORD size, LPWSTR filename
)
{
- static const WCHAR path[] =
-
{'\\','s','p','o','o','l','\\','d','r','i','v','e','r','s',
-
'\\','c','o','l','o','r','\\',0};
static const WCHAR srgb[] =
{'s','R','G','B','
','C','o','l','o','r','
','S','p','a','c','e',' ',
'P','r','o','f','i','l','e','.','i','c','m',0};
- static const WCHAR mntr[] =
-
{'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\',
-
'W','i','n','d','o','w','s','
','N','T','\\','C','u','r','r','e','n','t',
-
'V','e','r','s','i','o','n','\\','I','C','M','\\','m','n','t','r',0};
-
HKEY hkey;
DWORD required, len;
- WCHAR profile[MAX_PATH], fullname[2*MAX_PATH + sizeof(path)/sizeof(WCHAR)];
+ WCHAR profile[MAX_PATH], fullname[2*MAX_PATH + sizeof(color_path)/sizeof(WCHAR)];
unsigned char *buffer;
unsigned long buflen;
if (!size) return FALSE;
GetSystemDirectoryW( fullname, MAX_PATH );
- strcatW( fullname, path );
+ strcatW( fullname, color_path );
len = sizeof(profile)/sizeof(WCHAR);
- if (!RegCreateKeyExW( HKEY_LOCAL_MACHINE, mntr, 0, NULL, 0, KEY_ALL_ACCESS, NULL,
&hkey, NULL ) &&
+ if (!RegCreateKeyExW( HKEY_LOCAL_MACHINE, mntr_key, 0, NULL, 0, KEY_ALL_ACCESS, NULL,
&hkey, NULL ) &&
!RegEnumValueW( hkey, 0, profile, &len, NULL, NULL, NULL, NULL )) /* FIXME
handle multiple values */
{
strcatW( fullname, profile );
@@ -1589,3 +1589,57 @@
*size = required;
return TRUE;
}
+
+/***********************************************************************
+ * EnumICMProfiles (X11DRV.@)
+ */
+INT CDECL X11DRV_EnumICMProfiles( X11DRV_PDEVICE *physDev, ICMENUMPROCW proc, LPARAM
lparam )
+{
+ HKEY hkey;
+ DWORD len_sysdir, len_path, len, index = 0;
+ WCHAR sysdir[MAX_PATH], *profile;
+ LONG res;
+ INT ret;
+
+ TRACE("%p, %p, %ld\n", physDev, proc, lparam);
+
+ if (RegOpenKeyExW( HKEY_LOCAL_MACHINE, mntr_key, 0, KEY_ALL_ACCESS, &hkey ))
+ return -1;
+
+ len_sysdir = GetSystemDirectoryW( sysdir, MAX_PATH );
+ len_path = len_sysdir + sizeof(color_path) / sizeof(color_path[0]) - 1;
+ len = 64;
+ for (;;)
+ {
+ if (!(profile = HeapAlloc( GetProcessHeap(), 0, (len_path + len) * sizeof(WCHAR)
)))
+ {
+ RegCloseKey( hkey );
+ return -1;
+ }
+ res = RegEnumValueW( hkey, index, profile + len_path, &len, NULL, NULL, NULL,
NULL );
+ while (res == ERROR_MORE_DATA)
+ {
+ len *= 2;
+ HeapFree( GetProcessHeap(), 0, profile );
+ if (!(profile = HeapAlloc( GetProcessHeap(), 0, (len_path + len) *
sizeof(WCHAR) )))
+ {
+ RegCloseKey( hkey );
+ return -1;
+ }
+ res = RegEnumValueW( hkey, index, profile + len_path, &len, NULL, NULL,
NULL, NULL );
+ }
+ if (res != ERROR_SUCCESS)
+ {
+ HeapFree( GetProcessHeap(), 0, profile );
+ break;
+ }
+ memcpy( profile, sysdir, len_sysdir * sizeof(WCHAR) );
+ memcpy( profile + len_sysdir, color_path, sizeof(color_path) - sizeof(WCHAR) );
+ ret = proc( profile, lparam );
+ HeapFree( GetProcessHeap(), 0, profile );
+ if (!ret) break;
+ index++;
+ }
+ RegCloseKey( hkey );
+ return -1;
+}
Modified: branches/arwinss/reactos/dll/win32/winex11.drv/mouse.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winex…
==============================================================================
--- branches/arwinss/reactos/dll/win32/winex11.drv/mouse.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/winex11.drv/mouse.c [iso-8859-1] Tue Nov 23
22:12:41 2010
@@ -23,6 +23,7 @@
#include "wine/port.h"
#include <X11/Xlib.h>
+#include <X11/cursorfont.h>
#include <stdarg.h>
#ifdef SONAME_LIBXCURSOR
@@ -35,18 +36,22 @@
MAKE_FUNCPTR(XcursorImagesCreate);
MAKE_FUNCPTR(XcursorImagesDestroy);
MAKE_FUNCPTR(XcursorImagesLoadCursor);
+MAKE_FUNCPTR(XcursorLibraryLoadCursor);
# undef MAKE_FUNCPTR
#endif /* SONAME_LIBXCURSOR */
#define NONAMELESSUNION
#define NONAMELESSSTRUCT
+#define OEMRESOURCE
#include "windef.h"
#include "winbase.h"
+#include "winreg.h"
#include "x11drv.h"
#include "winternl.h"
#include "wine/server.h"
#include "wine/library.h"
+#include "wine/unicode.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(cursor);
@@ -121,6 +126,7 @@
LOAD_FUNCPTR(XcursorImagesCreate);
LOAD_FUNCPTR(XcursorImagesDestroy);
LOAD_FUNCPTR(XcursorImagesLoadCursor);
+ LOAD_FUNCPTR(XcursorLibraryLoadCursor);
#undef LOAD_FUNCPTR
#endif /* SONAME_LIBXCURSOR */
}
@@ -223,21 +229,25 @@
*
* Update the various window states on a mouse event.
*/
-static void update_mouse_state( HWND hwnd, Window window, int x, int y, unsigned int
state, POINT *pt )
+static HWND update_mouse_state( HWND hwnd, Window window, int x, int y, unsigned int
state, POINT *pt )
{
struct x11drv_win_data *data = X11DRV_get_win_data( hwnd );
- if (!data) return;
+ if (!data) return 0;
if (window == data->whole_window)
{
x += data->whole_rect.left - data->client_rect.left;
y += data->whole_rect.top - data->client_rect.top;
}
- pt->x = x + data->client_rect.left;
- pt->y = y + data->client_rect.top;
+ pt->x = x;
+ pt->y = y;
+ if (GetWindowLongW( data->hwnd, GWL_EXSTYLE ) & WS_EX_LAYOUTRTL)
+ pt->x = data->client_rect.right - data->client_rect.left - 1 -
pt->x;
+ MapWindowPoints( hwnd, 0, pt, 1 );
cursor_window = hwnd;
+ if (hwnd != GetDesktopWindow()) hwnd = GetAncestor( hwnd, GA_ROOT );
/* update the wine server Z-order */
@@ -246,9 +256,8 @@
!(state &
(Button1Mask|Button2Mask|Button3Mask|Button4Mask|Button5Mask|Button6Mask|Button7Mask)))
{
RECT rect;
- SetRect( &rect, x, y, x + 1, y + 1 );
- if (GetWindowLongW( data->hwnd, GWL_EXSTYLE ) & WS_EX_LAYOUTRTL)
- mirror_rect( &data->client_rect, &rect );
+ SetRect( &rect, pt->x, pt->y, pt->x + 1, pt->y + 1 );
+ MapWindowPoints( 0, hwnd, (POINT *)&rect, 2 );
SERVER_START_REQ( update_window_zorder )
{
@@ -261,6 +270,7 @@
}
SERVER_END_REQ;
}
+ return hwnd;
}
@@ -293,7 +303,7 @@
/***********************************************************************
* queue_raw_mouse_message
*/
-static void queue_raw_mouse_message( UINT message, HWND hwnd, DWORD x, DWORD y,
+static void queue_raw_mouse_message( UINT message, HWND top_hwnd, HWND cursor_hwnd, DWORD
x, DWORD y,
DWORD data, DWORD time, DWORD extra_info, UINT
injected_flags )
{
MSLLHOOKSTRUCT hook;
@@ -313,7 +323,7 @@
SERVER_START_REQ( send_hardware_message )
{
req->id = (injected_flags & LLMHF_INJECTED) ? 0 :
GetCurrentThreadId();
- req->win = wine_server_user_handle( hwnd );
+ req->win = wine_server_user_handle( top_hwnd );
req->msg = message;
req->wparam = MAKEWPARAM( get_key_state(), data );
req->lparam = 0;
@@ -326,10 +336,10 @@
}
SERVER_END_REQ;
- if (hwnd)
- {
- struct x11drv_win_data *data = X11DRV_get_win_data( hwnd );
- if (data && cursor != data->cursor) set_window_cursor( hwnd, cursor
);
+ if (cursor_hwnd)
+ {
+ struct x11drv_win_data *data = X11DRV_get_win_data( cursor_hwnd );
+ if (data && cursor != data->cursor) set_window_cursor( cursor_hwnd,
cursor );
}
}
@@ -337,7 +347,7 @@
/***********************************************************************
* X11DRV_send_mouse_input
*/
-void X11DRV_send_mouse_input( HWND hwnd, DWORD flags, DWORD x, DWORD y,
+void X11DRV_send_mouse_input( HWND top_hwnd, HWND cursor_hwnd, DWORD flags, DWORD x,
DWORD y,
DWORD data, DWORD time, DWORD extra_info, UINT
injected_flags )
{
POINT pt;
@@ -394,7 +404,7 @@
if (flags & MOUSEEVENTF_MOVE)
{
- queue_raw_mouse_message( WM_MOUSEMOVE, hwnd, pt.x, pt.y, data, time,
+ queue_raw_mouse_message( WM_MOUSEMOVE, top_hwnd, cursor_hwnd, pt.x, pt.y, data,
time,
extra_info, injected_flags );
if ((injected_flags & LLMHF_INJECTED) &&
((flags & MOUSEEVENTF_ABSOLUTE) || x || y)) /* we have to actually move
the cursor */
@@ -413,54 +423,58 @@
{
key_state_table[VK_LBUTTON] |= 0xc0;
queue_raw_mouse_message( GetSystemMetrics(SM_SWAPBUTTON) ? WM_RBUTTONDOWN :
WM_LBUTTONDOWN,
- hwnd, pt.x, pt.y, data, time, extra_info, injected_flags
);
+ top_hwnd, cursor_hwnd, pt.x, pt.y,
+ data, time, extra_info, injected_flags );
}
if (flags & MOUSEEVENTF_LEFTUP)
{
key_state_table[VK_LBUTTON] &= ~0x80;
queue_raw_mouse_message( GetSystemMetrics(SM_SWAPBUTTON) ? WM_RBUTTONUP :
WM_LBUTTONUP,
- hwnd, pt.x, pt.y, data, time, extra_info, injected_flags
);
+ top_hwnd, cursor_hwnd, pt.x, pt.y,
+ data, time, extra_info, injected_flags );
}
if (flags & MOUSEEVENTF_RIGHTDOWN)
{
key_state_table[VK_RBUTTON] |= 0xc0;
queue_raw_mouse_message( GetSystemMetrics(SM_SWAPBUTTON) ? WM_LBUTTONDOWN :
WM_RBUTTONDOWN,
- hwnd, pt.x, pt.y, data, time, extra_info, injected_flags
);
+ top_hwnd, cursor_hwnd, pt.x, pt.y,
+ data, time, extra_info, injected_flags );
}
if (flags & MOUSEEVENTF_RIGHTUP)
{
key_state_table[VK_RBUTTON] &= ~0x80;
queue_raw_mouse_message( GetSystemMetrics(SM_SWAPBUTTON) ? WM_LBUTTONUP :
WM_RBUTTONUP,
- hwnd, pt.x, pt.y, data, time, extra_info, injected_flags
);
+ top_hwnd, cursor_hwnd, pt.x, pt.y,
+ data, time, extra_info, injected_flags );
}
if (flags & MOUSEEVENTF_MIDDLEDOWN)
{
key_state_table[VK_MBUTTON] |= 0xc0;
- queue_raw_mouse_message( WM_MBUTTONDOWN, hwnd, pt.x, pt.y, data, time,
- extra_info, injected_flags );
+ queue_raw_mouse_message( WM_MBUTTONDOWN, top_hwnd, cursor_hwnd, pt.x, pt.y,
+ data, time, extra_info, injected_flags );
}
if (flags & MOUSEEVENTF_MIDDLEUP)
{
key_state_table[VK_MBUTTON] &= ~0x80;
- queue_raw_mouse_message( WM_MBUTTONUP, hwnd, pt.x, pt.y, data, time,
- extra_info, injected_flags );
+ queue_raw_mouse_message( WM_MBUTTONUP, top_hwnd, cursor_hwnd, pt.x, pt.y,
+ data, time, extra_info, injected_flags );
}
if (flags & MOUSEEVENTF_WHEEL)
{
- queue_raw_mouse_message( WM_MOUSEWHEEL, hwnd, pt.x, pt.y, data, time,
- extra_info, injected_flags );
+ queue_raw_mouse_message( WM_MOUSEWHEEL, top_hwnd, cursor_hwnd, pt.x, pt.y,
+ data, time, extra_info, injected_flags );
}
if (flags & MOUSEEVENTF_XDOWN)
{
key_state_table[VK_XBUTTON1 + data - 1] |= 0xc0;
- queue_raw_mouse_message( WM_XBUTTONDOWN, hwnd, pt.x, pt.y, data, time,
- extra_info, injected_flags );
+ queue_raw_mouse_message( WM_XBUTTONDOWN, top_hwnd, cursor_hwnd, pt.x, pt.y,
+ data, time, extra_info, injected_flags );
}
if (flags & MOUSEEVENTF_XUP)
{
key_state_table[VK_XBUTTON1 + data - 1] &= ~0x80;
- queue_raw_mouse_message( WM_XBUTTONUP, hwnd, pt.x, pt.y, data, time,
- extra_info, injected_flags );
+ queue_raw_mouse_message( WM_XBUTTONUP, top_hwnd, cursor_hwnd, pt.x, pt.y,
+ data, time, extra_info, injected_flags );
}
}
@@ -471,7 +485,7 @@
*
* Use Xcursor to create a frame of an X cursor from a Windows one.
*/
-static XcursorImage *create_xcursor_frame( HDC hdc, ICONINFO *iinfo, HANDLE icon,
+static XcursorImage *create_xcursor_frame( HDC hdc, const ICONINFOEXW *iinfo, HANDLE
icon,
HBITMAP hbmColor, unsigned char *color_bits,
int color_size,
HBITMAP hbmMask, unsigned char *mask_bits, int
mask_size,
int width, int height, int istep )
@@ -538,7 +552,7 @@
*
* Use Xcursor to create an X cursor from a Windows one.
*/
-static Cursor create_xcursor_cursor( HDC hdc, ICONINFO *iinfo, HANDLE icon, int width,
int height )
+static Cursor create_xcursor_cursor( HDC hdc, const ICONINFOEXW *iinfo, HANDLE icon, int
width, int height )
{
unsigned char *color_bits, *mask_bits;
HBITMAP hbmColor = 0, hbmMask = 0;
@@ -620,6 +634,148 @@
if (hbmColor) DeleteObject( hbmColor );
if (hbmMask) DeleteObject( hbmMask );
HeapFree( GetProcessHeap(), 0, info );
+ return cursor;
+}
+
+
+struct system_cursors
+{
+ WORD id;
+ const char *name;
+};
+
+static const struct system_cursors user32_cursors[] =
+{
+ { OCR_NORMAL, "left_ptr" },
+ { OCR_IBEAM, "xterm" },
+ { OCR_WAIT, "watch" },
+ { OCR_CROSS, "cross" },
+ { OCR_UP, "center_ptr" },
+ { OCR_SIZE, "fleur" },
+ { OCR_SIZEALL, "fleur" },
+ { OCR_ICON, "icon" },
+ { OCR_SIZENWSE, "nwse-resize" },
+ { OCR_SIZENESW, "nesw-resize" },
+ { OCR_SIZEWE, "ew-resize" },
+ { OCR_SIZENS, "ns-resize" },
+ { OCR_NO, "not-allowed" },
+ { OCR_HAND, "hand2" },
+ { OCR_APPSTARTING, "left_ptr_watch" },
+ { OCR_HELP, "question_arrow" },
+ { 0 }
+};
+
+static const struct system_cursors comctl32_cursors[] =
+{
+ { 102, "move" },
+ { 104, "copy" },
+ { 105, "left_ptr" },
+ { 106, "row-resize" },
+ { 107, "row-resize" },
+ { 108, "hand2" },
+ { 135, "col-resize" },
+ { 0 }
+};
+
+static const struct system_cursors ole32_cursors[] =
+{
+ { 1, "no-drop" },
+ { 2, "move" },
+ { 3, "copy" },
+ { 4, "alias" },
+ { 0 }
+};
+
+static const struct system_cursors riched20_cursors[] =
+{
+ { 105, "hand2" },
+ { 107, "right_ptr" },
+ { 109, "copy" },
+ { 110, "move" },
+ { 111, "no-drop" },
+ { 0 }
+};
+
+static const struct
+{
+ const struct system_cursors *cursors;
+ WCHAR name[16];
+} module_cursors[] =
+{
+ { user32_cursors,
{'u','s','e','r','3','2','.','d','l','l',0}
},
+ { comctl32_cursors,
{'c','o','m','c','t','l','3','2','.','d','l','l',0}
},
+ { ole32_cursors,
{'o','l','e','3','2','.','d','l','l',0}
},
+ { riched20_cursors,
{'r','i','c','h','e','d','2','0','.','d','l','l',0}
}
+};
+
+/***********************************************************************
+ * create_xcursor_system_cursor
+ *
+ * Create an X cursor for a system cursor.
+ */
+static Cursor create_xcursor_system_cursor( const ICONINFOEXW *info )
+{
+ static const WCHAR idW[] = {'%','h','u',0};
+ const struct system_cursors *cursors;
+ unsigned int i;
+ Cursor cursor = 0;
+ HMODULE module;
+ HKEY key;
+ WCHAR *p, name[MAX_PATH * 2], valueW[64];
+ char valueA[64];
+ DWORD size, ret;
+
+ if (!pXcursorLibraryLoadCursor) return 0;
+ if (!info->szModName[0]) return 0;
+
+ p = strrchrW( info->szModName, '\\' );
+ strcpyW( name, p ? p + 1 : info->szModName );
+ p = name + strlenW( name );
+ *p++ = ',';
+ if (info->szResName[0]) strcpyW( p, info->szResName );
+ else sprintfW( p, idW, info->wResID );
+ valueA[0] = 0;
+
+ /* @@ Wine registry key: HKCU\Software\Wine\X11 Driver\Cursors */
+ if (!RegOpenKeyA( HKEY_CURRENT_USER, "Software\\Wine\\X11 Driver\\Cursors",
&key ))
+ {
+ size = sizeof(valueW) / sizeof(WCHAR);
+ ret = RegQueryValueExW( key, name, NULL, NULL, (BYTE *)valueW, &size );
+ RegCloseKey( key );
+ if (!ret)
+ {
+ if (!valueW[0]) return 0; /* force standard cursor */
+ if (!WideCharToMultiByte( CP_UNIXCP, 0, valueW, -1, valueA, sizeof(valueA),
NULL, NULL ))
+ valueA[0] = 0;
+ goto done;
+ }
+ }
+
+ if (info->szResName[0]) goto done; /* only integer resources are supported here
*/
+ if (!(module = GetModuleHandleW( info->szModName ))) goto done;
+
+ for (i = 0; i < sizeof(module_cursors)/sizeof(module_cursors[0]); i++)
+ if (GetModuleHandleW( module_cursors[i].name ) == module) break;
+ if (i == sizeof(module_cursors)/sizeof(module_cursors[0])) goto done;
+
+ cursors = module_cursors[i].cursors;
+ for (i = 0; cursors[i].id; i++)
+ if (cursors[i].id == info->wResID)
+ {
+ strcpy( valueA, cursors[i].name );
+ break;
+ }
+
+done:
+ if (valueA[0])
+ {
+ wine_tsx11_lock();
+ cursor = pXcursorLibraryLoadCursor( gdi_display, valueA );
+ wine_tsx11_unlock();
+ if (!cursor) WARN( "no system cursor found for %s mapped to %s\n",
+ debugstr_w(name), debugstr_a(valueA) );
+ }
+ else WARN( "no system cursor found for %s\n", debugstr_w(name) );
return cursor;
}
@@ -702,7 +858,7 @@
*
* Create an X cursor from a Windows one.
*/
-static Cursor create_xlib_cursor( HDC hdc, ICONINFO *icon, int width, int height )
+static Cursor create_xlib_cursor( HDC hdc, const ICONINFOEXW *icon, int width, int height
)
{
XColor fg, bg;
Cursor cursor = None;
@@ -831,18 +987,22 @@
static Cursor create_cursor( HANDLE handle )
{
Cursor cursor = 0;
- HDC hdc;
- ICONINFO info;
+ ICONINFOEXW info;
BITMAP bm;
if (!handle) return get_empty_cursor();
- if (!(hdc = CreateCompatibleDC( 0 ))) return 0;
- if (!GetIconInfo( handle, &info ))
- {
- DeleteDC( hdc );
- return 0;
- }
+ info.cbSize = sizeof(info);
+ if (!GetIconInfoExW( handle, &info )) return 0;
+
+#ifdef SONAME_LIBXCURSOR
+ if (use_system_cursors && (cursor = create_xcursor_system_cursor( &info
)))
+ {
+ DeleteObject( info.hbmColor );
+ DeleteObject( info.hbmMask );
+ return cursor;
+ }
+#endif
GetObjectW( info.hbmMask, sizeof(bm), &bm );
if (!info.hbmColor) bm.bmHeight /= 2;
@@ -856,11 +1016,17 @@
if (info.hbmColor)
{
+ HDC hdc = CreateCompatibleDC( 0 );
+ if (hdc)
+ {
#ifdef SONAME_LIBXCURSOR
- if (pXcursorImagesLoadCursor) cursor = create_xcursor_cursor( hdc, &info,
handle, bm.bmWidth, bm.bmHeight );
+ if (pXcursorImagesLoadCursor)
+ cursor = create_xcursor_cursor( hdc, &info, handle, bm.bmWidth,
bm.bmHeight );
#endif
- if (!cursor) cursor = create_xlib_cursor( hdc, &info, bm.bmWidth, bm.bmHeight
);
+ if (!cursor) cursor = create_xlib_cursor( hdc, &info, bm.bmWidth,
bm.bmHeight );
+ }
DeleteObject( info.hbmColor );
+ DeleteDC( hdc );
}
else
{
@@ -872,7 +1038,6 @@
}
DeleteObject( info.hbmMask );
- DeleteDC( hdc );
return cursor;
}
@@ -916,7 +1081,7 @@
{
wine_tsx11_unlock();
/* We still need to generate WM_MOUSEMOVE */
- queue_raw_mouse_message( WM_MOUSEMOVE, NULL, x, y, 0, GetCurrentTime(), 0, 0 );
+ queue_raw_mouse_message( WM_MOUSEMOVE, 0, 0, x, y, 0, GetCurrentTime(), 0, 0 );
return TRUE;
}
@@ -980,9 +1145,9 @@
int buttonNum = event->button - 1;
WORD wData = 0;
POINT pt;
+ HWND top_hwnd;
if (buttonNum >= NB_BUTTONS) return;
- if (!hwnd) return;
switch (buttonNum)
{
@@ -1007,9 +1172,11 @@
}
update_user_time( event->time );
- update_mouse_state( hwnd, event->window, event->x, event->y,
event->state, &pt );
-
- X11DRV_send_mouse_input( hwnd, button_down_flags[buttonNum] | MOUSEEVENTF_ABSOLUTE |
MOUSEEVENTF_MOVE,
+ top_hwnd = update_mouse_state( hwnd, event->window, event->x, event->y,
event->state, &pt );
+ if (!top_hwnd) return;
+
+ X11DRV_send_mouse_input( top_hwnd, hwnd,
+ button_down_flags[buttonNum] | MOUSEEVENTF_ABSOLUTE |
MOUSEEVENTF_MOVE,
pt.x, pt.y, wData,
EVENT_x11_time_to_win32_time(event->time), 0, 0 );
}
@@ -1023,9 +1190,9 @@
int buttonNum = event->button - 1;
WORD wData = 0;
POINT pt;
+ HWND top_hwnd;
if (buttonNum >= NB_BUTTONS || !button_up_flags[buttonNum]) return;
- if (!hwnd) return;
switch (buttonNum)
{
@@ -1043,9 +1210,11 @@
break;
}
- update_mouse_state( hwnd, event->window, event->x, event->y,
event->state, &pt );
-
- X11DRV_send_mouse_input( hwnd, button_up_flags[buttonNum] | MOUSEEVENTF_ABSOLUTE |
MOUSEEVENTF_MOVE,
+ top_hwnd = update_mouse_state( hwnd, event->window, event->x, event->y,
event->state, &pt );
+ if (!top_hwnd) return;
+
+ X11DRV_send_mouse_input( top_hwnd, hwnd,
+ button_up_flags[buttonNum] | MOUSEEVENTF_ABSOLUTE |
MOUSEEVENTF_MOVE,
pt.x, pt.y, wData,
EVENT_x11_time_to_win32_time(event->time), 0, 0 );
}
@@ -1057,14 +1226,14 @@
{
XMotionEvent *event = &xev->xmotion;
POINT pt;
+ HWND top_hwnd;
TRACE("hwnd %p, event->is_hint %d\n", hwnd, event->is_hint);
- if (!hwnd) return;
-
- update_mouse_state( hwnd, event->window, event->x, event->y,
event->state, &pt );
-
- X11DRV_send_mouse_input( hwnd, MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE,
+ top_hwnd = update_mouse_state( hwnd, event->window, event->x, event->y,
event->state, &pt );
+ if (!top_hwnd) return;
+
+ X11DRV_send_mouse_input( top_hwnd, hwnd, MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE,
pt.x, pt.y, 0, EVENT_x11_time_to_win32_time(event->time),
0, 0 );
}
@@ -1076,16 +1245,17 @@
{
XCrossingEvent *event = &xev->xcrossing;
POINT pt;
+ HWND top_hwnd;
TRACE("hwnd %p, event->detail %d\n", hwnd, event->detail);
- if (!hwnd) return;
if (event->detail == NotifyVirtual || event->detail == NotifyNonlinearVirtual)
return;
if (event->window == x11drv_thread_data()->grab_window) return;
/* simulate a mouse motion event */
- update_mouse_state( hwnd, event->window, event->x, event->y,
event->state, &pt );
-
- X11DRV_send_mouse_input( hwnd, MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE,
+ top_hwnd = update_mouse_state( hwnd, event->window, event->x, event->y,
event->state, &pt );
+ if (!top_hwnd) return;
+
+ X11DRV_send_mouse_input( top_hwnd, hwnd, MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE,
pt.x, pt.y, 0, EVENT_x11_time_to_win32_time(event->time),
0, 0 );
}
Modified: branches/arwinss/reactos/dll/win32/winex11.drv/opengl.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winex…
==============================================================================
--- branches/arwinss/reactos/dll/win32/winex11.drv/opengl.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/winex11.drv/opengl.c [iso-8859-1] Tue Nov 23
22:12:41 2010
@@ -1793,6 +1793,7 @@
if (ctx->tid != 0 && ctx->tid != GetCurrentThreadId())
{
TRACE("Cannot delete context=%p because it is current in another
thread.\n", ctx);
+ SetLastError(ERROR_BUSY);
return FALSE;
}
@@ -1807,6 +1808,7 @@
wine_tsx11_unlock();
}
+ free_context(ctx);
return TRUE;
}
Modified: branches/arwinss/reactos/dll/win32/winex11.drv/palette.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winex…
==============================================================================
--- branches/arwinss/reactos/dll/win32/winex11.drv/palette.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/winex11.drv/palette.c [iso-8859-1] Tue Nov 23
22:12:41 2010
@@ -874,6 +874,49 @@
}
/***********************************************************************
+ * X11DRV_PALETTE_GetColor
+ *
+ * Resolve PALETTEINDEX/PALETTERGB/DIBINDEX COLORREFs to an RGB COLORREF.
+ */
+COLORREF X11DRV_PALETTE_GetColor( X11DRV_PDEVICE *physDev, COLORREF color )
+{
+ HPALETTE hPal = GetCurrentObject(physDev->hdc, OBJ_PAL );
+ unsigned char spec_type = color >> 24;
+ unsigned idx = color & 0xffff;
+ PALETTEENTRY entry;
+ RGBQUAD quad;
+
+ switch(spec_type)
+ {
+ case 2: /* PALETTERGB */
+ idx = GetNearestPaletteIndex( hPal, color );
+ /* fall through to PALETTEINDEX */
+
+ case 1: /* PALETTEINDEX */
+ if (!GetPaletteEntries( hPal, idx, 1, &entry ))
+ {
+ WARN("PALETTEINDEX(%x) : idx %d is out of bounds, assuming
black\n", color, idx);
+ return 0;
+ }
+ return RGB( entry.peRed, entry.peGreen, entry.peBlue );
+
+ case 0x10: /* DIBINDEX */
+ if( GetDIBColorTable( physDev->hdc, idx, 1, &quad ) != 1 ) {
+ WARN("DIBINDEX(%x) : idx %d is out of bounds, assuming black\n",
color , idx);
+ return 0;
+ }
+ return RGB( quad.rgbRed, quad.rgbGreen, quad.rgbBlue );
+
+ default:
+ color &= 0xffffff;
+ /* fall through to RGB */
+
+ case 0: /* RGB */
+ return color;
+ }
+}
+
+/***********************************************************************
* X11DRV_PALETTE_ToPhysical
*
* Return the physical color closest to 'color'.
@@ -898,16 +941,11 @@
unsigned long red, green, blue;
unsigned idx = color & 0xffff;
- RGBQUAD quad;
switch(spec_type)
{
case 0x10: /* DIBINDEX */
- if( GetDIBColorTable( physDev->hdc, idx, 1, &quad ) != 1 ) {
- WARN("DIBINDEX(%x) : idx %d is out of bounds, assuming
black\n", color , idx);
- return 0;
- }
- color = RGB( quad.rgbRed, quad.rgbGreen, quad.rgbBlue );
+ color = X11DRV_PALETTE_GetColor( physDev, color );
break;
case 1: /* PALETTEINDEX */
Modified: branches/arwinss/reactos/dll/win32/winex11.drv/systray.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winex…
==============================================================================
--- branches/arwinss/reactos/dll/win32/winex11.drv/systray.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/winex11.drv/systray.c [iso-8859-1] Tue Nov 23
22:12:41 2010
@@ -55,21 +55,33 @@
HWND tooltip; /* Icon tooltip */
UINT id; /* the unique id given by the app */
UINT callback_message;
+ int display; /* display index, or -1 if hidden */
WCHAR tiptext[256]; /* Tooltip text. If empty => tooltip disabled */
WCHAR tiptitle[64]; /* Tooltip title for ballon style tooltips. If empty
=> tooltip is not balloon style. */
};
static struct list icon_list = LIST_INIT( icon_list );
-static const WCHAR tray_classname[] =
{'_','_','w','i','n','e','x','1','1','_','t','r','a','y','_','w','i','n','d','o','w',0};
-
+static const WCHAR icon_classname[] =
{'_','_','w','i','n','e','x','1','1','_','t','r','a','y','_','i','c','o','n',0};
+static const WCHAR tray_classname[] =
{'_','_','w','i','n','e','x','1','1','_','s','t','a','n','d','a','l','o','n','e','_','t','r','a','y',0};
+
+static BOOL show_icon( struct tray_icon *icon );
+static BOOL hide_icon( struct tray_icon *icon );
static BOOL delete_icon( struct tray_icon *icon );
#define SYSTEM_TRAY_REQUEST_DOCK 0
#define SYSTEM_TRAY_BEGIN_MESSAGE 1
#define SYSTEM_TRAY_CANCEL_MESSAGE 2
+Atom systray_atom = 0;
+
+#define MIN_DISPLAYED 8
#define ICON_BORDER 2
+
+/* stand-alone tray window */
+static HWND standalone_tray;
+static int icon_cx, icon_cy;
+static unsigned int nb_displayed;
/* retrieves icon record by owner window and ID */
static struct tray_icon *get_icon(HWND owner, UINT id)
@@ -140,8 +152,105 @@
SendMessageW(icon->tooltip, TTM_UPDATETIPTEXTW, 0, (LPARAM)&ti);
}
-/* window procedure for the tray window */
-static LRESULT WINAPI tray_wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
+/* get the size of the stand-alone tray window */
+static SIZE get_window_size(void)
+{
+ SIZE size;
+ RECT rect;
+
+ rect.left = 0;
+ rect.top = 0;
+ rect.right = icon_cx * max( nb_displayed, MIN_DISPLAYED );
+ rect.bottom = icon_cy;
+ AdjustWindowRect( &rect, WS_CAPTION, FALSE );
+ size.cx = rect.right - rect.left;
+ size.cy = rect.bottom - rect.top;
+ return size;
+}
+
+/* get the position of an icon in the stand-alone tray */
+static POINT get_icon_pos( struct tray_icon *icon )
+{
+ POINT pos;
+
+ pos.x = icon_cx * icon->display;
+ pos.y = 0;
+ return pos;
+}
+
+/* window procedure for the standalone tray window */
+static LRESULT WINAPI standalone_tray_wndproc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM
lparam )
+{
+ switch (msg)
+ {
+ case WM_CLOSE:
+ ShowWindow( hwnd, SW_HIDE );
+ show_systray = FALSE;
+ return 0;
+ case WM_DESTROY:
+ standalone_tray = 0;
+ break;
+ }
+ return DefWindowProcW( hwnd, msg, wparam, lparam );
+}
+
+/* add an icon to the standalone tray window */
+static void add_to_standalone_tray( struct tray_icon *icon )
+{
+ SIZE size;
+ POINT pos;
+
+ if (!standalone_tray)
+ {
+ static const WCHAR winname[] =
{'W','i','n','e','
','S','y','s','t','e','m','
','T','r','a','y',0};
+
+ size = get_window_size();
+ standalone_tray = CreateWindowExW( 0, tray_classname, winname, WS_CAPTION |
WS_SYSMENU,
+ CW_USEDEFAULT, CW_USEDEFAULT, size.cx,
size.cy, 0, 0, 0, 0 );
+ if (!standalone_tray) return;
+ }
+
+ icon->display = nb_displayed;
+ pos = get_icon_pos( icon );
+ icon->window = CreateWindowW( icon_classname, NULL, WS_CHILD | WS_VISIBLE,
+ pos.x, pos.y, icon_cx, icon_cy, standalone_tray, NULL,
NULL, icon );
+ if (!icon->window)
+ {
+ icon->display = -1;
+ return;
+ }
+ create_tooltip( icon );
+
+ nb_displayed++;
+ size = get_window_size();
+ SetWindowPos( standalone_tray, 0, 0, 0, size.cx, size.cy, SWP_NOMOVE | SWP_NOACTIVATE
| SWP_NOZORDER );
+ if (nb_displayed == 1 && show_systray) ShowWindow( standalone_tray, SW_SHOWNA
);
+ TRACE( "added %u now %d icons\n", icon->id, nb_displayed );
+}
+
+/* remove an icon from the stand-alone tray */
+static void remove_from_standalone_tray( struct tray_icon *icon )
+{
+ struct tray_icon *ptr;
+ POINT pos;
+
+ if (icon->display == -1) return;
+
+ LIST_FOR_EACH_ENTRY( ptr, &icon_list, struct tray_icon, entry )
+ {
+ if (ptr == icon) continue;
+ if (ptr->display < icon->display) continue;
+ ptr->display--;
+ pos = get_icon_pos( ptr );
+ SetWindowPos( ptr->window, 0, pos.x, pos.y, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE
| SWP_NOZORDER );
+ }
+ icon->display = -1;
+ if (!--nb_displayed) ShowWindow( standalone_tray, SW_HIDE );
+ TRACE( "removed %u now %d icons\n", icon->id, nb_displayed );
+}
+
+/* window procedure for the individual tray icon window */
+static LRESULT WINAPI tray_icon_wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM
lparam)
{
struct tray_icon *icon = NULL;
BOOL ret;
@@ -156,6 +265,10 @@
switch (msg)
{
+ case WM_CREATE:
+ SetTimer( hwnd, 1, 1000, NULL );
+ break;
+
case WM_PAINT:
{
PAINTSTRUCT ps;
@@ -170,7 +283,7 @@
DrawIconEx( hdc, (rc.left + rc.right - cx) / 2, (rc.top + rc.bottom - cy) /
2,
icon->image, cx, cy, 0, 0, DI_DEFAULTSIZE|DI_NORMAL );
EndPaint(hwnd, &ps);
- break;
+ return 0;
}
case WM_MOUSEMOVE:
@@ -191,57 +304,109 @@
WARN( "application window was destroyed, removing icon %u\n",
icon->id );
delete_icon( icon );
}
- break;
+ return 0;
case WM_TIMER:
if (!IsWindow( icon->owner )) delete_icon( icon );
return 0;
- default:
- return DefWindowProcW(hwnd, msg, wparam, lparam);
- }
- return 0;
+ case WM_CLOSE:
+ if (icon->display == -1)
+ {
+ TRACE( "icon %u no longer embedded\n", icon->id );
+ hide_icon( icon );
+ add_to_standalone_tray( icon );
+ }
+ return 0;
+ }
+ return DefWindowProcW( hwnd, msg, wparam, lparam );
}
/* find the X11 window owner the system tray selection */
static Window get_systray_selection_owner( Display *display )
{
- static Atom systray_atom;
Window ret;
- if (root_window != DefaultRootWindow( display )) return 0;
-
wine_tsx11_lock();
- if (!systray_atom)
- {
- if (DefaultScreen( display ) == 0)
- systray_atom = x11drv_atom(_NET_SYSTEM_TRAY_S0);
- else
- {
- char systray_buffer[29]; /* strlen(_NET_SYSTEM_TRAY_S4294967295)+1 */
- sprintf( systray_buffer, "_NET_SYSTEM_TRAY_S%u", DefaultScreen(
display ) );
- systray_atom = XInternAtom( display, systray_buffer, False );
- }
- }
ret = XGetSelectionOwner( display, systray_atom );
wine_tsx11_unlock();
return ret;
}
-
-/* dock the given X window with the NETWM system tray */
-static void dock_systray_window( Display *display, HWND hwnd, Window systray_window )
+static BOOL init_systray(void)
+{
+ static BOOL init_done;
+ WNDCLASSEXW class;
+ Display *display;
+
+ if (root_window != DefaultRootWindow( gdi_display )) return FALSE;
+ if (init_done) return TRUE;
+
+ icon_cx = GetSystemMetrics( SM_CXSMICON ) + 2 * ICON_BORDER;
+ icon_cy = GetSystemMetrics( SM_CYSMICON ) + 2 * ICON_BORDER;
+
+ memset( &class, 0, sizeof(class) );
+ class.cbSize = sizeof(class);
+ class.lpfnWndProc = tray_icon_wndproc;
+ class.hIcon = LoadIconW(0, (LPCWSTR)IDI_WINLOGO);
+ class.hCursor = LoadCursorW( 0, (LPCWSTR)IDC_ARROW );
+ class.lpszClassName = icon_classname;
+ class.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
+
+ if (!RegisterClassExW( &class ) && GetLastError() !=
ERROR_CLASS_ALREADY_EXISTS)
+ {
+ ERR( "Could not register icon tray window class\n" );
+ return FALSE;
+ }
+
+ class.lpfnWndProc = standalone_tray_wndproc;
+ class.hbrBackground = (HBRUSH)COLOR_WINDOW;
+ class.lpszClassName = tray_classname;
+ class.style = CS_DBLCLKS;
+
+ if (!RegisterClassExW( &class ) && GetLastError() !=
ERROR_CLASS_ALREADY_EXISTS)
+ {
+ ERR( "Could not register standalone tray window class\n" );
+ return FALSE;
+ }
+
+ display = thread_init_display();
+ wine_tsx11_lock();
+ if (DefaultScreen( display ) == 0)
+ systray_atom = x11drv_atom(_NET_SYSTEM_TRAY_S0);
+ else
+ {
+ char systray_buffer[29]; /* strlen(_NET_SYSTEM_TRAY_S4294967295)+1 */
+ sprintf( systray_buffer, "_NET_SYSTEM_TRAY_S%u", DefaultScreen( display
) );
+ systray_atom = XInternAtom( display, systray_buffer, False );
+ }
+ XSelectInput( display, root_window, StructureNotifyMask );
+ wine_tsx11_unlock();
+
+ init_done = TRUE;
+ return TRUE;
+}
+
+/* dock the given icon with the NETWM system tray */
+static void dock_systray_icon( Display *display, struct tray_icon *icon, Window
systray_window )
{
struct x11drv_win_data *data;
XEvent ev;
XSetWindowAttributes attr;
- if (!(data = X11DRV_get_win_data( hwnd )) &&
- !(data = X11DRV_create_win_data( hwnd ))) return;
+ icon->window = CreateWindowW( icon_classname, NULL, WS_CLIPSIBLINGS | WS_POPUP,
+ CW_USEDEFAULT, CW_USEDEFAULT, icon_cx, icon_cy,
+ NULL, NULL, NULL, icon );
+ if (!icon->window) return;
+
+ if (!(data = X11DRV_get_win_data( icon->window )) &&
+ !(data = X11DRV_create_win_data( icon->window ))) return;
TRACE( "icon window %p/%lx managed %u\n", data->hwnd,
data->whole_window, data->managed );
make_window_embedded( display, data );
+ create_tooltip( icon );
+ ShowWindow( icon->window, SW_SHOWNA );
/* send the docking request message */
ev.xclient.type = ClientMessage;
@@ -262,67 +427,55 @@
wine_tsx11_unlock();
}
+/* dock systray windows again with the new owner */
+void change_systray_owner( Display *display, Window systray_window )
+{
+ struct tray_icon *icon;
+
+ TRACE( "new owner %lx\n", systray_window );
+ LIST_FOR_EACH_ENTRY( icon, &icon_list, struct tray_icon, entry )
+ {
+ if (icon->display == -1) continue;
+ hide_icon( icon );
+ dock_systray_icon( display, icon, systray_window );
+ }
+}
/* hide a tray icon */
static BOOL hide_icon( struct tray_icon *icon )
{
+ struct x11drv_win_data *data;
+
TRACE( "id=0x%x, hwnd=%p\n", icon->id, icon->owner );
if (!icon->window) return TRUE; /* already hidden */
+
+ /* make sure we don't try to unmap it, it confuses some systray docks */
+ if ((data = X11DRV_get_win_data( icon->window )) && data->embedded)
data->mapped = FALSE;
DestroyWindow(icon->window);
DestroyWindow(icon->tooltip);
icon->window = 0;
icon->tooltip = 0;
+ remove_from_standalone_tray( icon );
return TRUE;
}
/* make the icon visible */
static BOOL show_icon( struct tray_icon *icon )
{
- RECT rect;
- static BOOL class_registered;
Window systray_window;
- Display *display = thread_display();
+ Display *display = thread_init_display();
TRACE( "id=0x%x, hwnd=%p\n", icon->id, icon->owner );
if (icon->window) return TRUE; /* already shown */
- if (!class_registered)
- {
- WNDCLASSEXW class;
-
- ZeroMemory( &class, sizeof(class) );
- class.cbSize = sizeof(class);
- class.lpfnWndProc = tray_wndproc;
- class.hCursor = LoadCursorW( 0, (LPCWSTR)IDC_ARROW );
- class.lpszClassName = tray_classname;
- class.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
-
- if (!RegisterClassExW(&class) && GetLastError() !=
ERROR_CLASS_ALREADY_EXISTS)
- {
- WINE_ERR( "Could not register tray window class\n" );
- return FALSE;
- }
- class_registered = TRUE;
- }
-
- if (!(systray_window = get_systray_selection_owner( display ))) return FALSE;
-
- rect.left = 0;
- rect.top = 0;
- rect.right = GetSystemMetrics( SM_CXSMICON ) + 2*ICON_BORDER;
- rect.bottom = GetSystemMetrics( SM_CYSMICON ) + 2*ICON_BORDER;
-
- icon->window = CreateWindowExW( WS_EX_APPWINDOW, tray_classname, NULL,
WS_CLIPSIBLINGS | WS_POPUP,
- CW_USEDEFAULT, CW_USEDEFAULT,
- rect.right - rect.left, rect.bottom - rect.top,
- NULL, NULL, NULL, icon );
- create_tooltip( icon );
- dock_systray_window( display, icon->window, systray_window );
- SetTimer( icon->window, 1, 1000, NULL );
- ShowWindow( icon->window, SW_SHOWNA );
+ if ((systray_window = get_systray_selection_owner( display )))
+ dock_systray_icon( display, icon, systray_window );
+ else
+ add_to_standalone_tray( icon );
+
return TRUE;
}
@@ -343,8 +496,12 @@
icon->image = CopyIcon(nid->hIcon);
if (icon->window)
{
- struct x11drv_win_data *data = X11DRV_get_win_data( icon->window );
- if (data) XClearArea( thread_display(), data->client_window, 0, 0, 0, 0,
True );
+ if (icon->display != -1) InvalidateRect( icon->window, NULL, TRUE );
+ else
+ {
+ struct x11drv_win_data *data = X11DRV_get_win_data( icon->window );
+ if (data) XClearArea( gdi_display, data->client_window, 0, 0, 0, 0,
True );
+ }
}
}
@@ -389,6 +546,7 @@
ZeroMemory(icon, sizeof(struct tray_icon));
icon->id = nid->uID;
icon->owner = nid->hWnd;
+ icon->display = -1;
list_add_tail(&icon_list, &icon->entry);
@@ -423,8 +581,7 @@
switch (msg)
{
case NIM_ADD:
- if (!get_systray_selection_owner( thread_init_display() ))
- return -1; /* fall back to default handling */
+ if (!init_systray()) return -1; /* fall back to default handling */
ret = add_icon( data );
break;
case NIM_DELETE:
Modified: branches/arwinss/reactos/dll/win32/winex11.drv/window.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winex…
==============================================================================
--- branches/arwinss/reactos/dll/win32/winex11.drv/window.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/winex11.drv/window.c [iso-8859-1] Tue Nov 23
22:12:41 2010
@@ -1357,6 +1357,8 @@
{
unsigned long info[2];
+ if (!data->whole_window) return;
+
info[0] = 0; /* protocol version */
info[1] = flags;
wine_tsx11_lock();
@@ -1419,18 +1421,19 @@
*/
void make_window_embedded( Display *display, struct x11drv_win_data *data )
{
- if (data->mapped)
- {
- /* the window cannot be mapped before being embedded */
- unmap_window( display, data );
- data->embedded = TRUE;
+ BOOL was_mapped = data->mapped;
+ /* the window cannot be mapped before being embedded */
+ if (data->mapped) unmap_window( display, data );
+
+ data->embedded = TRUE;
+ data->managed = TRUE;
+ SetPropA( data->hwnd, managed_prop, (HANDLE)1 );
+ sync_window_style( display, data );
+
+ if (was_mapped)
map_window( display, data, 0 );
- }
else
- {
- data->embedded = TRUE;
set_xembed_flags( display, data, 0 );
- }
}
@@ -1890,9 +1893,17 @@
struct x11drv_win_data *data;
if (!(data = X11DRV_get_win_data( hwnd ))) return;
-
- FIXME( "window %p/%lx destroyed from the outside\n", hwnd,
data->whole_window );
- destroy_whole_window( display, data, TRUE );
+ if (!data->embedded) FIXME( "window %p/%lx destroyed from the
outside\n", hwnd, data->whole_window );
+
+ if (!data->whole_window)
+ {
+ wine_tsx11_lock();
+ XDeleteContext( display, event->xdestroywindow.window, winContext );
+ wine_tsx11_unlock();
+ }
+ else destroy_whole_window( display, data, TRUE );
+
+ if (data->embedded) SendMessageW( hwnd, WM_CLOSE, 0, 0 );
}
@@ -2044,6 +2055,118 @@
}
+/* window procedure for foreign windows */
+static LRESULT WINAPI foreign_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM
lparam )
+{
+ switch(msg)
+ {
+ case WM_PARENTNOTIFY:
+ if (LOWORD(wparam) == WM_DESTROY)
+ {
+ TRACE( "%p: got parent notify destroy for win %lx\n", hwnd, lparam
);
+ PostMessageW( hwnd, WM_CLOSE, 0, 0 ); /* so that we come back here once the
child is gone */
+ }
+ return 0;
+ case WM_CLOSE:
+ if (GetWindow( hwnd, GW_CHILD )) return 0; /* refuse to die if we still have
children */
+ break;
+ }
+ return DefWindowProcW( hwnd, msg, wparam, lparam );
+}
+
+
+/***********************************************************************
+ * create_foreign_window
+ *
+ * Create a foreign window for the specified X window and its ancestors
+ */
+HWND create_foreign_window( Display *display, Window xwin )
+{
+ static const WCHAR classW[] =
{'_','_','w','i','n','e','_','x','1','1','_','f','o','r','e','i','g','n','_','w','i','n','d','o','w',0};
+ static BOOL class_registered;
+ struct x11drv_win_data *data;
+ HWND hwnd, parent;
+ Window xparent, xroot;
+ Window *xchildren;
+ unsigned int nchildren;
+ XWindowAttributes attr;
+ DWORD style = WS_CLIPCHILDREN;
+
+ if (!class_registered)
+ {
+ WNDCLASSEXW class;
+
+ memset( &class, 0, sizeof(class) );
+ class.cbSize = sizeof(class);
+ class.lpfnWndProc = foreign_window_proc;
+ class.lpszClassName = classW;
+ if (!RegisterClassExW( &class ) && GetLastError() !=
ERROR_CLASS_ALREADY_EXISTS)
+ {
+ ERR( "Could not register foreign window class\n" );
+ return FALSE;
+ }
+ class_registered = TRUE;
+ }
+
+ wine_tsx11_lock();
+ if (XFindContext( display, xwin, winContext, (char **)&hwnd )) hwnd = 0;
+ if (hwnd) /* already created */
+ {
+ wine_tsx11_unlock();
+ return hwnd;
+ }
+
+ XSelectInput( display, xwin, StructureNotifyMask );
+ if (!XGetWindowAttributes( display, xwin, &attr ) ||
+ !XQueryTree( display, xwin, &xroot, &xparent, &xchildren,
&nchildren ))
+ {
+ XSelectInput( display, xwin, 0 );
+ wine_tsx11_unlock();
+ return 0;
+ }
+ XFree( xchildren );
+ wine_tsx11_unlock();
+
+ if (xparent == xroot)
+ {
+ parent = GetDesktopWindow();
+ style |= WS_POPUP;
+ attr.x += virtual_screen_rect.left;
+ attr.y += virtual_screen_rect.top;
+ }
+ else
+ {
+ parent = create_foreign_window( display, xparent );
+ style |= WS_CHILD;
+ }
+
+ hwnd = CreateWindowW( classW, NULL, style, attr.x, attr.y, attr.width, attr.height,
+ parent, 0, 0, NULL );
+
+ if (!(data = alloc_win_data( display, hwnd )))
+ {
+ DestroyWindow( hwnd );
+ return 0;
+ }
+ SetRect( &data->window_rect, attr.x, attr.y, attr.x + attr.width, attr.y +
attr.height );
+ data->whole_rect = data->client_rect = data->window_rect;
+ data->whole_window = data->client_window = 0;
+ data->embedded = TRUE;
+ data->mapped = TRUE;
+
+ wine_tsx11_lock();
+ XSaveContext( display, xwin, winContext, (char *)data->hwnd );
+ wine_tsx11_unlock();
+
+ ShowWindow( hwnd, SW_SHOW );
+
+ TRACE( "win %lx parent %p style %08x %s -> hwnd %p\n",
+ xwin, parent, style, wine_dbgstr_rect(&data->window_rect), hwnd );
+
+ return hwnd;
+}
+
+
/***********************************************************************
* X11DRV_get_whole_window
*
@@ -2107,6 +2230,7 @@
{
struct x11drv_escape_set_drawable escape;
struct x11drv_win_data *data = X11DRV_get_win_data( hwnd );
+ HWND parent;
escape.code = X11DRV_SET_DRAWABLE;
escape.mode = IncludeInferiors;
@@ -2114,6 +2238,15 @@
escape.gl_drawable = 0;
escape.pixmap = 0;
escape.gl_copy = FALSE;
+
+ escape.dc_rect.left = win_rect->left - top_rect->left;
+ escape.dc_rect.top = win_rect->top - top_rect->top;
+ escape.dc_rect.right = win_rect->right - top_rect->left;
+ escape.dc_rect.bottom = win_rect->bottom - top_rect->top;
+ escape.drawable_rect.left = top_rect->left;
+ escape.drawable_rect.top = top_rect->top;
+ escape.drawable_rect.right = top_rect->right;
+ escape.drawable_rect.bottom = top_rect->bottom;
if (top == hwnd)
{
@@ -2131,22 +2264,25 @@
}
else
{
- escape.drawable = X11DRV_get_client_window( top );
+ /* find the first ancestor that has a drawable */
+ for (parent = hwnd; parent && parent != top; parent = GetAncestor(
parent, GA_PARENT ))
+ if ((escape.drawable = X11DRV_get_client_window( parent ))) break;
+
+ if (escape.drawable)
+ {
+ POINT pt = { 0, 0 };
+ MapWindowPoints( top, parent, &pt, 1 );
+ OffsetRect( &escape.dc_rect, pt.x, pt.y );
+ OffsetRect( &escape.drawable_rect, -pt.x, -pt.y );
+ }
+ else escape.drawable = X11DRV_get_client_window( top );
+
escape.fbconfig_id = data ? data->fbconfig_id : (XID)GetPropA( hwnd,
fbconfig_id_prop );
escape.gl_drawable = data ? data->gl_drawable : (Drawable)GetPropA( hwnd,
gl_drawable_prop );
escape.pixmap = data ? data->pixmap : (Pixmap)GetPropA( hwnd, pixmap_prop
);
escape.gl_copy = (escape.gl_drawable != 0);
if (flags & DCX_CLIPCHILDREN) escape.mode = ClipByChildren;
}
-
- escape.dc_rect.left = win_rect->left - top_rect->left;
- escape.dc_rect.top = win_rect->top - top_rect->top;
- escape.dc_rect.right = win_rect->right - top_rect->left;
- escape.dc_rect.bottom = win_rect->bottom - top_rect->top;
- escape.drawable_rect.left = top_rect->left;
- escape.drawable_rect.top = top_rect->top;
- escape.drawable_rect.right = top_rect->right;
- escape.drawable_rect.bottom = top_rect->bottom;
ExtEscape( hdc, X11DRV_ESCAPE, sizeof(escape), (LPSTR)&escape, 0, NULL );
}
@@ -2218,6 +2354,7 @@
if (!data) return;
if (parent == old_parent) return;
+ if (data->embedded) return;
if (parent != GetDesktopWindow()) /* a child window */
{
@@ -2368,10 +2505,11 @@
if (thread_data->current_event &&
thread_data->current_event->xany.window == data->whole_window)
event_type = thread_data->current_event->type;
- if (event_type != ConfigureNotify && event_type != PropertyNotify)
+ if (event_type != ConfigureNotify && event_type != PropertyNotify &&
+ event_type != GravityNotify && event_type != ReparentNotify)
event_type = 0; /* ignore other events */
- if (data->mapped)
+ if (data->mapped && event_type != ReparentNotify)
{
if (((swp_flags & SWP_HIDEWINDOW) && !(new_style & WS_VISIBLE))
||
(event_type != ConfigureNotify &&
Modified: branches/arwinss/reactos/dll/win32/winex11.drv/winex11.drv.spec
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winex…
==============================================================================
--- branches/arwinss/reactos/dll/win32/winex11.drv/winex11.drv.spec [iso-8859-1]
(original)
+++ branches/arwinss/reactos/dll/win32/winex11.drv/winex11.drv.spec [iso-8859-1] Tue Nov
23 22:12:41 2010
@@ -12,6 +12,7 @@
@ cdecl DescribePixelFormat(ptr long long ptr) X11DRV_DescribePixelFormat
@ cdecl Ellipse(ptr long long long long) X11DRV_Ellipse
@ cdecl EnumDeviceFonts(ptr ptr ptr long) X11DRV_EnumDeviceFonts
+@ cdecl EnumICMProfiles(ptr ptr long) X11DRV_EnumICMProfiles
@ cdecl ExtEscape(ptr long long ptr long ptr) X11DRV_ExtEscape
@ cdecl ExtFloodFill(ptr long long long long) X11DRV_ExtFloodFill
@ cdecl ExtTextOut(ptr long long long ptr ptr long ptr) X11DRV_ExtTextOut
Modified: branches/arwinss/reactos/dll/win32/winex11.drv/x11drv.h
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winex…
==============================================================================
--- branches/arwinss/reactos/dll/win32/winex11.drv/x11drv.h [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/winex11.drv/x11drv.h [iso-8859-1] Tue Nov 23
22:12:41 2010
@@ -502,6 +502,7 @@
extern COLORREF X11DRV_PALETTE_ToLogical(X11DRV_PDEVICE *physDev, int pixel);
extern int X11DRV_PALETTE_ToPhysical(X11DRV_PDEVICE *physDev, COLORREF color);
+extern COLORREF X11DRV_PALETTE_GetColor( X11DRV_PDEVICE *physDev, COLORREF color );
extern int X11DRV_PALETTE_LookupPixel(ColorShifts *shifts, COLORREF color);
extern void X11DRV_PALETTE_ComputeColorShifts(ColorShifts *shifts, unsigned long redMask,
unsigned long greenMask, unsigned long blueMask);
@@ -596,6 +597,8 @@
extern int use_xkb;
extern int use_take_focus;
extern int use_primary_selection;
+extern int use_system_cursors;
+extern int show_systray;
extern int usexcomposite;
extern int managed_mode;
extern int decorated_mode;
@@ -617,6 +620,7 @@
XATOM_CLIPBOARD = FIRST_XATOM,
XATOM_COMPOUND_TEXT,
XATOM_INCR,
+ XATOM_MANAGER,
XATOM_MULTIPLE,
XATOM_SELECTION_DATA,
XATOM_TARGETS,
@@ -658,6 +662,7 @@
XATOM__NET_WM_WINDOW_TYPE_NORMAL,
XATOM__NET_WM_WINDOW_TYPE_UTILITY,
XATOM__NET_WORKAREA,
+ XATOM__XEMBED,
XATOM__XEMBED_INFO,
XATOM_XdndAware,
XATOM_XdndEnter,
@@ -688,6 +693,7 @@
};
extern Atom X11DRV_Atoms[NB_XATOMS - FIRST_XATOM];
+extern Atom systray_atom;
#define x11drv_atom(name) (X11DRV_Atoms[XATOM_##name - FIRST_XATOM])
@@ -756,6 +762,7 @@
BOOL shaped : 1; /* is window using a custom region shape? */
int wm_state; /* current value of the WM_STATE property */
DWORD net_wm_state; /* bit mask of active x11drv_net_wm_state values */
+ Window embedder; /* window id of embedder */
unsigned long configure_serial; /* serial number of last configure request */
HBITMAP hWMIconBitmap;
HBITMAP hWMIconMask;
@@ -776,6 +783,8 @@
extern void update_user_time( Time time );
extern void update_net_wm_states( Display *display, struct x11drv_win_data *data );
extern void make_window_embedded( Display *display, struct x11drv_win_data *data );
+extern void change_systray_owner( Display *display, Window systray_window );
+extern HWND create_foreign_window( Display *display, Window window );
static inline void mirror_rect( const RECT *window_rect, RECT *rect )
{
@@ -798,7 +807,7 @@
extern void X11DRV_InitKeyboard( Display *display );
extern void X11DRV_send_keyboard_input( WORD wVk, WORD wScan, DWORD dwFlags, DWORD time,
DWORD dwExtraInfo, UINT injected_flags );
-extern void X11DRV_send_mouse_input( HWND hwnd, DWORD flags, DWORD x, DWORD y,
+extern void X11DRV_send_mouse_input( HWND top_hwnd, HWND cursor_hwnd, DWORD flags, DWORD
x, DWORD y,
DWORD data, DWORD time, DWORD extra_info, UINT
injected_flags );
extern DWORD CDECL X11DRV_MsgWaitForMultipleObjectsEx( DWORD count, const HANDLE
*handles, DWORD timeout,
DWORD mask, DWORD flags );
Modified: branches/arwinss/reactos/dll/win32/winex11.drv/x11drv_main.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winex…
==============================================================================
--- branches/arwinss/reactos/dll/win32/winex11.drv/x11drv_main.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/winex11.drv/x11drv_main.c [iso-8859-1] Tue Nov 23
22:12:41 2010
@@ -83,6 +83,8 @@
int use_xkb = 1;
int use_take_focus = 1;
int use_primary_selection = 0;
+int use_system_cursors = 1;
+int show_systray = 1;
int managed_mode = 1;
int decorated_mode = 1;
int private_color_map = 0;
@@ -118,6 +120,7 @@
"CLIPBOARD",
"COMPOUND_TEXT",
"INCR",
+ "MANAGER",
"MULTIPLE",
"SELECTION_DATA",
"TARGETS",
@@ -159,6 +162,7 @@
"_NET_WM_WINDOW_TYPE_NORMAL",
"_NET_WM_WINDOW_TYPE_UTILITY",
"_NET_WORKAREA",
+ "_XEMBED",
"_XEMBED_INFO",
"XdndAware",
"XdndEnter",
@@ -397,6 +401,12 @@
if (!get_config_key( hkey, appkey, "UsePrimarySelection", buffer,
sizeof(buffer) ))
use_primary_selection = IS_OPTION_TRUE( buffer[0] );
+ if (!get_config_key( hkey, appkey, "UseSystemCursors", buffer,
sizeof(buffer) ))
+ use_system_cursors = IS_OPTION_TRUE( buffer[0] );
+
+ if (!get_config_key( hkey, appkey, "ShowSystray", buffer, sizeof(buffer)
))
+ show_systray = IS_OPTION_TRUE( buffer[0] );
+
screen_depth = 0;
if (!get_config_key( hkey, appkey, "ScreenDepth", buffer, sizeof(buffer)
))
screen_depth = atoi(buffer);
Propchange: branches/arwinss/reactos/subsystems/win32/win32k/wine/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Nov 23 22:12:41 2010
@@ -1,3 +1,3 @@
/branches/ros-amd64-bringup/reactos/subsystems/win32/win32k/wine:35746,35789,36614,36930,38148,38151,38265,38268,39333,39345,40991,41000,41027-41028,41050,41052,41082-41086,41549,43080
/trunk/reactos/subsystems/win32/win32k/wine:42000-43126,43669-44999,45011,45097-45099,45319,45418-45419,45535-45539,45687-45688,47605,48678
-/vendor/wine/server/current:43708,44715,45044,45206,45646,45910,46314,46696,47274,47321,47798,49173
+/vendor/wine/server/current:43708,44715,45044,45206,45646,45910,46314,46696,47274,47321,47798,49173,49721
Modified: branches/arwinss/reactos/subsystems/win32/win32k/wine/window.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win3…
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/wine/window.c [iso-8859-1]
(original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/wine/window.c [iso-8859-1] Tue Nov 23
22:12:41 2010
@@ -564,9 +564,13 @@
if (!win) return 0;
- /* set last active for window and its owner */
- win->last_active = win->handle;
- if ((owner = get_user_object( win->owner, USER_WINDOW ))) owner->last_active =
win->handle;
+ /* set last active for window and its owners */
+ owner = win;
+ while (owner)
+ {
+ owner->last_active = win->handle;
+ owner = get_user_object( owner->owner, USER_WINDOW );
+ }
return 1;
}
Propchange: branches/arwinss/reactos/subsystems/win32/win32k/wine/window.c
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Nov 23 22:12:41 2010
@@ -1,3 +1,3 @@
/branches/ros-amd64-bringup/reactos/subsystems/win32/win32k/wine/window.c:35746,35789,36614,36930,38148,38151,38265,38268,39333,39345,40991,41000,41027-41028,41050,41052,41082-41086,41549,43080
/trunk/reactos/subsystems/win32/win32k/wine/window.c:42000-43126,43669-44999,45011,45097-45099,45319,45418-45419,45535-45539,45687-45688,47605,48678
-/vendor/wine/server/current/window.c:43708,44715,45044,45206,45646,45910,46314,46696,47274,47321,47798,48677,49173
+/vendor/wine/server/current/window.c:43708,44715,45044,45206,45646,45910,46314,46696,47274,47321,47798,48677,49173,49721