Commit 7d654eb2 authored by Alexandre Julliard's avatar Alexandre Julliard

Release 960225

Sat Feb 24 16:17:05 1996 Alexandre Julliard <julliard@lrc.epfl.ch> * [files/profile.c] Added \r when writing profile files, for DOS compatibility. * [memory/global.c] Fixed bug in GlobalReAlloc() that caused a discarded block not to be reallocated if its size was not changed. * [memory/selector.c] Avoid setting a valid LDT entry with base and limit set to 0, as this causes the kernel to clear the entry. This fixes a crash when exiting Windows program manager. * [objects/metafile.c] Removed call to creat() instead of _lcreat() for WINELIB. Fri Feb 23 00:35:54 1996 Thomas Sandford <tdgsandf@prds-grn.demon.co.uk> * [if1632/gdi32.spec] GetTextExtentPointA now has win32 specific implementation. * [include/struct32.h] Define new structure tagSIZE32 and typedef SIZE32 to it. Define prototype for function PARAM32_SIZE16to32 * [win32/param32.c] New functions PARAM32_SIZE16to32 and WIN32_GetTextExtentPointA * [win32/memory.c] Added missing file pointer parameter to fprintf. Thu Feb 22 01:14:21 1996 Eric Warnke <ew2193@csc.albany.edu> * [windows/nonclient.c] Added more familiar icon activity, ie single click brings up system menu. Wed Feb 21 13:07:04 1996 Frans van Dorsselaer <dorssel@rulhm1.leidenuniv.nl> * [controls/menu.c] Added calls to HideCaret() and ShowCaret() from within TrackPopupMenu(), MENU_TrackMouseMenuBar() and MENU_TrackKbdMenuBar(). Are there any more places where this should be done? * [controls/static.c] Fixed a FIXME in STATIC_SetIcon(), which now returns a handle to the previous icon. Added a new FIXME at the point where WM_SETTEXT is handled for a SS_ICON static control. * [misc/commdlg.c] Implemented FindText() and ReplaceText() Still missing : Templates and Hooks handling / error checking * [resources/sysres_En.c] Redesigned FIND_TEXT and REPLACE_TEXT dialogs, so they now work. Languages other than En should update these too, though, as well as redimension the controls because some of the text doesn't fit. Created file resources/TODO to explain this. * [windows/caret.c] Re-written. It now uses the correct R2_XORPEN. It resets the blink timer on SetCaretPos(). It does its own hide/show scheme when SetCaretPos() is called (should be faster). Mon Feb 19 21:50:00 1996 Alex Korobka <alex@phm30.pharm.sunysb.edu> * [controls/listbox.c] Miscellaneous changes for better LBS_EXTENDEDSEL support. Removed several superfluous redrawals of item list. * [controls/scroll.c] WM_GETDLGCODE return value. * [windows/win.c] FlashWindow function. * [windows/painting.c] [windows/scroll.c] Added HideCaret/ShowCaret calls. * [objects/font.c] Added GetCharABCWidths stub. * [include/windows.h] "#define"s needed for changes mentioned above. Mon Feb 19 20:12:03 1996 Hans de Graaff <Hans.deGraaff@twi72.twi.tudelft.nl> * [include/winsock.h] Change order of includes to get in_addr struct defined in time. (Note: Linux 1.3.66, libc 5.2.18) * [misc/main.c] [include/options.h] [miscemu/int2f.c] Changed the -enhanced option into a -mode option, which can be either 'standard' or 'enhanced'. 'enhanced' is the default.
parent 0c126c7c
This is release 960218 of Wine the MS Windows emulator. This is still a This is release 960225 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 "julliard@lrc.epfl.ch". Please don't Patches should be submitted to "julliard@lrc.epfl.ch". Please don't
forget to include a ChangeLog entry. forget to include a ChangeLog entry.
WHAT'S NEW with Wine-960218: (see ChangeLog for details) WHAT'S NEW with Wine-960225: (see ChangeLog for details)
- Lots of edit control fixes. - Many caret fixes.
- Czech language support. - New -mode option to replace -enhanced.
- As usual, more Win32 code. - Many listboxes improvements.
- Find and Replace dialogs in built-in COMMDLG fixed.
- 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,19 +18,21 @@ Because of lags created by using mirror, this message may reach you before ...@@ -17,19 +18,21 @@ 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-960218.tar.gz sunsite.unc.edu:/pub/Linux/ALPHA/wine/development/Wine-960225.tar.gz
tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-960218.tar.gz tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-960225.tar.gz
ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-960218.tar.gz ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-960225.tar.gz
aris.com:/pub/linux/ALPHA/Wine/development/Wine-960218.tar.gz aris.com:/pub/linux/ALPHA/Wine/development/Wine-960225.tar.gz
It should also be available from any site that mirrors tsx-11 or sunsite. It should also be available from any site that mirrors tsx-11 or sunsite.
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.
New developers should read the info files available from the ftp sites. If you want to get the new releases faster, you can subscribe to the
The files NEWBIE-PROJECTS, DEVELOPERS-HINTS and Wine.FAQ are required wine-patches mailing list by sending a mail containing 'subscribe
reading for new developers. wine-patches your_address' to majordomo@tiger.informatik.hu-berlin.de.
To avoid overloading the mail host, please subscribe only if you
really intend to test the new releases as soon as they're out.
Wine is available thanks to the work of Bob Amstadt, Dag Asheim, Wine is available thanks to the work of Bob Amstadt, Dag Asheim,
Martin Ayotte, Ross Biro, Erik Bos, Fons Botman, John Brezak, Martin Ayotte, Ross Biro, Erik Bos, Fons Botman, John Brezak,
......
---------------------------------------------------------------------- ----------------------------------------------------------------------
Sat Feb 24 16:17:05 1996 Alexandre Julliard <julliard@lrc.epfl.ch>
* [files/profile.c]
Added \r when writing profile files, for DOS compatibility.
* [memory/global.c]
Fixed bug in GlobalReAlloc() that caused a discarded block not to
be reallocated if its size was not changed.
* [memory/selector.c]
Avoid setting a valid LDT entry with base and limit set to 0, as
this causes the kernel to clear the entry. This fixes a crash when
exiting Windows program manager.
* [objects/metafile.c]
Removed call to creat() instead of _lcreat() for WINELIB.
Fri Feb 23 00:35:54 1996 Thomas Sandford <tdgsandf@prds-grn.demon.co.uk>
* [if1632/gdi32.spec]
GetTextExtentPointA now has win32 specific implementation.
* [include/struct32.h]
Define new structure tagSIZE32 and typedef SIZE32 to it.
Define prototype for function PARAM32_SIZE16to32
* [win32/param32.c]
New functions PARAM32_SIZE16to32 and WIN32_GetTextExtentPointA
* [win32/memory.c]
Added missing file pointer parameter to fprintf.
Thu Feb 22 01:14:21 1996 Eric Warnke <ew2193@csc.albany.edu>
* [windows/nonclient.c]
Added more familiar icon activity, ie single click brings up
system menu.
Wed Feb 21 13:07:04 1996 Frans van Dorsselaer <dorssel@rulhm1.leidenuniv.nl>
* [controls/menu.c]
Added calls to HideCaret() and ShowCaret() from within
TrackPopupMenu(), MENU_TrackMouseMenuBar() and
MENU_TrackKbdMenuBar(). Are there any more places where this
should be done?
* [controls/static.c]
Fixed a FIXME in STATIC_SetIcon(), which now returns a handle to
the previous icon. Added a new FIXME at the point where
WM_SETTEXT is handled for a SS_ICON static control.
* [misc/commdlg.c]
Implemented FindText() and ReplaceText()
Still missing : Templates and Hooks handling / error checking
* [resources/sysres_En.c]
Redesigned FIND_TEXT and REPLACE_TEXT dialogs, so they now work.
Languages other than En should update these too, though, as well
as redimension the controls because some of the text doesn't fit.
Created file resources/TODO to explain this.
* [windows/caret.c]
Re-written. It now uses the correct R2_XORPEN. It resets the
blink timer on SetCaretPos(). It does its own hide/show scheme
when SetCaretPos() is called (should be faster).
Mon Feb 19 21:50:00 1996 Alex Korobka <alex@phm30.pharm.sunysb.edu>
* [controls/listbox.c]
Miscellaneous changes for better LBS_EXTENDEDSEL support.
Removed several superfluous redrawals of item list.
* [controls/scroll.c]
WM_GETDLGCODE return value.
* [windows/win.c]
FlashWindow function.
* [windows/painting.c] [windows/scroll.c]
Added HideCaret/ShowCaret calls.
* [objects/font.c]
Added GetCharABCWidths stub.
* [include/windows.h]
"#define"s needed for changes mentioned above.
Mon Feb 19 20:12:03 1996 Hans de Graaff <Hans.deGraaff@twi72.twi.tudelft.nl>
* [include/winsock.h]
Change order of includes to get in_addr struct defined in time.
(Note: Linux 1.3.66, libc 5.2.18)
* [misc/main.c] [include/options.h] [miscemu/int2f.c]
Changed the -enhanced option into a -mode option, which can be
either 'standard' or 'enhanced'. 'enhanced' is the default.
----------------------------------------------------------------------
Sun Feb 18 16:35:54 1996 Alexandre Julliard <julliard@lrc.epfl.ch> Sun Feb 18 16:35:54 1996 Alexandre Julliard <julliard@lrc.epfl.ch>
* [controls/desktop.c] * [controls/desktop.c]
......
...@@ -10,8 +10,8 @@ ...@@ -10,8 +10,8 @@
/* /*
* FIXME: * FIXME:
* - check if multi-column listboxes work * - check if multi-column listboxes work
* - implement more messages and styles (LB_EXTENDEDSEL for instance) * - implement more messages and styles
* - exterminate evil InvalidateRect(whole listbox) where possible!!!! * - implement caret for LBS_EXTENDEDSEL
*/ */
#include <stdio.h> #include <stdio.h>
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include "windows.h" #include "windows.h"
#include "user.h" #include "user.h"
#include "win.h" #include "win.h"
#include "gdi.h"
#include "msdos.h" #include "msdos.h"
#include "listbox.h" #include "listbox.h"
#include "dos_fs.h" #include "dos_fs.h"
...@@ -574,13 +575,9 @@ int ListBoxSetCurSel(LPHEADLIST lphl, WORD wIndex) ...@@ -574,13 +575,9 @@ int ListBoxSetCurSel(LPHEADLIST lphl, WORD wIndex)
DWORD dwStyle = GetWindowWord(lphl->hSelf,GWL_STYLE); DWORD dwStyle = GetWindowWord(lphl->hSelf,GWL_STYLE);
/* use ListBoxSetSel instead */ /* use ListBoxSetSel instead */
if (dwStyle & LBS_MULTIPLESEL ) return 0; if (dwStyle & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL) ) return 0;
/* unselect all previously selected */ /* unselect previous item */
if (dwStyle & LBS_EXTENDEDSEL )
ListBoxSetSel(lphl,-1,0);
else
/* unselect previous item */
if (lphl->ItemFocused != -1) { if (lphl->ItemFocused != -1) {
lpls = ListBoxGetItem(lphl, lphl->ItemFocused); lpls = ListBoxGetItem(lphl, lphl->ItemFocused);
if (lpls == 0) return LB_ERR; if (lpls == 0) return LB_ERR;
...@@ -602,23 +599,27 @@ int ListBoxSetCurSel(LPHEADLIST lphl, WORD wIndex) ...@@ -602,23 +599,27 @@ int ListBoxSetCurSel(LPHEADLIST lphl, WORD wIndex)
int ListBoxSetSel(LPHEADLIST lphl, WORD wIndex, WORD state) int ListBoxSetSel(LPHEADLIST lphl, WORD wIndex, WORD state)
{ {
LPLISTSTRUCT lpls; LPLISTSTRUCT lpls;
int n = 0;
if (!(GetWindowLong(lphl->hSelf,GWL_STYLE) & if (!(GetWindowLong(lphl->hSelf,GWL_STYLE) &
(LBS_MULTIPLESEL | LBS_EXTENDEDSEL) )) (LBS_MULTIPLESEL | LBS_EXTENDEDSEL) ))
return 0; return LB_ERR;
if (wIndex == (UINT)-1) { if (wIndex == (UINT)-1) {
for (lpls = lphl->lpFirst; lpls != NULL; lpls = lpls->lpNext) { for (lpls = lphl->lpFirst; lpls != NULL; lpls = lpls->lpNext) {
lpls->itemState = state; if( lpls->itemState & ODS_SELECTED) n++;
lpls->itemState = state? lpls->itemState | ODS_SELECTED
: lpls->itemState & ~ODS_SELECTED;
} }
return 0; return n;
} }
if (wIndex >= lphl->ItemsCount) return LB_ERR; if (wIndex >= lphl->ItemsCount) return LB_ERR;
lpls = ListBoxGetItem(lphl, wIndex); lpls = ListBoxGetItem(lphl, wIndex);
lpls->itemState = state; lpls->itemState = state? lpls->itemState | ODS_SELECTED
: lpls->itemState & ~ODS_SELECTED;
return 0; return 0;
} }
...@@ -629,7 +630,7 @@ int ListBoxGetSel(LPHEADLIST lphl, WORD wIndex) ...@@ -629,7 +630,7 @@ int ListBoxGetSel(LPHEADLIST lphl, WORD wIndex)
LPLISTSTRUCT lpls = ListBoxGetItem(lphl, wIndex); LPLISTSTRUCT lpls = ListBoxGetItem(lphl, wIndex);
if (lpls == NULL) return LB_ERR; if (lpls == NULL) return LB_ERR;
return lpls->itemState; return lpls->itemState & ODS_SELECTED;
} }
/* ------------------------- dir listing ------------------------ */ /* ------------------------- dir listing ------------------------ */
...@@ -902,7 +903,7 @@ static LONG LBLButtonDown(HWND hwnd, WORD wParam, LONG lParam) ...@@ -902,7 +903,7 @@ static LONG LBLButtonDown(HWND hwnd, WORD wParam, LONG lParam)
{ {
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd); LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
WORD wRet; WORD wRet;
int y; int y,n;
RECT rectsel; RECT rectsel;
LONG dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE); LONG dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
POINT tmpPOINT; POINT tmpPOINT;
...@@ -914,31 +915,62 @@ static LONG LBLButtonDown(HWND hwnd, WORD wParam, LONG lParam) ...@@ -914,31 +915,62 @@ static LONG LBLButtonDown(HWND hwnd, WORD wParam, LONG lParam)
lphl->PrevFocused = lphl->ItemFocused; lphl->PrevFocused = lphl->ItemFocused;
y = ListBoxFindMouse(lphl, LOWORD(lParam), HIWORD(lParam)); y = ListBoxFindMouse(lphl, LOWORD(lParam), HIWORD(lParam));
if (y == -1)
return 0;
if (dwStyle & LBS_MULTIPLESEL) { if (y == -1) return 0;
lphl->ItemFocused = y;
wRet = ListBoxGetSel(lphl, y);
ListBoxSetSel(lphl, y, !wRet);
InvalidateRect(hwnd, NULL, TRUE); if (dwStyle & LBS_NOTIFY && y!= LB_ERR )
} else { if( SendMessage(lphl->hParent, WM_LBTRACKPOINT, y, lParam) )
ListBoxSetCurSel(lphl, y); return 0;
ListBoxGetItemRect(lphl, y, &rectsel);
InvalidateRect(hwnd, &rectsel, TRUE);
if(lphl->PrevFocused) {
ListBoxGetItemRect(lphl, lphl->PrevFocused, &rectsel);
InvalidateRect(hwnd, &rectsel, TRUE);
}
}
if (dwStyle & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) switch( dwStyle & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL) )
ListBoxSendNotification(lphl, LBN_SELCHANGE); {
case LBS_MULTIPLESEL:
lphl->ItemFocused = y;
wRet = ListBoxGetSel(lphl, y);
ListBoxSetSel(lphl, y, !wRet);
break;
case LBS_EXTENDEDSEL:
/* should handle extended mode here and in kbd handler
*/
if ( lphl->PrevFocused != y && y!= LB_ERR)
{
LPLISTSTRUCT lpls = ListBoxGetItem( lphl, lphl->ItemFocused = y );
n = ListBoxSetSel(lphl,-1,FALSE);
lpls->itemState = ODS_FOCUS | ODS_SELECTED;
if( n > 1 && n != LB_ERR )
InvalidateRect(hwnd,NULL,TRUE);
}
else
return 0;
break;
case 0:
if( y!=lphl->ItemFocused )
ListBoxSetCurSel(lphl, y);
else
return 0;
break;
default:
fprintf(stdnimp,"Listbox: LBS_MULTIPLESEL and LBS_EXTENDEDSEL are on!\n");
return 0;
}
/* invalidate changed items */
if( dwStyle & LBS_MULTIPLESEL || y!=lphl->PrevFocused )
{
ListBoxGetItemRect(lphl, y, &rectsel);
InvalidateRect(hwnd, &rectsel, TRUE);
}
if( lphl->PrevFocused!=-1 && y!=lphl->PrevFocused )
{
ListBoxGetItemRect(lphl, lphl->PrevFocused, &rectsel);
InvalidateRect(hwnd, &rectsel, TRUE);
}
if (dwStyle & LBS_NOTIFY)
SendMessage(lphl->hParent, WM_LBTRACKPOINT, y, lParam);
#ifndef WINELIB #ifndef WINELIB
if (GetWindowLong(lphl->hSelf,GWL_EXSTYLE) & WS_EX_DRAGDETECT) if (GetWindowLong(lphl->hSelf,GWL_EXSTYLE) & WS_EX_DRAGDETECT)
if( DragDetect(lphl->hSelf,tmpPOINT) ) if( DragDetect(lphl->hSelf,tmpPOINT) )
...@@ -987,8 +1019,8 @@ static LONG LBRButtonUp(HWND hwnd, WORD wParam, LONG lParam) ...@@ -987,8 +1019,8 @@ static LONG LBRButtonUp(HWND hwnd, WORD wParam, LONG lParam)
static LONG LBMouseMove(HWND hwnd, WORD wParam, LONG lParam) static LONG LBMouseMove(HWND hwnd, WORD wParam, LONG lParam)
{ {
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd); LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
int y; int y,redraw_prev = 0;
WORD wRet; int iRet;
LONG dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE); LONG dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
RECT rect, rectsel; /* XXX Broken */ RECT rect, rectsel; /* XXX Broken */
...@@ -1014,19 +1046,33 @@ static LONG LBMouseMove(HWND hwnd, WORD wParam, LONG lParam) ...@@ -1014,19 +1046,33 @@ static LONG LBMouseMove(HWND hwnd, WORD wParam, LONG lParam)
} }
if ((y > 0) && (y < (rect.bottom - 4))) { if ((y > 0) && (y < (rect.bottom - 4))) {
if ((y < rectsel.top) || (y > rectsel.bottom)) { if ((y < rectsel.top) || (y > rectsel.bottom)) {
wRet = ListBoxFindMouse(lphl, LOWORD(lParam), HIWORD(lParam)); iRet = ListBoxFindMouse(lphl, LOWORD(lParam), HIWORD(lParam));
if (wRet == lphl->ItemFocused) { if (iRet == lphl->ItemFocused || iRet == -1) {
return 0; return 0;
} }
if (dwStyle & LBS_MULTIPLESEL) { if (dwStyle & LBS_MULTIPLESEL) {
lphl->ItemFocused = wRet; lphl->ItemFocused = iRet;
ListBoxSendNotification(lphl, LBN_SELCHANGE); ListBoxSendNotification(lphl, LBN_SELCHANGE);
} else { } else if ( dwStyle & LBS_EXTENDEDSEL )
ListBoxSetCurSel(lphl, wRet); {
if(dwStyle & LBS_EXTENDEDSEL) /* Fixme: extended selection mode */
ListBoxSendNotification(lphl, LBN_SELCHANGE); ListBoxSetSel( lphl, lphl->ItemFocused, 0);
} lphl->PrevFocused = lphl->ItemFocused;
ListBoxGetItemRect(lphl, wRet, &rectsel); lphl->ItemFocused = iRet;
ListBoxSetSel( lphl, iRet, TRUE);
redraw_prev = 1;
}
else
{
ListBoxSetCurSel(lphl, (WORD)iRet);
redraw_prev = 1;
}
if( lphl->PrevFocused!=-1 && redraw_prev )
{
ListBoxGetItemRect(lphl, lphl->PrevFocused, &rectsel);
InvalidateRect(hwnd, &rectsel, TRUE);
}
ListBoxGetItemRect(lphl, iRet, &rectsel);
InvalidateRect(hwnd, &rectsel, TRUE); InvalidateRect(hwnd, &rectsel, TRUE);
} }
} }
...@@ -1050,8 +1096,6 @@ static LONG LBKeyDown(HWND hwnd, WORD wParam, LONG lParam) ...@@ -1050,8 +1096,6 @@ static LONG LBKeyDown(HWND hwnd, WORD wParam, LONG lParam)
ListBoxGetItemRect(lphl,lphl->ItemFocused,&rect); ListBoxGetItemRect(lphl,lphl->ItemFocused,&rect);
switch(wParam) switch(wParam)
{ {
/* ugly kludge that belongs in TranslateMessage */
case VK_HOME: case VK_HOME:
case VK_END: case VK_END:
case VK_LEFT: case VK_LEFT:
...@@ -1065,7 +1109,7 @@ static LONG LBKeyDown(HWND hwnd, WORD wParam, LONG lParam) ...@@ -1065,7 +1109,7 @@ static LONG LBKeyDown(HWND hwnd, WORD wParam, LONG lParam)
newFocused = (WORD)(INT)SendMessage(lphl->hParent,WM_VKEYTOITEM, newFocused = (WORD)(INT)SendMessage(lphl->hParent,WM_VKEYTOITEM,
wParam,MAKELPARAM(lphl->ItemFocused,hwnd)); wParam,MAKELPARAM(lphl->ItemFocused,hwnd));
if ( newFocused == 0xFFFE ) return 0L; if ( newFocused == 0xFFFE ) return 0L;
} }
if ( newFocused == 0xFFFF ) if ( newFocused == 0xFFFF )
{ {
newFocused = lphl->ItemFocused; newFocused = lphl->ItemFocused;
...@@ -1073,42 +1117,42 @@ static LONG LBKeyDown(HWND hwnd, WORD wParam, LONG lParam) ...@@ -1073,42 +1117,42 @@ static LONG LBKeyDown(HWND hwnd, WORD wParam, LONG lParam)
/* nested switch */ /* nested switch */
switch(wParam) switch(wParam)
{ {
case VK_HOME: case VK_HOME:
newFocused = 0; newFocused = 0;
break; break;
case VK_END: case VK_END:
newFocused = lphl->ItemsCount - 1; newFocused = lphl->ItemsCount - 1;
break; break;
case VK_LEFT: case VK_LEFT:
if (dwStyle & LBS_MULTICOLUMN) { if (dwStyle & LBS_MULTICOLUMN) {
if (newFocused >= lphl->ItemsPerColumn) { if (newFocused >= lphl->ItemsPerColumn) {
newFocused -= lphl->ItemsPerColumn; newFocused -= lphl->ItemsPerColumn;
} else { } else {
newFocused = 0; newFocused = 0;
} }
} }
break; break;
case VK_UP: case VK_UP:
if (newFocused > 0) newFocused--; if (newFocused > 0) newFocused--;
break; break;
case VK_RIGHT: case VK_RIGHT:
if (dwStyle & LBS_MULTICOLUMN) if (dwStyle & LBS_MULTICOLUMN)
newFocused += lphl->ItemsPerColumn; newFocused += lphl->ItemsPerColumn;
break; break;
case VK_DOWN: case VK_DOWN:
newFocused++; newFocused++;
break; break;
case VK_PRIOR: case VK_PRIOR:
if (newFocused > lphl->ItemsVisible) if (newFocused > lphl->ItemsVisible)
newFocused -= lphl->ItemsVisible; newFocused -= lphl->ItemsVisible;
else newFocused = 0; else newFocused = 0;
break; break;
case VK_NEXT: case VK_NEXT:
newFocused += lphl->ItemsVisible; newFocused += lphl->ItemsVisible;
break; break;
default: default:
return 0; return 0;
} }
/* end of nested switch */ /* end of nested switch */
} }
break; break;
...@@ -1132,9 +1176,9 @@ static LONG LBKeyDown(HWND hwnd, WORD wParam, LONG lParam) ...@@ -1132,9 +1176,9 @@ static LONG LBKeyDown(HWND hwnd, WORD wParam, LONG lParam)
if (!(dwStyle & LBS_MULTIPLESEL)) if (!(dwStyle & LBS_MULTIPLESEL))
{ {
ListBoxSetCurSel(lphl, newFocused); ListBoxSetCurSel(lphl, newFocused);
ListBoxSendNotification(lphl, LBN_SELCHANGE); ListBoxSendNotification(lphl, LBN_SELCHANGE);
} }
lphl->ItemFocused = newFocused; lphl->ItemFocused = newFocused;
...@@ -1235,18 +1279,23 @@ static LONG LBPaint(HWND hwnd, WORD wParam, LONG lParam) ...@@ -1235,18 +1279,23 @@ static LONG LBPaint(HWND hwnd, WORD wParam, LONG lParam)
PAINTSTRUCT ps; PAINTSTRUCT ps;
HBRUSH hBrush; HBRUSH hBrush;
HFONT hOldFont; HFONT hOldFont;
HDC hdc; HDC hdc = BeginPaint( hwnd, &ps );
RECT rect; DC *dc = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC);
RECT rect, paintRect, scratchRect;
int i, top, height, maxwidth, ipc; int i, top, height, maxwidth, ipc;
top = 0; top = 0;
hdc = BeginPaint( hwnd, &ps );
if (!IsWindowVisible(hwnd) || !lphl->bRedrawFlag) { if (!IsWindowVisible(hwnd) || !lphl->bRedrawFlag) {
EndPaint(hwnd, &ps); EndPaint(hwnd, &ps);
return 0; return 0;
} }
GetRgnBox(dc->w.hGCClipRgn,&paintRect);
GetClientRect(hwnd, &rect);
IntersectRect(&paintRect,&rect,&paintRect);
hOldFont = SelectObject(hdc, lphl->hFont); hOldFont = SelectObject(hdc, lphl->hFont);
#ifdef WINELIB32 #ifdef WINELIB32
...@@ -1259,7 +1308,6 @@ static LONG LBPaint(HWND hwnd, WORD wParam, LONG lParam) ...@@ -1259,7 +1308,6 @@ static LONG LBPaint(HWND hwnd, WORD wParam, LONG lParam)
if (hBrush == 0) hBrush = GetStockObject(WHITE_BRUSH); if (hBrush == 0) hBrush = GetStockObject(WHITE_BRUSH);
GetClientRect(hwnd, &rect);
FillRect(hdc, &rect, hBrush); FillRect(hdc, &rect, hBrush);
maxwidth = rect.right; maxwidth = rect.right;
...@@ -1295,17 +1343,23 @@ static LONG LBPaint(HWND hwnd, WORD wParam, LONG lParam) ...@@ -1295,17 +1343,23 @@ static LONG LBPaint(HWND hwnd, WORD wParam, LONG lParam)
lpls->itemRect.left = rect.left; lpls->itemRect.left = rect.left;
lpls->itemRect.right = rect.right; lpls->itemRect.right = rect.right;
dprintf_listbox(stddeb,"drawing item: %ld %d %ld %d %d\n",(LONG)rect.left,top,(LONG)rect.right,top+height,lpls->itemState); if( IntersectRect(&scratchRect,&paintRect,&lpls->itemRect) )
if (lphl->OwnerDrawn) { {
ListBoxDrawItem (hwnd, lphl, hdc, lpls, &lpls->itemRect, ODA_DRAWENTIRE, 0); dprintf_listbox(stddeb,"drawing item: %ld %d %ld %d %d\n",(LONG)rect.left,top,
if (lpls->itemState) (LONG)rect.right,top+height,lpls->itemState);
ListBoxDrawItem (hwnd, lphl, hdc, lpls, &lpls->itemRect, ODA_SELECT, ODS_SELECTED);
} else { if (lphl->OwnerDrawn && (lphl->ItemFocused == i) && GetFocus() == hwnd)
ListBoxDrawItem (hwnd, lphl, hdc, lpls, &lpls->itemRect, ODA_DRAWENTIRE, {
lpls->itemState); ListBoxDrawItem (hwnd, lphl, hdc, lpls, &lpls->itemRect, ODA_FOCUS,
} lpls->itemState & ~ODS_FOCUS);
if ((lphl->ItemFocused == i) && GetFocus() == hwnd) ListBoxDrawItem (hwnd, lphl, hdc, lpls, &lpls->itemRect, ODA_DRAWENTIRE,
ListBoxDrawItem (hwnd,lphl, hdc, lpls, &lpls->itemRect, ODA_FOCUS, ODS_FOCUS); lpls->itemState & ~ODS_FOCUS);
ListBoxDrawItem (hwnd, lphl, hdc, lpls, &lpls->itemRect, ODA_FOCUS, lpls->itemState);
}
else
ListBoxDrawItem (hwnd, lphl, hdc, lpls, &lpls->itemRect, ODA_DRAWENTIRE,
lpls->itemState);
}
top += height; top += height;
lphl->ItemsVisible++; lphl->ItemsVisible++;
...@@ -1325,7 +1379,29 @@ static LONG LBPaint(HWND hwnd, WORD wParam, LONG lParam) ...@@ -1325,7 +1379,29 @@ static LONG LBPaint(HWND hwnd, WORD wParam, LONG lParam)
*/ */
static LONG LBSetFocus(HWND hwnd, WORD wParam, LONG lParam) static LONG LBSetFocus(HWND hwnd, WORD wParam, LONG lParam)
{ {
dprintf_listbox(stddeb,"ListBox WM_SETFOCUS !\n"); LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
LONG dwStyle;
dprintf_listbox(stddeb,"ListBox WM_SETFOCUS for "NPFMT"\n",hwnd);
dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
if(!(dwStyle & LBS_MULTIPLESEL) )
if( lphl->ItemsCount && lphl->ItemFocused != -1)
{
HDC hDC = GetDC(hwnd);
HFONT hOldFont = SelectObject(hDC, lphl->hFont);
LPLISTSTRUCT lpls;
lpls = ListBoxGetItem(lphl,lphl->ItemFocused);
lpls->itemState |= ODS_FOCUS;
ListBoxDrawItem(hwnd,lphl,hDC,lpls,&lpls->itemRect, ODA_FOCUS, lpls->itemState);
SelectObject(hDC, hOldFont);
ReleaseDC(hwnd,hDC);
}
ListBoxSendNotification(lphl, LBN_SETFOCUS);
return 0; return 0;
} }
...@@ -1335,10 +1411,37 @@ static LONG LBSetFocus(HWND hwnd, WORD wParam, LONG lParam) ...@@ -1335,10 +1411,37 @@ static LONG LBSetFocus(HWND hwnd, WORD wParam, LONG lParam)
*/ */
static LONG LBKillFocus(HWND hwnd, WORD wParam, LONG lParam) static LONG LBKillFocus(HWND hwnd, WORD wParam, LONG lParam)
{ {
dprintf_listbox(stddeb,"ListBox WM_KILLFOCUS !\n"); LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
LONG dwStyle;
dprintf_listbox(stddeb,"ListBox WM_KILLFOCUS for "NPFMT"\n",hwnd);
dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
if (!(dwStyle & LBS_MULTIPLESEL))
{
if( lphl->ItemsCount )
if( lphl->ItemFocused != -1 )
{
HDC hDC = GetDC(hwnd);
HFONT hOldFont = SelectObject(hDC, lphl->hFont);
LPLISTSTRUCT lpls;
lpls = ListBoxGetItem(lphl,lphl->ItemFocused);
lpls->itemState &= ~ODS_FOCUS;
ListBoxDrawItem(hwnd,lphl,hDC,lpls,&lpls->itemRect, ODA_FOCUS, lpls->itemState);
SelectObject(hDC, hOldFont);
ReleaseDC(hwnd,hDC);
}
else
dprintf_listbox(stddeb,"LBKillFocus: no focused item!\n");
}
else
InvalidateRect(hwnd, NULL, TRUE);
ListBoxSendNotification(lphl, LBN_KILLFOCUS);
InvalidateRect(hwnd, NULL, TRUE);
return 0; return 0;
} }
...@@ -1466,7 +1569,7 @@ static LONG LBGetCurSel(HWND hwnd, WORD wParam, LONG lParam) ...@@ -1466,7 +1569,7 @@ static LONG LBGetCurSel(HWND hwnd, WORD wParam, LONG lParam)
LPHEADLIST lphl; LPHEADLIST lphl;
lphl = ListBoxGetStorageHeader(hwnd); lphl = ListBoxGetStorageHeader(hwnd);
dprintf_listbox(stddeb,"ListBox LB_GETCURSEL %u !\n", dprintf_listbox(stddeb,"ListBox LB_GETCURSEL %i !\n",
lphl->ItemFocused); lphl->ItemFocused);
return lphl->ItemFocused; return lphl->ItemFocused;
} }
...@@ -1506,7 +1609,11 @@ static LONG LBGetItemRect(HWND hwnd, WORD wParam, LONG lParam) ...@@ -1506,7 +1609,11 @@ static LONG LBGetItemRect(HWND hwnd, WORD wParam, LONG lParam)
static LONG LBGetSel(HWND hwnd, WORD wParam, LONG lParam) static LONG LBGetSel(HWND hwnd, WORD wParam, LONG lParam)
{ {
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd); LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
return (ListBoxGetSel(lphl, wParam) )? 1 : 0; int iSel = ListBoxGetSel(lphl, wParam);
dprintf_listbox(stdnimp,"LBGetSel: item %u - %i\n",wParam,iSel);
return (iSel)? 1 : 0;
} }
/*********************************************************************** /***********************************************************************
...@@ -1602,13 +1709,22 @@ static LONG LBGetTopIndex(HWND hwnd, WORD wParam, LONG lParam) ...@@ -1602,13 +1709,22 @@ static LONG LBGetTopIndex(HWND hwnd, WORD wParam, LONG lParam)
static LONG LBSelectString(HWND hwnd, WORD wParam, LONG lParam) static LONG LBSelectString(HWND hwnd, WORD wParam, LONG lParam)
{ {
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd); LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
WORD wRet; INT iRet;
wRet = ListBoxFindString(lphl, wParam, (SEGPTR)lParam); iRet = ListBoxFindString(lphl, wParam, (SEGPTR)lParam);
/* XXX add functionality here */ if( iRet != LB_ERR)
{
return 0; if( GetWindowLong(hwnd, GWL_STYLE) &
(LBS_MULTIPLESEL | LBS_EXTENDEDSEL) )
ListBoxSetSel(lphl,iRet,TRUE);
else
ListBoxSetCurSel(lphl,iRet);
lphl->ItemFocused = iRet;
InvalidateRect(hwnd,0,TRUE);
}
return iRet;
} }
/*********************************************************************** /***********************************************************************
...@@ -1635,7 +1751,7 @@ static LONG LBSelItemRange(HWND hwnd, WORD wParam, LONG lParam) ...@@ -1635,7 +1751,7 @@ static LONG LBSelItemRange(HWND hwnd, WORD wParam, LONG lParam)
while (lpls != NULL) { while (lpls != NULL) {
if (cnt++ >= first) if (cnt++ >= first)
lpls->itemState = select ? ODS_SELECTED : 0; lpls->itemState = select ? lpls->itemState | ODS_SELECTED : 0;
if (cnt > last) if (cnt > last)
break; break;
...@@ -1651,17 +1767,24 @@ static LONG LBSelItemRange(HWND hwnd, WORD wParam, LONG lParam) ...@@ -1651,17 +1767,24 @@ static LONG LBSelItemRange(HWND hwnd, WORD wParam, LONG lParam)
*/ */
static LONG LBSetCaretIndex(HWND hwnd, WORD wParam, LONG lParam) static LONG LBSetCaretIndex(HWND hwnd, WORD wParam, LONG lParam)
{ {
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd); LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
int i;
if (!(GetWindowLong(lphl->hSelf,GWL_STYLE) &
(LBS_MULTIPLESEL | LBS_EXTENDEDSEL) )) return 0;
dprintf_listbox(stddeb,"LBSetCaretIndex: hwnd "NPFMT" n=%i\n",hwnd,wParam);
if (!(GetWindowLong(lphl->hSelf,GWL_STYLE) & LBS_MULTIPLESEL)) return 0;
if (wParam >= lphl->ItemsCount) return LB_ERR; if (wParam >= lphl->ItemsCount) return LB_ERR;
lphl->ItemFocused = wParam; lphl->ItemFocused = wParam;
ListBoxScrollToFocus (lphl); i = ListBoxScrollToFocus (lphl);
SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE); SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
InvalidateRect(hwnd, NULL, TRUE); if(i)
return 0; InvalidateRect(hwnd, NULL, TRUE);
return 1;
} }
/*********************************************************************** /***********************************************************************
...@@ -1752,14 +1875,29 @@ static LONG LBSetCurSel(HWND hwnd, WORD wParam, LONG lParam) ...@@ -1752,14 +1875,29 @@ static LONG LBSetCurSel(HWND hwnd, WORD wParam, LONG lParam)
static LONG LBSetSel(HWND hwnd, WORD wParam, LONG lParam) static LONG LBSetSel(HWND hwnd, WORD wParam, LONG lParam)
{ {
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd); LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
WORD wRet; RECT rect;
int iRet;
dprintf_listbox(stddeb,"ListBox LB_SETSEL wParam=%x lParam=%lX !\n", wParam, lParam); dprintf_listbox(stddeb,"ListBox LB_SETSEL wParam=%x lParam=%lX !\n", wParam, lParam);
wRet = ListBoxSetSel(lphl, LOWORD(lParam), wParam); iRet = ListBoxSetSel(lphl, LOWORD(lParam), wParam);
InvalidateRect(hwnd, NULL, TRUE);
return wRet; if( iRet > 1 )
InvalidateRect(hwnd, NULL, TRUE);
else if( iRet != LB_ERR )
{
if( GetWindowLong(hwnd,GWL_STYLE) & LBS_EXTENDEDSEL &&
lphl->ItemFocused != LOWORD(lParam) )
{
ListBoxGetItemRect(lphl, lphl->ItemFocused , &rect);
InvalidateRect(hwnd,&rect,TRUE);
lphl->ItemFocused = LOWORD(lParam);
}
ListBoxGetItemRect(lphl,LOWORD(lParam),&rect);
InvalidateRect(hwnd,&rect,TRUE);
}
return (iRet == (WORD)LB_ERR)? LB_ERR: 0;
} }
/*********************************************************************** /***********************************************************************
...@@ -1863,6 +2001,15 @@ LRESULT ListBoxWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) ...@@ -1863,6 +2001,15 @@ LRESULT ListBoxWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
case WM_DROPFILES: return LBPassToParent(hwnd, message, wParam, lParam); case WM_DROPFILES: return LBPassToParent(hwnd, message, wParam, lParam);
/* these will have to be implemented for proper LBS_EXTENDEDSEL -
*
* anchor item is an item that with caret (focused) item defines a
* range of currently selected items when listbox is in the extended
* selection mode.
*/
case LB_SETANCHORINDEX: return LB_SETANCHORINDEX; /* that's what Windows returns */
case LB_GETANCHORINDEX: return 0;
case WM_DROPOBJECT: case WM_DROPOBJECT:
case WM_QUERYDROPOBJECT: case WM_QUERYDROPOBJECT:
case WM_DRAGSELECT: case WM_DRAGSELECT:
...@@ -1871,8 +2018,6 @@ LRESULT ListBoxWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) ...@@ -1871,8 +2018,6 @@ LRESULT ListBoxWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
LPDRAGINFO lpDragInfo = (LPDRAGINFO) PTR_SEG_TO_LIN((SEGPTR)lParam); LPDRAGINFO lpDragInfo = (LPDRAGINFO) PTR_SEG_TO_LIN((SEGPTR)lParam);
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd); LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
/* more undocumented Microsoft crap - drag&drop depends on it - AK */
lpDragInfo->l = ListBoxFindMouse(lphl,lpDragInfo->pt.x, lpDragInfo->l = ListBoxFindMouse(lphl,lpDragInfo->pt.x,
lpDragInfo->pt.y); lpDragInfo->pt.y);
......
...@@ -1609,11 +1609,13 @@ static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, int x, int y, ...@@ -1609,11 +1609,13 @@ static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, int x, int y,
void MENU_TrackMouseMenuBar( HWND hwnd, POINT pt ) void MENU_TrackMouseMenuBar( HWND hwnd, POINT pt )
{ {
WND *wndPtr = WIN_FindWndPtr( hwnd ); WND *wndPtr = WIN_FindWndPtr( hwnd );
HideCaret(0);
SendMessage( hwnd, WM_ENTERMENULOOP, 0, 0 ); SendMessage( hwnd, WM_ENTERMENULOOP, 0, 0 );
SendMessage( hwnd, WM_INITMENU, wndPtr->wIDmenu, 0 ); SendMessage( hwnd, WM_INITMENU, wndPtr->wIDmenu, 0 );
MENU_TrackMenu( (HMENU)wndPtr->wIDmenu, TPM_LEFTALIGN | TPM_LEFTBUTTON, MENU_TrackMenu( (HMENU)wndPtr->wIDmenu, TPM_LEFTALIGN | TPM_LEFTBUTTON,
pt.x, pt.y, hwnd, NULL ); pt.x, pt.y, hwnd, NULL );
SendMessage( hwnd, WM_EXITMENULOOP, 0, 0 ); SendMessage( hwnd, WM_EXITMENULOOP, 0, 0 );
ShowCaret(0);
} }
...@@ -1626,6 +1628,7 @@ void MENU_TrackKbdMenuBar( HWND hwnd, UINT wParam ) ...@@ -1626,6 +1628,7 @@ void MENU_TrackKbdMenuBar( HWND hwnd, UINT wParam )
{ {
WND *wndPtr = WIN_FindWndPtr( hwnd ); WND *wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr->wIDmenu) return; if (!wndPtr->wIDmenu) return;
HideCaret(0);
SendMessage( hwnd, WM_ENTERMENULOOP, 0, 0 ); SendMessage( hwnd, WM_ENTERMENULOOP, 0, 0 );
SendMessage( hwnd, WM_INITMENU, wndPtr->wIDmenu, 0 ); SendMessage( hwnd, WM_INITMENU, wndPtr->wIDmenu, 0 );
/* Select first selectable item */ /* Select first selectable item */
...@@ -1634,6 +1637,7 @@ void MENU_TrackKbdMenuBar( HWND hwnd, UINT wParam ) ...@@ -1634,6 +1637,7 @@ void MENU_TrackKbdMenuBar( HWND hwnd, UINT wParam )
MENU_TrackMenu( (HMENU)wndPtr->wIDmenu, TPM_LEFTALIGN | TPM_LEFTBUTTON, MENU_TrackMenu( (HMENU)wndPtr->wIDmenu, TPM_LEFTALIGN | TPM_LEFTBUTTON,
0, 0, hwnd, NULL ); 0, 0, hwnd, NULL );
SendMessage( hwnd, WM_EXITMENULOOP, 0, 0 ); SendMessage( hwnd, WM_EXITMENULOOP, 0, 0 );
ShowCaret(0);
} }
...@@ -1643,8 +1647,14 @@ void MENU_TrackKbdMenuBar( HWND hwnd, UINT wParam ) ...@@ -1643,8 +1647,14 @@ void MENU_TrackKbdMenuBar( HWND hwnd, UINT wParam )
BOOL TrackPopupMenu( HMENU hMenu, UINT wFlags, short x, short y, BOOL TrackPopupMenu( HMENU hMenu, UINT wFlags, short x, short y,
short nReserved, HWND hWnd, LPRECT lpRect ) short nReserved, HWND hWnd, LPRECT lpRect )
{ {
if (!MENU_ShowPopup( hWnd, hMenu, 0, x, y )) return FALSE; BOOL ret;
return MENU_TrackMenu( hMenu, wFlags, 0, 0, hWnd, lpRect ); HideCaret(0);
if (!MENU_ShowPopup( hWnd, hMenu, 0, x, y ))
ret = FALSE;
else
ret = MENU_TrackMenu( hMenu, wFlags, 0, 0, hWnd, lpRect );
ShowCaret(0);
return ret;
} }
......
...@@ -812,7 +812,10 @@ LONG ScrollBarWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam ) ...@@ -812,7 +812,10 @@ LONG ScrollBarWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam )
break; break;
case WM_ERASEBKGND: case WM_ERASEBKGND:
break; return 1;
case WM_GETDLGCODE:
return DLGC_WANTARROWS; /* Windows returns this value */
case WM_PAINT: case WM_PAINT:
{ {
...@@ -823,6 +826,13 @@ LONG ScrollBarWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam ) ...@@ -823,6 +826,13 @@ LONG ScrollBarWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam )
} }
break; break;
case 0x400: /* SB_SETSCROLLPOS */
case 0x401: /* SB_GETSCROLLPOS */
case 0x402: /* SB_GETSCROLLRANGE */
case 0x403: /* SB_ENABLE */
case 0x404: /* SB_REDRAW */
fprintf(stdnimp,"ScrollBarWndProc: undocumented message %04x, please report\n", message );
default: default:
return DefWindowProc( hwnd, message, wParam, lParam ); return DefWindowProc( hwnd, message, wParam, lParam );
} }
......
...@@ -49,14 +49,14 @@ static pfPaint staticPaintFunc[LAST_STATIC_TYPE+1] = ...@@ -49,14 +49,14 @@ static pfPaint staticPaintFunc[LAST_STATIC_TYPE+1] =
* *
* Set the icon for an SS_ICON control. * Set the icon for an SS_ICON control.
*/ */
static void STATIC_SetIcon( HWND hwnd, HICON hicon ) static HICON STATIC_SetIcon( HWND hwnd, HICON hicon )
{ {
HICON prevIcon;
WND *wndPtr = WIN_FindWndPtr( hwnd ); WND *wndPtr = WIN_FindWndPtr( hwnd );
STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra; STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
if ((wndPtr->dwStyle & 0x0f) != SS_ICON) return; if ((wndPtr->dwStyle & 0x0f) != SS_ICON) return 0;
/* FIXME: is this OK? prevIcon = infoPtr->hIcon;
if (infoPtr->hIcon) DestroyIcon( infoPtr->hIcon ); */
infoPtr->hIcon = hicon; infoPtr->hIcon = hicon;
if (hicon) if (hicon)
{ {
...@@ -65,6 +65,7 @@ static void STATIC_SetIcon( HWND hwnd, HICON hicon ) ...@@ -65,6 +65,7 @@ static void STATIC_SetIcon( HWND hwnd, HICON hicon )
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER ); SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER );
GlobalUnlock( hicon ); GlobalUnlock( hicon );
} }
return prevIcon;
} }
...@@ -114,7 +115,7 @@ LONG StaticWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ...@@ -114,7 +115,7 @@ LONG StaticWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_NCDESTROY: case WM_NCDESTROY:
if (style == SS_ICON) if (style == SS_ICON)
STATIC_SetIcon( hWnd, 0 ); /* Destroy the current icon */ DestroyIcon( STATIC_SetIcon( hWnd, 0 ) );
else else
lResult = DefWindowProc(hWnd, uMsg, wParam, lParam); lResult = DefWindowProc(hWnd, uMsg, wParam, lParam);
break; break;
...@@ -138,6 +139,7 @@ LONG StaticWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ...@@ -138,6 +139,7 @@ LONG StaticWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_SETTEXT: case WM_SETTEXT:
if (style == SS_ICON) if (style == SS_ICON)
/* FIXME : should we also return the previous hIcon here ??? */
STATIC_SetIcon( hWnd, LoadIcon( wndPtr->hInstance, STATIC_SetIcon( hWnd, LoadIcon( wndPtr->hInstance,
(SEGPTR)lParam )); (SEGPTR)lParam ));
else else
...@@ -169,10 +171,10 @@ LONG StaticWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ...@@ -169,10 +171,10 @@ LONG StaticWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return (LONG)infoPtr->hIcon; return (LONG)infoPtr->hIcon;
case STM_SETICON: case STM_SETICON:
STATIC_SetIcon( hWnd, (HICON)wParam ); lResult = (LONG)STATIC_SetIcon( hWnd, (HICON)wParam );
InvalidateRect( hWnd, NULL, FALSE ); InvalidateRect( hWnd, NULL, FALSE );
UpdateWindow( hWnd ); UpdateWindow( hWnd );
return 0; break;
default: default:
lResult = DefWindowProc(hWnd, uMsg, wParam, lParam); lResult = DefWindowProc(hWnd, uMsg, wParam, lParam);
......
...@@ -110,12 +110,12 @@ static void PROFILE_Save( FILE *file, PROFILESECTION *section ) ...@@ -110,12 +110,12 @@ static void PROFILE_Save( FILE *file, PROFILESECTION *section )
for ( ; section; section = section->next) for ( ; section; section = section->next)
{ {
if (section->name) fprintf( file, "[%s]\n", section->name ); if (section->name) fprintf( file, "[%s]\r\n", section->name );
for (key = section->key; key; key = key->next) for (key = section->key; key; key = key->next)
{ {
fprintf( file, "%s", key->name ); fprintf( file, "%s", key->name );
if (key->value) fprintf( file, "=%s", key->value ); if (key->value) fprintf( file, "=%s", key->value );
fprintf( file, "\n" ); fprintf( file, "\r\n" );
} }
} }
} }
......
...@@ -215,7 +215,7 @@ id 3 ...@@ -215,7 +215,7 @@ id 3
304 stub ENGINESETFONTCONTEXT 304 stub ENGINESETFONTCONTEXT
305 stub ENGINEGETGLYPHBMP 305 stub ENGINEGETGLYPHBMP
306 stub ENGINEMAKEFONTDIR 306 stub ENGINEMAKEFONTDIR
307 stub GetCharABCWidths 307 pascal16 GetCharABCWidths(word word word ptr) GetCharABCWidths
308 stub GetOutLineTextMetrics 308 stub GetOutLineTextMetrics
309 pascal GetGlyphOutLine(word word word ptr long ptr ptr) GetGlyphOutLine 309 pascal GetGlyphOutLine(word word word ptr long ptr ptr) GetGlyphOutLine
310 pascal16 CreateScalableFontResource(word ptr ptr ptr) CreateScalableFontResource 310 pascal16 CreateScalableFontResource(word ptr ptr ptr) CreateScalableFontResource
......
...@@ -233,7 +233,7 @@ base 1 ...@@ -233,7 +233,7 @@ base 1
0229 stub GetTextExtentExPointW 0229 stub GetTextExtentExPointW
0230 stub GetTextExtentPoint32A 0230 stub GetTextExtentPoint32A
0231 stub GetTextExtentPoint32W 0231 stub GetTextExtentPoint32W
0232 stdcall GetTextExtentPointA(long ptr long ptr) GetTextExtentPoint 0232 stdcall GetTextExtentPointA(long ptr long ptr) WIN32_GetTextExtentPointA
0233 stub GetTextExtentPointW 0233 stub GetTextExtentPointW
0234 stub GetTextFaceA 0234 stub GetTextFaceA
0235 stub GetTextFaceW 0235 stub GetTextFaceW
......
...@@ -20,6 +20,13 @@ typedef enum ...@@ -20,6 +20,13 @@ typedef enum
LANG_Cz /* Czech */ LANG_Cz /* Czech */
} WINE_LANGUAGE; } WINE_LANGUAGE;
/* Supported modes */
typedef enum
{
MODE_STANDARD,
MODE_ENHANCED
} WINE_MODE;
struct options struct options
{ {
char * desktopGeometry; /* NULL when no desktop */ char * desktopGeometry; /* NULL when no desktop */
...@@ -32,7 +39,8 @@ struct options ...@@ -32,7 +39,8 @@ struct options
int debug; int debug;
int allowReadOnly; /* Opening a read only file will succeed even int allowReadOnly; /* Opening a read only file will succeed even
if write access is requested */ if write access is requested */
int enhanced; /* Start Wine in enhanced mode */ WINE_MODE mode; /* Start Wine in selected mode
(standard/enhanced) */
int ipc; /* Use IPC mechanisms */ int ipc; /* Use IPC mechanisms */
WINE_LANGUAGE language; /* Current language */ WINE_LANGUAGE language; /* Current language */
int managed; /* Managed windows */ int managed; /* Managed windows */
......
...@@ -19,8 +19,15 @@ typedef struct tagPOINT32 ...@@ -19,8 +19,15 @@ typedef struct tagPOINT32
LONG y; LONG y;
} POINT32; } POINT32;
typedef struct tagSIZE32
{
LONG cx;
LONG cy;
} SIZE32;
void PARAM32_POINT32to16(const POINT32*,POINT*); void PARAM32_POINT32to16(const POINT32*,POINT*);
void PARAM32_POINT16to32(const POINT*,POINT32*); void PARAM32_POINT16to32(const POINT*,POINT32*);
void PARAM32_SIZE16to32(const SIZE* p16, SIZE32* p32);
typedef struct { typedef struct {
DWORD style; DWORD style;
......
...@@ -240,7 +240,7 @@ typedef struct tagTIMERINFO { ...@@ -240,7 +240,7 @@ typedef struct tagTIMERINFO {
DWORD dwmsThisVM; DWORD dwmsThisVM;
} TIMERINFO; } TIMERINFO;
BOOL TimerInfo( TIMERINFO *pTimerInfo ); BOOL TimerCount( TIMERINFO *pTimerInfo );
/* Window classes */ /* Window classes */
......
...@@ -689,6 +689,14 @@ typedef struct tagTEXTMETRIC ...@@ -689,6 +689,14 @@ typedef struct tagTEXTMETRIC
#define ETO_OPAQUE 0x02 #define ETO_OPAQUE 0x02
#define ETO_CLIPPED 0x04 #define ETO_CLIPPED 0x04
/* for GetCharABCWidths() */
typedef struct tagABC
{
INT abcA;
UINT abcB;
INT abcC;
} ABC, *LPABC;
/* Rasterizer status */ /* Rasterizer status */
typedef struct typedef struct
{ {
...@@ -1999,6 +2007,8 @@ typedef struct tagDRAGINFO { ...@@ -1999,6 +2007,8 @@ typedef struct tagDRAGINFO {
#define LB_GETITEMDATA (WM_USER+26) #define LB_GETITEMDATA (WM_USER+26)
#define LB_SETITEMDATA (WM_USER+27) #define LB_SETITEMDATA (WM_USER+27)
#define LB_SELITEMRANGE (WM_USER+28) #define LB_SELITEMRANGE (WM_USER+28)
#define LB_SETANCHORINDEX (WM_USER+29) /* undoc. - for LBS_EXTENDEDSEL */
#define LB_GETANCHORINDEX (WM_USER+30) /* - * - */
#define LB_SETCARETINDEX (WM_USER+31) #define LB_SETCARETINDEX (WM_USER+31)
#define LB_GETCARETINDEX (WM_USER+32) #define LB_GETCARETINDEX (WM_USER+32)
#define LB_SETITEMHEIGHT (WM_USER+33) #define LB_SETITEMHEIGHT (WM_USER+33)
...@@ -2794,6 +2804,7 @@ BOOL GetBrushOrgEx(HDC,LPPOINT); ...@@ -2794,6 +2804,7 @@ BOOL GetBrushOrgEx(HDC,LPPOINT);
HWND GetCapture(void); HWND GetCapture(void);
WORD GetCaretBlinkTime(void); WORD GetCaretBlinkTime(void);
void GetCaretPos(LPPOINT); void GetCaretPos(LPPOINT);
BOOL GetCharABCWidths(HDC,UINT,UINT,LPABC);
BOOL GetCharWidth(HDC,WORD,WORD,LPINT); BOOL GetCharWidth(HDC,WORD,WORD,LPINT);
BOOL GetClassInfo(HANDLE,SEGPTR,LPWNDCLASS); BOOL GetClassInfo(HANDLE,SEGPTR,LPWNDCLASS);
LONG GetClassLong(HWND,short); LONG GetClassLong(HWND,short);
......
...@@ -7,12 +7,12 @@ ...@@ -7,12 +7,12 @@
#ifndef _WINSOCKAPI_ #ifndef _WINSOCKAPI_
#define _WINSOCKAPI_ #define _WINSOCKAPI_
#include <netinet/in.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/time.h> #include <sys/time.h>
#include <fcntl.h> #include <fcntl.h>
#include <netdb.h> #include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h> #include <sys/socket.h>
#include "windows.h" #include "windows.h"
......
...@@ -35,7 +35,7 @@ rolex: rolex.o $(WINELIB) ...@@ -35,7 +35,7 @@ rolex: rolex.o $(WINELIB)
$(CC) -o rolex rolex.o $(LDOPTIONS) $(ALL_LIBS) $(CC) -o rolex rolex.o $(LDOPTIONS) $(ALL_LIBS)
clean:: clean::
$(RM) hello hello2 hello3 hello3res.c hello3res.h hello4 new rolex $(RM) $(PROGRAMS) hello3res.c hello3res.h
hello3res.c hello3res.h: $(WINERC) hello3res.c hello3res.h: $(WINERC)
......
...@@ -333,7 +333,7 @@ HGLOBAL GlobalReAlloc( HGLOBAL handle, DWORD size, WORD flags ) ...@@ -333,7 +333,7 @@ HGLOBAL GlobalReAlloc( HGLOBAL handle, DWORD size, WORD flags )
ptr = (void *)pArena->base; ptr = (void *)pArena->base;
oldsize = pArena->size; oldsize = pArena->size;
dprintf_global(stddeb,"oldsize %08lx\n",oldsize); dprintf_global(stddeb,"oldsize %08lx\n",oldsize);
if (size == oldsize) return handle; /* Nothing to do */ if (ptr && (size == oldsize)) return handle; /* Nothing to do */
ptr = realloc( ptr, size ); ptr = realloc( ptr, size );
if (!ptr) if (!ptr)
......
...@@ -105,8 +105,8 @@ static void SELECTOR_SetEntries( WORD sel, const void *base, DWORD size, ...@@ -105,8 +105,8 @@ static void SELECTOR_SetEntries( WORD sel, const void *base, DWORD size,
ldt_entry entry; ldt_entry entry;
WORD i, count; WORD i, count;
/* The limit for the first selector is the whole */ /* The limit for the first selector is the whole */
/* block. The next selectors get a 64k limit. */ /* block. The next selectors get a 64k limit. */
entry.base = (unsigned long)base; entry.base = (unsigned long)base;
entry.type = type; entry.type = type;
entry.seg_32bit = is32bit; entry.seg_32bit = is32bit;
...@@ -114,6 +114,8 @@ static void SELECTOR_SetEntries( WORD sel, const void *base, DWORD size, ...@@ -114,6 +114,8 @@ static void SELECTOR_SetEntries( WORD sel, const void *base, DWORD size,
entry.limit_in_pages = (size > 0x100000); entry.limit_in_pages = (size > 0x100000);
if (entry.limit_in_pages) entry.limit = ((size + 0xfff) >> 12) - 1; if (entry.limit_in_pages) entry.limit = ((size + 0xfff) >> 12) - 1;
else entry.limit = size - 1; else entry.limit = size - 1;
/* Make sure base and limit are not 0 together if the size is not 0 */
if (!base && !entry.limit && size) entry.limit = 1;
count = (size + 0xffff) / 0x10000; count = (size + 0xffff) / 0x10000;
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
{ {
......
...@@ -669,12 +669,23 @@ BOOL FindText(LPFINDREPLACE lpFind) ...@@ -669,12 +669,23 @@ BOOL FindText(LPFINDREPLACE lpFind)
{ {
HANDLE hInst, hDlgTmpl; HANDLE hInst, hDlgTmpl;
BOOL bRet; BOOL bRet;
SEGPTR ptr;
/*
* FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here
* For now, only the standard dialog works.
*/
/*
* FIXME : We should do error checking on the lpFind structure here
* and make CommDlgExtendedError() return the error condition.
*/
hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_FIND_TEXT ); hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_FIND_TEXT );
hInst = WIN_GetWindowInstance( lpFind->hwndOwner ); hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
bRet = DialogBoxIndirectParam( hInst, hDlgTmpl, lpFind->hwndOwner, if (!(ptr = (SEGPTR)WIN16_GlobalLock( hDlgTmpl ))) return -1;
GetWndProcEntry16("FindTextDlgProc"), bRet = CreateDialogIndirectParam( hInst, ptr, lpFind->hwndOwner,
(DWORD)lpFind ); GetWndProcEntry16("FindTextDlgProc"),
(DWORD)lpFind );
GlobalUnlock( hDlgTmpl );
SYSRES_FreeResource( hDlgTmpl ); SYSRES_FreeResource( hDlgTmpl );
return bRet; return bRet;
} }
...@@ -687,42 +698,228 @@ BOOL ReplaceText(LPFINDREPLACE lpFind) ...@@ -687,42 +698,228 @@ BOOL ReplaceText(LPFINDREPLACE lpFind)
{ {
HANDLE hInst, hDlgTmpl; HANDLE hInst, hDlgTmpl;
BOOL bRet; BOOL bRet;
SEGPTR ptr;
/*
* FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here
* For now, only the standard dialog works.
*/
/*
* FIXME : We should do error checking on the lpFind structure here
* and make CommDlgExtendedError() return the error condition.
*/
hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_REPLACE_TEXT ); hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_REPLACE_TEXT );
hInst = WIN_GetWindowInstance( lpFind->hwndOwner ); hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
bRet = DialogBoxIndirectParam( hInst, hDlgTmpl, lpFind->hwndOwner, if (!(ptr = (SEGPTR)WIN16_GlobalLock( hDlgTmpl ))) return -1;
GetWndProcEntry16("ReplaceTextDlgProc"), bRet = CreateDialogIndirectParam( hInst, ptr, lpFind->hwndOwner,
(DWORD)lpFind ); GetWndProcEntry16("ReplaceTextDlgProc"),
(DWORD)lpFind );
GlobalUnlock( hDlgTmpl );
SYSRES_FreeResource( hDlgTmpl ); SYSRES_FreeResource( hDlgTmpl );
return bRet; return bRet;
} }
/*********************************************************************** /***********************************************************************
* FINDDLG_WMInitDialog [internal]
*/
static LRESULT FINDDLG_WMInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
LPFINDREPLACE lpfr;
SetWindowLong(hWnd, DWL_USER, lParam);
lpfr = (LPFINDREPLACE)lParam;
lpfr->Flags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL | FR_DIALOGTERM);
/*
* FIXME : If the initial FindWhat string is empty, we should disable the
* FindNext (IDOK) button. Only after typing some text, the button should be
* enabled.
*/
SetDlgItemText(hWnd, edt1, lpfr->lpstrFindWhat);
CheckRadioButton(hWnd, rad1, rad2, (lpfr->Flags & FR_DOWN) ? rad2 : rad1);
if (lpfr->Flags & (FR_HIDEUPDOWN | FR_NOUPDOWN)) {
EnableWindow(GetDlgItem(hWnd, rad1), FALSE);
EnableWindow(GetDlgItem(hWnd, rad2), FALSE);
}
if (lpfr->Flags & FR_HIDEUPDOWN) {
ShowWindow(GetDlgItem(hWnd, rad1), SW_HIDE);
ShowWindow(GetDlgItem(hWnd, rad2), SW_HIDE);
ShowWindow(GetDlgItem(hWnd, grp1), SW_HIDE);
}
CheckDlgButton(hWnd, chx1, (lpfr->Flags & FR_WHOLEWORD) ? 1 : 0);
if (lpfr->Flags & (FR_HIDEWHOLEWORD | FR_NOWHOLEWORD))
EnableWindow(GetDlgItem(hWnd, chx1), FALSE);
if (lpfr->Flags & FR_HIDEWHOLEWORD)
ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE);
CheckDlgButton(hWnd, chx2, (lpfr->Flags & FR_MATCHCASE) ? 1 : 0);
if (lpfr->Flags & (FR_HIDEMATCHCASE | FR_NOMATCHCASE))
EnableWindow(GetDlgItem(hWnd, chx2), FALSE);
if (lpfr->Flags & FR_HIDEMATCHCASE)
ShowWindow(GetDlgItem(hWnd, chx2), SW_HIDE);
if (!(lpfr->Flags & FR_SHOWHELP)) {
EnableWindow(GetDlgItem(hWnd, pshHelp), FALSE);
ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE);
}
ShowWindow(hWnd, SW_SHOWNORMAL);
return TRUE;
}
/***********************************************************************
* FINDDLG_WMCommand [internal]
*/
static LRESULT FINDDLG_WMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
LPFINDREPLACE lpfr;
int uFindReplaceMessage = RegisterWindowMessage(MAKE_SEGPTR(FINDMSGSTRING));
int uHelpMessage = RegisterWindowMessage(MAKE_SEGPTR(HELPMSGSTRING));
lpfr = (LPFINDREPLACE)GetWindowLong(hWnd, DWL_USER);
switch (wParam) {
case IDOK:
GetDlgItemText(hWnd, edt1, lpfr->lpstrFindWhat, lpfr->wFindWhatLen);
if (IsDlgButtonChecked(hWnd, rad2))
lpfr->Flags |= FR_DOWN;
else lpfr->Flags &= ~FR_DOWN;
if (IsDlgButtonChecked(hWnd, chx1))
lpfr->Flags |= FR_WHOLEWORD;
else lpfr->Flags &= ~FR_WHOLEWORD;
if (IsDlgButtonChecked(hWnd, chx2))
lpfr->Flags |= FR_MATCHCASE;
else lpfr->Flags &= ~FR_MATCHCASE;
lpfr->Flags &= ~(FR_REPLACE | FR_REPLACEALL | FR_DIALOGTERM);
lpfr->Flags |= FR_FINDNEXT;
SendMessage(lpfr->hwndOwner, uFindReplaceMessage, 0, (LPARAM)MAKE_SEGPTR(lpfr));
return TRUE;
case IDCANCEL:
lpfr->Flags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL);
lpfr->Flags |= FR_DIALOGTERM;
SendMessage(lpfr->hwndOwner, uFindReplaceMessage, 0, (LPARAM)MAKE_SEGPTR(lpfr));
DestroyWindow(hWnd);
return TRUE;
case pshHelp:
/* FIXME : should lpfr structure be passed as an argument ??? */
SendMessage(lpfr->hwndOwner, uHelpMessage, 0, 0);
return TRUE;
}
return FALSE;
}
/***********************************************************************
* FindTextDlgProc (COMMDLG.13) * FindTextDlgProc (COMMDLG.13)
*/ */
LRESULT FindTextDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam) LRESULT FindTextDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{ {
switch (wMsg) switch (wMsg) {
{ case WM_INITDIALOG:
case WM_INITDIALOG: return FINDDLG_WMInitDialog(hWnd, wParam, lParam);
dprintf_commdlg(stddeb,"FindTextDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam); case WM_COMMAND:
ShowWindow(hWnd, SW_SHOWNORMAL); return FINDDLG_WMCommand(hWnd, wParam, lParam);
return (TRUE); }
case WM_COMMAND: return FALSE;
switch (wParam) }
{
/***********************************************************************
* REPLACEDLG_WMInitDialog [internal]
*/
static LRESULT REPLACEDLG_WMInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
LPFINDREPLACE lpfr;
SetWindowLong(hWnd, DWL_USER, lParam);
lpfr = (LPFINDREPLACE)lParam;
lpfr->Flags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL | FR_DIALOGTERM);
/*
* FIXME : If the initial FindWhat string is empty, we should disable the FinNext /
* Replace / ReplaceAll buttons. Only after typing some text, the buttons should be
* enabled.
*/
SetDlgItemText(hWnd, edt1, lpfr->lpstrFindWhat);
SetDlgItemText(hWnd, edt2, lpfr->lpstrReplaceWith);
CheckDlgButton(hWnd, chx1, (lpfr->Flags & FR_WHOLEWORD) ? 1 : 0);
if (lpfr->Flags & (FR_HIDEWHOLEWORD | FR_NOWHOLEWORD))
EnableWindow(GetDlgItem(hWnd, chx1), FALSE);
if (lpfr->Flags & FR_HIDEWHOLEWORD)
ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE);
CheckDlgButton(hWnd, chx2, (lpfr->Flags & FR_MATCHCASE) ? 1 : 0);
if (lpfr->Flags & (FR_HIDEMATCHCASE | FR_NOMATCHCASE))
EnableWindow(GetDlgItem(hWnd, chx2), FALSE);
if (lpfr->Flags & FR_HIDEMATCHCASE)
ShowWindow(GetDlgItem(hWnd, chx2), SW_HIDE);
if (!(lpfr->Flags & FR_SHOWHELP)) {
EnableWindow(GetDlgItem(hWnd, pshHelp), FALSE);
ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE);
}
ShowWindow(hWnd, SW_SHOWNORMAL);
return TRUE;
}
/***********************************************************************
* REPLACEDLG_WMCommand [internal]
*/
static LRESULT REPLACEDLG_WMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
LPFINDREPLACE lpfr;
int uFindReplaceMessage = RegisterWindowMessage(MAKE_SEGPTR(FINDMSGSTRING));
int uHelpMessage = RegisterWindowMessage(MAKE_SEGPTR(HELPMSGSTRING));
lpfr = (LPFINDREPLACE)GetWindowLong(hWnd, DWL_USER);
switch (wParam) {
case IDOK: case IDOK:
EndDialog(hWnd, TRUE); GetDlgItemText(hWnd, edt1, lpfr->lpstrFindWhat, lpfr->wFindWhatLen);
return(TRUE); GetDlgItemText(hWnd, edt2, lpfr->lpstrReplaceWith, lpfr->wReplaceWithLen);
if (IsDlgButtonChecked(hWnd, chx1))
lpfr->Flags |= FR_WHOLEWORD;
else lpfr->Flags &= ~FR_WHOLEWORD;
if (IsDlgButtonChecked(hWnd, chx2))
lpfr->Flags |= FR_MATCHCASE;
else lpfr->Flags &= ~FR_MATCHCASE;
lpfr->Flags &= ~(FR_REPLACE | FR_REPLACEALL | FR_DIALOGTERM);
lpfr->Flags |= FR_FINDNEXT;
SendMessage(lpfr->hwndOwner, uFindReplaceMessage, 0, (LPARAM)MAKE_SEGPTR(lpfr));
return TRUE;
case IDCANCEL: case IDCANCEL:
EndDialog(hWnd, FALSE); lpfr->Flags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL);
return(TRUE); lpfr->Flags |= FR_DIALOGTERM;
} SendMessage(lpfr->hwndOwner, uFindReplaceMessage, 0, (LPARAM)MAKE_SEGPTR(lpfr));
return(FALSE); DestroyWindow(hWnd);
return TRUE;
case psh1:
GetDlgItemText(hWnd, edt1, lpfr->lpstrFindWhat, lpfr->wFindWhatLen);
GetDlgItemText(hWnd, edt2, lpfr->lpstrReplaceWith, lpfr->wReplaceWithLen);
if (IsDlgButtonChecked(hWnd, chx1))
lpfr->Flags |= FR_WHOLEWORD;
else lpfr->Flags &= ~FR_WHOLEWORD;
if (IsDlgButtonChecked(hWnd, chx2))
lpfr->Flags |= FR_MATCHCASE;
else lpfr->Flags &= ~FR_MATCHCASE;
lpfr->Flags &= ~(FR_FINDNEXT | FR_REPLACEALL | FR_DIALOGTERM);
lpfr->Flags |= FR_REPLACE;
SendMessage(lpfr->hwndOwner, uFindReplaceMessage, 0, (LPARAM)MAKE_SEGPTR(lpfr));
return TRUE;
case psh2:
GetDlgItemText(hWnd, edt1, lpfr->lpstrFindWhat, lpfr->wFindWhatLen);
GetDlgItemText(hWnd, edt2, lpfr->lpstrReplaceWith, lpfr->wReplaceWithLen);
if (IsDlgButtonChecked(hWnd, chx1))
lpfr->Flags |= FR_WHOLEWORD;
else lpfr->Flags &= ~FR_WHOLEWORD;
if (IsDlgButtonChecked(hWnd, chx2))
lpfr->Flags |= FR_MATCHCASE;
else lpfr->Flags &= ~FR_MATCHCASE;
lpfr->Flags &= ~(FR_FINDNEXT | FR_REPLACE | FR_DIALOGTERM);
lpfr->Flags |= FR_REPLACEALL;
SendMessage(lpfr->hwndOwner, uFindReplaceMessage, 0, (LPARAM)MAKE_SEGPTR(lpfr));
return TRUE;
case pshHelp:
/* FIXME : should lpfr structure be passed as an argument ??? */
SendMessage(lpfr->hwndOwner, uHelpMessage, 0, 0);
return TRUE;
} }
return FALSE; return FALSE;
} }
/*********************************************************************** /***********************************************************************
...@@ -730,25 +927,13 @@ LRESULT FindTextDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam) ...@@ -730,25 +927,13 @@ LRESULT FindTextDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
*/ */
LRESULT ReplaceTextDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam) LRESULT ReplaceTextDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{ {
switch (wMsg) switch (wMsg) {
{ case WM_INITDIALOG:
case WM_INITDIALOG: return REPLACEDLG_WMInitDialog(hWnd, wParam, lParam);
dprintf_commdlg(stddeb,"ReplaceTextDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam); case WM_COMMAND:
ShowWindow(hWnd, SW_SHOWNORMAL); return REPLACEDLG_WMCommand(hWnd, wParam, lParam);
return (TRUE);
case WM_COMMAND:
switch (wParam)
{
case IDOK:
EndDialog(hWnd, TRUE);
return(TRUE);
case IDCANCEL:
EndDialog(hWnd, FALSE);
return(TRUE);
}
return(FALSE);
} }
return FALSE; return FALSE;
} }
......
...@@ -89,7 +89,7 @@ struct options Options = ...@@ -89,7 +89,7 @@ struct options Options =
SW_SHOWNORMAL, /* cmdShow */ SW_SHOWNORMAL, /* cmdShow */
FALSE, FALSE,
FALSE, /* AllowReadOnly */ FALSE, /* AllowReadOnly */
FALSE, /* Enhanced mode */ MODE_ENHANCED, /* Enhanced mode */
FALSE, /* IPC enabled */ FALSE, /* IPC enabled */
#ifdef DEFAULT_LANG #ifdef DEFAULT_LANG
DEFAULT_LANG, /* Default language */ DEFAULT_LANG, /* Default language */
...@@ -117,7 +117,7 @@ static XrmOptionDescRec optionsTable[] = ...@@ -117,7 +117,7 @@ static XrmOptionDescRec optionsTable[] =
{ "-debugmsg", ".debugmsg", XrmoptionSepArg, (caddr_t)NULL }, { "-debugmsg", ".debugmsg", XrmoptionSepArg, (caddr_t)NULL },
{ "-dll", ".dll", XrmoptionSepArg, (caddr_t)NULL }, { "-dll", ".dll", XrmoptionSepArg, (caddr_t)NULL },
{ "-allowreadonly", ".allowreadonly", XrmoptionNoArg, (caddr_t)"on" }, { "-allowreadonly", ".allowreadonly", XrmoptionNoArg, (caddr_t)"on" },
{ "-enhanced", ".enhanced", XrmoptionNoArg, (caddr_t)"off"}, { "-mode", ".mode", XrmoptionSepArg, (caddr_t)NULL },
{ "-managed", ".managed", XrmoptionNoArg, (caddr_t)"off"} { "-managed", ".managed", XrmoptionNoArg, (caddr_t)"off"}
}; };
...@@ -127,24 +127,23 @@ static XrmOptionDescRec optionsTable[] = ...@@ -127,24 +127,23 @@ static XrmOptionDescRec optionsTable[] =
"Usage: %s [options] program_name [arguments]\n" \ "Usage: %s [options] program_name [arguments]\n" \
"\n" \ "\n" \
"Options:\n" \ "Options:\n" \
" -allowreadonly Read only files may be opened in write mode\n" \
" -backingstore Turn on backing store\n" \
" -debug Enter debugger before starting application\n" \
" -debugmsg name Turn debugging-messages on or off\n" \
" -depth n Change the depth to use for multiple-depth screens\n" \ " -depth n Change the depth to use for multiple-depth screens\n" \
" -desktop geom Use a desktop window of the given geometry\n" \ " -desktop geom Use a desktop window of the given geometry\n" \
" -display name Use the specified display\n" \ " -display name Use the specified display\n" \
" -dll name Enable or disable built-in DLLs\n" \
" -fixedmap Use a \"standard\" color map\n" \
" -iconic Start as an icon\n" \ " -iconic Start as an icon\n" \
" -ipc Enable IPC facilities\n" \ " -ipc Enable IPC facilities\n" \
" -debug Enter debugger before starting application\n" \
" -language xx Set the language (one of En,Es,De,No,Fr,Fi,Da,Cz)\n" \ " -language xx Set the language (one of En,Es,De,No,Fr,Fi,Da,Cz)\n" \
" -managed Allow the window manager to manage created windows\n" \ " -managed Allow the window manager to manage created windows\n" \
" -mode mode Start Wine in a particular mode (standard or enhanced)\n" \
" -name name Set the application name\n" \ " -name name Set the application name\n" \
" -privatemap Use a private color map\n" \ " -privatemap Use a private color map\n" \
" -fixedmap Use a \"standard\" color map\n" \ " -synchronous Turn on synchronous display mode\n"
" -synchronous Turn on synchronous display mode\n" \
" -backingstore Turn on backing store\n" \
" -spy file Obsolete. Use -debugmsg +message for messages\n" \
" -debugmsg name Turn debugging-messages on or off\n" \
" -dll name Enable or disable built-in DLLs\n" \
" -allowreadonly Read only files may be opened in write mode\n" \
" -enhanced Start wine in enhanced mode (like 'win /3') \n"
...@@ -319,6 +318,24 @@ static void MAIN_ParseLanguageOption( char *arg ) ...@@ -319,6 +318,24 @@ static void MAIN_ParseLanguageOption( char *arg )
/*********************************************************************** /***********************************************************************
* MAIN_ParseModeOption
*
* Parse -mode option.
*/
static void MAIN_ParseModeOption( char *arg )
{
if (!lstrcmpi("enhanced", arg)) Options.mode = MODE_ENHANCED;
else if (!lstrcmpi("standard", arg)) Options.mode = MODE_STANDARD;
else
{
fprintf(stderr, "Invalid mode '%s' specified.\n", arg);
fprintf(stderr, "Valid modes are: 'standard', 'enhanced' (default).\n");
exit(1);
}
}
/***********************************************************************
* MAIN_ParseOptions * MAIN_ParseOptions
* *
* Parse command line options and open display. * Parse command line options and open display.
...@@ -368,8 +385,6 @@ static void MAIN_ParseOptions( int *argc, char *argv[] ) ...@@ -368,8 +385,6 @@ static void MAIN_ParseOptions( int *argc, char *argv[] )
Options.debug = TRUE; Options.debug = TRUE;
if (MAIN_GetResource( db, ".allowreadonly", &value )) if (MAIN_GetResource( db, ".allowreadonly", &value ))
Options.allowReadOnly = TRUE; Options.allowReadOnly = TRUE;
if (MAIN_GetResource( db, ".enhanced", &value ))
Options.enhanced = TRUE;
if (MAIN_GetResource( db, ".ipc", &value )) if (MAIN_GetResource( db, ".ipc", &value ))
Options.ipc = TRUE; Options.ipc = TRUE;
if (MAIN_GetResource( db, ".depth", &value)) if (MAIN_GetResource( db, ".depth", &value))
...@@ -380,6 +395,9 @@ static void MAIN_ParseOptions( int *argc, char *argv[] ) ...@@ -380,6 +395,9 @@ static void MAIN_ParseOptions( int *argc, char *argv[] )
MAIN_ParseLanguageOption( (char *)value.addr ); MAIN_ParseLanguageOption( (char *)value.addr );
if (MAIN_GetResource( db, ".managed", &value)) if (MAIN_GetResource( db, ".managed", &value))
Options.managed = TRUE; Options.managed = TRUE;
if (MAIN_GetResource( db, ".mode", &value))
MAIN_ParseModeOption( (char *)value.addr );
#ifdef DEBUG_RUNTIME #ifdef DEBUG_RUNTIME
if (MAIN_GetResource( db, ".debugoptions", &value)) if (MAIN_GetResource( db, ".debugoptions", &value))
ParseDebugOptions((char*)value.addr); ParseDebugOptions((char*)value.addr);
...@@ -629,6 +647,8 @@ LONG GetWinFlags(void) ...@@ -629,6 +647,8 @@ LONG GetWinFlags(void)
static const long cpuflags[5] = static const long cpuflags[5] =
{ WF_CPU086, WF_CPU186, WF_CPU286, WF_CPU386, WF_CPU486 }; { WF_CPU086, WF_CPU186, WF_CPU286, WF_CPU386, WF_CPU486 };
long result = 0;
/* There doesn't seem to be any Pentium flag. */ /* There doesn't seem to be any Pentium flag. */
#ifndef WINELIB #ifndef WINELIB
long cpuflag = cpuflags[MIN (runtime_cpu (), 4)]; long cpuflag = cpuflags[MIN (runtime_cpu (), 4)];
...@@ -636,10 +656,21 @@ LONG GetWinFlags(void) ...@@ -636,10 +656,21 @@ LONG GetWinFlags(void)
long cpuflag = cpuflags[4]; long cpuflag = cpuflags[4];
#endif #endif
if (Options.enhanced) switch(Options.mode) {
return (WF_ENHANCED | cpuflag | WF_PMODE | WF_80x87 | WF_PAGING); case MODE_STANDARD:
else result = (WF_STANDARD | cpuflag | WF_PMODE | WF_80x87);
return (WF_STANDARD | cpuflag | WF_PMODE | WF_80x87); break;
case MODE_ENHANCED:
result = (WF_ENHANCED | cpuflag | WF_PMODE | WF_80x87 | WF_PAGING);
break;
default:
fprintf(stderr, "Unknown mode set? This shouldn't happen. Check GetWinFlags()!\n");
break;
}
return result;
} }
/*********************************************************************** /***********************************************************************
......
...@@ -71,13 +71,13 @@ static void do_int2f_16(struct sigcontext_struct *context) ...@@ -71,13 +71,13 @@ static void do_int2f_16(struct sigcontext_struct *context)
switch(AL_reg(context)) switch(AL_reg(context))
{ {
case 0x00: /* Windows enhanced mode installation check */ case 0x00: /* Windows enhanced mode installation check */
AX_reg(context) = Options.enhanced ? WINVERSION : 0; AX_reg(context) = (Options.mode == MODE_ENHANCED) ? WINVERSION : 0;
break; break;
case 0x0a: /* Get Windows version and type */ case 0x0a: /* Get Windows version and type */
AX_reg(context) = 0; AX_reg(context) = 0;
BX_reg(context) = (WINVERSION >> 8) | ((WINVERSION << 8) & 0xff00); BX_reg(context) = (WINVERSION >> 8) | ((WINVERSION << 8) & 0xff00);
CX_reg(context) = Options.enhanced ? 3 : 2; CX_reg(context) = (Options.mode == MODE_ENHANCED) ? 3 : 2;
break; break;
case 0x80: /* Release time-slice */ case 0x80: /* Release time-slice */
......
...@@ -594,7 +594,14 @@ DWORD SetMapperFlags(HDC hDC, DWORD dwFlag) ...@@ -594,7 +594,14 @@ DWORD SetMapperFlags(HDC hDC, DWORD dwFlag)
} }
/***********************************************************************/ /***********************************************************************
* GetCharABCWidths (GDI.307)
*/
BOOL GetCharABCWidths(HDC hdc, UINT wFirstChar, UINT wLastChar, LPABC lpABC)
{
/* No TrueType fonts in Wine */
return FALSE;
}
/*********************************************************************** /***********************************************************************
......
...@@ -117,12 +117,7 @@ HANDLE CreateMetaFile(LPCTSTR lpFilename) ...@@ -117,12 +117,7 @@ HANDLE CreateMetaFile(LPCTSTR lpFilename)
{ {
mh->mtType = 1; mh->mtType = 1;
strcpy(mf->Filename, lpFilename); strcpy(mf->Filename, lpFilename);
#ifndef WINELIB
mf->hFile = _lcreat(lpFilename, 0); mf->hFile = _lcreat(lpFilename, 0);
#else
/* temporary fix until _lcreate works under WINELIB */
mf->hFile = creat(lpFilename, 0666);
#endif
if (_lwrite(mf->hFile, (char *)mh, MFHEADERSIZE) == -1) if (_lwrite(mf->hFile, (char *)mh, MFHEADERSIZE) == -1)
{ {
GlobalFree(mf->hMetaHdr); GlobalFree(mf->hMetaHdr);
......
Due to the implementation of FindText() and ReplaceText() in /misc/commdlg.c
I had to change the definition in sysres_En.rc of the dialogs FIND_TEXT and
REPLACE_TEXT. These changes should also be made for the other languages.
Not only should the definitions in sysres_??.rc made up to date with the
Enlish version, but also the dimensions of the controls should be changed so
that they will be big enough to contain the text for every individual
language.
Therefore:
- Definitions of FIND_TEXT and REPLACE_TEXT in sysres_??.rc should match
those in sysres_En.rc
- Dimensions of controls are based on sysres_En.rc. Other languages should
change these dimensions in order to make the text fit.
Frans van Dorsselaer
dorssel@rulhm1.LeidenUniv.nl
...@@ -165,36 +165,38 @@ FONT 8, "Helv" ...@@ -165,36 +165,38 @@ FONT 8, "Helv"
} }
FIND_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 84 FIND_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 236, 62
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Find" CAPTION "Find"
FONT 8, "Helv" FONT 8, "Helv"
{ {
LTEXT "Fi&nd What:", 1088, 6, 6, 40, 9 LTEXT "Fi&nd What:", -1, 4, 8, 42, 8
LTEXT "", 1089, 60, 6, 150, 9 EDITTEXT 1152, 47, 7, 128, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP
CHECKBOX "Match &Whole Word Only", 1040, 20, 30, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP CHECKBOX "Match &Whole Word Only", 1040, 4, 26, 100, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
CHECKBOX "Match &Case", 1041, 20, 50, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP CHECKBOX "Match &Case", 1041, 4, 42, 64, 12, BS_AUTOCHECKBOX | WS_TABSTOP
GROUPBOX "Direction", 1072, 90, 40, 80, 40, BS_GROUPBOX GROUPBOX "Direction", 1072, 107, 26, 68, 28
RADIOBUTTON "&Up", 1056, 100, 50, 50, 12 CONTROL "&Up", 1056, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 111, 38, 20, 12
RADIOBUTTON "&Down", 1057, 150, 50, 50, 12 CONTROL "&Down", 1057, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 138, 38, 30, 12
DEFPUSHBUTTON "&Find Next", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP DEFPUSHBUTTON "&Find Next", 1, 182, 5, 50, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON "Cancel", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP PUSHBUTTON "Cancel", 2, 182, 23, 50, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON "&Help", 1038, 182, 45, 50, 14, WS_GROUP | WS_TABSTOP
} }
REPLACE_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 114 REPLACE_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 230, 94
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Replace" CAPTION "Replace"
FONT 8, "Helv" FONT 8, "Helv"
{ {
LTEXT "Fi&nd What:", 1088, 6, 6, 40, 9 LTEXT "Fi&nd What:", -1, 4, 9, 48, 8
LTEXT "", 1089, 60, 6, 150, 9 EDITTEXT 1152, 54, 7, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP
LTEXT "Re&place With:", 1090, 6, 26, 40, 9 LTEXT "Re&place With:", -1, 4, 26, 48, 8
LTEXT "", 1091, 60, 26, 150, 9 EDITTEXT 1153, 54, 24, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP
CHECKBOX "Match &Whole Word Only", 1040, 20, 40, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP CHECKBOX "Match &Whole Word Only", 1040, 5, 46, 104, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
CHECKBOX "Match &Case", 1041, 20, 60, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP CHECKBOX "Match &Case", 1041, 5, 62, 59, 12, BS_AUTOCHECKBOX | WS_TABSTOP
DEFPUSHBUTTON "&Find Next", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP DEFPUSHBUTTON "&Find Next", 1, 174, 4, 50, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
PUSHBUTTON "&Replace", 1024, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP PUSHBUTTON "&Replace", 1024, 174, 21, 50, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON "Replace &All", 1025, 206, 44, 56, 14, WS_GROUP | WS_TABSTOP PUSHBUTTON "Replace &All", 1025, 174, 38, 50, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON "Cancel", 2, 206, 64, 56, 14, WS_GROUP | WS_TABSTOP PUSHBUTTON "Cancel", 2, 174, 55, 50, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON "&Help", 1038, 174, 75, 50, 14, WS_GROUP | WS_TABSTOP
} }
...@@ -108,7 +108,7 @@ static int MEMORY_IsVrangeFree(DWORD start,DWORD size) ...@@ -108,7 +108,7 @@ static int MEMORY_IsVrangeFree(DWORD start,DWORD size)
static int warned=0; static int warned=0;
if(!warned) if(!warned)
{ {
fprintf("Don't know how to perform MEMORY_IsVrangeFree on " fprintf(stdnimp, "Don't know how to perform MEMORY_IsVrangeFree on "
"this system.\n Please fix\n"); "this system.\n Please fix\n");
warned=0; warned=0;
} }
......
...@@ -19,6 +19,13 @@ void PARAM32_POINT32to16(const POINT32* p32,POINT* p16) ...@@ -19,6 +19,13 @@ void PARAM32_POINT32to16(const POINT32* p32,POINT* p16)
p16->y = p32->y; p16->y = p32->y;
} }
void PARAM32_SIZE16to32(const SIZE* p16, SIZE32* p32)
{
p32->cx = p16->cx;
p32->cy = p16->cy;
}
/**************************************************************** /****************************************************************
* MoveToEx (GDI32.254) * MoveToEx (GDI32.254)
*/ */
...@@ -32,3 +39,15 @@ BOOL WIN32_MoveToEx(HDC hdc,int x,int y,POINT32* p32) ...@@ -32,3 +39,15 @@ BOOL WIN32_MoveToEx(HDC hdc,int x,int y,POINT32* p32)
return MoveToEx(hdc,x,y,&p); return MoveToEx(hdc,x,y,&p);
} }
} }
BOOL WIN32_GetTextExtentPointA(HDC hdc, LPCTSTR str, int length, SIZE32* lpsize)
{
SIZE s;
BOOL retval;
retval = GetTextExtentPoint(hdc, str, length, &s);
PARAM32_SIZE16to32(&s, lpsize);
return retval;
}
...@@ -28,72 +28,109 @@ typedef struct ...@@ -28,72 +28,109 @@ typedef struct
WORD timerid; WORD timerid;
} CARET; } CARET;
static CARET Caret; typedef enum
static BOOL LockCaret; {
CARET_OFF = 0,
CARET_ON,
CARET_TOGGLE,
} DISPLAY_CARET;
static void CARET_HideCaret(); static CARET Caret = { (HWND)0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
/***************************************************************** /*****************************************************************
* CARET_Callback * CARET_GetHwnd
*/ */
WORD CARET_Callback(HWND hwnd, WORD msg, WORD timerid, LONG ctime) HWND CARET_GetHwnd()
{ {
HDC hdc; return Caret.hwnd;
HBRUSH hBrush;
HRGN rgn;
dprintf_caret(stddeb,"CARET_Callback: id=%d: LockCaret=%d, hidden=%d, on=%d\n",
timerid, LockCaret, Caret.hidden, Caret.on);
if (!LockCaret && (!Caret.hidden || Caret.on))
{
Caret.on = (Caret.on ? FALSE : TRUE);
hdc = GetDC(Caret.hwnd);
if (Caret.bitmap == (HBITMAP)0 || Caret.bitmap == (HBITMAP)1)
hBrush = CreateSolidBrush(Caret.color);
else
hBrush = CreatePatternBrush(Caret.bitmap);
SelectObject(hdc, (HANDLE)hBrush);
SetROP2(hdc, R2_NOTXORPEN);
rgn = CreateRectRgn(Caret.x, Caret.y,
Caret.x + Caret.width,
Caret.y + Caret.height);
FillRgn(hdc, rgn, hBrush);
DeleteObject((HANDLE)rgn);
DeleteObject((HANDLE)hBrush);
ReleaseDC(Caret.hwnd, hdc);
}
return 0;
} }
/***************************************************************** /*****************************************************************
* CARET_HideCaret * CARET_DisplayCaret
*/ */
void CARET_DisplayCaret(DISPLAY_CARET status)
static void CARET_HideCaret()
{ {
HDC hdc; HDC hdc;
HBRUSH hBrush; HBRUSH hBrush;
HBRUSH hPrevBrush;
HRGN rgn; HRGN rgn;
Caret.on = FALSE; if (Caret.on && (status == CARET_ON)) return;
if (!Caret.on && (status == CARET_OFF)) return;
/* So now it's always a toggle */
Caret.on = !Caret.on;
hdc = GetDC(Caret.hwnd); hdc = GetDC(Caret.hwnd);
if (Caret.bitmap == (HBITMAP)0 || Caret.bitmap == (HBITMAP)1) if (Caret.bitmap == (HBITMAP)0 || Caret.bitmap == (HBITMAP)1)
hBrush = CreateSolidBrush(Caret.color); hBrush = CreateSolidBrush(Caret.color);
else else
hBrush = CreatePatternBrush(Caret.bitmap); hBrush = CreatePatternBrush(Caret.bitmap);
SelectObject(hdc, (HANDLE)hBrush); hPrevBrush = SelectObject(hdc, (HANDLE)hBrush);
SetROP2(hdc, R2_NOTXORPEN); SetROP2(hdc, R2_XORPEN);
rgn = CreateRectRgn(Caret.x, Caret.y, rgn = CreateRectRgn(Caret.x, Caret.y,
Caret.x + Caret.width, Caret.x + Caret.width,
Caret.y + Caret.height); Caret.y + Caret.height);
FillRgn(hdc, rgn, hBrush); FillRgn(hdc, rgn, hBrush);
DeleteObject((HANDLE)rgn); DeleteObject( rgn );
DeleteObject((HANDLE)hBrush); SelectObject( hdc, hPrevBrush );
DeleteObject( hBrush );
ReleaseDC(Caret.hwnd, hdc); ReleaseDC(Caret.hwnd, hdc);
} }
/*****************************************************************
* CARET_Callback
*/
WORD CARET_Callback(HWND hwnd, WORD msg, WORD timerid, LONG ctime)
{
dprintf_caret(stddeb,"CARET_Callback: hwnd="NPFMT", timerid=%d, "
"caret=%d\n", hwnd, timerid, Caret.on);
CARET_DisplayCaret(CARET_TOGGLE);
return 0;
}
/*****************************************************************
* CARET_SetTimer
*/
void CARET_SetTimer(void)
{
if (Caret.timerid) KillSystemTimer((HWND)0, Caret.timerid);
Caret.timerid = SetSystemTimer((HWND)0, 0, Caret.timeout,
(FARPROC)GetWndProcEntry16("CARET_Callback"));
}
/*****************************************************************
* CARET_ResetTimer
*/
void CARET_ResetTimer(void)
{
if (Caret.timerid)
{
KillSystemTimer((HWND)0, Caret.timerid);
Caret.timerid = SetSystemTimer((HWND)0, 0, Caret.timeout,
(FARPROC)GetWndProcEntry16("CARET_Callback"));
}
}
/*****************************************************************
* CARET_KillTimer
*/
void CARET_KillTimer(void)
{
if (Caret.timerid)
{
KillSystemTimer((HWND)0, Caret.timerid);
Caret.timerid = 0;
}
}
/***************************************************************** /*****************************************************************
* CARET_Initialize * CARET_Initialize
*/ */
...@@ -101,14 +138,16 @@ static void CARET_Initialize() ...@@ -101,14 +138,16 @@ static void CARET_Initialize()
{ {
DWORD WineProc,Win16Proc,Win32Proc; DWORD WineProc,Win16Proc,Win32Proc;
static int initialized=0; static int initialized=0;
if(!initialized) if(!initialized)
{ {
WineProc=(DWORD)CARET_Callback; WineProc = (DWORD)CARET_Callback;
Win16Proc=(DWORD)GetWndProcEntry16("CARET_Callback"); Win16Proc = (DWORD)GetWndProcEntry16("CARET_Callback");
Win32Proc=(DWORD)RELAY32_GetEntryPoint( Win32Proc = (DWORD)RELAY32_GetEntryPoint(
RELAY32_GetBuiltinDLL("WINPROCS32"),"CARET_Callback",0); RELAY32_GetBuiltinDLL("WINPROCS32"),
ALIAS_RegisterAlias(WineProc,Win16Proc,Win32Proc); "CARET_Callback", 0);
initialized=1; ALIAS_RegisterAlias(WineProc, Win16Proc, Win32Proc);
initialized=1;
} }
} }
...@@ -119,18 +158,17 @@ static void CARET_Initialize() ...@@ -119,18 +158,17 @@ static void CARET_Initialize()
BOOL CreateCaret(HWND hwnd, HBITMAP bitmap, INT width, INT height) BOOL CreateCaret(HWND hwnd, HBITMAP bitmap, INT width, INT height)
{ {
if (!hwnd) return FALSE; dprintf_caret(stddeb,"CreateCaret: hwnd="NPFMT"\n", hwnd);
if (!hwnd) return FALSE;
/* if cursor already exists, destroy it */ /* if cursor already exists, destroy it */
/* if (Caret.hwnd) if (Caret.hwnd) DestroyCaret();
DestroyCaret();
*/ if (bitmap && bitmap != (HBITMAP)1) Caret.bitmap = bitmap;
if (bitmap && bitmap != (HBITMAP)1)
Caret.bitmap = bitmap;
if (width) if (width)
Caret.width = width; Caret.width = width;
else else
Caret.width = GetSystemMetrics(SM_CXBORDER); Caret.width = GetSystemMetrics(SM_CXBORDER);
...@@ -147,17 +185,11 @@ BOOL CreateCaret(HWND hwnd, HBITMAP bitmap, INT width, INT height) ...@@ -147,17 +185,11 @@ BOOL CreateCaret(HWND hwnd, HBITMAP bitmap, INT width, INT height)
if (bitmap == (HBITMAP)1) if (bitmap == (HBITMAP)1)
Caret.color = GetSysColor(COLOR_GRAYTEXT); Caret.color = GetSysColor(COLOR_GRAYTEXT);
else else
Caret.color = GetSysColor(COLOR_WINDOWTEXT); Caret.color = GetSysColor(COLOR_WINDOW);
Caret.timeout = 750; Caret.timeout = 750;
LockCaret = FALSE;
CARET_Initialize(); CARET_Initialize();
Caret.timerid = SetSystemTimer( (HWND)0, 0, Caret.timeout,
(FARPROC)GetWndProcEntry16("CARET_Callback"));
dprintf_caret(stddeb,"CreateCaret: hwnd="NPFMT", timerid=%d\n",
hwnd, Caret.timerid);
return TRUE; return TRUE;
} }
...@@ -168,16 +200,15 @@ BOOL CreateCaret(HWND hwnd, HBITMAP bitmap, INT width, INT height) ...@@ -168,16 +200,15 @@ BOOL CreateCaret(HWND hwnd, HBITMAP bitmap, INT width, INT height)
BOOL DestroyCaret() BOOL DestroyCaret()
{ {
/* if (!Caret.hwnd) return; if (!Caret.hwnd) return FALSE;
*/
dprintf_caret(stddeb,"DestroyCaret: timerid=%d\n", Caret.timerid);
KillSystemTimer( (HWND)0, Caret.timerid); dprintf_caret(stddeb,"DestroyCaret: hwnd="NPFMT", timerid=%d\n",
Caret.hwnd, Caret.timerid);
if (Caret.on) CARET_KillTimer();
CARET_HideCaret(); CARET_DisplayCaret(CARET_OFF);
Caret.hwnd = 0; /* cursor marked as not existing */ Caret.hwnd = 0;
return TRUE; return TRUE;
} }
...@@ -192,13 +223,15 @@ void SetCaretPos(short x, short y) ...@@ -192,13 +223,15 @@ void SetCaretPos(short x, short y)
dprintf_caret(stddeb,"SetCaretPos: x=%d, y=%d\n", x, y); dprintf_caret(stddeb,"SetCaretPos: x=%d, y=%d\n", x, y);
LockCaret = TRUE; CARET_KillTimer();
if (Caret.on) CARET_DisplayCaret(CARET_OFF);
CARET_HideCaret();
Caret.x = x; Caret.x = x;
Caret.y = y; Caret.y = y;
LockCaret = FALSE; if (!Caret.hidden)
{
CARET_DisplayCaret(CARET_ON);
CARET_SetTimer();
}
} }
/***************************************************************** /*****************************************************************
...@@ -210,12 +243,12 @@ void HideCaret(HWND hwnd) ...@@ -210,12 +243,12 @@ void HideCaret(HWND hwnd)
if (!Caret.hwnd) return; if (!Caret.hwnd) return;
if (hwnd && (Caret.hwnd != hwnd)) return; if (hwnd && (Caret.hwnd != hwnd)) return;
LockCaret = TRUE; dprintf_caret(stddeb,"HideCaret: hwnd="NPFMT", hidden=%d\n",
if (Caret.on) hwnd, Caret.hidden);
CARET_HideCaret();
++Caret.hidden; CARET_KillTimer();
LockCaret = FALSE; CARET_DisplayCaret(CARET_OFF);
Caret.hidden++;
} }
...@@ -228,9 +261,18 @@ void ShowCaret(HWND hwnd) ...@@ -228,9 +261,18 @@ void ShowCaret(HWND hwnd)
if (!Caret.hwnd) return; if (!Caret.hwnd) return;
if (hwnd && (Caret.hwnd != hwnd)) return; if (hwnd && (Caret.hwnd != hwnd)) return;
dprintf_caret(stddeb,"ShowCaret: hidden=%d\n", Caret.hidden); dprintf_caret(stddeb,"ShowCaret: hwnd="NPFMT", hidden=%d\n",
hwnd, Caret.hidden);
if (Caret.hidden) if (Caret.hidden)
--Caret.hidden; {
Caret.hidden--;
if (!Caret.hidden)
{
CARET_DisplayCaret(CARET_ON);
CARET_SetTimer();
}
}
} }
...@@ -242,12 +284,11 @@ void SetCaretBlinkTime(WORD msecs) ...@@ -242,12 +284,11 @@ void SetCaretBlinkTime(WORD msecs)
{ {
if (!Caret.hwnd) return; if (!Caret.hwnd) return;
CARET_Initialize(); dprintf_caret(stddeb,"SetCaretBlinkTime: hwnd="NPFMT", msecs=%d\n",
Caret.hwnd, msecs);
KillSystemTimer( (HWND)0, Caret.timerid);
Caret.timeout = msecs; Caret.timeout = msecs;
Caret.timerid = SetSystemTimer( (HWND)0, 0, Caret.timeout, CARET_ResetTimer();
(FARPROC)GetWndProcEntry16("CARET_Callback"));
} }
...@@ -258,6 +299,10 @@ void SetCaretBlinkTime(WORD msecs) ...@@ -258,6 +299,10 @@ void SetCaretBlinkTime(WORD msecs)
WORD GetCaretBlinkTime() WORD GetCaretBlinkTime()
{ {
if (!Caret.hwnd) return 0; if (!Caret.hwnd) return 0;
dprintf_caret(stddeb,"GetCaretBlinkTime: hwnd="NPFMT", msecs=%d\n",
Caret.hwnd, Caret.timeout);
return Caret.timeout; return Caret.timeout;
} }
...@@ -270,6 +315,9 @@ void GetCaretPos(LPPOINT pt) ...@@ -270,6 +315,9 @@ void GetCaretPos(LPPOINT pt)
{ {
if (!Caret.hwnd || !pt) return; if (!Caret.hwnd || !pt) return;
dprintf_caret(stddeb,"GetCaretPos: hwnd="NPFMT", pt=%p, x=%d, y=%d\n",
Caret.hwnd, pt, Caret.x, Caret.y);
pt->x = Caret.x; pt->x = Caret.x;
pt->y = Caret.y; pt->y = Caret.y;
} }
...@@ -807,6 +807,37 @@ LONG NC_HandleSetCursor( HWND hwnd, WPARAM wParam, LPARAM lParam ) ...@@ -807,6 +807,37 @@ LONG NC_HandleSetCursor( HWND hwnd, WPARAM wParam, LPARAM lParam )
/*********************************************************************** /***********************************************************************
* NC_TrackSysMenu
*
* Track a mouse button press on the system menu.
*/
static void NC_TrackSysMenu( HWND hwnd, HDC hdc, POINT pt )
{
RECT rect;
WND *wndPtr = WIN_FindWndPtr( hwnd );
int iconic = wndPtr->dwStyle & WS_MINIMIZE;
if (!(wndPtr->dwStyle & WS_SYSMENU)) return;
/* If window has a menu, track the menu bar normally if it not minimized */
if (HAS_MENU(wndPtr) && !iconic) MENU_TrackMouseMenuBar( hwnd, pt );
else
{
/* Otherwise track the system menu like a normal popup menu */
NC_GetInsideRect( hwnd, &rect );
OffsetRect( &rect, wndPtr->rectWindow.left, wndPtr->rectWindow.top );
if (wndPtr->dwStyle & WS_CHILD)
ClientToScreen( wndPtr->hwndParent, (POINT *)&rect );
rect.right = rect.left + SYSMETRICS_CXSIZE;
rect.bottom = rect.top + SYSMETRICS_CYSIZE;
if (!iconic) NC_DrawSysButton( hwnd, hdc, TRUE );
TrackPopupMenu( wndPtr->hSysMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON,
rect.left, rect.bottom, 0, hwnd, &rect );
if (!iconic) NC_DrawSysButton( hwnd, hdc, FALSE );
}
}
/***********************************************************************
* NC_StartSizeMove * NC_StartSizeMove
* *
* Initialisation of a move or resize, when initiatied from a menu choice. * Initialisation of a move or resize, when initiatied from a menu choice.
...@@ -904,6 +935,7 @@ static void NC_DoSizeMove( HWND hwnd, WORD wParam, POINT pt ) ...@@ -904,6 +935,7 @@ static void NC_DoSizeMove( HWND hwnd, WORD wParam, POINT pt )
BOOL thickframe; BOOL thickframe;
POINT minTrack, maxTrack, capturePoint = pt; POINT minTrack, maxTrack, capturePoint = pt;
WND * wndPtr = WIN_FindWndPtr( hwnd ); WND * wndPtr = WIN_FindWndPtr( hwnd );
int moved = 0;
if (IsZoomed(hwnd) || !IsWindowVisible(hwnd) || if (IsZoomed(hwnd) || !IsWindowVisible(hwnd) ||
(wndPtr->flags & WIN_MANAGED)) return; (wndPtr->flags & WIN_MANAGED)) return;
...@@ -977,7 +1009,7 @@ static void NC_DoSizeMove( HWND hwnd, WORD wParam, POINT pt ) ...@@ -977,7 +1009,7 @@ static void NC_DoSizeMove( HWND hwnd, WORD wParam, POINT pt )
while(1) while(1)
{ {
int dx = 0, dy = 0; int dx = 0, dy = 0;
MSG_GetHardwareMessage( &msg ); MSG_GetHardwareMessage( &msg );
...@@ -1012,6 +1044,7 @@ static void NC_DoSizeMove( HWND hwnd, WORD wParam, POINT pt ) ...@@ -1012,6 +1044,7 @@ static void NC_DoSizeMove( HWND hwnd, WORD wParam, POINT pt )
if (dx || dy) if (dx || dy)
{ {
moved = 1;
if (msg.message == WM_KEYDOWN) SetCursorPos( pt.x, pt.y ); if (msg.message == WM_KEYDOWN) SetCursorPos( pt.x, pt.y );
else else
{ {
...@@ -1032,6 +1065,7 @@ static void NC_DoSizeMove( HWND hwnd, WORD wParam, POINT pt ) ...@@ -1032,6 +1065,7 @@ static void NC_DoSizeMove( HWND hwnd, WORD wParam, POINT pt )
NC_DrawMovingFrame( hdc, &sizingRect, thickframe ); NC_DrawMovingFrame( hdc, &sizingRect, thickframe );
ReleaseCapture(); ReleaseCapture();
if (wndPtr->dwStyle & WS_CHILD) ReleaseDC( wndPtr->hwndParent, hdc ); if (wndPtr->dwStyle & WS_CHILD) ReleaseDC( wndPtr->hwndParent, hdc );
else else
{ {
...@@ -1041,6 +1075,14 @@ static void NC_DoSizeMove( HWND hwnd, WORD wParam, POINT pt ) ...@@ -1041,6 +1075,14 @@ static void NC_DoSizeMove( HWND hwnd, WORD wParam, POINT pt )
SendMessage( hwnd, WM_EXITSIZEMOVE, 0, 0 ); SendMessage( hwnd, WM_EXITSIZEMOVE, 0, 0 );
SendMessage( hwnd, WM_SETVISIBLE, !IsIconic(hwnd), 0L); SendMessage( hwnd, WM_SETVISIBLE, !IsIconic(hwnd), 0L);
/* Single click brings up the system menu */
if (!moved)
{
NC_TrackSysMenu( hwnd, hdc, pt );
return;
}
/* If Esc key, don't move the window */ /* If Esc key, don't move the window */
if ((msg.message == WM_KEYDOWN) && (msg.wParam == VK_ESCAPE)) return; if ((msg.message == WM_KEYDOWN) && (msg.wParam == VK_ESCAPE)) return;
...@@ -1152,36 +1194,6 @@ static void NC_TrackScrollBar( HWND hwnd, WORD wParam, POINT pt ) ...@@ -1152,36 +1194,6 @@ static void NC_TrackScrollBar( HWND hwnd, WORD wParam, POINT pt )
} }
/*********************************************************************** /***********************************************************************
* NC_TrackSysMenu
*
* Track a mouse button press on the system menu.
*/
static void NC_TrackSysMenu( HWND hwnd, HDC hdc, POINT pt )
{
RECT rect;
WND *wndPtr = WIN_FindWndPtr( hwnd );
if (!(wndPtr->dwStyle & WS_SYSMENU)) return;
/* If window has a menu, track the menu bar normally */
if (HAS_MENU(wndPtr)) MENU_TrackMouseMenuBar( hwnd, pt );
else
{
/* Otherwise track the system menu like a normal popup menu */
NC_GetInsideRect( hwnd, &rect );
OffsetRect( &rect, wndPtr->rectWindow.left, wndPtr->rectWindow.top );
if (wndPtr->dwStyle & WS_CHILD)
ClientToScreen( wndPtr->hwndParent, (POINT *)&rect );
rect.right = rect.left + SYSMETRICS_CXSIZE;
rect.bottom = rect.top + SYSMETRICS_CYSIZE;
NC_DrawSysButton( hwnd, hdc, TRUE );
TrackPopupMenu( wndPtr->hSysMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON,
rect.left, rect.bottom, 0, hwnd, &rect );
NC_DrawSysButton( hwnd, hdc, FALSE );
}
}
/***********************************************************************
* NC_HandleNCLButtonDown * NC_HandleNCLButtonDown
* *
* Handle a WM_NCLBUTTONDOWN message. Called from DefWindowProc(). * Handle a WM_NCLBUTTONDOWN message. Called from DefWindowProc().
......
...@@ -30,13 +30,15 @@ HDC BeginPaint( HWND hwnd, LPPAINTSTRUCT lps ) ...@@ -30,13 +30,15 @@ HDC BeginPaint( HWND hwnd, LPPAINTSTRUCT lps )
hrgnUpdate = wndPtr->hrgnUpdate; /* Save update region */ hrgnUpdate = wndPtr->hrgnUpdate; /* Save update region */
if (!hrgnUpdate) /* Create an empty region */ if (!hrgnUpdate) /* Create an empty region */
if (!(hrgnUpdate = CreateRectRgn( 0, 0, 0, 0 ))) return 0; if (!(hrgnUpdate = CreateRectRgn( 0, 0, 0, 0 ))) return 0;
if (wndPtr->hrgnUpdate || (wndPtr->flags & WIN_INTERNAL_PAINT)) if (wndPtr->hrgnUpdate || (wndPtr->flags & WIN_INTERNAL_PAINT))
MSG_DecPaintCount( wndPtr->hmemTaskQ ); MSG_DecPaintCount( wndPtr->hmemTaskQ );
wndPtr->hrgnUpdate = 0; wndPtr->hrgnUpdate = 0;
wndPtr->flags &= ~(WIN_NEEDS_BEGINPAINT | WIN_INTERNAL_PAINT); wndPtr->flags &= ~(WIN_NEEDS_BEGINPAINT | WIN_INTERNAL_PAINT);
HideCaret( hwnd );
if (wndPtr->flags & WIN_NEEDS_NCPAINT) if (wndPtr->flags & WIN_NEEDS_NCPAINT)
{ {
wndPtr->flags &= ~WIN_NEEDS_NCPAINT; wndPtr->flags &= ~WIN_NEEDS_NCPAINT;
...@@ -71,6 +73,7 @@ HDC BeginPaint( HWND hwnd, LPPAINTSTRUCT lps ) ...@@ -71,6 +73,7 @@ HDC BeginPaint( HWND hwnd, LPPAINTSTRUCT lps )
BOOL EndPaint( HWND hwnd, const PAINTSTRUCT* lps ) BOOL EndPaint( HWND hwnd, const PAINTSTRUCT* lps )
{ {
ReleaseDC( hwnd, lps->hdc ); ReleaseDC( hwnd, lps->hdc );
ShowCaret( hwnd );
return TRUE; return TRUE;
} }
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
extern HRGN DCE_GetVisRgn(HWND, WORD); extern HRGN DCE_GetVisRgn(HWND, WORD);
extern HWND CARET_GetHwnd();
static int RgnType; static int RgnType;
...@@ -122,9 +123,10 @@ BOOL SCROLL_ScrollChildren( HWND hScroll, short dx, short dy) ...@@ -122,9 +123,10 @@ BOOL SCROLL_ScrollChildren( HWND hScroll, short dx, short dy)
void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT rect, LPRECT clipRect) void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT rect, LPRECT clipRect)
{ {
HDC hdc; HDC hdc;
HRGN hrgnUpdate,hrgnClip; HRGN hrgnUpdate,hrgnClip;
RECT rc, cliprc; RECT rc, cliprc;
HWND hCaretWnd = CARET_GetHwnd();
dprintf_scroll(stddeb,"ScrollWindow: dx=%d, dy=%d, lpRect =%08lx clipRect=%i,%i,%i,%i\n", dprintf_scroll(stddeb,"ScrollWindow: dx=%d, dy=%d, lpRect =%08lx clipRect=%i,%i,%i,%i\n",
dx, dy, (LONG)rect, (int)((clipRect)?clipRect->left:0), dx, dy, (LONG)rect, (int)((clipRect)?clipRect->left:0),
...@@ -138,6 +140,10 @@ void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT rect, LPRECT clipRect) ...@@ -138,6 +140,10 @@ void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT rect, LPRECT clipRect)
GetClientRect(hwnd, &rc); GetClientRect(hwnd, &rc);
hrgnClip = CreateRectRgnIndirect( &rc ); hrgnClip = CreateRectRgnIndirect( &rc );
if ((hCaretWnd == hwnd) || IsChild(hwnd,hCaretWnd))
HideCaret(hCaretWnd);
else hCaretWnd = 0;
/* children will be Blt'ed too */ /* children will be Blt'ed too */
hdc = GetDCEx(hwnd, hrgnClip, DCX_CACHE | DCX_CLIPSIBLINGS); hdc = GetDCEx(hwnd, hrgnClip, DCX_CACHE | DCX_CLIPSIBLINGS);
DeleteObject(hrgnClip); DeleteObject(hrgnClip);
...@@ -150,7 +156,9 @@ void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT rect, LPRECT clipRect) ...@@ -150,7 +156,9 @@ void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT rect, LPRECT clipRect)
(int)rect->bottom,(int)rc.left,(int)rc.top, (int)rect->bottom,(int)rc.left,(int)rc.top,
(int)rc.right,(int)rc.bottom); (int)rc.right,(int)rc.bottom);
CopyRect(&rc, rect); if (hCaretWnd == hwnd) HideCaret(hCaretWnd);
else hCaretWnd = 0;
CopyRect(&rc, rect);
hdc = GetDC(hwnd); hdc = GetDC(hwnd);
} }
...@@ -189,6 +197,7 @@ void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT rect, LPRECT clipRect) ...@@ -189,6 +197,7 @@ void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT rect, LPRECT clipRect)
} }
DeleteObject(hrgnUpdate); DeleteObject(hrgnUpdate);
if( hCaretWnd ) ShowCaret(hCaretWnd);
} }
......
...@@ -1240,8 +1240,41 @@ BOOL AnyPopup() ...@@ -1240,8 +1240,41 @@ BOOL AnyPopup()
*/ */
BOOL FlashWindow(HWND hWnd, BOOL bInvert) BOOL FlashWindow(HWND hWnd, BOOL bInvert)
{ {
dprintf_win(stdnimp,"EMPTY STUB !! FlashWindow !\n"); WND *wndPtr = WIN_FindWndPtr(hWnd);
return FALSE;
dprintf_win(stddeb,"FlashWindow: "NPFMT"\n", hWnd);
if (!wndPtr) return FALSE;
if (wndPtr->dwStyle & WS_MINIMIZE)
{
if (bInvert && !(wndPtr->flags & WIN_NCACTIVATED))
{
HDC hDC = GetDC(hWnd);
if (!SendMessage( hWnd, WM_ERASEBKGND, (WPARAM)hDC, (LPARAM)0 ))
wndPtr->flags |= WIN_NEEDS_ERASEBKGND;
ReleaseDC( hWnd, hDC );
wndPtr->flags |= WIN_NCACTIVATED;
}
else
{
RedrawWindow( hWnd, 0, 0, RDW_INVALIDATE | RDW_ERASE |
RDW_UPDATENOW | RDW_FRAME );
wndPtr->flags &= ~WIN_NCACTIVATED;
}
return TRUE;
}
else
{
WPARAM wparam;
if (bInvert) wparam = !(wndPtr->flags & WIN_NCACTIVATED);
else wparam = (hWnd == GetActiveWindow());
SendMessage( hWnd, WM_NCACTIVATE, wparam, (LPARAM)0 );
return wparam;
}
} }
......
...@@ -56,43 +56,14 @@ the --prefix option when running ...@@ -56,43 +56,14 @@ the --prefix option when running
.B configure. .B configure.
.SH OPTIONS .SH OPTIONS
.TP .TP
.I -depth n .I -allowreadonly
Change the depth to use for multiple-depth screens Read only files may be opened in write mode
.TP
.I -desktop geom
Use a desktop window of the given geometry
.TP
.I -display name
Use the specified display
.TP
.I -iconic
Start as an icon
.TP
.I -debug
Enter the debugger before starting application
.TP
.I -language xx
Set the language to
.I xx
(one of En, Es, De, No, Fr, Fi, Da Cz)
.TP
.I -managed
Create each top-level window as a properly managed X window
.TP
.I -name name
Set the application name
.TP
.I -privatemap
Use a private color map
.TP
.I -synchronous
Turn on synchronous display mode
.TP .TP
.I -backingstore .I -backingstore
Turn on backing store Turn on backing store
.TP .TP
.I -spy file .I -debug
Turn on message spying to the specified file Enter the debugger before starting application
.TP .TP
.I -debugmsg name[,name] .I -debugmsg name[,name]
Turn debugging messages on or off - for instance, Turn debugging messages on or off - for instance,
...@@ -106,6 +77,15 @@ metafile, midi, mmio, mmsys, mmtime, module, msg, nonclient, ole, palette, ...@@ -106,6 +77,15 @@ metafile, midi, mmio, mmsys, mmtime, module, msg, nonclient, ole, palette,
profile, prop, reg, region, relay, resource, scroll, selector, selectors, profile, prop, reg, region, relay, resource, scroll, selector, selectors,
stress, syscolor, task, text, timer, toolhelp, utility, win, winsock. stress, syscolor, task, text, timer, toolhelp, utility, win, winsock.
.TP .TP
.I -depth n
Change the depth to use for multiple-depth screens
.TP
.I -desktop geom
Use a desktop window of the given geometry
.TP
.I -display name
Use the specified display
.TP
.I -dll name .I -dll name
Enables/disables built-in DLL's - starting wine with Enables/disables built-in DLL's - starting wine with
.I -dll -commdlg .I -dll -commdlg
...@@ -115,11 +95,37 @@ KERNEL, USER, GDI, WIN87EM, SHELL, SOUND, KEYBOARD, WINSOCK, STRESS, MMSYSTEM, ...@@ -115,11 +95,37 @@ KERNEL, USER, GDI, WIN87EM, SHELL, SOUND, KEYBOARD, WINSOCK, STRESS, MMSYSTEM,
SYSTEM, TOOLHELP, MOUSE, COMMDLG, OLE2, OLE2CONV, OLE2DISP, OLE2NLS, OLE2PROX, SYSTEM, TOOLHELP, MOUSE, COMMDLG, OLE2, OLE2CONV, OLE2DISP, OLE2NLS, OLE2PROX,
OLECLI, OLESVR, COMPOBJ, STORAGE, WINPROCS, DDEML OLECLI, OLESVR, COMPOBJ, STORAGE, WINPROCS, DDEML
.TP .TP
.I -allowreadonly .I -fixedmap
Read only files may be opened in write mode Use a "standard" color map.
.TP
.I -iconic
Start as an icon
.TP
.I -language xx
Set the language to
.I xx
(one of En, Es, De, No, Fr, Fi, Da, Cz)
.TP
.I -managed
Create each top-level window as a properly managed X window
.TP
.I -mode modename
Determines the mode in which
.B wine
is started. Possible mode names are
.I standard
and
.I enhanced.
Enhanced mode is the default (when no -mode option is specified).
.TP .TP
.I -enhanced .I -name name
Starts wine in Enhanced mode Set the application name
.TP
.I -privatemap
Use a private color map
.TP
.I -synchronous
Turn on synchronous display mode
.PD 1 .PD 1
.SH PROGRAM/ARGUMENTS .SH PROGRAM/ARGUMENTS
The program name may be specified in DOS format (C:\\WINDOWS\\SOL.EXE) or in The program name may be specified in DOS format (C:\\WINDOWS\\SOL.EXE) or in
......
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