Commit 22945d5a authored by Alexandre Julliard's avatar Alexandre Julliard

Release 950202

Wed Feb 1 19:27:55 1995 Alexandre Julliard (julliard@lamisun.epfl.ch) * [windows/nonclient.c] [windows/winpos.c] Implemented maximized windows. Implemented icon positioning and ArrangeIconicWindows(). Bug fixes in SetWindowPos(). * [windows/painting.c] Implemented GetControlBrush(). Window frame is no longer contained in the update region. * [windows/win.c] Destroy owned windows upon DestroyWindow(). Sun Jan 29 16:17:22 1995 David Metcalfe <david@prism.demon.co.uk> * [controls/edit.c] Changed line terminator to \r\n to be compatible with Windows. Fixed bug in text selection. Sun Jan 29 14:10:22 1995 Bernd Schmidt <crux@pool.informatik.rwth-aachen.de> * [misc/shell.c] Rewrote RegCreateKey and RegOpenKey, since they were completely broken. Fixed a bug in RegQueryKeyValue. Implemented RegEnumKey These functions now work somewhat more the way Windows programs expect them to work.
parent 18506558
This is release 950122 of Wine the MS Windows emulator. This is still a This is release 950202 of Wine the MS Windows emulator. This is still a
developer's only release. There are many bugs and many unimplemented API developer's only release. There are many bugs and many unimplemented API
features. Most applications still do not work. features. Most applications still do not work.
Patches should be submitted to "wine-new@amscons.com". Please don't forget Patches should be submitted to "wine-new@amscons.com". Please don't forget
to include a ChangeLog entry. I'll make a new release every other Sunday. to include a ChangeLog entry. I'll make a new release every other Sunday.
WHAT'S NEW with Wine-950122: (see ChangeLog for details) WHAT'S NEW with Wine-950202: (see ChangeLog for details)
- ELF format support - Maximized windows
- New disassembler based on Mach code, replacing the gdb code - Edit control now uses \r\n for line endings
- Faster regions - Better registry functions
- Lots of bug fixes - Lots of bug fixes
See the README file in the distribution for installation instructions. See the README file in the distribution for installation instructions.
...@@ -17,11 +17,11 @@ Because of lags created by using mirror, this message may reach you before ...@@ -17,11 +17,11 @@ Because of lags created by using mirror, this message may reach you before
the release is available at the ftp sites. The sources will be available the release is available at the ftp sites. The sources will be available
from the following locations: from the following locations:
sunsite.unc.edu:/pub/Linux/ALPHA/wine/Wine-950122.tar.gz sunsite.unc.edu:/pub/Linux/ALPHA/wine/Wine-950202.tar.gz
aris.com:/pub/linux/ALPHA/Wine/development/Wine-950122.tar.gz aris.com:/pub/linux/ALPHA/Wine/development/Wine-950202.tar.gz
tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-950122.tar.gz tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-950202.tar.gz
ftp.funet.fi:/pub/OS/Linux/ALPHA/Wine/Wine-950122.tar.gz ftp.funet.fi:/pub/OS/Linux/ALPHA/Wine/Wine-950202.tar.gz
ftp.wonderland.org:/Wine/Wine-950122.tar.gz ftp.wonderland.org:/Wine/Wine-950202.tar.gz
If you submitted a patch, please check to make sure it has been If you submitted a patch, please check to make sure it has been
included in the new release. included in the new release.
......
---------------------------------------------------------------------- ----------------------------------------------------------------------
Wed Feb 1 19:27:55 1995 Alexandre Julliard (julliard@lamisun.epfl.ch)
* [windows/nonclient.c] [windows/winpos.c]
Implemented maximized windows.
Implemented icon positioning and ArrangeIconicWindows().
Bug fixes in SetWindowPos().
* [windows/painting.c]
Implemented GetControlBrush().
Window frame is no longer contained in the update region.
* [windows/win.c]
Destroy owned windows upon DestroyWindow().
Sun Jan 29 16:17:22 1995 David Metcalfe <david@prism.demon.co.uk>
* [controls/edit.c]
Changed line terminator to \r\n to be compatible with
Windows. Fixed bug in text selection.
Sun Jan 29 14:10:22 1995 Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>
* [misc/shell.c]
Rewrote RegCreateKey and RegOpenKey, since they were completely broken.
Fixed a bug in RegQueryKeyValue. Implemented RegEnumKey
These functions now work somewhat more the way Windows programs expect
them to work.
----------------------------------------------------------------------
Sun Jan 22 18:55:33 1995 Alexandre Julliard (julliard@lamisun.epfl.ch) Sun Jan 22 18:55:33 1995 Alexandre Julliard (julliard@lamisun.epfl.ch)
* [loader/resource.c] [objects/dib.c] * [loader/resource.c] [objects/dib.c]
......
...@@ -47,10 +47,11 @@ then ...@@ -47,10 +47,11 @@ then
fi fi
echo echo
echo -n 'Use the XPM library (Y/N) [N]? ' echo -n 'Use the XPM library (Y/N) [Y]? '
read input read input
if [ "$input" = 'y' -o "$input" = 'Y' ] if [ "$input" = 'n' -o "$input" = 'N' ]
then then :
else
XPM='#define USE_XPM' XPM='#define USE_XPM'
ALLDEFINES="$ALLDEFINES -DUSE_XPM" ALLDEFINES="$ALLDEFINES -DUSE_XPM"
fi fi
......
- Find all the remaining bugs!
- ES_LEFT, ES_RIGHT and ES_CENTER. ES_RIGHT and ES_CENTER cannot be
used with single line edit controls or be combined with ES_AUTOHSCROLL.
- Hide selection when window loses focus and ES_NOHIDESEL to disable
this functionality.
- ES_LOWERCASE and ES_UPPERCASE.
- ES_PASSWORD and EM_PASSWORDCHAR.
- ES_OEMCONVERT. Probably won't do anything very much.
- ES_READONLY.
- ES_WANTRETURN and Ctrl-Enter to move to next line when this
functionality is enabled.
- Implement undo buffer correctly. Windows allows the user to undo
entered text as well as deleted text. You can also undo an undo.
- Add word wrap - this is a very big change!
...@@ -278,7 +278,10 @@ LONG EditWndProc(HWND hwnd, WORD uMsg, WORD wParam, LONG lParam) ...@@ -278,7 +278,10 @@ LONG EditWndProc(HWND hwnd, WORD uMsg, WORD wParam, LONG lParam)
break; break;
case EM_SETHANDLE: case EM_SETHANDLE:
HideCaret(hwnd);
EDIT_SetHandleMsg(hwnd, wParam); EDIT_SetHandleMsg(hwnd, wParam);
SetCaretPos(es->WndCol, es->WndRow * es->txtht);
ShowCaret(hwnd);
break; break;
case EM_SETMODIFY: case EM_SETMODIFY:
...@@ -431,7 +434,13 @@ LONG EditWndProc(HWND hwnd, WORD uMsg, WORD wParam, LONG lParam) ...@@ -431,7 +434,13 @@ LONG EditWndProc(HWND hwnd, WORD uMsg, WORD wParam, LONG lParam)
SetCaretPos(es->WndCol, es->WndRow * es->txtht); SetCaretPos(es->WndCol, es->WndRow * es->txtht);
ShowCaret(hwnd); ShowCaret(hwnd);
break; break;
#if 0
case WM_SETREDRAW:
dprintf_edit(stddeb, "WM_SETREDRAW: hwnd=%d, wParam=%x\n",
hwnd, wParam);
lResult = 0;
break;
#endif
case WM_SETTEXT: case WM_SETTEXT:
EDIT_SetTextMsg(hwnd, lParam); EDIT_SetTextMsg(hwnd, lParam);
break; break;
...@@ -548,11 +557,14 @@ long EDIT_CreateMsg(HWND hwnd, LONG lParam) ...@@ -548,11 +557,14 @@ long EDIT_CreateMsg(HWND hwnd, LONG lParam)
char *text; char *text;
/* initialize state variable structure */ /* initialize state variable structure */
/* --- char width array */
hdc = GetDC(hwnd); hdc = GetDC(hwnd);
/* --- char width array */
/* only initialise chars <= 32 as X returns strange widths */
/* for other chars */
charWidths = (short *)EDIT_HeapAddr(hwnd, es->hCharWidths); charWidths = (short *)EDIT_HeapAddr(hwnd, es->hCharWidths);
memset(charWidths, 0, 256 * sizeof(short)); memset(charWidths, 0, 256 * sizeof(short));
GetCharWidth(hdc, 0, 255, charWidths); GetCharWidth(hdc, 32, 254, &charWidths[32]);
/* --- other structure variables */ /* --- other structure variables */
GetTextMetrics(hdc, &tm); GetTextMetrics(hdc, &tm);
...@@ -737,7 +749,7 @@ HANDLE EDIT_GetTextLine(HWND hwnd, int selection) ...@@ -737,7 +749,7 @@ HANDLE EDIT_GetTextLine(HWND hwnd, int selection)
dprintf_edit(stddeb,"GetTextLine %d\n", selection); dprintf_edit(stddeb,"GetTextLine %d\n", selection);
cp = cp1 = EDIT_TextLine(hwnd, selection); cp = cp1 = EDIT_TextLine(hwnd, selection);
/* advance through line */ /* advance through line */
while (*cp && *cp != '\n') while (*cp && *cp != '\r')
{ {
len++; len++;
cp++; cp++;
...@@ -804,7 +816,7 @@ int EDIT_LineLength(HWND hwnd, int num) ...@@ -804,7 +816,7 @@ int EDIT_LineLength(HWND hwnd, int num)
char *cp1; char *cp1;
if(!cp)return 0; if(!cp)return 0;
cp1 = strchr(cp, '\n'); cp1 = strchr(cp, '\r');
return cp1 ? (int)(cp1 - cp) : strlen(cp); return cp1 ? (int)(cp1 - cp) : strlen(cp);
} }
...@@ -1094,7 +1106,7 @@ HANDLE EDIT_GetStr(HWND hwnd, char *lp, int off, int len, int *diff) ...@@ -1094,7 +1106,7 @@ HANDLE EDIT_GetStr(HWND hwnd, char *lp, int off, int len, int *diff)
dprintf_edit(stddeb,"EDIT_GetStr lp='%s' off=%d len=%d\n", lp, off, len); dprintf_edit(stddeb,"EDIT_GetStr lp='%s' off=%d len=%d\n", lp, off, len);
if (off<0) off=0; if (off < 0) off = 0;
while (i < off) while (i < off)
{ {
s_i = i; s_i = i;
...@@ -1111,6 +1123,8 @@ HANDLE EDIT_GetStr(HWND hwnd, char *lp, int off, int len, int *diff) ...@@ -1111,6 +1123,8 @@ HANDLE EDIT_GetStr(HWND hwnd, char *lp, int off, int len, int *diff)
ch1 = ch; ch1 = ch;
while (i < len + off) while (i < len + off)
{ {
if (*(lp + ch) == '\r' || *(lp + ch) == '\n')
break;
i += EDIT_CharWidth(hwnd, (BYTE)(*(lp + ch)), i); i += EDIT_CharWidth(hwnd, (BYTE)(*(lp + ch)), i);
ch++; ch++;
} }
...@@ -1191,8 +1205,9 @@ void EDIT_KeyTyped(HWND hwnd, short ch) ...@@ -1191,8 +1205,9 @@ void EDIT_KeyTyped(HWND hwnd, short ch)
if (*currchar == '\0' && IsMultiLine()) if (*currchar == '\0' && IsMultiLine())
{ {
/* insert a newline at end of text */ /* insert a newline at end of text */
*currchar = '\n'; *currchar = '\r';
*(currchar + 1) = '\0'; *(currchar + 1) = '\n';
*(currchar + 2) = '\0';
EDIT_BuildTextPointers(hwnd); EDIT_BuildTextPointers(hwnd);
} }
...@@ -1220,9 +1235,19 @@ void EDIT_KeyTyped(HWND hwnd, short ch) ...@@ -1220,9 +1235,19 @@ void EDIT_KeyTyped(HWND hwnd, short ch)
currchar = CurrChar; currchar = CurrChar;
} }
/* make space for new character and put char in buffer */ /* make space for new character and put char in buffer */
memmove(currchar + 1, currchar, strlen(currchar) + 1); if (ch == '\n')
*currchar = ch; {
EDIT_ModTextPointers(hwnd, es->CurrLine + 1, 1); memmove(currchar + 2, currchar, strlen(currchar) + 1);
*currchar = '\r';
*(currchar + 1) = '\n';
EDIT_ModTextPointers(hwnd, es->CurrLine + 1, 2);
}
else
{
memmove(currchar + 1, currchar, strlen(currchar) + 1);
*currchar = ch;
EDIT_ModTextPointers(hwnd, es->CurrLine + 1, 1);
}
es->TextChanged = TRUE; es->TextChanged = TRUE;
NOTIFY_PARENT(hwnd, EN_UPDATE); NOTIFY_PARENT(hwnd, EN_UPDATE);
...@@ -1347,7 +1372,7 @@ void EDIT_Forward(HWND hwnd) ...@@ -1347,7 +1372,7 @@ void EDIT_Forward(HWND hwnd)
if (*CurrChar == '\0') if (*CurrChar == '\0')
return; return;
if (*CurrChar == '\n') if (*CurrChar == '\r')
{ {
EDIT_Home(hwnd); EDIT_Home(hwnd);
EDIT_Downward(hwnd); EDIT_Downward(hwnd);
...@@ -1465,7 +1490,7 @@ void EDIT_End(HWND hwnd) ...@@ -1465,7 +1490,7 @@ void EDIT_End(HWND hwnd)
EDITSTATE *es = EDITSTATE *es =
(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra))); (EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
while (*CurrChar && *CurrChar != '\n') while (*CurrChar && *CurrChar != '\r')
{ {
es->WndCol += EDIT_CharWidth(hwnd, (BYTE)(*CurrChar), es->WndCol + es->wleft); es->WndCol += EDIT_CharWidth(hwnd, (BYTE)(*CurrChar), es->WndCol + es->wleft);
es->CurrCol++; es->CurrCol++;
...@@ -2557,7 +2582,7 @@ void EDIT_ExtendSel(HWND hwnd, int x, int y) ...@@ -2557,7 +2582,7 @@ void EDIT_ExtendSel(HWND hwnd, int x, int y)
if (es->WndCol > EDIT_StrLength(hwnd, cp, len, 0) - es->wleft || end) if (es->WndCol > EDIT_StrLength(hwnd, cp, len, 0) - es->wleft || end)
es->WndCol = EDIT_StrLength(hwnd, cp, len, 0) - es->wleft; es->WndCol = EDIT_StrLength(hwnd, cp, len, 0) - es->wleft;
es->CurrCol = EDIT_PixelToChar(hwnd, es->CurrLine, &(es->WndCol)); es->CurrCol = EDIT_PixelToChar(hwnd, es->CurrLine, &(es->WndCol));
es->SelEndCol = es->CurrCol - 1; es->SelEndCol = es->CurrCol;
bel = es->SelEndLine; bel = es->SelEndLine;
bec = es->SelEndCol; bec = es->SelEndCol;
...@@ -2622,10 +2647,15 @@ void EDIT_WriteSel(HWND hwnd, int y, int start, int end) ...@@ -2622,10 +2647,15 @@ void EDIT_WriteSel(HWND hwnd, int y, int start, int end)
if (end == -1) if (end == -1)
end = EDIT_LineLength(hwnd, y); end = EDIT_LineLength(hwnd, y);
/* For some reason Rectangle, when called with R2_XORPEN filling,
* appears to leave a 2 pixel gap between characters and between
* lines. I have kludged this by adding on two pixels to ecol and
* to the line height in the call to Rectangle.
*/
scol = EDIT_StrLength(hwnd, cp, start, 0); scol = EDIT_StrLength(hwnd, cp, start, 0);
if (scol > rc.right) return; if (scol > rc.right) return;
if (scol < rc.left) scol = rc.left; if (scol < rc.left) scol = rc.left;
ecol = EDIT_StrLength(hwnd, cp, end, 0); ecol = EDIT_StrLength(hwnd, cp, end, 0) + 2; /* ??? */
if (ecol < rc.left) return; if (ecol < rc.left) return;
if (ecol > rc.right) ecol = rc.right; if (ecol > rc.right) ecol = rc.right;
...@@ -2633,7 +2663,7 @@ void EDIT_WriteSel(HWND hwnd, int y, int start, int end) ...@@ -2633,7 +2663,7 @@ void EDIT_WriteSel(HWND hwnd, int y, int start, int end)
hbrush = GetStockObject(BLACK_BRUSH); hbrush = GetStockObject(BLACK_BRUSH);
holdbrush = (HBRUSH)SelectObject(hdc, (HANDLE)hbrush); holdbrush = (HBRUSH)SelectObject(hdc, (HANDLE)hbrush);
olddm = SetROP2(hdc, R2_XORPEN); olddm = SetROP2(hdc, R2_XORPEN);
Rectangle(hdc, scol, y * es->txtht, ecol, (y + 1) * es->txtht); Rectangle(hdc, scol, y * es->txtht, ecol, (y + 1) * es->txtht + 2);
SetROP2(hdc, olddm); SetROP2(hdc, olddm);
SelectObject(hdc, (HANDLE)holdbrush); SelectObject(hdc, (HANDLE)holdbrush);
ReleaseDC(hwnd, hdc); ReleaseDC(hwnd, hdc);
...@@ -3054,7 +3084,7 @@ void EDIT_SetHandleMsg(HWND hwnd, WORD wParam) ...@@ -3054,7 +3084,7 @@ void EDIT_SetHandleMsg(HWND hwnd, WORD wParam)
if (IsMultiLine()) if (IsMultiLine())
{ {
es->hText = wParam; es->hText = wParam;
es->MaxTextLen = EDIT_HeapSize(hwnd, es->hText); es->textlen = EDIT_HeapSize(hwnd, es->hText);
es->wlines = 0; es->wlines = 0;
es->wtop = es->wleft = 0; es->wtop = es->wleft = 0;
es->CurrLine = es->CurrCol = 0; es->CurrLine = es->CurrCol = 0;
...@@ -3063,7 +3093,10 @@ void EDIT_SetHandleMsg(HWND hwnd, WORD wParam) ...@@ -3063,7 +3093,10 @@ void EDIT_SetHandleMsg(HWND hwnd, WORD wParam)
es->textwidth = 0; es->textwidth = 0;
es->SelBegLine = es->SelBegCol = 0; es->SelBegLine = es->SelBegCol = 0;
es->SelEndLine = es->SelEndCol = 0; es->SelEndLine = es->SelEndCol = 0;
dprintf_edit(stddeb, "EDIT_SetHandleMsg: textlen=%d\n",
es->textlen);
EDIT_BuildTextPointers(hwnd);
es->PaintBkgd = TRUE; es->PaintBkgd = TRUE;
InvalidateRect(hwnd, NULL, TRUE); InvalidateRect(hwnd, NULL, TRUE);
UpdateWindow(hwnd); UpdateWindow(hwnd);
......
...@@ -896,8 +896,6 @@ void ShowScrollBar( HWND hwnd, WORD wBar, BOOL fShow ) ...@@ -896,8 +896,6 @@ void ShowScrollBar( HWND hwnd, WORD wBar, BOOL fShow )
} }
SetWindowPos( hwnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE SetWindowPos( hwnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE
| SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED ); | SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED );
/* FIXME: Hack until SetWindowPos works correctly */
InvalidateRect( hwnd, NULL, TRUE );
} }
......
...@@ -320,7 +320,7 @@ length 540 ...@@ -320,7 +320,7 @@ length 540
#323 GETMESSAGE2 #323 GETMESSAGE2
324 pascal FillWindow(word word word word) FillWindow(1 2 3 4) 324 pascal FillWindow(word word word word) FillWindow(1 2 3 4)
325 pascal PaintRect(word word word word ptr) PaintRect(1 2 3 4 5) 325 pascal PaintRect(word word word word ptr) PaintRect(1 2 3 4 5)
#326 GETCONTROLBRUSH 326 pascal16 GetControlBrush(word word word) GetControlBrush(1 2 3)
331 pascal EnableHardwareInput(word) EnableHardwareInput(1) 331 pascal EnableHardwareInput(word) EnableHardwareInput(1)
332 return UserYield 0 0 332 return UserYield 0 0
#333 ISUSERIDLE #333 ISUSERIDLE
......
...@@ -10,6 +10,8 @@ ...@@ -10,6 +10,8 @@
#include "windows.h" #include "windows.h"
extern void NC_GetInsideRect( HWND hwnd, RECT *rect ); extern void NC_GetInsideRect( HWND hwnd, RECT *rect );
extern void NC_GetMinMaxInfo( HWND hwnd, POINT *maxSize, POINT *maxPos,
POINT *minTrack, POINT *maxTrack );
extern void NC_DoNCPaint( HWND hwnd, BOOL active, BOOL suppress_menupaint ); extern void NC_DoNCPaint( HWND hwnd, BOOL active, BOOL suppress_menupaint );
extern LONG NC_HandleNCPaint( HWND hwnd ); extern LONG NC_HandleNCPaint( HWND hwnd );
extern LONG NC_HandleNCActivate( HWND hwnd, WORD wParam ); extern LONG NC_HandleNCActivate( HWND hwnd, WORD wParam );
......
...@@ -48,7 +48,6 @@ typedef struct tagWND ...@@ -48,7 +48,6 @@ typedef struct tagWND
HANDLE hText; /* Handle of window text */ HANDLE hText; /* Handle of window text */
WORD flags; /* Misc. flags (see below) */ WORD flags; /* Misc. flags (see below) */
Window window; /* X window (only for top-level windows) */ Window window; /* X window (only for top-level windows) */
RECT rectClientSave; /* where client rect is saved when icon*/
HMENU hSysMenu; /* window's copy of System Menu */ HMENU hSysMenu; /* window's copy of System Menu */
HANDLE hProp; /* Handle of Properties List */ HANDLE hProp; /* Handle of Properties List */
HTASK hTask; /* Task Handle of the owner */ HTASK hTask; /* Task Handle of the owner */
......
...@@ -2711,6 +2711,7 @@ Fc(HANDLE,FindResource,HANDLE,a,LPSTR,b,LPSTR,c) ...@@ -2711,6 +2711,7 @@ Fc(HANDLE,FindResource,HANDLE,a,LPSTR,b,LPSTR,c)
Fc(HANDLE,LocalReAlloc,HANDLE,a,WORD,b,WORD,c) Fc(HANDLE,LocalReAlloc,HANDLE,a,WORD,b,WORD,c)
Fc(HBITMAP,CreateCompatibleBitmap,HDC,a,short,b,short,c) Fc(HBITMAP,CreateCompatibleBitmap,HDC,a,short,b,short,c)
Fc(HBITMAP,CreateDiscardableBitmap,HDC,a,short,b,short,c) Fc(HBITMAP,CreateDiscardableBitmap,HDC,a,short,b,short,c)
Fc(HBRUSH,GetControlBrush,HWND,a,HDC,b,WORD,c)
Fc(HDC,GetDCEx,HWND,a,HRGN,b,DWORD,c) Fc(HDC,GetDCEx,HWND,a,HRGN,b,DWORD,c)
Fc(HPALETTE,SelectPalette,HDC,a,HPALETTE,b,BOOL,c) Fc(HPALETTE,SelectPalette,HDC,a,HPALETTE,b,BOOL,c)
Fc(HPEN,CreatePen,short,a,short,b,COLORREF,c) Fc(HPEN,CreatePen,short,a,short,b,COLORREF,c)
......
...@@ -22,8 +22,6 @@ typedef struct ...@@ -22,8 +22,6 @@ typedef struct
extern HWND WINPOS_NextWindowFromPoint( HWND hwnd, POINT pt ); extern HWND WINPOS_NextWindowFromPoint( HWND hwnd, POINT pt );
extern HWND WINPOS_ChangeActiveWindow( HWND hwnd, BOOL mouseMsg ); extern HWND WINPOS_ChangeActiveWindow( HWND hwnd, BOOL mouseMsg );
extern void WINPOS_GetMinMaxInfo( HWND hwnd, POINT *maxSize, POINT *maxPos,
POINT *minTrack, POINT *maxTrack );
extern LONG WINPOS_SendNCCalcSize( HWND hwnd, BOOL calcValidRect, extern LONG WINPOS_SendNCCalcSize( HWND hwnd, BOOL calcValidRect,
RECT *newWindowRect, RECT *oldWindowRect, RECT *newWindowRect, RECT *oldWindowRect,
RECT *oldClientRect, WINDOWPOS *winpos, RECT *oldClientRect, WINDOWPOS *winpos,
......
...@@ -203,7 +203,8 @@ HINSTANCE LoadImage(char *module, int filetype, int change_dir) ...@@ -203,7 +203,8 @@ HINSTANCE LoadImage(char *module, int filetype, int change_dir)
if (read(wpnt->fd, wpnt->mz_header, sizeof(struct mz_header_s)) != if (read(wpnt->fd, wpnt->mz_header, sizeof(struct mz_header_s)) !=
sizeof(struct mz_header_s)) sizeof(struct mz_header_s))
{ {
myerror("Unable to read MZ header from file"); fprintf(stderr, "Unable to read MZ header from file '%s'\n", buffer);
exit(1);
} }
/* This field is ignored according to "Windows Internals", p.242 */ /* This field is ignored according to "Windows Internals", p.242 */
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
#include "stdio.h" #include "stdio.h"
#include "windows.h" #include "windows.h"
#include "win.h"
#include "user.h" #include "user.h"
#define WN_SUCCESS 0x0000 #define WN_SUCCESS 0x0000
......
...@@ -23,6 +23,7 @@ WineRelocatableTarget($(MODULE),,$(RCOBJS)) ...@@ -23,6 +23,7 @@ WineRelocatableTarget($(MODULE),,$(RCOBJS))
$(RCOBJS): winerc $(TOP)/include/windows.h $(RCOBJS): winerc $(TOP)/include/windows.h
includes:: includes::
touch $(RCSRCS:.rc=.h)
clean:: clean::
$(RM) $(RCSRCS:.rc=.c) $(RCSRCS:.rc=.h) $(RM) $(RCSRCS:.rc=.c) $(RCSRCS:.rc=.h)
......
...@@ -757,8 +757,10 @@ int main(int argc, char **argv) ...@@ -757,8 +757,10 @@ int main(int argc, char **argv)
sprintf(filename, "dll_%s.S", LowerDLLName); sprintf(filename, "dll_%s.S", LowerDLLName);
fp = fopen(filename, "w"); fp = fopen(filename, "w");
#ifdef __ELF__
fprintf (fp, "#define __ASSEMBLY__\n"); fprintf (fp, "#define __ASSEMBLY__\n");
fprintf (fp, "#include <asm/segment.h>\n"); fprintf (fp, "#include <asm/segment.h>\n");
#endif
fprintf(fp, "\t.globl " PREFIX "%s_Dispatch\n", UpperDLLName); fprintf(fp, "\t.globl " PREFIX "%s_Dispatch\n", UpperDLLName);
fprintf(fp, PREFIX "%s_Dispatch:\n", UpperDLLName); fprintf(fp, PREFIX "%s_Dispatch:\n", UpperDLLName);
fprintf(fp, "\tandl\t$0x0000ffff,%%esp\n"); fprintf(fp, "\tandl\t$0x0000ffff,%%esp\n");
......
...@@ -82,7 +82,6 @@ HCURSOR LoadCursor(HANDLE instance, LPSTR cursor_name) ...@@ -82,7 +82,6 @@ HCURSOR LoadCursor(HANDLE instance, LPSTR cursor_name)
lpcur = (CURSORALLOC *)GlobalLock(hCursor); lpcur = (CURSORALLOC *)GlobalLock(hCursor);
memset(lpcur, 0, sizeof(CURSORALLOC)); memset(lpcur, 0, sizeof(CURSORALLOC));
if (instance == (HANDLE)NULL) { if (instance == (HANDLE)NULL) {
instance = hSysRes;
switch((LONG)cursor_name) { switch((LONG)cursor_name) {
case IDC_ARROW: case IDC_ARROW:
lpcur->xcursor = XCreateFontCursor(display, XC_top_left_arrow); lpcur->xcursor = XCreateFontCursor(display, XC_top_left_arrow);
......
...@@ -283,23 +283,13 @@ LONG MDIMaximizeChild(HWND parent, HWND child, MDICLIENTINFO *ci) ...@@ -283,23 +283,13 @@ LONG MDIMaximizeChild(HWND parent, HWND child, MDICLIENTINFO *ci)
LONG MDIRestoreChild(HWND parent, MDICLIENTINFO *ci) LONG MDIRestoreChild(HWND parent, MDICLIENTINFO *ci)
{ {
HWND child; HWND child;
WND *w = WIN_FindWndPtr(parent);
LPRECT lprect = &ci->rectRestore;
dprintf_mdi(stddeb,"restoring mdi child\n"); dprintf_mdi(stddeb,"restoring mdi child\n");
child = ci->hwndActiveChild; child = ci->hwndActiveChild;
w->dwStyle &= ~WS_MAXIMIZE;
SetWindowPos(child, 0, lprect->left, lprect->top,
lprect->right - lprect->left + 1,
lprect->bottom - lprect->top + 1,
SWP_NOACTIVATE | SWP_NOZORDER);
ci->flagChildMaximized = FALSE; ci->flagChildMaximized = FALSE;
ShowWindow(child, SW_RESTORE); /* display the window */ ShowWindow(child, SW_RESTORE); /* display the window */
SendMessage(GetParent(parent), WM_NCPAINT, 0, 0);
MDIBringChildToTop(parent, child, FALSE, FALSE); MDIBringChildToTop(parent, child, FALSE, FALSE);
return 0; return 0;
......
...@@ -110,6 +110,82 @@ void AdjustWindowRectEx( LPRECT rect, DWORD style, BOOL menu, DWORD exStyle ) ...@@ -110,6 +110,82 @@ void AdjustWindowRectEx( LPRECT rect, DWORD style, BOOL menu, DWORD exStyle )
} }
/*******************************************************************
* NC_GetMinMaxInfo
*
* Get the minimized and maximized information for a window.
*/
void NC_GetMinMaxInfo( HWND hwnd, POINT *maxSize, POINT *maxPos,
POINT *minTrack, POINT *maxTrack )
{
HANDLE minmaxHandle;
MINMAXINFO MinMax, *pMinMax;
short xinc, yinc;
WND *wndPtr = WIN_FindWndPtr( hwnd );
/* Compute default values */
MinMax.ptMaxSize.x = SYSMETRICS_CXSCREEN;
MinMax.ptMaxSize.y = SYSMETRICS_CYSCREEN;
MinMax.ptMinTrackSize.x = SYSMETRICS_CXMINTRACK;
MinMax.ptMinTrackSize.y = SYSMETRICS_CYMINTRACK;
MinMax.ptMaxTrackSize.x = SYSMETRICS_CXSCREEN;
MinMax.ptMaxTrackSize.y = SYSMETRICS_CYSCREEN;
if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle ))
{
xinc = SYSMETRICS_CXDLGFRAME;
yinc = SYSMETRICS_CYDLGFRAME;
}
else
{
xinc = yinc = 0;
if (HAS_THICKFRAME(wndPtr->dwStyle))
{
xinc += SYSMETRICS_CXFRAME;
yinc += SYSMETRICS_CYFRAME;
}
if (wndPtr->dwStyle & WS_BORDER)
{
xinc += SYSMETRICS_CXBORDER;
yinc += SYSMETRICS_CYBORDER;
}
}
MinMax.ptMaxSize.x += 2 * xinc;
MinMax.ptMaxSize.y += 2 * yinc;
if ((wndPtr->ptMaxPos.x != -1) || (wndPtr->ptMaxPos.y != -1))
MinMax.ptMaxPosition = wndPtr->ptMaxPos;
else
{
MinMax.ptMaxPosition.x = -xinc;
MinMax.ptMaxPosition.y = -yinc;
}
minmaxHandle = USER_HEAP_ALLOC( LMEM_MOVEABLE, sizeof(MINMAXINFO) );
if (minmaxHandle)
{
pMinMax = (MINMAXINFO *) USER_HEAP_ADDR( minmaxHandle );
memcpy( pMinMax, &MinMax, sizeof(MinMax) );
SendMessage( hwnd, WM_GETMINMAXINFO, 0, (LONG)pMinMax );
}
else pMinMax = &MinMax;
/* Some sanity checks */
pMinMax->ptMaxTrackSize.x = max( pMinMax->ptMaxTrackSize.x,
pMinMax->ptMinTrackSize.x );
pMinMax->ptMaxTrackSize.y = max( pMinMax->ptMaxTrackSize.y,
pMinMax->ptMinTrackSize.y );
if (maxSize) *maxSize = pMinMax->ptMaxSize;
if (maxPos) *maxPos = pMinMax->ptMaxPosition;
if (minTrack) *minTrack = pMinMax->ptMinTrackSize;
if (maxTrack) *maxTrack = pMinMax->ptMaxTrackSize;
if (minmaxHandle) USER_HEAP_FREE( minmaxHandle );
}
/*********************************************************************** /***********************************************************************
* NC_HandleNCCalcSize * NC_HandleNCCalcSize
* *
...@@ -841,7 +917,7 @@ static void NC_DoSizeMove( HWND hwnd, WORD wParam, POINT pt ) ...@@ -841,7 +917,7 @@ static void NC_DoSizeMove( HWND hwnd, WORD wParam, POINT pt )
/* Get min/max info */ /* Get min/max info */
WINPOS_GetMinMaxInfo( hwnd, NULL, NULL, &minTrack, &maxTrack ); NC_GetMinMaxInfo( hwnd, NULL, NULL, &minTrack, &maxTrack );
sizingRect = wndPtr->rectWindow; sizingRect = wndPtr->rectWindow;
if (wndPtr->dwStyle & WS_CHILD) if (wndPtr->dwStyle & WS_CHILD)
GetClientRect( wndPtr->hwndParent, &mouseRect ); GetClientRect( wndPtr->hwndParent, &mouseRect );
...@@ -1162,7 +1238,8 @@ LONG NC_HandleNCLButtonDblClk( HWND hwnd, WORD wParam, LONG lParam ) ...@@ -1162,7 +1238,8 @@ LONG NC_HandleNCLButtonDblClk( HWND hwnd, WORD wParam, LONG lParam )
switch(wParam) /* Hit test */ switch(wParam) /* Hit test */
{ {
case HTCAPTION: case HTCAPTION:
SendMessage( hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, lParam ); SendMessage( hwnd, WM_SYSCOMMAND,
IsZoomed(hwnd) ? SC_RESTORE : SC_MAXIMIZE, lParam );
break; break;
case HTSYSMENU: case HTSYSMENU:
...@@ -1239,7 +1316,7 @@ LONG NC_HandleSysCommand( HWND hwnd, WORD wParam, POINT pt ) ...@@ -1239,7 +1316,7 @@ LONG NC_HandleSysCommand( HWND hwnd, WORD wParam, POINT pt )
case SC_SCREENSAVE: case SC_SCREENSAVE:
if (wParam == SC_ABOUTWINE) if (wParam == SC_ABOUTWINE)
{ extern char sysres_DIALOG_2[]; { extern char sysres_DIALOG_2[];
DialogBoxIndirectPtr( hSysRes, sysres_DIALOG_2, DialogBoxIndirectPtr( wndPtr->hInstance, sysres_DIALOG_2,
hwnd, (WNDPROC)AboutWine_Proc ); hwnd, (WNDPROC)AboutWine_Proc );
} }
break; break;
......
/* /*
* Window painting functions * Window painting functions
* *
* Copyright 1993 Alexandre Julliard * Copyright 1993, 1994, 1995 Alexandre Julliard
*/ */
#include <stdio.h> #include <stdio.h>
...@@ -104,12 +104,22 @@ void PaintRect(HWND hwndParent, HWND hwnd, HDC hdc, HBRUSH hbrush, LPRECT rect) ...@@ -104,12 +104,22 @@ void PaintRect(HWND hwndParent, HWND hwnd, HDC hdc, HBRUSH hbrush, LPRECT rect)
/*********************************************************************** /***********************************************************************
* GetControlBrush (USER.326)
*/
HBRUSH GetControlBrush( HWND hwnd, HDC hdc, WORD control )
{
return (HBRUSH)SendMessage( GetParent(hwnd), WM_CTLCOLOR,
hdc, MAKELONG( hwnd, control ) );
}
/***********************************************************************
* RedrawWindow (USER.290) * RedrawWindow (USER.290)
*/ */
BOOL RedrawWindow( HWND hwnd, LPRECT rectUpdate, HRGN hrgnUpdate, UINT flags ) BOOL RedrawWindow( HWND hwnd, LPRECT rectUpdate, HRGN hrgnUpdate, UINT flags )
{ {
HRGN tmpRgn, hrgn = 0; HRGN tmpRgn, hrgn;
RECT rectClient, rectWindow; RECT rectClient;
WND * wndPtr; WND * wndPtr;
if (!hwnd) hwnd = GetDesktopWindow(); if (!hwnd) hwnd = GetDesktopWindow();
...@@ -129,111 +139,68 @@ BOOL RedrawWindow( HWND hwnd, LPRECT rectUpdate, HRGN hrgnUpdate, UINT flags ) ...@@ -129,111 +139,68 @@ BOOL RedrawWindow( HWND hwnd, LPRECT rectUpdate, HRGN hrgnUpdate, UINT flags )
hwnd, hrgnUpdate, flags); hwnd, hrgnUpdate, flags);
} }
GetClientRect( hwnd, &rectClient ); GetClientRect( hwnd, &rectClient );
rectWindow = wndPtr->rectWindow;
OffsetRect(&rectWindow, -wndPtr->rectClient.left, -wndPtr->rectClient.top);
if (flags & RDW_INVALIDATE) /* Invalidate */ if (flags & RDW_INVALIDATE) /* Invalidate */
{ {
if (hrgnUpdate) /* Invalidate a region */ if (wndPtr->hrgnUpdate) /* Is there already an update region? */
{ {
if (flags & RDW_FRAME) tmpRgn = CreateRectRgnIndirect(&rectWindow); tmpRgn = CreateRectRgn( 0, 0, 0, 0 );
else tmpRgn = CreateRectRgnIndirect( &rectClient ); if ((hrgn = hrgnUpdate) == 0)
if (!tmpRgn) return FALSE; hrgn = CreateRectRgnIndirect( rectUpdate ? rectUpdate :
hrgn = CreateRectRgn( 0, 0, 0, 0 ); &rectClient );
if (CombineRgn( hrgn, hrgnUpdate, tmpRgn, RGN_AND ) == NULLREGION) CombineRgn( tmpRgn, wndPtr->hrgnUpdate, hrgn, RGN_OR );
{ DeleteObject( wndPtr->hrgnUpdate );
DeleteObject( hrgn ); wndPtr->hrgnUpdate = tmpRgn;
hrgn = 0; if (!hrgnUpdate) DeleteObject( hrgn );
} }
DeleteObject( tmpRgn ); else /* No update region yet */
} {
else /* Invalidate a rectangle */ if (!(wndPtr->flags & WIN_INTERNAL_PAINT))
{ MSG_IncPaintCount( wndPtr->hmemTaskQ );
RECT rect; if (hrgnUpdate)
if (flags & RDW_FRAME) {
{ wndPtr->hrgnUpdate = CreateRectRgn( 0, 0, 0, 0 );
if (rectUpdate) IntersectRect( &rect, rectUpdate, &rectWindow); CombineRgn( wndPtr->hrgnUpdate, hrgnUpdate, 0, RGN_COPY );
else rect = rectWindow; }
} else wndPtr->hrgnUpdate = CreateRectRgnIndirect( rectUpdate ?
else rectUpdate : &rectClient );
{ }
if (rectUpdate) IntersectRect( &rect, rectUpdate, &rectClient);
else rect = rectClient;
}
if (!IsRectEmpty(&rect)) hrgn = CreateRectRgnIndirect( &rect );
}
/* Set update region */
if (hrgn)
{
if (!wndPtr->hrgnUpdate)
{
wndPtr->hrgnUpdate = hrgn;
if (!(wndPtr->flags & WIN_INTERNAL_PAINT))
MSG_IncPaintCount( wndPtr->hmemTaskQ );
}
else
{
tmpRgn = CreateRectRgn( 0, 0, 0, 0 );
CombineRgn( tmpRgn, wndPtr->hrgnUpdate, hrgn, RGN_OR );
DeleteObject( wndPtr->hrgnUpdate );
DeleteObject( hrgn );
wndPtr->hrgnUpdate = tmpRgn;
}
}
if (flags & RDW_FRAME) wndPtr->flags |= WIN_NEEDS_NCPAINT; if (flags & RDW_FRAME) wndPtr->flags |= WIN_NEEDS_NCPAINT;
if (flags & RDW_ERASE) wndPtr->flags |= WIN_NEEDS_ERASEBKGND; if (flags & RDW_ERASE) wndPtr->flags |= WIN_NEEDS_ERASEBKGND;
flags |= RDW_FRAME; /* Force invalidating the frame of children */ flags |= RDW_FRAME; /* Force invalidating the frame of children */
} }
else if (flags & RDW_VALIDATE) /* Validate */ else if (flags & RDW_VALIDATE) /* Validate */
{ {
if (flags & RDW_NOERASE) wndPtr->flags &= ~WIN_NEEDS_ERASEBKGND; /* We need an update region in order to validate anything */
if (!(hrgn = CreateRectRgn( 0, 0, 0, 0 ))) return FALSE; if (wndPtr->hrgnUpdate)
{
/* Remove frame from update region */ if (!hrgnUpdate && !rectUpdate)
{
if (wndPtr->hrgnUpdate && (flags & RDW_NOFRAME)) /* Special case: validate everything */
{ DeleteObject( wndPtr->hrgnUpdate );
if (!(tmpRgn = CreateRectRgnIndirect( &rectClient ))) wndPtr->hrgnUpdate = 0;
return FALSE; }
if (CombineRgn(hrgn,tmpRgn,wndPtr->hrgnUpdate,RGN_AND) == NULLREGION) else
{ {
DeleteObject( hrgn ); tmpRgn = CreateRectRgn( 0, 0, 0, 0 );
hrgn = 0; if ((hrgn = hrgnUpdate) == 0)
} hrgn = CreateRectRgnIndirect( rectUpdate );
DeleteObject( tmpRgn ); if (CombineRgn( tmpRgn, wndPtr->hrgnUpdate,
DeleteObject( wndPtr->hrgnUpdate ); hrgn, RGN_DIFF ) == NULLREGION)
wndPtr->hrgnUpdate = hrgn; {
hrgn = CreateRectRgn( 0, 0, 0, 0 ); DeleteObject( tmpRgn );
} tmpRgn = 0;
}
/* Set update region */ DeleteObject( wndPtr->hrgnUpdate );
wndPtr->hrgnUpdate = tmpRgn;
if (wndPtr->hrgnUpdate) if (!hrgnUpdate) DeleteObject( hrgn );
{ }
int res; if (!wndPtr->hrgnUpdate) /* No more update region */
if (hrgnUpdate) /* Validate a region */
{
res = CombineRgn(hrgn,wndPtr->hrgnUpdate,hrgnUpdate,RGN_DIFF);
}
else /* Validate a rectangle */
{
if (rectUpdate) tmpRgn = CreateRectRgnIndirect( rectUpdate );
else tmpRgn = CreateRectRgnIndirect( &rectWindow );
res = CombineRgn( hrgn, wndPtr->hrgnUpdate, tmpRgn, RGN_DIFF );
DeleteObject( tmpRgn );
}
DeleteObject( wndPtr->hrgnUpdate );
if (res == NULLREGION)
{
DeleteObject( hrgn );
wndPtr->hrgnUpdate = 0;
if (!(wndPtr->flags & WIN_INTERNAL_PAINT)) if (!(wndPtr->flags & WIN_INTERNAL_PAINT))
MSG_DecPaintCount( wndPtr->hmemTaskQ ); MSG_DecPaintCount( wndPtr->hmemTaskQ );
} }
else wndPtr->hrgnUpdate = hrgn; if (flags & RDW_NOFRAME) wndPtr->flags &= ~WIN_NEEDS_NCPAINT;
} if (flags & RDW_NOERASE) wndPtr->flags &= ~WIN_NEEDS_ERASEBKGND;
} }
/* Set/clear internal paint flag */ /* Set/clear internal paint flag */
...@@ -393,7 +360,6 @@ BOOL GetUpdateRect( HWND hwnd, LPRECT rect, BOOL erase ) ...@@ -393,7 +360,6 @@ BOOL GetUpdateRect( HWND hwnd, LPRECT rect, BOOL erase )
*/ */
int GetUpdateRgn( HWND hwnd, HRGN hrgn, BOOL erase ) int GetUpdateRgn( HWND hwnd, HRGN hrgn, BOOL erase )
{ {
HRGN hrgnClip;
int retval; int retval;
WND * wndPtr = WIN_FindWndPtr( hwnd ); WND * wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr) return ERROR; if (!wndPtr) return ERROR;
...@@ -403,13 +369,8 @@ int GetUpdateRgn( HWND hwnd, HRGN hrgn, BOOL erase ) ...@@ -403,13 +369,8 @@ int GetUpdateRgn( HWND hwnd, HRGN hrgn, BOOL erase )
SetRectRgn( hrgn, 0, 0, 0, 0 ); SetRectRgn( hrgn, 0, 0, 0, 0 );
return NULLREGION; return NULLREGION;
} }
hrgnClip = CreateRectRgn( 0, 0, retval = CombineRgn( hrgn, wndPtr->hrgnUpdate, 0, RGN_COPY );
wndPtr->rectClient.right-wndPtr->rectClient.left,
wndPtr->rectClient.bottom-wndPtr->rectClient.top);
if (!hrgnClip) return ERROR;
retval = CombineRgn( hrgn, wndPtr->hrgnUpdate, hrgnClip, RGN_AND );
if (erase) RedrawWindow( hwnd, NULL, 0, RDW_ERASENOW | RDW_NOCHILDREN ); if (erase) RedrawWindow( hwnd, NULL, 0, RDW_ERASENOW | RDW_NOCHILDREN );
DeleteObject( hrgnClip );
return retval; return retval;
} }
......
...@@ -400,7 +400,7 @@ HWND CreateWindowEx( DWORD exStyle, LPSTR className, LPSTR windowName, ...@@ -400,7 +400,7 @@ HWND CreateWindowEx( DWORD exStyle, LPSTR className, LPSTR windowName,
/* Send the WM_GETMINMAXINFO message and fix the size if needed */ /* Send the WM_GETMINMAXINFO message and fix the size if needed */
WINPOS_GetMinMaxInfo( hwnd, &maxSize, &maxPos, &minTrack, &maxTrack ); NC_GetMinMaxInfo( hwnd, &maxSize, &maxPos, &minTrack, &maxTrack );
if ( maxSize.x < width) if ( maxSize.x < width)
{ {
...@@ -532,6 +532,21 @@ BOOL DestroyWindow( HWND hwnd ) ...@@ -532,6 +532,21 @@ BOOL DestroyWindow( HWND hwnd )
ReleaseCapture(); ReleaseCapture();
WIN_SendParentNotify( hwnd, WM_DESTROY, MAKELONG(hwnd, wndPtr->wIDmenu) ); WIN_SendParentNotify( hwnd, WM_DESTROY, MAKELONG(hwnd, wndPtr->wIDmenu) );
/* Recursively destroy owned windows */
for (;;)
{
HWND hwndSibling = GetWindow( hwnd, GW_HWNDFIRST );
while (hwndSibling)
{
WND *siblingPtr = WIN_FindWndPtr( hwndSibling );
if (siblingPtr->hwndOwner == hwnd) break;
hwndSibling = siblingPtr->hwndNext;
}
if (hwndSibling) DestroyWindow( hwndSibling );
else break;
}
/* Send destroy messages and destroy children */ /* Send destroy messages and destroy children */
SendMessage( hwnd, WM_DESTROY, 0, 0 ); SendMessage( hwnd, WM_DESTROY, 0, 0 );
...@@ -560,7 +575,6 @@ void CloseWindow(HWND hWnd) ...@@ -560,7 +575,6 @@ void CloseWindow(HWND hWnd)
} }
/*********************************************************************** /***********************************************************************
* OpenIcon (USER.44) * OpenIcon (USER.44)
*/ */
...@@ -572,7 +586,6 @@ BOOL OpenIcon(HWND hWnd) ...@@ -572,7 +586,6 @@ BOOL OpenIcon(HWND hWnd)
} }
/*********************************************************************** /***********************************************************************
* FindWindow (USER.50) * FindWindow (USER.50)
*/ */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment