Release 960818
Sun Aug 18 12:17:54 1996 Alexandre Julliard <julliard@lrc.epfl.ch> * [files/drive.c] Added 'Filesystem' option in drives configuration. * [files/dos_fs.c] Added handling of case-insensitive filesystems. * [memory/selector.c] [include/stackframe.h] Removed MAKE_SEGPTR. * [misc/commdlg.c] [multimedia/mcistring.c] Replaced MAKE_SEGPTR by the SEGPTR_* macros. * [objects/bitblt.c] [windows/graphics.c] Use an intermediary pixmap to avoid some BadMatch errors on XGetImage(). Sun Aug 18 09:21:27 1996 Albrecht Kleine <kleine@ak.sax.de> * [windows/message.c] Added handling of WM_NC...mouse messages in JOURNALRECORD hook. * [misc/ver.c] Fixed a bad string result in VerQueryValue[16|32A|32W]. Fri Aug 16 19:55:04 1996 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de> * [if1632/crtdll.spec] [misc/crtdll.c] More additions to get win95 programs further down the road. * [if1632/kernel.spec] [loader/module.c] GetModuleName() added. LoadModule(): params->showCmd can be NULL. * [if1632/kernel32.spec] [if1632/thunk.c] ThunkConnect32() stub added. * [loader/resource.c] Entries include lastentry. * [misc/shell.c] [files/file.c] Made progman work again. Fri Aug 16 09:00:00 1996 Alex Korobka <alex@phm30.pharm.sunysb.edu> * [windows/defwnd.c] [windows/winpos.c] [windows/painting.c] Icon painting fixes. * [windows/winpos.c] [windows/painting.c] Enforce and follow hrgnUpdate more closely to cut down on redundant RedrawWindow() calls. * [windows/event.c] Process ConfigureNotify only for managed windows. * [windows/winpos.c] Do not redraw parent if the window was hidden before SetWindowPos(). * [windows/nonclient.c] Omit some nonclient decoration painting for managed windows. * [controls/menu.c] [windows/mdi.c] [windows/nonclient.c] Implemented WM_NEXTMENU. * [controls/listbox.c] Multicolumn listboxes return WVR_VREDRAW on WM_NCCALCSIZE. * [misc/shell.c] Added .ICO file handling to ExtractIcon().
This commit is contained in:
parent
8cc3a5e4d4
commit
1e37a18171
16
ANNOUNCE
16
ANNOUNCE
|
@ -1,14 +1,12 @@
|
|||
This is release 960811 of Wine, the MS Windows emulator. This is still a
|
||||
This is release 960818 of Wine, the MS Windows emulator. This is still a
|
||||
developer's only release. There are many bugs and many unimplemented API
|
||||
features. Most applications still do not work correctly.
|
||||
|
||||
Patches should be submitted to "julliard@lrc.epfl.ch". Please don't
|
||||
forget to include a ChangeLog entry.
|
||||
|
||||
WHAT'S NEW with Wine-960811: (see ChangeLog for details)
|
||||
- Status window class.
|
||||
- Some CRTDLL support.
|
||||
- Fixes to scrolling code.
|
||||
WHAT'S NEW with Wine-960818: (see ChangeLog for details)
|
||||
- Many repainting fixes.
|
||||
- Lots of bug fixes.
|
||||
|
||||
See the README file in the distribution for installation instructions.
|
||||
|
@ -17,10 +15,10 @@ 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
|
||||
from the following locations:
|
||||
|
||||
sunsite.unc.edu:/pub/Linux/ALPHA/wine/development/Wine-960811.tar.gz
|
||||
tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-960811.tar.gz
|
||||
ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-960811.tar.gz
|
||||
aris.com:/pub/linux/ALPHA/Wine/development/Wine-960811.tar.gz
|
||||
ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-960818.tar.gz
|
||||
ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-960818.tar.gz
|
||||
ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-960818.tar.gz
|
||||
ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-960818.tar.gz
|
||||
|
||||
It should also be available from any site that mirrors tsx-11 or sunsite.
|
||||
|
||||
|
|
72
ChangeLog
72
ChangeLog
|
@ -1,3 +1,75 @@
|
|||
----------------------------------------------------------------------
|
||||
Sun Aug 18 12:17:54 1996 Alexandre Julliard <julliard@lrc.epfl.ch>
|
||||
|
||||
* [files/drive.c]
|
||||
Added 'Filesystem' option in drives configuration.
|
||||
|
||||
* [files/dos_fs.c]
|
||||
Added handling of case-insensitive filesystems.
|
||||
|
||||
* [memory/selector.c] [include/stackframe.h]
|
||||
Removed MAKE_SEGPTR.
|
||||
|
||||
* [misc/commdlg.c] [multimedia/mcistring.c]
|
||||
Replaced MAKE_SEGPTR by the SEGPTR_* macros.
|
||||
|
||||
* [objects/bitblt.c] [windows/graphics.c]
|
||||
Use an intermediary pixmap to avoid some BadMatch errors on
|
||||
XGetImage().
|
||||
|
||||
Sun Aug 18 09:21:27 1996 Albrecht Kleine <kleine@ak.sax.de>
|
||||
|
||||
* [windows/message.c]
|
||||
Added handling of WM_NC...mouse messages in JOURNALRECORD hook.
|
||||
|
||||
* [misc/ver.c]
|
||||
Fixed a bad string result in VerQueryValue[16|32A|32W].
|
||||
|
||||
Fri Aug 16 19:55:04 1996 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
|
||||
|
||||
* [if1632/crtdll.spec] [misc/crtdll.c]
|
||||
More additions to get win95 programs further down the road.
|
||||
|
||||
* [if1632/kernel.spec] [loader/module.c]
|
||||
GetModuleName() added.
|
||||
LoadModule(): params->showCmd can be NULL.
|
||||
|
||||
* [if1632/kernel32.spec] [if1632/thunk.c]
|
||||
ThunkConnect32() stub added.
|
||||
|
||||
* [loader/resource.c]
|
||||
Entries include lastentry.
|
||||
|
||||
* [misc/shell.c] [files/file.c]
|
||||
Made progman work again.
|
||||
|
||||
Fri Aug 16 09:00:00 1996 Alex Korobka <alex@phm30.pharm.sunysb.edu>
|
||||
|
||||
* [windows/defwnd.c] [windows/winpos.c] [windows/painting.c]
|
||||
Icon painting fixes.
|
||||
|
||||
* [windows/winpos.c] [windows/painting.c]
|
||||
Enforce and follow hrgnUpdate more closely to cut down on
|
||||
redundant RedrawWindow() calls.
|
||||
|
||||
* [windows/event.c]
|
||||
Process ConfigureNotify only for managed windows.
|
||||
|
||||
* [windows/winpos.c]
|
||||
Do not redraw parent if the window was hidden before SetWindowPos().
|
||||
|
||||
* [windows/nonclient.c]
|
||||
Omit some nonclient decoration painting for managed windows.
|
||||
|
||||
* [controls/menu.c] [windows/mdi.c] [windows/nonclient.c]
|
||||
Implemented WM_NEXTMENU.
|
||||
|
||||
* [controls/listbox.c]
|
||||
Multicolumn listboxes return WVR_VREDRAW on WM_NCCALCSIZE.
|
||||
|
||||
* [misc/shell.c]
|
||||
Added .ICO file handling to ExtractIcon().
|
||||
|
||||
----------------------------------------------------------------------
|
||||
Sun Aug 11 13:00:20 1996 Alexandre Julliard <julliard@lrc.epfl.ch>
|
||||
|
||||
|
|
|
@ -12,7 +12,8 @@ Addresses used by 16-bit code are segmented addresses (16:16), formed
|
|||
by a 16-bit selector and a 16-bit offset. Those used by the Wine code
|
||||
are regular 32-bit linear addresses.
|
||||
|
||||
There's three ways to obtain a segmented pointer:
|
||||
There are four ways to obtain a segmented pointer:
|
||||
- Use the SEGPTR_* macros in include/heap.h (recommended).
|
||||
- Allocate a block of memory from the global heap and use
|
||||
WIN16_GlobalLock to get its segmented address.
|
||||
- Allocate a block of memory from a local heap, and build the
|
||||
|
|
|
@ -12,6 +12,7 @@ X_CFLAGS = @X_CFLAGS@
|
|||
X_LIBS = @X_LIBS@
|
||||
XPM_LIB = -lXpm
|
||||
XLIB = @X_PRE_LIBS@ -lXext -lX11 @X_EXTRA_LIBS@
|
||||
WINELIB = -L$(TOPSRC) -lwine
|
||||
LDLIBS = @LDLIBS@
|
||||
YACC = @YACC@
|
||||
LEX = @LEX@
|
||||
|
@ -22,7 +23,6 @@ LDCOMBINE = ld -r
|
|||
RM = rm -f
|
||||
BUILD = $(TOPSRC)/tools/build
|
||||
WINERC = $(TOPSRC)/rc/winerc
|
||||
WINELIB = $(TOPSRC)/libwine.a
|
||||
SUBMAKE = $(MAKE) 'CC=$(CC)' 'CFLAGS=$(CFLAGS)' 'OPTIONS=$(OPTIONS)'
|
||||
@SET_MAKE@
|
||||
|
||||
|
|
|
@ -121,8 +121,13 @@ $(ALLSUBDIRS): dummy
|
|||
install_programs: dummy
|
||||
@cd programs; $(SUBMAKE) install
|
||||
|
||||
depend:
|
||||
for i in $(ALLSUBDIRS); do (cd $$i; $(MAKE) depend); done
|
||||
depend: libdepend emudepend
|
||||
|
||||
libdepend: dummy
|
||||
for i in $(COMMONSUBDIRS) $(LIBSUBDIRS); do (cd $$i; $(MAKE) depend); done
|
||||
|
||||
emudepend: dummy
|
||||
for i in $(EMUSUBDIRS); do (cd $$i; $(MAKE) depend); done
|
||||
|
||||
etags:
|
||||
etags `find . -name '*.[chS]' -print`
|
||||
|
|
|
@ -17,7 +17,6 @@
|
|||
#include "sysmetrics.h"
|
||||
#include "win.h"
|
||||
#include "combo.h"
|
||||
#include "stackframe.h"
|
||||
#include "user.h"
|
||||
#include "graphics.h"
|
||||
#include "heap.h"
|
||||
|
@ -715,7 +714,9 @@ static LRESULT CBCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|||
case EN_UPDATE:GetWindowText32A(lphc->hWndEdit,buffer,255);
|
||||
if (*buffer)
|
||||
{
|
||||
newFocused=ListBoxFindString(lphl, -1, MAKE_SEGPTR(buffer));
|
||||
char *str = SEGPTR_STRDUP(buffer);
|
||||
newFocused=ListBoxFindString(lphl, -1, SEGPTR_GET(str));
|
||||
SEGPTR_FREE(str);
|
||||
dprintf_combo(stddeb,"CBCommand: new selection #%d is= %s\n",
|
||||
newFocused,buffer);
|
||||
if (newFocused != (WORD)LB_ERR)
|
||||
|
@ -1259,11 +1260,11 @@ static INT32 COMBO_DlgDirList( HWND32 hDlg, LPARAM path, INT32 idCBox,
|
|||
/***********************************************************************
|
||||
* DlgDirListComboBox16 (USER.195)
|
||||
*/
|
||||
INT16 DlgDirListComboBox16( HWND16 hDlg, LPCSTR path, INT16 idCBox,
|
||||
INT16 DlgDirListComboBox16( HWND16 hDlg, SEGPTR path, INT16 idCBox,
|
||||
INT16 idStatic, UINT16 wType )
|
||||
{
|
||||
dprintf_combo( stddeb,"DlgDirListComboBox16(%04x,'%s',%d,%d,%04x)\n",
|
||||
hDlg, path, idCBox, idStatic, wType );
|
||||
dprintf_combo( stddeb,"DlgDirListComboBox16(%04x,%08x,%d,%d,%04x)\n",
|
||||
hDlg, (UINT32)path, idCBox, idStatic, wType );
|
||||
return COMBO_DlgDirList( hDlg, (LPARAM)path, idCBox,
|
||||
idStatic, wType, FALSE );
|
||||
}
|
||||
|
|
|
@ -77,6 +77,11 @@ static HBITMAP DESKTOP_LoadBitmap( HDC hdc, const char *filename )
|
|||
static LONG DESKTOP_DoEraseBkgnd( HWND hwnd, HDC hdc, DESKTOPINFO *infoPtr )
|
||||
{
|
||||
RECT16 rect;
|
||||
WND* Wnd = WIN_FindWndPtr( hwnd );
|
||||
|
||||
if( Wnd->hrgnUpdate > 1 ) DeleteObject( Wnd->hrgnUpdate );
|
||||
Wnd->hrgnUpdate = 0;
|
||||
|
||||
GetClientRect16( hwnd, &rect );
|
||||
|
||||
/* Paint desktop pattern (only if wall paper does not cover everything) */
|
||||
|
|
|
@ -17,7 +17,6 @@
|
|||
#include <windows.h>
|
||||
#include "win.h"
|
||||
#include "local.h"
|
||||
#include "stackframe.h"
|
||||
#include "stddebug.h"
|
||||
#include "debug.h"
|
||||
#include "xmalloc.h"
|
||||
|
@ -614,13 +613,21 @@ static void EDIT_BuildLineDefs(WND *wndPtr)
|
|||
*/
|
||||
static INT EDIT_CallWordBreakProc(WND *wndPtr, char *s, INT index, INT count, INT action)
|
||||
{
|
||||
EDITWORDBREAKPROC wbp = (EDITWORDBREAKPROC)EDIT_EM_GetWordBreakProc(wndPtr, 0, 0L);
|
||||
EDITWORDBREAKPROC wbp = (EDITWORDBREAKPROC)EDIT_EM_GetWordBreakProc(wndPtr, 0, 0L);
|
||||
|
||||
if (wbp) {
|
||||
return CallWordBreakProc((FARPROC16)wbp,
|
||||
(LONG)MAKE_SEGPTR(s), index, count, action);
|
||||
} else
|
||||
return EDIT_WordBreakProc(s, index, count, action);
|
||||
if (!wbp) return EDIT_WordBreakProc(s, index, count, action);
|
||||
else
|
||||
{
|
||||
/* We need a SEGPTR here */
|
||||
|
||||
EDITSTATE *es = EDITSTATEPTR(wndPtr);
|
||||
SEGPTR ptr = LOCAL_LockSegptr( wndPtr->hInstance, es->hBuf ) +
|
||||
(UINT16)(s - EDIT_GetPointer(wndPtr));
|
||||
INT ret = CallWordBreakProc( (FARPROC16)wbp, ptr,
|
||||
index, count, action);
|
||||
LOCAL_Unlock( wndPtr->hInstance, es->hBuf );
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -1836,7 +1843,6 @@ static LRESULT EDIT_EM_LineScroll(WND *wndPtr, WPARAM wParam, LPARAM lParam)
|
|||
INT dx;
|
||||
INT dy;
|
||||
POINT16 pos;
|
||||
HRGN hRgn;
|
||||
|
||||
if (nfv >= lc)
|
||||
nfv = lc - 1;
|
||||
|
@ -1848,15 +1854,8 @@ static LRESULT EDIT_EM_LineScroll(WND *wndPtr, WPARAM wParam, LPARAM lParam)
|
|||
if (dx || dy) {
|
||||
if (wndPtr->hwndSelf == GetFocus())
|
||||
HideCaret(wndPtr->hwndSelf);
|
||||
if (EDIT_GetRedraw(wndPtr)) {
|
||||
hRgn = CreateRectRgn(0, 0, 0, 0);
|
||||
GetUpdateRgn(wndPtr->hwndSelf, hRgn, FALSE);
|
||||
ValidateRgn(wndPtr->hwndSelf, 0);
|
||||
OffsetRgn(hRgn, dx, dy);
|
||||
InvalidateRgn( wndPtr->hwndSelf, hRgn, TRUE );
|
||||
DeleteObject(hRgn);
|
||||
if (EDIT_GetRedraw(wndPtr))
|
||||
ScrollWindow(wndPtr->hwndSelf, dx, dy, NULL, NULL);
|
||||
}
|
||||
es->FirstVisibleLine = nfv;
|
||||
es->XOffset = nxoff;
|
||||
if (IsVScrollBar(wndPtr))
|
||||
|
@ -2580,7 +2579,7 @@ static LRESULT EDIT_WM_LButtonDblClk(WND *wndPtr, WPARAM wParam, LPARAM lParam)
|
|||
UINT ll = (UINT)EDIT_EM_LineLength(wndPtr, e, 0L);
|
||||
char *text = EDIT_GetPointer(wndPtr);
|
||||
|
||||
s = li + EDIT_CallWordBreakProc(wndPtr, text + li, e - li, ll, WB_LEFT);
|
||||
s = li + EDIT_CallWordBreakProc (wndPtr, text + li, e - li, ll, WB_LEFT);
|
||||
e = li + EDIT_CallWordBreakProc(wndPtr, text + li, e - li, ll, WB_RIGHT);
|
||||
EDIT_EM_SetSel(wndPtr, 0, MAKELPARAM(s, e));
|
||||
return 0L;
|
||||
|
|
|
@ -29,7 +29,6 @@
|
|||
#include "drive.h"
|
||||
#include "file.h"
|
||||
#include "heap.h"
|
||||
#include "stackframe.h"
|
||||
#include "stddebug.h"
|
||||
#include "debug.h"
|
||||
#include "xmalloc.h"
|
||||
|
@ -274,20 +273,23 @@ int ListBoxFindMouse(LPHEADLIST lphl, int X, int Y)
|
|||
return LB_ERR;
|
||||
}
|
||||
|
||||
BOOL lbDeleteItemNotify(LPHEADLIST lphl, LPLISTSTRUCT lpls)
|
||||
BOOL32 lbDeleteItemNotify(LPHEADLIST lphl, LPLISTSTRUCT lpls)
|
||||
{
|
||||
/* called only for owner drawn listboxes */
|
||||
/* called only for owner drawn listboxes */
|
||||
BOOL32 ret;
|
||||
DELETEITEMSTRUCT16 *delItem = SEGPTR_NEW(DELETEITEMSTRUCT16);
|
||||
if (!delItem) return FALSE;
|
||||
|
||||
DELETEITEMSTRUCT16 delItem;
|
||||
delItem->CtlType = lphl->DrawCtlType;
|
||||
delItem->CtlID = lphl->CtlID;
|
||||
delItem->itemID = lpls->mis.itemID;
|
||||
delItem->hwndItem = lphl->hSelf;
|
||||
delItem->itemData = lpls->mis.itemData;
|
||||
|
||||
delItem.CtlType = lphl->DrawCtlType;
|
||||
delItem.CtlID = lphl->CtlID;
|
||||
delItem.itemID = lpls->mis.itemID;
|
||||
delItem.hwndItem= lphl->hSelf;
|
||||
delItem.itemData= lpls->mis.itemData;
|
||||
|
||||
return (BOOL) SendMessage16(lphl->hParent, WM_DELETEITEM, (WPARAM)lphl->CtlID,
|
||||
(LPARAM)MAKE_SEGPTR(&delItem));
|
||||
ret = SendMessage16( lphl->hParent, WM_DELETEITEM, (WPARAM)lphl->CtlID,
|
||||
(LPARAM)SEGPTR_GET(delItem) );
|
||||
SEGPTR_FREE(delItem);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void ListBoxAskMeasure(LPHEADLIST lphl, LPLISTSTRUCT lpls)
|
||||
|
@ -338,7 +340,7 @@ int ListBoxAskCompare(LPHEADLIST lphl, int startItem, SEGPTR matchData, BOOL exa
|
|||
* MATCH_SUBSTR (2) - same as exact match but with strncmp for string comparision
|
||||
*/
|
||||
|
||||
COMPAREITEMSTRUCT16 itemCmp;
|
||||
COMPAREITEMSTRUCT16 *itemCmp;
|
||||
LPLISTSTRUCT currentItem = NULL;
|
||||
LPCSTR matchStr = (lphl->HasStrings)?(LPCSTR)PTR_SEG_TO_LIN(matchData):NULL;
|
||||
int head, pos = -1, tail, loop = 1;
|
||||
|
@ -369,9 +371,10 @@ int ListBoxAskCompare(LPHEADLIST lphl, int startItem, SEGPTR matchData, BOOL exa
|
|||
|
||||
dprintf_listbox(stddeb,"AskCompare: head = %i, tail = %i, data = %08x\n", head, tail, (unsigned)matchData );
|
||||
|
||||
itemCmp.CtlType = lphl->DrawCtlType;
|
||||
itemCmp.CtlID = lphl->CtlID;
|
||||
itemCmp.hwndItem = lphl->hSelf;
|
||||
if (!(itemCmp = SEGPTR_NEW(COMPAREITEMSTRUCT16))) return 0;
|
||||
itemCmp->CtlType = lphl->DrawCtlType;
|
||||
itemCmp->CtlID = lphl->CtlID;
|
||||
itemCmp->hwndItem = lphl->hSelf;
|
||||
|
||||
/* search from startItem */
|
||||
|
||||
|
@ -384,22 +387,25 @@ int ListBoxAskCompare(LPHEADLIST lphl, int startItem, SEGPTR matchData, BOOL exa
|
|||
|
||||
if( lphl->HasStrings )
|
||||
{
|
||||
b = ( s_length )? strncasecmp( currentItem->itemText, matchStr, s_length)
|
||||
: strcasecmp( currentItem->itemText, matchStr);
|
||||
b = ( s_length )? lstrncmpi32A( currentItem->itemText, matchStr, s_length)
|
||||
: lstrcmpi32A( currentItem->itemText, matchStr);
|
||||
}
|
||||
else
|
||||
{
|
||||
itemCmp.itemID1 = pos;
|
||||
itemCmp.itemData1 = currentItem->mis.itemData;
|
||||
itemCmp.itemID2 = -1;
|
||||
itemCmp.itemData2 = matchData;
|
||||
itemCmp->itemID1 = pos;
|
||||
itemCmp->itemData1 = currentItem->mis.itemData;
|
||||
itemCmp->itemID2 = -1;
|
||||
itemCmp->itemData2 = matchData;
|
||||
|
||||
b = SendMessage16( lphl->hParent, WM_COMPAREITEM, (WPARAM)lphl->CtlID,
|
||||
(LPARAM)MAKE_SEGPTR(&itemCmp) );
|
||||
(LPARAM)SEGPTR_GET(itemCmp) );
|
||||
}
|
||||
|
||||
if( b == 0 )
|
||||
if( b == 0 )
|
||||
{
|
||||
SEGPTR_FREE(itemCmp);
|
||||
return pos; /* found exact match */
|
||||
}
|
||||
else
|
||||
if( b < 0 ) head = ++pos;
|
||||
else
|
||||
|
@ -411,6 +417,7 @@ int ListBoxAskCompare(LPHEADLIST lphl, int startItem, SEGPTR matchData, BOOL exa
|
|||
}
|
||||
|
||||
dprintf_listbox(stddeb,"\t-> pos = %i\n", pos );
|
||||
SEGPTR_FREE(itemCmp);
|
||||
|
||||
/* if we got here match is not exact */
|
||||
|
||||
|
@ -612,8 +619,8 @@ int lbFindString(LPHEADLIST lphl, UINT nFirst, SEGPTR MatchStr, BOOL match)
|
|||
{
|
||||
if (lphl->HasStrings)
|
||||
{
|
||||
if ( ( s_length )? !strncasecmp(lpls->itemText, lpMatchStr, s_length)
|
||||
: !strcasecmp(lpls->itemText, lpMatchStr) ) return Count;
|
||||
if ( ( s_length )? !lstrncmpi32A(lpls->itemText, lpMatchStr, s_length)
|
||||
: !lstrcmpi32A(lpls->itemText, lpMatchStr) ) return Count;
|
||||
}
|
||||
else
|
||||
if ( lpls->mis.itemData == (DWORD)lpMatchStr ) return Count;
|
||||
|
@ -630,8 +637,8 @@ int lbFindString(LPHEADLIST lphl, UINT nFirst, SEGPTR MatchStr, BOOL match)
|
|||
{
|
||||
if (lphl->HasStrings)
|
||||
{
|
||||
if ( ( s_length )? !strncasecmp(lpls->itemText, lpMatchStr, s_length)
|
||||
: !strcasecmp(lpls->itemText, lpMatchStr) ) return Count;
|
||||
if ( ( s_length )? !lstrncmpi32A(lpls->itemText, lpMatchStr, s_length)
|
||||
: !lstrcmpi32A(lpls->itemText, lpMatchStr) ) return Count;
|
||||
}
|
||||
else
|
||||
if ( lpls->mis.itemData == (DWORD)lpMatchStr ) return Count;
|
||||
|
@ -912,6 +919,18 @@ static LONG LBDestroy(HWND hwnd, WORD wParam, LONG lParam)
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* LBNCCalcSize
|
||||
*/
|
||||
static LONG LBNCCalcSize(HWND hwnd, WORD wParam, LONG lParam)
|
||||
{
|
||||
LONG ret = DefWindowProc16(hwnd, WM_NCCALCSIZE, wParam, lParam);
|
||||
|
||||
return (GetWindowLong32A(hwnd,GWL_STYLE) & LBS_MULTICOLUMN)? WVR_VREDRAW : ret;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* LBVScroll
|
||||
*/
|
||||
|
@ -2073,6 +2092,7 @@ LRESULT ListBoxWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||
case WM_PAINT: return LBPaint(hwnd, wParam, lParam);
|
||||
case WM_SETFOCUS: return LBSetFocus(hwnd, wParam, lParam);
|
||||
case WM_KILLFOCUS: return LBKillFocus(hwnd, wParam, lParam);
|
||||
case WM_NCCALCSIZE: return LBNCCalcSize(hwnd, wParam, lParam);
|
||||
case LB_RESETCONTENT: return LBResetContent(hwnd, wParam, lParam);
|
||||
case LB_DIR: return LBDir(hwnd, wParam, lParam);
|
||||
case LB_ADDSTRING: return LBAddString(hwnd, wParam, lParam);
|
||||
|
|
286
controls/menu.c
286
controls/menu.c
|
@ -60,6 +60,9 @@ typedef struct
|
|||
|
||||
#define MENU_MAGIC 0x554d /* 'MU' */
|
||||
|
||||
#define ITEM_PREV -1
|
||||
#define ITEM_NEXT 1
|
||||
|
||||
/* Dimension of the menu bitmaps */
|
||||
static WORD check_bitmap_width = 0, check_bitmap_height = 0;
|
||||
static WORD arrow_bitmap_width = 0, arrow_bitmap_height = 0;
|
||||
|
@ -85,6 +88,7 @@ static BOOL fEndMenuCalled = FALSE;
|
|||
MF_MENUBARBREAK | MF_MENUBREAK | MF_SEPARATOR)))
|
||||
|
||||
extern void NC_DrawSysButton(HWND hwnd, HDC hdc, BOOL down); /* nonclient.c */
|
||||
extern BOOL NC_GetSysPopupPos(WND* wndPtr, RECT16* rect);
|
||||
|
||||
static HBITMAP hStdCheck = 0;
|
||||
static HBITMAP hStdMnArrow = 0;
|
||||
|
@ -802,10 +806,11 @@ static BOOL MENU_ShowPopup(HWND hwndOwner, HMENU hmenu, UINT id, int x, int y)
|
|||
|
||||
uSubPWndLevel++;
|
||||
|
||||
wndPtr = WIN_FindWndPtr( menu->hWnd );
|
||||
|
||||
SetWindowPos(menu->hWnd, 0, x, y, menu->Width + 2*SYSMETRICS_CXBORDER,
|
||||
menu->Height + 2*SYSMETRICS_CYBORDER,
|
||||
SWP_NOACTIVATE | SWP_NOZORDER );
|
||||
|
||||
SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOREDRAW);
|
||||
/* Display the window */
|
||||
|
||||
SetWindowPos( menu->hWnd, HWND_TOP, 0, 0, 0, 0,
|
||||
|
@ -879,11 +884,12 @@ static void MENU_SelectItem( HWND hwndOwner, HMENU hmenu, UINT wIndex,
|
|||
|
||||
|
||||
/***********************************************************************
|
||||
* MENU_SelectNextItem
|
||||
* MENU_SelectItemRel
|
||||
*
|
||||
*/
|
||||
static void MENU_SelectNextItem( HWND hwndOwner, HMENU hmenu )
|
||||
static void MENU_SelectItemRel( HWND hwndOwner, HMENU hmenu, int offset )
|
||||
{
|
||||
int i;
|
||||
int i, min = 0;
|
||||
POPUPMENU *menu;
|
||||
|
||||
menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( hmenu );
|
||||
|
@ -891,7 +897,8 @@ static void MENU_SelectNextItem( HWND hwndOwner, HMENU hmenu )
|
|||
if ((menu->FocusedItem != NO_SELECTED_ITEM) &&
|
||||
(menu->FocusedItem != SYSMENU_SELECTED))
|
||||
{
|
||||
for (i = menu->FocusedItem+1; i < menu->nItems; i++)
|
||||
for (i = menu->FocusedItem + offset ; i >= 0 && i < menu->nItems
|
||||
; i += offset)
|
||||
{
|
||||
if (!(menu->items[i].item_flags & MF_SEPARATOR))
|
||||
{
|
||||
|
@ -899,53 +906,18 @@ static void MENU_SelectNextItem( HWND hwndOwner, HMENU hmenu )
|
|||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (MENU_HasSysMenu( menu ))
|
||||
{
|
||||
MENU_SelectItem( hwndOwner, hmenu, SYSMENU_SELECTED, TRUE );
|
||||
return;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < menu->nItems; i++)
|
||||
{
|
||||
if (!(menu->items[i].item_flags & MF_SEPARATOR))
|
||||
{
|
||||
MENU_SelectItem( hwndOwner, hmenu, i, TRUE );
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (MENU_HasSysMenu( menu ))
|
||||
MENU_SelectItem( hwndOwner, hmenu, SYSMENU_SELECTED, TRUE );
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* MENU_SelectPrevItem
|
||||
*/
|
||||
static void MENU_SelectPrevItem( HWND hwndOwner, HMENU hmenu )
|
||||
{
|
||||
int i;
|
||||
POPUPMENU *menu;
|
||||
|
||||
menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( hmenu );
|
||||
if (!menu->items) return;
|
||||
if ((menu->FocusedItem != NO_SELECTED_ITEM) &&
|
||||
(menu->FocusedItem != SYSMENU_SELECTED))
|
||||
{
|
||||
for (i = menu->FocusedItem - 1; i >= 0; i--)
|
||||
{
|
||||
if (!(menu->items[i].item_flags & MF_SEPARATOR))
|
||||
{
|
||||
MENU_SelectItem( hwndOwner, hmenu, i, TRUE );
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (MENU_HasSysMenu( menu ))
|
||||
{
|
||||
MENU_SelectItem( hwndOwner, hmenu, SYSMENU_SELECTED, TRUE );
|
||||
return;
|
||||
}
|
||||
}
|
||||
for (i = menu->nItems - 1; i > 0; i--)
|
||||
if( offset > 0 ) { i = 0; min = -1; }
|
||||
else i = menu->nItems - 1;
|
||||
|
||||
for ( ; i > min && i < menu->nItems ; i += offset)
|
||||
{
|
||||
if (!(menu->items[i].item_flags & MF_SEPARATOR))
|
||||
{
|
||||
|
@ -1193,7 +1165,7 @@ static HMENU MENU_ShowSubPopup( HWND hwndOwner, HMENU hmenu, BOOL selectFirst )
|
|||
{
|
||||
MENU_ShowPopup(hwndOwner, wndPtr->hSysMenu, 0, wndPtr->rectClient.left,
|
||||
wndPtr->rectClient.top - menu->Height - 2*SYSMETRICS_CYBORDER);
|
||||
if (selectFirst) MENU_SelectNextItem( hwndOwner, wndPtr->hSysMenu );
|
||||
if (selectFirst) MENU_SelectItemRel( hwndOwner, wndPtr->hSysMenu, ITEM_NEXT );
|
||||
return wndPtr->hSysMenu;
|
||||
}
|
||||
item = &menu->items[menu->FocusedItem];
|
||||
|
@ -1212,7 +1184,7 @@ static HMENU MENU_ShowSubPopup( HWND hwndOwner, HMENU hmenu, BOOL selectFirst )
|
|||
wndPtr->rectWindow.left + item->rect.left,
|
||||
wndPtr->rectWindow.top + item->rect.bottom );
|
||||
}
|
||||
if (selectFirst) MENU_SelectNextItem( hwndOwner, (HMENU)item->item_id );
|
||||
if (selectFirst) MENU_SelectItemRel( hwndOwner, (HMENU)item->item_id, ITEM_NEXT );
|
||||
return (HMENU)item->item_id;
|
||||
}
|
||||
|
||||
|
@ -1373,7 +1345,7 @@ static BOOL MENU_ButtonUp( HWND hwndOwner, HMENU hmenu, HMENU *hmenuCurrent,
|
|||
}
|
||||
/* Select first item of sub-popup */
|
||||
MENU_SelectItem( hwndOwner, hsubmenu, NO_SELECTED_ITEM, FALSE );
|
||||
MENU_SelectNextItem( hwndOwner, hsubmenu );
|
||||
MENU_SelectItemRel( hwndOwner, hsubmenu, ITEM_NEXT );
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -1415,6 +1387,86 @@ static BOOL MENU_MouseMove( HWND hwndOwner, HMENU hmenu, HMENU *hmenuCurrent,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* MENU_DoNextMenu
|
||||
*/
|
||||
static LRESULT MENU_DoNextMenu( HWND* hwndOwner, HMENU* hmenu, HMENU *hmenuCurrent, UINT vk)
|
||||
{
|
||||
POPUPMENU *menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( *hmenu );
|
||||
UINT id = 0;
|
||||
|
||||
if( (vk == VK_LEFT && !menu->FocusedItem)
|
||||
|| (vk == VK_RIGHT && menu->FocusedItem == menu->nItems - 1)
|
||||
|| menu->FocusedItem == SYSMENU_SELECTED
|
||||
|| ((menu->wFlags & (MF_POPUP | MF_SYSMENU)) == (MF_POPUP | MF_SYSMENU)) )
|
||||
{
|
||||
LRESULT l = SendMessage16( *hwndOwner, WM_NEXTMENU, (WPARAM)vk,
|
||||
(LPARAM)((menu->FocusedItem == SYSMENU_SELECTED)
|
||||
? GetSystemMenu( *hwndOwner, 0)
|
||||
: *hmenu));
|
||||
|
||||
if( l == 0 || !IsMenu(LOWORD(l)) || !IsWindow(HIWORD(l)) ) return 0;
|
||||
|
||||
/* shutdown current menu -
|
||||
* all these checks for system popup window are needed
|
||||
* only because Wine system menu tracking is unsuitable
|
||||
* for a lot of things (esp. when we do not have wIDmenu to fall back on).
|
||||
*/
|
||||
|
||||
MENU_SelectItem( *hwndOwner, *hmenu, NO_SELECTED_ITEM, FALSE );
|
||||
|
||||
if( (menu->wFlags & (MF_POPUP | MF_SYSMENU)) == (MF_POPUP | MF_SYSMENU) )
|
||||
{
|
||||
HDC hdc;
|
||||
|
||||
ShowWindow( menu->hWnd, SW_HIDE );
|
||||
uSubPWndLevel = 0;
|
||||
|
||||
if( !IsIconic( *hwndOwner ) )
|
||||
{
|
||||
hdc = GetDCEx( *hwndOwner, 0, DCX_CACHE | DCX_WINDOW);
|
||||
NC_DrawSysButton( *hwndOwner, hdc, FALSE );
|
||||
ReleaseDC( *hwndOwner, hdc );
|
||||
}
|
||||
}
|
||||
|
||||
ReleaseCapture();
|
||||
*hwndOwner = HIWORD(l);
|
||||
*hmenu = LOWORD(l);
|
||||
SetCapture( *hwndOwner );
|
||||
|
||||
menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( *hmenu );
|
||||
|
||||
/* init next menu */
|
||||
|
||||
if( (menu->wFlags & (MF_POPUP | MF_SYSMENU)) == (MF_POPUP | MF_SYSMENU) )
|
||||
{
|
||||
RECT16 rect;
|
||||
WND* wndPtr = WIN_FindWndPtr( *hwndOwner );
|
||||
|
||||
/* stupid kludge, see above */
|
||||
|
||||
if( wndPtr->wIDmenu && !(wndPtr->dwStyle & WS_CHILD) )
|
||||
{ *hmenu = wndPtr->wIDmenu; id = SYSMENU_SELECTED; }
|
||||
else
|
||||
{
|
||||
if( NC_GetSysPopupPos( wndPtr, &rect ) )
|
||||
MENU_ShowPopup( *hwndOwner, *hmenu, 0, rect.left, rect.bottom );
|
||||
|
||||
if( !IsIconic( *hwndOwner ) )
|
||||
{
|
||||
HDC hdc = GetDCEx( *hwndOwner, 0, DCX_CACHE | DCX_WINDOW);
|
||||
NC_DrawSysButton( *hwndOwner, hdc, TRUE );
|
||||
ReleaseDC( *hwndOwner, hdc );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MENU_SelectItem( *hwndOwner, *hmenu, id, TRUE );
|
||||
return l;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* MENU_KeyLeft
|
||||
|
@ -1422,28 +1474,34 @@ static BOOL MENU_MouseMove( HWND hwndOwner, HMENU hmenu, HMENU *hmenuCurrent,
|
|||
* Handle a VK_LEFT key event in a menu.
|
||||
* hmenuCurrent is the top-most visible popup.
|
||||
*/
|
||||
static void MENU_KeyLeft( HWND hwndOwner, HMENU hmenu, HMENU *hmenuCurrent )
|
||||
static void MENU_KeyLeft( HWND* hwndOwner, HMENU* hmenu, HMENU *hmenuCurrent )
|
||||
{
|
||||
POPUPMENU *menu;
|
||||
HMENU hmenutmp, hmenuprev;
|
||||
|
||||
menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( hmenu );
|
||||
hmenuprev = hmenutmp = hmenu;
|
||||
menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( *hmenu );
|
||||
hmenuprev = hmenutmp = *hmenu;
|
||||
while (hmenutmp != *hmenuCurrent)
|
||||
{
|
||||
hmenutmp = MENU_GetSubPopup( hmenuprev );
|
||||
if (hmenutmp != *hmenuCurrent) hmenuprev = hmenutmp;
|
||||
}
|
||||
MENU_HideSubPopups( hwndOwner, hmenuprev, TRUE );
|
||||
MENU_HideSubPopups( *hwndOwner, hmenuprev, TRUE );
|
||||
hmenutmp = *hmenu;
|
||||
|
||||
if ((hmenuprev == hmenu) && !(menu->wFlags & MF_POPUP))
|
||||
if ( (hmenuprev == *hmenu) &&
|
||||
((menu->wFlags & MF_SYSMENU) || !(menu->wFlags & MF_POPUP)) )
|
||||
{
|
||||
/* Select previous item on the menu bar */
|
||||
MENU_SelectPrevItem( hwndOwner, hmenu );
|
||||
if (*hmenuCurrent != hmenu)
|
||||
/* send WM_NEXTMENU */
|
||||
|
||||
if( !MENU_DoNextMenu( hwndOwner, hmenu, hmenuCurrent, VK_LEFT) )
|
||||
MENU_SelectItemRel( *hwndOwner, *hmenu, ITEM_PREV );
|
||||
else *hmenuCurrent = *hmenu;
|
||||
|
||||
if (*hmenuCurrent != hmenutmp)
|
||||
{
|
||||
/* A popup menu was displayed -> display the next one */
|
||||
*hmenuCurrent = MENU_ShowSubPopup( hwndOwner, hmenu, TRUE );
|
||||
/* A sublevel menu was displayed -> display the next one */
|
||||
*hmenuCurrent = MENU_ShowSubPopup( *hwndOwner, *hmenu, TRUE );
|
||||
}
|
||||
}
|
||||
else *hmenuCurrent = hmenuprev;
|
||||
|
@ -1456,17 +1514,17 @@ static void MENU_KeyLeft( HWND hwndOwner, HMENU hmenu, HMENU *hmenuCurrent )
|
|||
* Handle a VK_RIGHT key event in a menu.
|
||||
* hmenuCurrent is the top-most visible popup.
|
||||
*/
|
||||
static void MENU_KeyRight( HWND hwndOwner, HMENU hmenu, HMENU *hmenuCurrent )
|
||||
static void MENU_KeyRight( HWND* hwndOwner, HMENU* hmenu, HMENU *hmenuCurrent )
|
||||
{
|
||||
POPUPMENU *menu;
|
||||
HMENU hmenutmp;
|
||||
|
||||
menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( hmenu );
|
||||
menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( *hmenu );
|
||||
|
||||
if ((menu->wFlags & MF_POPUP) || (*hmenuCurrent != hmenu))
|
||||
if ((menu->wFlags & MF_POPUP) || (*hmenuCurrent != *hmenu))
|
||||
{
|
||||
/* If already displaying a popup, try to display sub-popup */
|
||||
hmenutmp = MENU_ShowSubPopup( hwndOwner, *hmenuCurrent, TRUE );
|
||||
hmenutmp = MENU_ShowSubPopup( *hwndOwner, *hmenuCurrent, TRUE );
|
||||
if (hmenutmp != *hmenuCurrent) /* Sub-popup displayed */
|
||||
{
|
||||
*hmenuCurrent = hmenutmp;
|
||||
|
@ -1474,27 +1532,35 @@ static void MENU_KeyRight( HWND hwndOwner, HMENU hmenu, HMENU *hmenuCurrent )
|
|||
}
|
||||
}
|
||||
|
||||
/* If on menu-bar, go to next item */
|
||||
if (!(menu->wFlags & MF_POPUP))
|
||||
/* If menu-bar tracking, go to next item */
|
||||
|
||||
if (!(menu->wFlags & MF_POPUP) || (menu->wFlags & MF_SYSMENU))
|
||||
{
|
||||
MENU_HideSubPopups( hwndOwner, hmenu, FALSE );
|
||||
MENU_SelectNextItem( hwndOwner, hmenu );
|
||||
if (*hmenuCurrent != hmenu)
|
||||
MENU_HideSubPopups( *hwndOwner, *hmenu, FALSE );
|
||||
hmenutmp = *hmenu;
|
||||
|
||||
/* Send WM_NEXTMENU */
|
||||
|
||||
if( !MENU_DoNextMenu( hwndOwner, hmenu, hmenuCurrent, VK_RIGHT) )
|
||||
MENU_SelectItemRel( *hwndOwner, *hmenu, ITEM_NEXT );
|
||||
else *hmenuCurrent = *hmenu;
|
||||
|
||||
if (*hmenuCurrent != hmenutmp)
|
||||
{
|
||||
/* A popup menu was displayed -> display the next one */
|
||||
*hmenuCurrent = MENU_ShowSubPopup( hwndOwner, hmenu, TRUE );
|
||||
/* A sublevel menu was displayed -> display the next one */
|
||||
*hmenuCurrent = MENU_ShowSubPopup( *hwndOwner, *hmenu, TRUE );
|
||||
}
|
||||
}
|
||||
else if (*hmenuCurrent != hmenu) /* Hide last level popup */
|
||||
else if (*hmenuCurrent != *hmenu) /* Hide last level popup */
|
||||
{
|
||||
HMENU hmenuprev;
|
||||
hmenuprev = hmenutmp = hmenu;
|
||||
hmenuprev = hmenutmp = *hmenu;
|
||||
while (hmenutmp != *hmenuCurrent)
|
||||
{
|
||||
hmenutmp = MENU_GetSubPopup( hmenuprev );
|
||||
if (hmenutmp != *hmenuCurrent) hmenuprev = hmenutmp;
|
||||
}
|
||||
MENU_HideSubPopups( hwndOwner, hmenuprev, TRUE );
|
||||
MENU_HideSubPopups( *hwndOwner, hmenuprev, TRUE );
|
||||
*hmenuCurrent = hmenuprev;
|
||||
}
|
||||
}
|
||||
|
@ -1510,8 +1576,7 @@ static void MENU_KeyRight( HWND hwndOwner, HMENU hmenu, HMENU *hmenuCurrent )
|
|||
static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, int x, int y,
|
||||
HWND hwnd, const RECT16 *lprect )
|
||||
{
|
||||
MSG16 *msg;
|
||||
HLOCAL16 hMsg;
|
||||
MSG16 msg;
|
||||
POPUPMENU *menu;
|
||||
HMENU hmenuCurrent = hmenu;
|
||||
BOOL fClosed = FALSE, fRemove;
|
||||
|
@ -1525,23 +1590,20 @@ static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, int x, int y,
|
|||
MENU_ButtonDown( hwnd, hmenu, &hmenuCurrent, pt );
|
||||
}
|
||||
SetCapture( hwnd );
|
||||
hMsg = USER_HEAP_ALLOC( sizeof(MSG16) );
|
||||
msg = (MSG16 *)USER_HEAP_LIN_ADDR( hMsg );
|
||||
while (!fClosed)
|
||||
{
|
||||
if (!MSG_InternalGetMessage( (SEGPTR)USER_HEAP_SEG_ADDR(hMsg), 0,
|
||||
hwnd, MSGF_MENU, 0, TRUE ))
|
||||
if (!MSG_InternalGetMessage( &msg, 0, hwnd, MSGF_MENU, 0, TRUE ))
|
||||
break;
|
||||
|
||||
TranslateMessage( msg );
|
||||
TranslateMessage( &msg );
|
||||
|
||||
fRemove = FALSE;
|
||||
if ((msg->message >= WM_MOUSEFIRST) && (msg->message <= WM_MOUSELAST))
|
||||
if ((msg.message >= WM_MOUSEFIRST) && (msg.message <= WM_MOUSELAST))
|
||||
{
|
||||
/* Find the sub-popup for this mouse event (if any) */
|
||||
HMENU hsubmenu = MENU_FindMenuByCoords( hmenu, msg->pt );
|
||||
HMENU hsubmenu = MENU_FindMenuByCoords( hmenu, msg.pt );
|
||||
|
||||
switch(msg->message)
|
||||
switch(msg.message)
|
||||
{
|
||||
case WM_RBUTTONDOWN:
|
||||
case WM_NCRBUTTONDOWN:
|
||||
|
@ -1550,7 +1612,7 @@ static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, int x, int y,
|
|||
case WM_LBUTTONDOWN:
|
||||
case WM_NCLBUTTONDOWN:
|
||||
fClosed = !MENU_ButtonDown( hwnd, hsubmenu,
|
||||
&hmenuCurrent, msg->pt );
|
||||
&hmenuCurrent, msg.pt );
|
||||
break;
|
||||
|
||||
case WM_RBUTTONUP:
|
||||
|
@ -1560,59 +1622,56 @@ static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, int x, int y,
|
|||
case WM_LBUTTONUP:
|
||||
case WM_NCLBUTTONUP:
|
||||
/* If outside all menus but inside lprect, ignore it */
|
||||
if (!hsubmenu && lprect && PtInRect16(lprect, msg->pt)) break;
|
||||
if (!hsubmenu && lprect && PtInRect16(lprect, msg.pt)) break;
|
||||
fClosed = !MENU_ButtonUp( hwnd, hsubmenu,
|
||||
&hmenuCurrent, msg->pt );
|
||||
&hmenuCurrent, msg.pt );
|
||||
fRemove = TRUE; /* Remove event even if outside menu */
|
||||
break;
|
||||
|
||||
case WM_MOUSEMOVE:
|
||||
case WM_NCMOUSEMOVE:
|
||||
if ((msg->wParam & MK_LBUTTON) ||
|
||||
((wFlags & TPM_RIGHTBUTTON) && (msg->wParam & MK_RBUTTON)))
|
||||
if ((msg.wParam & MK_LBUTTON) ||
|
||||
((wFlags & TPM_RIGHTBUTTON) && (msg.wParam & MK_RBUTTON)))
|
||||
{
|
||||
fClosed = !MENU_MouseMove( hwnd, hsubmenu,
|
||||
&hmenuCurrent, msg->pt );
|
||||
&hmenuCurrent, msg.pt );
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if ((msg->message >= WM_KEYFIRST) && (msg->message <= WM_KEYLAST))
|
||||
else if ((msg.message >= WM_KEYFIRST) && (msg.message <= WM_KEYLAST))
|
||||
{
|
||||
fRemove = TRUE; /* Keyboard messages are always removed */
|
||||
switch(msg->message)
|
||||
switch(msg.message)
|
||||
{
|
||||
case WM_KEYDOWN:
|
||||
switch(msg->wParam)
|
||||
switch(msg.wParam)
|
||||
{
|
||||
case VK_HOME:
|
||||
MENU_SelectItem( hwnd, hmenuCurrent, NO_SELECTED_ITEM, FALSE );
|
||||
MENU_SelectNextItem( hwnd, hmenuCurrent );
|
||||
break;
|
||||
|
||||
case VK_END:
|
||||
MENU_SelectItem( hwnd, hmenuCurrent, NO_SELECTED_ITEM, FALSE );
|
||||
MENU_SelectPrevItem( hwnd, hmenuCurrent );
|
||||
break;
|
||||
|
||||
/* fall through */
|
||||
case VK_UP:
|
||||
MENU_SelectPrevItem( hwnd, hmenuCurrent );
|
||||
MENU_SelectItemRel( hwnd, hmenuCurrent,
|
||||
(msg.wParam == VK_HOME)? ITEM_NEXT : ITEM_PREV );
|
||||
break;
|
||||
|
||||
case VK_DOWN:
|
||||
/* If on menu bar, pull-down the menu */
|
||||
case VK_DOWN: /* If on menu bar, pull-down the menu */
|
||||
|
||||
menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( hmenu );
|
||||
if (!(menu->wFlags & MF_POPUP) && (hmenuCurrent == hmenu))
|
||||
hmenuCurrent = MENU_ShowSubPopup( hwnd, hmenu, TRUE );
|
||||
else
|
||||
MENU_SelectNextItem( hwnd, hmenuCurrent );
|
||||
MENU_SelectItemRel( hwnd, hmenuCurrent, ITEM_NEXT );
|
||||
break;
|
||||
|
||||
case VK_LEFT:
|
||||
MENU_KeyLeft( hwnd, hmenu, &hmenuCurrent );
|
||||
MENU_KeyLeft( &hwnd, &hmenu, &hmenuCurrent );
|
||||
break;
|
||||
|
||||
case VK_RIGHT:
|
||||
MENU_KeyRight( hwnd, hmenu, &hmenuCurrent );
|
||||
MENU_KeyRight( &hwnd, &hmenu, &hmenuCurrent );
|
||||
break;
|
||||
|
||||
case VK_SPACE:
|
||||
|
@ -1631,7 +1690,7 @@ static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, int x, int y,
|
|||
break; /* WM_KEYDOWN */
|
||||
|
||||
case WM_SYSKEYDOWN:
|
||||
switch(msg->wParam)
|
||||
switch(msg.wParam)
|
||||
{
|
||||
case VK_MENU:
|
||||
fClosed = TRUE;
|
||||
|
@ -1644,8 +1703,8 @@ static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, int x, int y,
|
|||
{
|
||||
/* Hack to avoid control chars. */
|
||||
/* We will find a better way real soon... */
|
||||
if ((msg->wParam <= 32) || (msg->wParam >= 127)) break;
|
||||
pos = MENU_FindItemByKey( hwnd, hmenuCurrent, msg->wParam );
|
||||
if ((msg.wParam <= 32) || (msg.wParam >= 127)) break;
|
||||
pos = MENU_FindItemByKey( hwnd, hmenuCurrent, msg.wParam );
|
||||
if (pos == (UINT)-2) fClosed = TRUE;
|
||||
else if (pos == (UINT)-1) MessageBeep(0);
|
||||
else
|
||||
|
@ -1657,22 +1716,23 @@ static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, int x, int y,
|
|||
}
|
||||
}
|
||||
break; /* WM_CHAR */
|
||||
} /* switch(msg->message) */
|
||||
} /* switch(msg.message) */
|
||||
}
|
||||
else
|
||||
{
|
||||
DispatchMessage( msg );
|
||||
DispatchMessage( &msg );
|
||||
}
|
||||
if (fEndMenuCalled) fClosed = TRUE;
|
||||
if (!fClosed) fRemove = TRUE;
|
||||
|
||||
if (fRemove) /* Remove the message from the queue */
|
||||
PeekMessage16( msg, 0, msg->message, msg->message, PM_REMOVE );
|
||||
PeekMessage16( &msg, 0, msg.message, msg.message, PM_REMOVE );
|
||||
}
|
||||
USER_HEAP_FREE( hMsg );
|
||||
|
||||
ReleaseCapture();
|
||||
MENU_HideSubPopups( hwnd, hmenu, FALSE );
|
||||
if (menu->wFlags & MF_POPUP)
|
||||
menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( hmenu );
|
||||
if (menu && menu->wFlags & MF_POPUP)
|
||||
{
|
||||
ShowWindow( menu->hWnd, SW_HIDE );
|
||||
uSubPWndLevel = 0;
|
||||
|
@ -1756,7 +1816,7 @@ void MENU_TrackKbdMenuBar( WND* wndPtr, UINT wParam, INT vkey)
|
|||
|
||||
MENU_SelectItem( wndPtr->hwndSelf, hTrackMenu, uItem, TRUE );
|
||||
if( uItem == NO_SELECTED_ITEM )
|
||||
MENU_SelectNextItem( wndPtr->hwndSelf, hTrackMenu );
|
||||
MENU_SelectItemRel( wndPtr->hwndSelf, hTrackMenu, ITEM_NEXT );
|
||||
else
|
||||
PostMessage( wndPtr->hwndSelf, WM_KEYDOWN, VK_DOWN, 0L );
|
||||
|
||||
|
|
|
@ -8,7 +8,6 @@
|
|||
#include <stdio.h>
|
||||
#include <windows.h>
|
||||
#include "win.h"
|
||||
#include "user.h"
|
||||
#include "static.h"
|
||||
|
||||
static void STATIC_PaintTextfn( WND *wndPtr, HDC hdc );
|
||||
|
|
|
@ -13,7 +13,6 @@
|
|||
#include "desktop.h"
|
||||
#include "mdi.h"
|
||||
#include "gdi.h"
|
||||
#include "user.h"
|
||||
#include "module.h"
|
||||
#include "heap.h"
|
||||
|
||||
|
|
|
@ -63,10 +63,11 @@ BYTE DOS_ErrorLocus;
|
|||
* (i.e. contains only valid DOS chars, lower-case only, fits in 8.3 format).
|
||||
* File name can be terminated by '\0', '\\' or '/'.
|
||||
*/
|
||||
static int DOSFS_ValidDOSName( const char *name )
|
||||
static int DOSFS_ValidDOSName( const char *name, int ignore_case )
|
||||
{
|
||||
static const char invalid_chars[] = INVALID_DOS_CHARS "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||
static const char invalid_chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" INVALID_DOS_CHARS;
|
||||
const char *p = name;
|
||||
const char *invalid = ignore_case ? (invalid_chars + 26) : invalid_chars;
|
||||
int len = 0;
|
||||
|
||||
if (*p == '.')
|
||||
|
@ -79,7 +80,7 @@ static int DOSFS_ValidDOSName( const char *name )
|
|||
}
|
||||
while (!IS_END_OF_NAME(*p))
|
||||
{
|
||||
if (strchr( invalid_chars, *p )) return 0; /* Invalid char */
|
||||
if (strchr( invalid, *p )) return 0; /* Invalid char */
|
||||
if (*p == '.') break; /* Start of the extension */
|
||||
if (++len > 8) return 0; /* Name too long */
|
||||
p++;
|
||||
|
@ -90,7 +91,7 @@ static int DOSFS_ValidDOSName( const char *name )
|
|||
len = 0;
|
||||
while (!IS_END_OF_NAME(*p))
|
||||
{
|
||||
if (strchr( invalid_chars, *p )) return 0; /* Invalid char */
|
||||
if (strchr( invalid, *p )) return 0; /* Invalid char */
|
||||
if (*p == '.') return 0; /* Second extension not allowed */
|
||||
if (++len > 3) return 0; /* Extension too long */
|
||||
p++;
|
||||
|
@ -280,7 +281,7 @@ void DOSFS_ToDosDateTime( time_t unixtime, WORD *pDate, WORD *pTime )
|
|||
* hashed version that fits in 8.3 format.
|
||||
* File name can be terminated by '\0', '\\' or '/'.
|
||||
*/
|
||||
const char *DOSFS_Hash( const char *name, int dir_format )
|
||||
const char *DOSFS_Hash( const char *name, int dir_format, int ignore_case )
|
||||
{
|
||||
static const char invalid_chars[] = INVALID_DOS_CHARS "~.";
|
||||
static const char hash_chars[32] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ012345";
|
||||
|
@ -293,7 +294,7 @@ const char *DOSFS_Hash( const char *name, int dir_format )
|
|||
|
||||
if (dir_format) strcpy( buffer, " " );
|
||||
|
||||
if (DOSFS_ValidDOSName( name ))
|
||||
if (DOSFS_ValidDOSName( name, ignore_case ))
|
||||
{
|
||||
/* Check for '.' and '..' */
|
||||
if (*name == '.')
|
||||
|
@ -322,10 +323,19 @@ const char *DOSFS_Hash( const char *name, int dir_format )
|
|||
/* Compute the hash code of the file name */
|
||||
/* If you know something about hash functions, feel free to */
|
||||
/* insert a better algorithm here... */
|
||||
for (p = name, hash = 0xbeef; !IS_END_OF_NAME(p[1]); p++)
|
||||
hash = (hash << 3) ^ (hash >> 5) ^ *p ^ (p[1] << 8);
|
||||
hash = (hash << 3) ^ (hash >> 5) ^ *p; /* Last character */
|
||||
|
||||
if (ignore_case)
|
||||
{
|
||||
for (p = name, hash = 0xbeef; !IS_END_OF_NAME(p[1]); p++)
|
||||
hash = (hash << 3) ^ (hash >> 5) ^ tolower(*p) ^ (tolower(p[1]) << 8);
|
||||
hash = (hash << 3) ^ (hash >> 5) ^ tolower(*p); /* Last character*/
|
||||
}
|
||||
else
|
||||
{
|
||||
for (p = name, hash = 0xbeef; !IS_END_OF_NAME(p[1]); p++)
|
||||
hash = (hash << 3) ^ (hash >> 5) ^ *p ^ (p[1] << 8);
|
||||
hash = (hash << 3) ^ (hash >> 5) ^ *p; /* Last character */
|
||||
}
|
||||
|
||||
/* Find last dot for start of the extension */
|
||||
for (p = name+1, ext = NULL; !IS_END_OF_NAME(*p); p++)
|
||||
if (*p == '.') ext = p;
|
||||
|
@ -368,7 +378,7 @@ const char *DOSFS_Hash( const char *name, int dir_format )
|
|||
* Return 1 if OK, 0 if no file name matches.
|
||||
*/
|
||||
static int DOSFS_FindUnixName( const char *path, const char *name,
|
||||
char *buffer, int maxlen )
|
||||
char *buffer, int maxlen, UINT32 drive_flags )
|
||||
{
|
||||
DIR *dir;
|
||||
struct dirent *dirent;
|
||||
|
@ -390,12 +400,22 @@ static int DOSFS_FindUnixName( const char *path, const char *name,
|
|||
while ((dirent = readdir( dir )) != NULL)
|
||||
{
|
||||
/* Check against Unix name */
|
||||
if ((len == strlen(dirent->d_name) &&
|
||||
!memcmp( dirent->d_name, name, len ))) break;
|
||||
if (len == strlen(dirent->d_name))
|
||||
{
|
||||
if (drive_flags & DRIVE_CASE_SENSITIVE)
|
||||
{
|
||||
if (!lstrncmp32A( dirent->d_name, name, len )) break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!lstrncmpi32A( dirent->d_name, name, len )) break;
|
||||
}
|
||||
}
|
||||
if (dos_name)
|
||||
{
|
||||
/* Check against hashed DOS name */
|
||||
const char *hash_name = DOSFS_Hash( dirent->d_name, TRUE );
|
||||
const char *hash_name = DOSFS_Hash( dirent->d_name, TRUE,
|
||||
!(drive_flags & DRIVE_CASE_SENSITIVE) );
|
||||
if (!strcmp( dos_name, hash_name )) break;
|
||||
}
|
||||
}
|
||||
|
@ -445,6 +465,7 @@ const char * DOSFS_GetUnixFileName( const char * name, int check_last )
|
|||
{
|
||||
static char buffer[MAX_PATHNAME_LEN];
|
||||
int drive, len, found;
|
||||
UINT32 flags;
|
||||
char *p, *root;
|
||||
|
||||
dprintf_dosfs( stddeb, "DOSFS_GetUnixFileName: %s\n", name );
|
||||
|
@ -470,6 +491,7 @@ const char * DOSFS_GetUnixFileName( const char * name, int check_last )
|
|||
DOS_ERROR( ER_InvalidDrive, EC_MediaError, SA_Abort, EL_Disk );
|
||||
return NULL;
|
||||
}
|
||||
flags = DRIVE_GetFlags(drive);
|
||||
lstrcpyn32A( buffer, DRIVE_GetRoot(drive), MAX_PATHNAME_LEN );
|
||||
if (buffer[1]) root = buffer + strlen(buffer);
|
||||
else root = buffer; /* root directory */
|
||||
|
@ -502,7 +524,7 @@ const char * DOSFS_GetUnixFileName( const char * name, int check_last )
|
|||
DOS_ERROR( ER_PathNotFound, EC_NotFound, SA_Abort, EL_Disk );
|
||||
return NULL;
|
||||
}
|
||||
if ((found = DOSFS_FindUnixName( buffer, name, p+1, len-1 )))
|
||||
if ((found = DOSFS_FindUnixName( buffer, name, p+1, len-1, flags )))
|
||||
{
|
||||
*p = '/';
|
||||
len -= strlen(p);
|
||||
|
@ -548,6 +570,7 @@ const char * DOSFS_GetDosTrueName( const char *name, int unix_format )
|
|||
{
|
||||
static char buffer[MAX_PATHNAME_LEN];
|
||||
int drive, len;
|
||||
UINT32 flags;
|
||||
char *p;
|
||||
|
||||
dprintf_dosfs( stddeb, "DOSFS_GetDosTrueName(%s,%d)\n", name, unix_format);
|
||||
|
@ -589,6 +612,7 @@ const char * DOSFS_GetDosTrueName( const char *name, int unix_format )
|
|||
}
|
||||
*p = '\0';
|
||||
len = MAX_PATHNAME_LEN - (int)(p - buffer);
|
||||
flags = DRIVE_GetFlags(drive);
|
||||
|
||||
while (*name)
|
||||
{
|
||||
|
@ -607,7 +631,9 @@ const char * DOSFS_GetDosTrueName( const char *name, int unix_format )
|
|||
*p++ = '\\';
|
||||
if (unix_format) /* Hash it into a DOS name */
|
||||
{
|
||||
lstrcpyn32A( p, DOSFS_Hash( name, FALSE ), len );
|
||||
lstrcpyn32A( p, DOSFS_Hash( name, FALSE,
|
||||
!(flags & DRIVE_CASE_SENSITIVE) ),
|
||||
len );
|
||||
len -= strlen(p);
|
||||
p += strlen(p);
|
||||
while (!IS_END_OF_NAME(*name)) name++;
|
||||
|
@ -651,7 +677,8 @@ int DOSFS_FindNext( const char *path, const char *mask, int drive,
|
|||
static int drive_root = 0;
|
||||
char *p;
|
||||
const char *hash_name;
|
||||
|
||||
UINT32 flags;
|
||||
|
||||
if ((attr & ~(FA_UNUSED | FA_ARCHIVE | FA_RDONLY)) == FA_LABEL)
|
||||
{
|
||||
if (skip) return 0;
|
||||
|
@ -686,12 +713,14 @@ int DOSFS_FindNext( const char *path, const char *mask, int drive,
|
|||
strcat( buffer, "/" );
|
||||
p = buffer + strlen(buffer);
|
||||
attr |= FA_UNUSED | FA_ARCHIVE | FA_RDONLY;
|
||||
flags = DRIVE_GetFlags( drive );
|
||||
|
||||
while ((dirent = readdir( dir )) != NULL)
|
||||
{
|
||||
if (skip-- > 0) continue;
|
||||
count++;
|
||||
hash_name = DOSFS_Hash( dirent->d_name, TRUE );
|
||||
hash_name = DOSFS_Hash( dirent->d_name, TRUE,
|
||||
!(flags & DRIVE_CASE_SENSITIVE) );
|
||||
if (!DOSFS_Match( mask, hash_name )) continue;
|
||||
/* Don't return '.' and '..' in the root of the drive */
|
||||
if (drive_root && (dirent->d_name[0] == '.') &&
|
||||
|
@ -708,6 +737,7 @@ int DOSFS_FindNext( const char *path, const char *mask, int drive,
|
|||
if (entry->attr & ~attr) continue;
|
||||
strcpy( entry->name, hash_name );
|
||||
lstrcpyn32A( entry->unixname, dirent->d_name, sizeof(entry->unixname));
|
||||
if (!(flags & DRIVE_CASE_PRESERVING)) AnsiLower( entry->unixname );
|
||||
dprintf_dosfs( stddeb, "DOSFS_FindNext: returning %s %02x %ld\n",
|
||||
entry->name, entry->attr, entry->size );
|
||||
cur_pos += count;
|
||||
|
@ -730,7 +760,7 @@ DWORD GetShortPathName32A( LPCSTR longpath, LPSTR shortpath, DWORD shortlen )
|
|||
dprintf_dosfs( stddeb, "GetShortPathName32A(%s,%p,%ld)\n",
|
||||
longpath, shortpath, shortlen );
|
||||
|
||||
dostruename = DOSFS_GetDosTrueName( longpath, 0 );
|
||||
dostruename = DOSFS_GetDosTrueName( longpath, TRUE );
|
||||
lstrcpyn32A( shortpath, dostruename, shortlen );
|
||||
return strlen(dostruename);
|
||||
}
|
||||
|
@ -742,7 +772,7 @@ DWORD GetShortPathName32A( LPCSTR longpath, LPSTR shortpath, DWORD shortlen )
|
|||
DWORD GetShortPathName32W( LPCWSTR longpath, LPWSTR shortpath, DWORD shortlen )
|
||||
{
|
||||
LPSTR longpatha = STRING32_DupUniToAnsi( longpath );
|
||||
LPCSTR dostruename = DOSFS_GetDosTrueName( longpatha, 0 );
|
||||
LPCSTR dostruename = DOSFS_GetDosTrueName( longpatha, TRUE );
|
||||
free( longpatha );
|
||||
lstrcpynAtoW( shortpath, dostruename, shortlen );
|
||||
return strlen(dostruename);
|
||||
|
|
|
@ -44,11 +44,11 @@ typedef struct
|
|||
char label[12]; /* drive label */
|
||||
DWORD serial; /* drive serial number */
|
||||
DRIVETYPE type; /* drive type */
|
||||
BYTE disabled; /* disabled flag */
|
||||
UINT32 flags; /* drive flags */
|
||||
} DOSDRIVE;
|
||||
|
||||
|
||||
static const char *DRIVE_Types[] =
|
||||
static const char * const DRIVE_Types[] =
|
||||
{
|
||||
"floppy", /* TYPE_FLOPPY */
|
||||
"hd", /* TYPE_HD */
|
||||
|
@ -57,6 +57,26 @@ static const char *DRIVE_Types[] =
|
|||
};
|
||||
|
||||
|
||||
/* Known filesystem types */
|
||||
|
||||
typedef struct
|
||||
{
|
||||
const char *name;
|
||||
UINT32 flags;
|
||||
} FS_DESCR;
|
||||
|
||||
static const FS_DESCR DRIVE_Filesystems[] =
|
||||
{
|
||||
{ "unix", DRIVE_CASE_SENSITIVE | DRIVE_CASE_PRESERVING },
|
||||
{ "msdos", DRIVE_SHORT_NAMES },
|
||||
{ "dos", DRIVE_SHORT_NAMES },
|
||||
{ "fat", DRIVE_SHORT_NAMES },
|
||||
{ "vfat", DRIVE_CASE_PRESERVING },
|
||||
{ "win95", DRIVE_CASE_PRESERVING },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
|
||||
static DOSDRIVE DOSDrives[MAX_DOS_DRIVES];
|
||||
static int DRIVE_CurDrive = -1;
|
||||
|
||||
|
@ -82,6 +102,21 @@ static DRIVETYPE DRIVE_GetDriveType( const char *name )
|
|||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* DRIVE_GetFSFlags
|
||||
*/
|
||||
static UINT32 DRIVE_GetFSFlags( const char *name, const char *value )
|
||||
{
|
||||
const FS_DESCR *descr;
|
||||
|
||||
for (descr = DRIVE_Filesystems; descr->name; descr++)
|
||||
if (!lstrcmpi32A( value, descr->name )) return descr->flags;
|
||||
fprintf( stderr, "%s: unknown filesystem type '%s', defaulting to 'unix'.\n",
|
||||
name, value );
|
||||
return DRIVE_CASE_SENSITIVE | DRIVE_CASE_PRESERVING;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* DRIVE_Init
|
||||
*/
|
||||
|
@ -105,7 +140,7 @@ int DRIVE_Init(void)
|
|||
drive->dos_cwd = xstrdup( "" );
|
||||
drive->unix_cwd = xstrdup( "" );
|
||||
drive->type = DRIVE_GetDriveType( name );
|
||||
drive->disabled = 0;
|
||||
drive->flags = 0;
|
||||
|
||||
/* Get the drive label */
|
||||
PROFILE_GetWineIniString( name, "Label", name, drive->label, 12 );
|
||||
|
@ -121,14 +156,19 @@ int DRIVE_Init(void)
|
|||
buffer, sizeof(buffer) );
|
||||
drive->serial = strtoul( buffer, NULL, 16 );
|
||||
|
||||
/* Get the filesystem type */
|
||||
PROFILE_GetWineIniString( name, "Filesystem", "unix",
|
||||
buffer, sizeof(buffer) );
|
||||
drive->flags = DRIVE_GetFSFlags( name, buffer );
|
||||
|
||||
/* Make the first hard disk the current drive */
|
||||
if ((DRIVE_CurDrive == -1) && (drive->type == TYPE_HD))
|
||||
DRIVE_CurDrive = i;
|
||||
|
||||
count++;
|
||||
dprintf_dosfs( stddeb, "%s: path=%s type=%s label='%s' serial=%08lx\n",
|
||||
dprintf_dosfs( stddeb, "%s: path=%s type=%s label='%s' serial=%08lx flags=%08x\n",
|
||||
name, path, DRIVE_Types[drive->type],
|
||||
drive->label, drive->serial );
|
||||
drive->label, drive->serial, drive->flags );
|
||||
}
|
||||
else dprintf_dosfs( stddeb, "%s: not defined\n", name );
|
||||
}
|
||||
|
@ -143,7 +183,7 @@ int DRIVE_Init(void)
|
|||
strcpy( DOSDrives[2].label, "Drive C " );
|
||||
DOSDrives[2].serial = 0x12345678;
|
||||
DOSDrives[2].type = TYPE_HD;
|
||||
DOSDrives[2].disabled = 0;
|
||||
DOSDrives[2].flags = 0;
|
||||
DRIVE_CurDrive = 2;
|
||||
}
|
||||
|
||||
|
@ -152,7 +192,7 @@ int DRIVE_Init(void)
|
|||
{
|
||||
for (i = 0, drive = DOSDrives; i < MAX_DOS_DRIVES; i++, drive++)
|
||||
{
|
||||
if (drive->root && !drive->disabled)
|
||||
if (drive->root && !(drive->flags & DRIVE_DISABLED))
|
||||
{
|
||||
DRIVE_CurDrive = i;
|
||||
break;
|
||||
|
@ -170,7 +210,8 @@ int DRIVE_Init(void)
|
|||
int DRIVE_IsValid( int drive )
|
||||
{
|
||||
if ((drive < 0) || (drive >= MAX_DOS_DRIVES)) return 0;
|
||||
return (DOSDrives[drive].root && !DOSDrives[drive].disabled);
|
||||
return (DOSDrives[drive].root &&
|
||||
!(DOSDrives[drive].flags & DRIVE_DISABLED));
|
||||
}
|
||||
|
||||
|
||||
|
@ -221,7 +262,8 @@ int DRIVE_FindDriveRoot( const char **path )
|
|||
dprintf_dosfs( stddeb, "DRIVE_FindDriveRoot: searching '%s'\n", *path );
|
||||
for (drive = 0; drive < MAX_DOS_DRIVES; drive++)
|
||||
{
|
||||
if (!DOSDrives[drive].root || DOSDrives[drive].disabled) continue;
|
||||
if (!DOSDrives[drive].root ||
|
||||
(DOSDrives[drive].flags & DRIVE_DISABLED)) continue;
|
||||
p1 = *path;
|
||||
p2 = DOSDrives[drive].root;
|
||||
dprintf_dosfs( stddeb, "DRIVE_FindDriveRoot: checking %c: '%s'\n",
|
||||
|
@ -351,6 +393,16 @@ DRIVETYPE DRIVE_GetType( int drive )
|
|||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* DRIVE_GetFlags
|
||||
*/
|
||||
UINT32 DRIVE_GetFlags( int drive )
|
||||
{
|
||||
if ((drive < 0) || (drive >= MAX_DOS_DRIVES)) return 0;
|
||||
return DOSDrives[drive].flags;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* DRIVE_Chdir
|
||||
*/
|
||||
|
@ -407,7 +459,7 @@ int DRIVE_Disable( int drive )
|
|||
DOS_ERROR( ER_InvalidDrive, EC_MediaError, SA_Abort, EL_Disk );
|
||||
return 0;
|
||||
}
|
||||
DOSDrives[drive].disabled = 1;
|
||||
DOSDrives[drive].flags |= DRIVE_DISABLED;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -422,7 +474,7 @@ int DRIVE_Enable( int drive )
|
|||
DOS_ERROR( ER_InvalidDrive, EC_MediaError, SA_Abort, EL_Disk );
|
||||
return 0;
|
||||
}
|
||||
DOSDrives[drive].disabled = 0;
|
||||
DOSDrives[drive].flags &= ~DRIVE_DISABLED;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -853,8 +853,12 @@ DWORD SearchPath32A(
|
|||
strcat(testpath,name);
|
||||
if ((unixName=DOSFS_GetUnixFileName((LPCSTR)testpath,TRUE))!=NULL) {
|
||||
goto found;
|
||||
} else
|
||||
} else {
|
||||
strcpy(testpath,name);
|
||||
if ((unixName=DOSFS_GetUnixFileName((LPCSTR)testpath,TRUE))!=NULL)
|
||||
goto found;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if ((len=sizeof(testpath)-strlen(name)-1)<0)
|
||||
return 0;
|
||||
|
|
|
@ -199,15 +199,15 @@ base 1
|
|||
194 stub _mbctoupper
|
||||
195 stub _mbctype
|
||||
196 stub _mbsbtype
|
||||
197 stub _mbscat
|
||||
197 cdecl _mbscat(ptr ptr) CRTDLL__mbscat
|
||||
198 stub _mbschr
|
||||
199 stub _mbscmp
|
||||
200 stub _mbscpy
|
||||
200 cdecl _mbscpy(ptr ptr) CRTDLL__mbscpy
|
||||
201 stub _mbscspn
|
||||
202 stub _mbsdec
|
||||
203 stub _mbsdup
|
||||
204 stub _mbsicmp
|
||||
205 stub _mbsinc
|
||||
204 cdecl _mbsicmp(ptr ptr) CRTDLL__mbsicmp
|
||||
205 cdecl _mbsinc(ptr) CRTDLL__mbsinc
|
||||
206 stub _mbslen
|
||||
207 stub _mbslwr
|
||||
208 stub _mbsnbcat
|
||||
|
@ -502,7 +502,7 @@ base 1
|
|||
497 stub vfprintf
|
||||
498 stub vfwprintf
|
||||
499 stub vprintf
|
||||
500 stub vsprintf
|
||||
500 cdecl vsprintf() CRTDLL_vsprintf
|
||||
501 stub vswprintf
|
||||
502 stub vwprintf
|
||||
503 stub wcscat
|
||||
|
|
|
@ -58,7 +58,7 @@ base 1
|
|||
0051 stub CreateMetaFileA
|
||||
0052 stub CreateMetaFileW
|
||||
0053 stdcall CreatePalette(ptr) CreatePalette
|
||||
0054 stub CreatePatternBrush
|
||||
0054 stdcall CreatePatternBrush(long) CreatePatternBrush
|
||||
0055 stdcall CreatePen(long long long) CreatePen
|
||||
0056 stub CreatePenIndirect
|
||||
0057 stub CreatePolyPolygonRgn
|
||||
|
|
|
@ -27,7 +27,7 @@ type win16
|
|||
24 pascal16 UnlockSegment(word) UnlockSegment16
|
||||
25 pascal GlobalCompact(long) GlobalCompact16
|
||||
26 pascal16 GlobalFreeAll(word) GlobalFreeAll
|
||||
27 stub GetModuleName
|
||||
27 pascal16 GetModuleName(word ptr word) GetModuleName
|
||||
28 stub GlobalMasterHandle
|
||||
29 pascal16 Yield() Yield
|
||||
30 pascal16 WaitEvent(word) WaitEvent
|
||||
|
|
|
@ -232,7 +232,7 @@ base 1
|
|||
0227 stdcall GetLastError() GetLastError
|
||||
0228 stdcall GetLocalTime(ptr) GetLocalTime
|
||||
0229 stdcall GetLocaleInfoA(long long ptr long) GetLocaleInfoA
|
||||
0230 stub GetLocaleInfoW
|
||||
0230 stdcall GetLocaleInfoW(long long ptr long) GetLocaleInfo32W
|
||||
0231 stdcall GetLogicalDriveStringsA(long ptr) GetLogicalDriveStrings32A
|
||||
0232 stdcall GetLogicalDriveStringsW(long ptr) GetLogicalDriveStrings32W
|
||||
0233 stdcall GetLogicalDrives() GetLogicalDrives
|
||||
|
@ -637,3 +637,5 @@ base 1
|
|||
0631 stub WritePrivateProfileStructA
|
||||
0632 stub WritePrivateProfileStructW
|
||||
0633 stub MakeCriticalSectionGlobal
|
||||
#extra late additions
|
||||
0634 stdcall ThunkConnect32(ptr ptr ptr ptr ptr ptr) ThunkConnect32
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
|
||||
#include "windows.h"
|
||||
#include "callback.h"
|
||||
#include "stddebug.h"
|
||||
#include "debug.h"
|
||||
#include "heap.h"
|
||||
|
||||
typedef void (*RELAY)();
|
||||
|
@ -248,3 +250,31 @@ BOOL16 THUNK_GrayString16( HDC16 hdc, HBRUSH16 hbr, GRAYSTRINGPROC16 func,
|
|||
x, y, cx, cy );
|
||||
}
|
||||
|
||||
|
||||
struct thunkstruct
|
||||
{
|
||||
char magic[4];
|
||||
DWORD x1;
|
||||
DWORD x2;
|
||||
};
|
||||
|
||||
UINT32 ThunkConnect32( struct thunkstruct *ths, LPSTR thunkfun16,
|
||||
LPSTR module16, LPSTR module32, HMODULE32 hmod32,
|
||||
DWORD dllinitarg1 )
|
||||
{
|
||||
HINSTANCE16 hmm;
|
||||
|
||||
fprintf(stdnimp,"ThunkConnect32(<struct>,%s,%s,%s,%lx,%lx)\n",
|
||||
thunkfun16,module32,module16,hmod32,dllinitarg1
|
||||
);
|
||||
fprintf(stdnimp," magic = %c%c%c%c\n",
|
||||
ths->magic[0],
|
||||
ths->magic[1],
|
||||
ths->magic[2],
|
||||
ths->magic[3]
|
||||
);
|
||||
fprintf(stdnimp," x1 = %lx\n",ths->x1);
|
||||
fprintf(stdnimp," x2 = %lx\n",ths->x2);
|
||||
hmm=LoadModule(module16,NULL);
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
@ -194,7 +194,7 @@ heap 65520
|
|||
192 pascal16 InSendMessage() InSendMessage
|
||||
193 pascal16 IsClipboardFormatAvailable(word) IsClipboardFormatAvailable
|
||||
194 pascal16 DlgDirSelectComboBox(word ptr word) DlgDirSelectComboBox
|
||||
195 pascal16 DlgDirListComboBox(word ptr word word word) DlgDirListComboBox16
|
||||
195 pascal16 DlgDirListComboBox(word segptr word word word) DlgDirListComboBox16
|
||||
196 pascal TabbedTextOut(word s_word s_word ptr s_word s_word ptr s_word)
|
||||
TabbedTextOut
|
||||
197 pascal GetTabbedTextExtent(word ptr word word ptr) GetTabbedTextExtent
|
||||
|
|
|
@ -98,7 +98,7 @@ base 1
|
|||
0091 stub DdeConnect
|
||||
0092 stub DdeConnectList
|
||||
0093 stub DdeCreateDataHandle
|
||||
0094 stub DdeCreateStringHandleA
|
||||
0094 return DdeCreateStringHandleA 12 0
|
||||
0095 stub DdeCreateStringHandleW
|
||||
0096 stub DdeDisconnect
|
||||
0097 stub DdeDisconnectList
|
||||
|
@ -109,10 +109,10 @@ base 1
|
|||
0102 stub DdeGetLastError
|
||||
0103 stub DdeGetQualityOfService
|
||||
0104 stub DdeImpersonateClient
|
||||
0105 stub DdeInitializeA
|
||||
0105 return DdeInitializeA 16 0
|
||||
0106 stub DdeInitializeW
|
||||
0107 stub DdeKeepStringHandle
|
||||
0108 stub DdeNameService
|
||||
0108 return DdeNameService 16 0
|
||||
0109 stub DdePostAdvise
|
||||
0110 stub DdeQueryConvInfo
|
||||
0111 stub DdeQueryNextServer
|
||||
|
@ -145,7 +145,7 @@ base 1
|
|||
0138 stdcall DialogBoxParamA(long ptr long ptr long) DialogBoxParam32A
|
||||
0139 stdcall DialogBoxParamW(long ptr long ptr long) DialogBoxParam32W
|
||||
0140 stdcall DispatchMessageA(ptr) USER32_DispatchMessageA
|
||||
0141 stub DispatchMessageW
|
||||
0141 stdcall DispatchMessageW(ptr) USER32_DispatchMessageA
|
||||
0142 stub DlgDirListA
|
||||
0143 stdcall DlgDirListComboBoxA(long ptr long long long) DlgDirListComboBox32A
|
||||
0144 stdcall DlgDirListComboBoxW(long ptr long long long) DlgDirListComboBox32W
|
||||
|
@ -229,7 +229,7 @@ base 1
|
|||
0222 stub GetClipboardFormatNameA
|
||||
0223 stub GetClipboardFormatNameW
|
||||
0224 stub GetClipboardOwner
|
||||
0225 stub GetClipboardViewer
|
||||
0225 stdcall GetClipboardViewer(long) GetClipboardViewer
|
||||
0226 stub GetCursor
|
||||
0227 stub GetCursorInfo
|
||||
0228 stdcall GetCursorPos(ptr) GetCursorPos32
|
||||
|
@ -277,7 +277,7 @@ base 1
|
|||
0270 stub GetMessageExtraInfo
|
||||
0271 stub GetMessagePos
|
||||
0272 stub GetMessageTime
|
||||
0273 stub GetMessageW
|
||||
0273 stdcall GetMessageW(ptr long long long) USER32_GetMessageA
|
||||
0274 stub GetNextDlgGroupItem
|
||||
0275 stub GetNextDlgTabItem
|
||||
0276 stub GetOpenClipboardWindow
|
||||
|
@ -355,7 +355,7 @@ base 1
|
|||
0348 stdcall IsWindowEnabled(long) IsWindowEnabled
|
||||
0349 stdcall IsWindowUnicode(long) IsWindowUnicode
|
||||
0350 stdcall IsWindowVisible(long) IsWindowVisible
|
||||
0351 stub IsZoomed
|
||||
0351 stdcall IsZoomed(long) IsZoomed
|
||||
0352 stdcall KillSystemTimer(long long) KillSystemTimer32
|
||||
0353 stdcall KillTimer(long long) KillTimer32
|
||||
0354 stdcall LoadAcceleratorsA(long ptr) LoadAccelerators32A
|
||||
|
@ -423,7 +423,7 @@ base 1
|
|||
0416 stdcall PeekMessageW(ptr long long long long) PeekMessage32W
|
||||
0417 stub PlaySoundEvent
|
||||
0418 stdcall PostMessageA(long long long long) PostMessage
|
||||
0419 stub PostMessageW
|
||||
0419 stdcall PostMessageW(long long long long) PostMessage
|
||||
0420 stdcall PostQuitMessage(long) PostQuitMessage
|
||||
0421 stub PostThreadMessageA
|
||||
0422 stub PostThreadMessageW
|
||||
|
@ -474,7 +474,7 @@ base 1
|
|||
0467 stdcall SetClassLongW(long long long) SetClassLong32W
|
||||
0468 stdcall SetClassWord(long long long) SetClassWord
|
||||
0469 stub SetClipboardData
|
||||
0470 stub SetClipboardViewer
|
||||
0470 stdcall SetClipboardViewer(long) SetClipboardViewer
|
||||
0471 stdcall SetCursor(long) SetCursor
|
||||
0472 stub SetCursorContents
|
||||
0473 stub SetCursorPos
|
||||
|
@ -554,9 +554,9 @@ base 1
|
|||
0547 stub ToUnicode
|
||||
0548 stdcall TrackPopupMenu(long long long long long long ptr) TrackPopupMenu32
|
||||
0549 stub TrackPopupMenuEx
|
||||
0550 stub TranslateAccelerator
|
||||
0550 stdcall TranslateAccelerator(long long ptr) TranslateAccelerator
|
||||
0551 stdcall TranslateAcceleratorA(long long ptr) TranslateAccelerator
|
||||
0552 stub TranslateAcceleratorW
|
||||
0552 stdcall TranslateAcceleratorW(long long ptr) TranslateAccelerator
|
||||
0553 stub TranslateCharsetInfo
|
||||
0554 stub TranslateMDISysAccel
|
||||
0555 stdcall TranslateMessage(ptr) USER32_TranslateMessage
|
||||
|
|
|
@ -20,6 +20,13 @@ typedef enum
|
|||
TYPE_INVALID
|
||||
} DRIVETYPE;
|
||||
|
||||
/* Drive flags */
|
||||
|
||||
#define DRIVE_DISABLED 0x0001 /* Drive is disabled */
|
||||
#define DRIVE_SHORT_NAMES 0x0002 /* Drive fs has 8.3 file names */
|
||||
#define DRIVE_CASE_SENSITIVE 0x0004 /* Drive fs is case sensitive */
|
||||
#define DRIVE_CASE_PRESERVING 0x0008 /* Drive fs is case preserving */
|
||||
|
||||
extern int DRIVE_Init(void);
|
||||
extern int DRIVE_IsValid( int drive );
|
||||
extern int DRIVE_GetCurrentDrive(void);
|
||||
|
@ -32,6 +39,7 @@ extern const char * DRIVE_GetLabel( int drive );
|
|||
extern DWORD DRIVE_GetSerialNumber( int drive );
|
||||
extern int DRIVE_SetSerialNumber( int drive, DWORD serial );
|
||||
extern DRIVETYPE DRIVE_GetType( int drive );
|
||||
extern UINT32 DRIVE_GetFlags( int drive );
|
||||
extern int DRIVE_Chdir( int drive, const char *path );
|
||||
extern int DRIVE_Disable( int drive );
|
||||
extern int DRIVE_Enable( int drive );
|
||||
|
|
|
@ -23,6 +23,7 @@ extern UINT16 LOCAL_Flags( HANDLE16 ds, HLOCAL16 handle );
|
|||
extern UINT16 LOCAL_HeapSize( HANDLE16 ds );
|
||||
extern UINT16 LOCAL_CountFree( HANDLE16 ds );
|
||||
extern LPSTR LOCAL_Lock( HANDLE16 ds, HLOCAL16 handle );
|
||||
extern SEGPTR LOCAL_LockSegptr( HANDLE16 ds, HLOCAL16 handle );
|
||||
extern BOOL16 LOCAL_Unlock( HANDLE16 ds, HLOCAL16 handle );
|
||||
|
||||
#endif /* __WINE_LOCAL_H */
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
extern DWORD MSG_WineStartTicks; /* Ticks at Wine startup */
|
||||
|
||||
/* message.c */
|
||||
extern BOOL MSG_InternalGetMessage( SEGPTR msg, HWND hwnd, HWND hwndOwner,
|
||||
extern BOOL MSG_InternalGetMessage( MSG16 *msg, HWND hwnd, HWND hwndOwner,
|
||||
short code, WORD flags, BOOL sendIdle );
|
||||
|
||||
/* timer.c */
|
||||
|
|
|
@ -13,7 +13,7 @@ extern void NC_GetMinMaxInfo( HWND hwnd, POINT16 *maxSize, POINT16 *maxPos,
|
|||
POINT16 *minTrack, POINT16 *maxTrack );
|
||||
extern void NC_DoNCPaint( HWND hwnd, HRGN clip, BOOL suppress_menupaint );
|
||||
extern LONG NC_HandleNCPaint( HWND hwnd , HRGN clip);
|
||||
extern LONG NC_HandleNCActivate( HWND hwnd, WPARAM wParam );
|
||||
extern LONG NC_HandleNCActivate( WND *pwnd, WPARAM wParam );
|
||||
extern LONG NC_HandleNCCalcSize( WND *pWnd, RECT16 *winRect );
|
||||
extern LONG NC_HandleNCHitTest( HWND hwnd, POINT16 pt );
|
||||
extern LONG NC_HandleNCLButtonDown( HWND hwnd, WPARAM wParam, LPARAM lParam );
|
||||
|
|
|
@ -7,6 +7,8 @@
|
|||
#ifndef OPTIONS_H
|
||||
#define OPTIONS_H
|
||||
|
||||
#include "wintypes.h"
|
||||
|
||||
/* Supported languages */
|
||||
typedef enum
|
||||
{
|
||||
|
@ -23,7 +25,13 @@ typedef enum
|
|||
LANG_Ko /* Korean */
|
||||
} WINE_LANGUAGE;
|
||||
|
||||
extern const char *langNames[];
|
||||
typedef struct
|
||||
{
|
||||
const char *name;
|
||||
WORD langid;
|
||||
} WINE_LANGUAGE_DEF;
|
||||
|
||||
extern const WINE_LANGUAGE_DEF Languages[];
|
||||
|
||||
/* Supported modes */
|
||||
typedef enum
|
||||
|
|
|
@ -68,7 +68,7 @@ typedef struct tagMESSAGEQUEUE
|
|||
|
||||
extern void QUEUE_DumpQueue( HQUEUE16 hQueue );
|
||||
extern void QUEUE_WalkQueues(void);
|
||||
extern HQUEUE16 QUEUE_GetDoomedQueue();
|
||||
extern BOOL32 QUEUE_IsDoomedQueue( HQUEUE16 hQueue );
|
||||
extern void QUEUE_SetDoomedQueue( HQUEUE16 hQueue );
|
||||
extern MESSAGEQUEUE *QUEUE_GetSysQueue(void);
|
||||
extern void QUEUE_SetWakeBit( MESSAGEQUEUE *queue, WORD bit );
|
||||
|
|
|
@ -82,23 +82,6 @@ typedef struct sigcontext SIGCONTEXT;
|
|||
#define EDI_reg(context) ((context)->sc_edi)
|
||||
#define EBP_reg(context) ((context)->sc_ebp)
|
||||
|
||||
#define AX_reg(context) (*(WORD*)&((context)->sc_eax))
|
||||
#define BX_reg(context) (*(WORD*)&((context)->sc_ebx))
|
||||
#define CX_reg(context) (*(WORD*)&((context)->sc_ecx))
|
||||
#define DX_reg(context) (*(WORD*)&((context)->sc_edx))
|
||||
#define SI_reg(context) (*(WORD*)&((context)->sc_esi))
|
||||
#define DI_reg(context) (*(WORD*)&((context)->sc_edi))
|
||||
#define BP_reg(context) (*(WORD*)&((context)->sc_ebp))
|
||||
|
||||
#define AL_reg(context) (*(BYTE*)(&(context)->sc_eax))
|
||||
#define AH_reg(context) (*(((BYTE*)(&(context)->sc_eax)+1)))
|
||||
#define BL_reg(context) (*(BYTE*)(&(context)->sc_ebx))
|
||||
#define BH_reg(context) (*(((BYTE*)(&(context)->sc_ebx)+1)))
|
||||
#define CL_reg(context) (*(BYTE*)(&(context)->sc_ecx))
|
||||
#define CH_reg(context) (*(((BYTE*)(&(context)->sc_ecx)+1)))
|
||||
#define DL_reg(context) (*(BYTE*)(&(context)->sc_edx))
|
||||
#define DH_reg(context) (*(((BYTE*)(&(context)->sc_edx)+1)))
|
||||
|
||||
#define CS_reg(context) ((context)->sc_cs)
|
||||
#define DS_reg(context) ((context)->sc_ds)
|
||||
#define ES_reg(context) ((context)->sc_es)
|
||||
|
@ -112,48 +95,26 @@ typedef struct sigcontext SIGCONTEXT;
|
|||
|
||||
#ifndef __FreeBSD__
|
||||
#define EFL_reg(context) ((context)->sc_eflags)
|
||||
#define FL_reg(context) (*(WORD*)(&(context)->sc_eflags))
|
||||
#else
|
||||
#define EFL_reg(context) ((context)->sc_efl)
|
||||
#define FL_reg(context) (*(WORD*)(&(context)->sc_efl))
|
||||
#endif
|
||||
|
||||
#define EIP_reg(context) ((context)->sc_eip)
|
||||
#define ESP_reg(context) ((context)->sc_esp)
|
||||
|
||||
#define IP_reg(context) (*(WORD*)(&(context)->sc_eip))
|
||||
#define SP_reg(context) (*(WORD*)(&(context)->sc_esp))
|
||||
|
||||
#else /* __svr4__ || _SCO_DS */
|
||||
|
||||
#ifdef _SCO_DS
|
||||
#define gregs regs
|
||||
#endif
|
||||
|
||||
#define EAX_reg(context) ((context)->uc_mcontext.gregs[EAX])
|
||||
#define EBX_reg(context) ((context)->uc_mcontext.gregs[EBX])
|
||||
#define ECX_reg(context) ((context)->uc_mcontext.gregs[ECX])
|
||||
#define EDX_reg(context) ((context)->uc_mcontext.gregs[EDX])
|
||||
#define ESI_reg(context) ((context)->uc_mcontext.gregs[ESI])
|
||||
#define EDI_reg(context) ((context)->uc_mcontext.gregs[EDI])
|
||||
#define EBP_reg(context) ((context)->uc_mcontext.gregs[EBP])
|
||||
|
||||
#define AX_reg(context) (*(WORD*)&((context)->uc_mcontext.gregs[EAX]))
|
||||
#define BX_reg(context) (*(WORD*)&((context)->uc_mcontext.gregs[EBX]))
|
||||
#define CX_reg(context) (*(WORD*)&((context)->uc_mcontext.gregs[ECX]))
|
||||
#define DX_reg(context) (*(WORD*)&((context)->uc_mcontext.gregs[EDX]))
|
||||
#define SI_reg(context) (*(WORD*)&((context)->uc_mcontext.gregs[ESI]))
|
||||
#define DI_reg(context) (*(WORD*)&((context)->uc_mcontext.gregs[EDI]))
|
||||
#define BP_reg(context) (*(WORD*)&((context)->uc_mcontext.gregs[EBP]))
|
||||
|
||||
#define AL_reg(context) (*(BYTE*)(&(context)->uc_mcontext.gregs[EAX]))
|
||||
#define AH_reg(context) (*(((BYTE*)(&(context)->uc_mcontext.gregs[EAX])+1)))
|
||||
#define BL_reg(context) (*(BYTE*)(&(context)->uc_mcontext.gregs[EBX]))
|
||||
#define BH_reg(context) (*(((BYTE*)(&(context)->uc_mcontext.gregs[EBX])+1)))
|
||||
#define CL_reg(context) (*(BYTE*)(&(context)->uc_mcontext.gregs[ECX]))
|
||||
#define CH_reg(context) (*(((BYTE*)(&(context)->uc_mcontext.gregs[ECX])+1)))
|
||||
#define DL_reg(context) (*(BYTE*)(&(context)->uc_mcontext.gregs[EDX]))
|
||||
#define DH_reg(context) (*(((BYTE*)(&(context)->uc_mcontext.gregs[EDX])+1)))
|
||||
#define EAX_reg(context) ((context)->uc_mcontext.gregs[EAX])
|
||||
#define EBX_reg(context) ((context)->uc_mcontext.gregs[EBX])
|
||||
#define ECX_reg(context) ((context)->uc_mcontext.gregs[ECX])
|
||||
#define EDX_reg(context) ((context)->uc_mcontext.gregs[EDX])
|
||||
#define ESI_reg(context) ((context)->uc_mcontext.gregs[ESI])
|
||||
#define EDI_reg(context) ((context)->uc_mcontext.gregs[EDI])
|
||||
#define EBP_reg(context) ((context)->uc_mcontext.gregs[EBP])
|
||||
|
||||
#define CS_reg(context) ((context)->uc_mcontext.gregs[CS])
|
||||
#define DS_reg(context) ((context)->uc_mcontext.gregs[DS])
|
||||
|
@ -163,27 +124,39 @@ typedef struct sigcontext SIGCONTEXT;
|
|||
#define FS_reg(context) ((context)->uc_mcontext.gregs[FS])
|
||||
#define GS_reg(context) ((context)->uc_mcontext.gregs[GS])
|
||||
|
||||
|
||||
#define EFL_reg(context) ((context)->uc_mcontext.gregs[EFL])
|
||||
#define FL_reg(context) (*(WORD*)(&(context)->uc_mcontext.gregs[EFL]))
|
||||
|
||||
|
||||
#define EIP_reg(context) ((context)->uc_mcontext.gregs[EIP])
|
||||
#define EIP_reg(context) ((context)->uc_mcontext.gregs[EIP])
|
||||
#ifdef R_ESP
|
||||
#define ESP_reg(context) ((context)->uc_mcontext.gregs[R_ESP])
|
||||
#else
|
||||
#define ESP_reg(context) ((context)->uc_mcontext.gregs[ESP])
|
||||
#endif
|
||||
|
||||
#define IP_reg(context) (*(WORD*)(&(context)->uc_mcontext.gregs[EIP]))
|
||||
#ifdef R_ESP
|
||||
#define SP_reg(context) (*(WORD*)(&(context)->uc_mcontext.gregs[R_ESP]))
|
||||
#else
|
||||
#define SP_reg(context) (*(WORD*)(&(context)->uc_mcontext.gregs[ESP]))
|
||||
#endif
|
||||
|
||||
#endif /* __svr4__ || _SCO_DS */
|
||||
|
||||
#define AX_reg(context) (*(WORD*)&EAX_reg(context))
|
||||
#define BX_reg(context) (*(WORD*)&EBX_reg(context))
|
||||
#define CX_reg(context) (*(WORD*)&ECX_reg(context))
|
||||
#define DX_reg(context) (*(WORD*)&EDX_reg(context))
|
||||
#define SI_reg(context) (*(WORD*)&ESI_reg(context))
|
||||
#define DI_reg(context) (*(WORD*)&EDI_reg(context))
|
||||
#define BP_reg(context) (*(WORD*)&EBP_reg(context))
|
||||
|
||||
#define AL_reg(context) (*(BYTE*)&EAX_reg(context))
|
||||
#define AH_reg(context) (*((BYTE*)&EAX_reg(context)+1))
|
||||
#define BL_reg(context) (*(BYTE*)&EBX_reg(context))
|
||||
#define BH_reg(context) (*((BYTE*)&EBX_reg(context)+1))
|
||||
#define CL_reg(context) (*(BYTE*)&ECX_reg(context))
|
||||
#define CH_reg(context) (*((BYTE*)&ECX_reg(context)+1))
|
||||
#define DL_reg(context) (*(BYTE*)&EDX_reg(context))
|
||||
#define DH_reg(context) (*((BYTE*)&EDX_reg(context)+1))
|
||||
|
||||
#define IP_reg(context) (*(WORD*)&EIP_reg(context))
|
||||
#define SP_reg(context) (*(WORD*)&ESP_reg(context))
|
||||
|
||||
#define FL_reg(context) (*(WORD*)&EFL_reg(context))
|
||||
|
||||
#define SET_CFLAG(context) (EFL_reg(context) |= 0x0001)
|
||||
#define RESET_CFLAG(context) (EFL_reg(context) &= 0xfffffffe)
|
||||
|
||||
|
|
|
@ -61,17 +61,4 @@ extern DWORD IF1632_Original32_esp;
|
|||
|
||||
#define CURRENT_DS (CURRENT_STACK16->ds)
|
||||
|
||||
#ifndef WINELIB
|
||||
/* Make a segmented pointer from a pointer to a variable located */
|
||||
/* on the 32-bit stack for the current task. */
|
||||
#if 0
|
||||
#define MAKE_SEGPTR(ptr) \
|
||||
((SEGPTR)IF1632_Stack32_base + \
|
||||
((DWORD)(ptr) - (DWORD)PTR_SEG_TO_LIN(IF1632_Stack32_base)))
|
||||
#endif
|
||||
SEGPTR MAKE_SEGPTR(void *ptr);
|
||||
#else
|
||||
#define MAKE_SEGPTR(ptr) ((SEGPTR)ptr)
|
||||
#endif
|
||||
|
||||
#endif /* __WINE_STACKFRAME_H */
|
||||
|
|
|
@ -28,6 +28,10 @@
|
|||
#define WINSWITCH_CLASS_ATOM MAKEINTATOM(32771) /* WinSwitch */
|
||||
#define ICONTITLE_CLASS_ATOM MAKEINTATOM(32772) /* IconTitle */
|
||||
|
||||
/* PAINT_RedrawWindow() control flags */
|
||||
#define RDW_C_USEHRGN 0x0001
|
||||
#define RDW_C_DELETEHRGN 0x0002
|
||||
|
||||
typedef struct tagWND
|
||||
{
|
||||
struct tagWND *next; /* Next sibling */
|
||||
|
@ -84,9 +88,10 @@ extern BOOL32 WIN_UnlinkWindow( HWND32 hwnd );
|
|||
extern BOOL32 WIN_LinkWindow( HWND32 hwnd, HWND32 hwndInsertAfter );
|
||||
extern HWND32 WIN_FindWinToRepaint( HWND32 hwnd, HQUEUE16 hQueue );
|
||||
extern void WIN_SendParentNotify( HWND32 hwnd, WORD event,
|
||||
WORD idChild, LONG lValue );
|
||||
WORD idChild, LPARAM lValue );
|
||||
extern BOOL32 WIN_CreateDesktopWindow(void);
|
||||
extern HWND32 WIN_GetTopParent( HWND32 hwnd );
|
||||
extern BOOL32 WIN_IsWindowDrawable(WND*, BOOL32 );
|
||||
extern HINSTANCE16 WIN_GetWindowInstance( HWND32 hwnd );
|
||||
extern WND **WIN_BuildWinArray( WND *wndPtr );
|
||||
|
||||
|
@ -94,6 +99,10 @@ extern void DEFWND_SetText( WND *wndPtr, LPCSTR text ); /* windows/defwnd.c */
|
|||
|
||||
extern void PROPERTY_RemoveWindowProps( WND *pWnd ); /* windows/property.c */
|
||||
|
||||
extern BOOL32 PAINT_RedrawWindow( HWND32 hwnd, const RECT32 *rectUpdate,
|
||||
HRGN32 hrgnUpdate, UINT32 flags,
|
||||
UINT32 control ); /* windows/painting.c */
|
||||
|
||||
extern Display * display;
|
||||
extern Screen * screen;
|
||||
extern Window rootWindow;
|
||||
|
|
|
@ -3415,6 +3415,7 @@ UINT16 GetCommEventMask(INT16,UINT16);
|
|||
HTASK16 GetCurrentTask(void);
|
||||
HMODULE16 GetExePtr(HANDLE16);
|
||||
WORD GetExeVersion(void);
|
||||
BOOL16 GetModuleName(HINSTANCE16,LPSTR,INT16);
|
||||
HINSTANCE16 GetTaskDS(void);
|
||||
HQUEUE16 GetTaskQueue(HTASK16);
|
||||
BOOL16 IsSharedSelector(HANDLE16);
|
||||
|
@ -3745,7 +3746,7 @@ INT16 DialogBoxParam16(HINSTANCE16,SEGPTR,HWND16,DLGPROC16,LPARAM);
|
|||
INT32 DialogBoxParam32A(HINSTANCE32,LPCSTR,HWND32,DLGPROC32,LPARAM);
|
||||
INT32 DialogBoxParam32W(HINSTANCE32,LPCWSTR,HWND32,DLGPROC32,LPARAM);
|
||||
#define DialogBoxParam WINELIB_NAME_AW(DialogBoxParam)
|
||||
INT16 DlgDirListComboBox16(HWND16,LPCSTR,INT16,INT16,UINT16);
|
||||
INT16 DlgDirListComboBox16(HWND16,SEGPTR,INT16,INT16,UINT16);
|
||||
INT32 DlgDirListComboBox32A(HWND32,LPCSTR,INT32,INT32,UINT32);
|
||||
INT32 DlgDirListComboBox32W(HWND32,LPCWSTR,INT32,INT32,UINT32);
|
||||
#define DlgDirListComboBox WINELIB_NAME_AW(DlgDirListComboBox)
|
||||
|
@ -4654,8 +4655,8 @@ BOOL GetMessage(SEGPTR,HWND,UINT,UINT);
|
|||
LONG GetMessageExtraInfo(void);
|
||||
DWORD GetMessagePos(void);
|
||||
LONG GetMessageTime(void);
|
||||
HANDLE GetMetaFile(LPSTR);
|
||||
HANDLE GetMetaFileBits(HANDLE);
|
||||
HMETAFILE16 GetMetaFile(LPSTR);
|
||||
HANDLE GetMetaFileBits(HMETAFILE16);
|
||||
int GetModuleFileName(HANDLE,LPSTR,short);
|
||||
HMODULE16 GetModuleHandle(LPCSTR);
|
||||
int GetModuleUsage(HANDLE);
|
||||
|
@ -4777,7 +4778,7 @@ void OutputDebugString(LPCSTR);
|
|||
BOOL PaintRgn(HDC,HRGN);
|
||||
BOOL PatBlt(HDC,short,short,short,short,DWORD);
|
||||
BOOL Pie(HDC,INT,INT,INT,INT,INT,INT,INT,INT);
|
||||
BOOL PlayMetaFile(HDC,HANDLE);
|
||||
BOOL PlayMetaFile(HDC,HMETAFILE16);
|
||||
void PlayMetaFileRecord(HDC,LPHANDLETABLE16,LPMETARECORD,WORD);
|
||||
BOOL PostAppMessage(HANDLE,WORD,WORD,LONG);
|
||||
void PostEvent(HTASK);
|
||||
|
@ -4844,7 +4845,7 @@ DWORD SetMapperFlags(HDC,DWORD);
|
|||
BOOL SetMenu(HWND,HMENU);
|
||||
BOOL SetMenuItemBitmaps(HMENU,UINT,UINT,HBITMAP,HBITMAP);
|
||||
BOOL SetMessageQueue(int);
|
||||
HANDLE SetMetaFileBits(HANDLE);
|
||||
HMETAFILE16 SetMetaFileBits(HANDLE);
|
||||
WORD SetPaletteEntries(HPALETTE16,WORD,WORD,LPPALETTEENTRY);
|
||||
HWND SetParent(HWND,HWND);
|
||||
COLORREF SetPixel(HDC,short,short,COLORREF);
|
||||
|
|
|
@ -79,7 +79,7 @@ typedef unsigned short WCHAR;
|
|||
typedef unsigned short BOOL16;
|
||||
typedef int BOOL32;
|
||||
|
||||
/* Handles types. These are the same for emulator and library. */
|
||||
/* Integer types. These are the same for emulator and library. */
|
||||
|
||||
typedef UINT16 HANDLE16;
|
||||
typedef UINT32 HANDLE32;
|
||||
|
@ -96,6 +96,8 @@ typedef INT16 HFILE;
|
|||
typedef HANDLE32 HHOOK;
|
||||
typedef HANDLE32 HKEY;
|
||||
typedef HANDLE32 HMIXEROBJ;
|
||||
typedef DWORD LCID;
|
||||
typedef DWORD LCTYPE;
|
||||
|
||||
/* Pointers types. These are the same for emulator and library. */
|
||||
|
||||
|
|
|
@ -16,22 +16,22 @@ all: check_winerc $(PROGRAMS)
|
|||
|
||||
@MAKE_RULES@
|
||||
|
||||
hello: hello.o $(WINELIB)
|
||||
hello: hello.o
|
||||
$(CC) -o hello hello.o $(LDOPTIONS) $(ALL_LIBS)
|
||||
|
||||
hello2: hello2.o $(WINELIB)
|
||||
hello2: hello2.o
|
||||
$(CC) -o hello2 hello2.o $(LDOPTIONS) $(ALL_LIBS)
|
||||
|
||||
hello3: hello3res.o hello3.o $(WINELIB)
|
||||
hello3: hello3res.o hello3.o
|
||||
$(CC) -o hello3 hello3.o hello3res.o $(LDOPTIONS) $(ALL_LIBS)
|
||||
|
||||
hello4: hello4.o $(WINELIB)
|
||||
hello4: hello4.o
|
||||
$(CC) -o hello4 hello4.o $(LDOPTIONS) $(ALL_LIBS)
|
||||
|
||||
new: new.o $(WINELIB)
|
||||
new: new.o
|
||||
$(CC) -o new new.o $(LDOPTIONS) $(ALL_LIBS)
|
||||
|
||||
rolex: rolex.o $(WINELIB)
|
||||
rolex: rolex.o
|
||||
$(CC) -o rolex rolex.o $(LDOPTIONS) $(ALL_LIBS)
|
||||
|
||||
clean::
|
||||
|
|
|
@ -29,10 +29,11 @@ typedef struct
|
|||
|
||||
typedef struct
|
||||
{
|
||||
int base; /* Ordinal base */
|
||||
int size; /* Number of functions */
|
||||
const void **functions; /* Pointer to functions table */
|
||||
const char * const *names; /* Pointer to names table */
|
||||
int base; /* Ordinal base */
|
||||
int size; /* Number of functions */
|
||||
const void *code_start; /* Start of DLL code */
|
||||
const void **functions; /* Pointer to functions table */
|
||||
const char * const *names; /* Pointer to names table */
|
||||
} WIN32_DESCRIPTOR;
|
||||
|
||||
typedef struct
|
||||
|
@ -356,8 +357,8 @@ LPCSTR BUILTIN_GetEntryPoint32( void *relay )
|
|||
|
||||
for (dll = BuiltinDLLs; dll->descr; dll++)
|
||||
if ((dll->flags & DLL_FLAG_WIN32) &&
|
||||
(dll->descr->u.win32.functions[0] <= relay) &&
|
||||
(dll->descr->u.win32.functions[dll->descr->u.win32.size-1] >relay))
|
||||
(dll->descr->u.win32.code_start <= relay) &&
|
||||
((void *)dll->descr->u.win32.functions > relay))
|
||||
break;
|
||||
if (!dll->descr)
|
||||
{
|
||||
|
|
|
@ -1215,10 +1215,17 @@ HINSTANCE LoadModule( LPCSTR name, LPVOID paramBlock )
|
|||
|
||||
if (!(pModule->flags & NE_FFLAGS_LIBMODULE) && (paramBlock != (LPVOID)-1))
|
||||
{
|
||||
WORD showcmd;
|
||||
|
||||
/* PowerPoint passes NULL as showCmd */
|
||||
if (params->showCmd)
|
||||
showcmd = *((WORD *)PTR_SEG_TO_LIN(params->showCmd)+1);
|
||||
else
|
||||
showcmd = 0; /* FIXME: correct */
|
||||
TASK_CreateTask( hModule, hInstance, hPrevInstance,
|
||||
params->hEnvironment,
|
||||
(LPSTR)PTR_SEG_TO_LIN( params->cmdLine ),
|
||||
*((WORD *)PTR_SEG_TO_LIN(params->showCmd)+1) );
|
||||
showcmd );
|
||||
}
|
||||
|
||||
return hInstance;
|
||||
|
@ -1286,6 +1293,18 @@ int GetModuleFileName( HANDLE hModule, LPSTR lpFileName, short nSize )
|
|||
return strlen(lpFileName);
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
* GetModuleName (KERNEL.27)
|
||||
*/
|
||||
BOOL16 GetModuleName( HINSTANCE16 hinst, LPSTR buf, INT16 nSize )
|
||||
{
|
||||
LPSTR name = MODULE_GetModuleName(hinst);
|
||||
|
||||
if (!name) return FALSE;
|
||||
lstrcpyn32A( buf, name, nSize );
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* LoadLibrary (KERNEL.95)
|
||||
|
|
|
@ -726,7 +726,7 @@ LoadMessage32A(
|
|||
stre = NULL;
|
||||
se = (struct _subentry*)(p+4);
|
||||
for (i=nrofentries;i--;) {
|
||||
if ((id>=se->firstentry) && (id<se->lastentry)) {
|
||||
if ((id>=se->firstentry) && (id<=se->lastentry)) {
|
||||
stre = (struct _stringentry*)(p+se->offset);
|
||||
id -= se->firstentry;
|
||||
break;
|
||||
|
|
|
@ -35,7 +35,6 @@
|
|||
#define MIN_THUNKS 32
|
||||
|
||||
/* 32-bit stack size for each task */
|
||||
/* Must not be greater than 64k, or MAKE_SEGPTR won't work */
|
||||
#define STACK32_SIZE 0x10000
|
||||
|
||||
extern void USER_AppExit( HTASK16, HINSTANCE16, HQUEUE16 );
|
||||
|
|
|
@ -1223,6 +1223,16 @@ LPSTR LOCAL_Lock( HANDLE16 ds, HLOCAL16 handle )
|
|||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* LOCAL_LockSegptr
|
||||
*/
|
||||
SEGPTR LOCAL_LockSegptr( HANDLE16 ds, HLOCAL16 handle )
|
||||
{
|
||||
char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
|
||||
return PTR_SEG_OFF_TO_SEGPTR( ds, LOCAL_InternalLock( ptr, handle ) );
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* LOCAL_Unlock
|
||||
*/
|
||||
|
@ -1401,9 +1411,7 @@ HLOCAL16 LocalFree16( HLOCAL16 handle )
|
|||
*/
|
||||
SEGPTR LocalLock16( HLOCAL16 handle )
|
||||
{
|
||||
HANDLE16 ds = CURRENT_DS;
|
||||
char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
|
||||
return PTR_SEG_OFF_TO_SEGPTR( ds, LOCAL_InternalLock( ptr, handle ) );
|
||||
return LOCAL_LockSegptr( CURRENT_DS, handle );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -480,37 +480,3 @@ DWORD MemoryWrite( WORD sel, DWORD offset, void *buffer, DWORD count )
|
|||
memcpy( ((char *)GET_SEL_BASE(sel)) + offset, buffer, count );
|
||||
return count;
|
||||
}
|
||||
|
||||
#ifndef WINELIB
|
||||
SEGPTR MAKE_SEGPTR(void * ptr)
|
||||
|
||||
{
|
||||
SEGPTR result;
|
||||
int entry;
|
||||
|
||||
if (!ptr)
|
||||
return ptr;
|
||||
if (!((unsigned)ptr & 0xffff0000)) {
|
||||
fprintf(stderr, "Invalid pointer %p has been passed to MAKE_SEGPTR. This was\n", ptr);
|
||||
fprintf(stderr, "probably caused by an unnecessary call to PTR_SEG_TO_LIN.\n");
|
||||
fprintf(stderr, "Forcing call to debugger\n");
|
||||
ptr = *(void **)0;
|
||||
}
|
||||
result = (SEGPTR) (IF1632_Stack32_base) +
|
||||
((DWORD)(ptr) - (DWORD) PTR_SEG_TO_LIN(IF1632_Stack32_base));
|
||||
if (PTR_SEG_TO_LIN(result) == ptr)
|
||||
return result;
|
||||
|
||||
for (entry = 0; entry < LDT_SIZE; entry++) {
|
||||
if (ldt_copy[entry].base &&
|
||||
(ldt_copy[entry].limit < 0x10000) &&
|
||||
((unsigned) ptr >= ldt_copy[entry].base) &&
|
||||
((unsigned) ptr < (ldt_copy[entry].base + ldt_copy[entry].limit))) {
|
||||
return ((ENTRY_TO_SELECTOR(entry) << 16) |
|
||||
((unsigned) ptr - ldt_copy[entry].base));
|
||||
}
|
||||
}
|
||||
entry = SELECTOR_AllocBlock((void *)((unsigned)ptr & 0xffff0000), 0x10000, SEGMENT_DATA, 0, 0);
|
||||
return ((entry << 16) | ((unsigned) ptr & 0xffff));
|
||||
}
|
||||
#endif
|
||||
|
|
223
misc/commdlg.c
223
misc/commdlg.c
|
@ -9,7 +9,7 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "win.h"
|
||||
#include "user.h"
|
||||
#include "heap.h"
|
||||
#include "message.h"
|
||||
#include "commdlg.h"
|
||||
#include "dlgs.h"
|
||||
|
@ -17,7 +17,6 @@
|
|||
#include "resource.h"
|
||||
#include "dos_fs.h"
|
||||
#include "drive.h"
|
||||
#include "stackframe.h"
|
||||
#include "stddebug.h"
|
||||
#include "debug.h"
|
||||
|
||||
|
@ -165,15 +164,22 @@ static void FILEDLG_StripEditControl(HWND hwnd)
|
|||
*/
|
||||
static BOOL FILEDLG_ScanDir(HWND hWnd, LPSTR newPath)
|
||||
{
|
||||
char str[512],str2[512];
|
||||
BOOL32 ret = FALSE;
|
||||
int len;
|
||||
char *str = SEGPTR_ALLOC(512);
|
||||
if (!str) return TRUE;
|
||||
|
||||
strncpy(str,newPath,511); str[511]=0;
|
||||
GetDlgItemText32A( hWnd, edt1, str2, sizeof(str2) );
|
||||
strncat(str,str2,511-strlen(str)); str[511]=0;
|
||||
if (!DlgDirList(hWnd, MAKE_SEGPTR(str), lst1, 0, 0x0000)) return FALSE;
|
||||
strcpy( str, "*.*" );
|
||||
DlgDirList(hWnd, MAKE_SEGPTR(str), lst2, stc1, 0x8010);
|
||||
return TRUE;
|
||||
lstrcpyn32A( str, newPath, 512 );
|
||||
len = strlen(str);
|
||||
GetDlgItemText32A( hWnd, edt1, str + len, 512 - len );
|
||||
if (DlgDirList(hWnd, SEGPTR_GET(str), lst1, 0, 0x0000))
|
||||
{
|
||||
strcpy( str, "*.*" );
|
||||
DlgDirList(hWnd, SEGPTR_GET(str), lst2, stc1, 0x8010 );
|
||||
ret = TRUE;
|
||||
}
|
||||
SEGPTR_FREE(str);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
|
@ -209,19 +215,20 @@ static LPSTR FILEDLG_GetFileType(LPSTR cfptr, LPSTR fptr, WORD index)
|
|||
static LONG FILEDLG_WMDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam,int savedlg)
|
||||
{
|
||||
LPDRAWITEMSTRUCT16 lpdis = (LPDRAWITEMSTRUCT16)PTR_SEG_TO_LIN(lParam);
|
||||
char str[512];
|
||||
char *str;
|
||||
HBRUSH hBrush;
|
||||
HBITMAP hBitmap, hPrevBitmap;
|
||||
BITMAP16 bm;
|
||||
HDC hMemDC;
|
||||
|
||||
str[0]=0;
|
||||
if (lpdis->CtlType == ODT_LISTBOX && lpdis->CtlID == lst1) {
|
||||
if (lpdis->CtlType == ODT_LISTBOX && lpdis->CtlID == lst1)
|
||||
{
|
||||
if (!(str = SEGPTR_ALLOC(512))) return FALSE;
|
||||
hBrush = SelectObject(lpdis->hDC, GetStockObject(LTGRAY_BRUSH));
|
||||
SelectObject(lpdis->hDC, hBrush);
|
||||
FillRect16(lpdis->hDC, &lpdis->rcItem, hBrush);
|
||||
SendMessage16(lpdis->hwndItem, LB_GETTEXT, lpdis->itemID,
|
||||
(LPARAM)MAKE_SEGPTR(str));
|
||||
(LPARAM)SEGPTR_GET(str));
|
||||
|
||||
if (savedlg) /* use _gray_ text in FileSaveDlg */
|
||||
if (!lpdis->itemState)
|
||||
|
@ -235,15 +242,18 @@ static LONG FILEDLG_WMDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam,int saved
|
|||
if (lpdis->itemState != 0) {
|
||||
InvertRect16(lpdis->hDC, &lpdis->rcItem);
|
||||
}
|
||||
SEGPTR_FREE(str);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (lpdis->CtlType == ODT_LISTBOX && lpdis->CtlID == lst2) {
|
||||
if (lpdis->CtlType == ODT_LISTBOX && lpdis->CtlID == lst2)
|
||||
{
|
||||
if (!(str = SEGPTR_ALLOC(512))) return FALSE;
|
||||
hBrush = SelectObject(lpdis->hDC, GetStockObject(LTGRAY_BRUSH));
|
||||
SelectObject(lpdis->hDC, hBrush);
|
||||
FillRect16(lpdis->hDC, &lpdis->rcItem, hBrush);
|
||||
SendMessage16(lpdis->hwndItem, LB_GETTEXT, lpdis->itemID,
|
||||
(LPARAM)MAKE_SEGPTR(str));
|
||||
(LPARAM)SEGPTR_GET(str));
|
||||
|
||||
hBitmap = hFolder;
|
||||
GetObject16( hBitmap, sizeof(bm), &bm );
|
||||
|
@ -255,17 +265,18 @@ static LONG FILEDLG_WMDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam,int saved
|
|||
bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
|
||||
SelectObject(hMemDC, hPrevBitmap);
|
||||
DeleteDC(hMemDC);
|
||||
if (lpdis->itemState != 0) {
|
||||
InvertRect16(lpdis->hDC, &lpdis->rcItem);
|
||||
}
|
||||
if (lpdis->itemState != 0) InvertRect16(lpdis->hDC, &lpdis->rcItem);
|
||||
SEGPTR_FREE(str);
|
||||
return TRUE;
|
||||
}
|
||||
if (lpdis->CtlType == ODT_COMBOBOX && lpdis->CtlID == cmb2) {
|
||||
if (lpdis->CtlType == ODT_COMBOBOX && lpdis->CtlID == cmb2)
|
||||
{
|
||||
if (!(str = SEGPTR_ALLOC(512))) return FALSE;
|
||||
hBrush = SelectObject(lpdis->hDC, GetStockObject(LTGRAY_BRUSH));
|
||||
SelectObject(lpdis->hDC, hBrush);
|
||||
FillRect16(lpdis->hDC, &lpdis->rcItem, hBrush);
|
||||
SendMessage16(lpdis->hwndItem, CB_GETLBTEXT, lpdis->itemID,
|
||||
(LPARAM)MAKE_SEGPTR(str));
|
||||
(LPARAM)SEGPTR_GET(str));
|
||||
switch(DRIVE_GetType( str[2] - 'a' ))
|
||||
{
|
||||
case TYPE_FLOPPY: hBitmap = hFloppy; break;
|
||||
|
@ -283,9 +294,8 @@ static LONG FILEDLG_WMDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam,int saved
|
|||
bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
|
||||
SelectObject(hMemDC, hPrevBitmap);
|
||||
DeleteDC(hMemDC);
|
||||
if (lpdis->itemState != 0) {
|
||||
InvertRect16(lpdis->hDC, &lpdis->rcItem);
|
||||
}
|
||||
if (lpdis->itemState != 0) InvertRect16(lpdis->hDC, &lpdis->rcItem);
|
||||
SEGPTR_FREE(str);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
|
@ -323,8 +333,7 @@ static int FILEDLG_HookCallChk(LPOPENFILENAME lpofn)
|
|||
|
||||
static LONG FILEDLG_WMInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
int n;
|
||||
int i;
|
||||
int i, n;
|
||||
LPOPENFILENAME lpofn;
|
||||
char tmpstr[512];
|
||||
LPSTR pstr;
|
||||
|
@ -335,33 +344,35 @@ static LONG FILEDLG_WMInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||
if (lpofn->lpstrCustomFilter)
|
||||
{
|
||||
pstr = (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter);
|
||||
n = 0;
|
||||
dprintf_commdlg(stddeb,"lpstrCustomFilter = %p\n", pstr);
|
||||
while(*pstr)
|
||||
{
|
||||
n = strlen(pstr);
|
||||
strncpy(tmpstr, pstr, 511); tmpstr[511]=0;
|
||||
dprintf_commdlg(stddeb,"lpstrCustomFilter // add tmpstr='%s' ", tmpstr);
|
||||
i = SendDlgItemMessage16(hWnd, cmb1, CB_ADDSTRING, 0, (LPARAM)MAKE_SEGPTR(tmpstr));
|
||||
pstr += n + 1;
|
||||
n = strlen(pstr);
|
||||
dprintf_commdlg(stddeb,"lpstrCustomFilter // add str='%s' ",pstr);
|
||||
i = SendDlgItemMessage16(hWnd, cmb1, CB_ADDSTRING, 0,
|
||||
(LPARAM)lpofn->lpstrCustomFilter + n );
|
||||
n += strlen(pstr) + 1;
|
||||
pstr += strlen(pstr) + 1;
|
||||
dprintf_commdlg(stddeb,"associated to '%s'\n", pstr);
|
||||
SendDlgItemMessage16(hWnd, cmb1, CB_SETITEMDATA, i, (LPARAM)pstr);
|
||||
pstr += n + 1;
|
||||
n += strlen(pstr) + 1;
|
||||
pstr += strlen(pstr) + 1;
|
||||
}
|
||||
}
|
||||
/* read filter information */
|
||||
pstr = (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrFilter);
|
||||
n = 0;
|
||||
while(*pstr)
|
||||
{
|
||||
n = strlen(pstr);
|
||||
strncpy(tmpstr, pstr, 511); tmpstr[511]=0;
|
||||
dprintf_commdlg(stddeb,"lpstrFilter // add tmpstr='%s' ", tmpstr);
|
||||
i = SendDlgItemMessage16(hWnd, cmb1, CB_ADDSTRING, 0, (LPARAM)MAKE_SEGPTR(tmpstr));
|
||||
pstr += n + 1;
|
||||
n = strlen(pstr);
|
||||
dprintf_commdlg(stddeb,"lpstrFilter // add str='%s' ", pstr);
|
||||
i = SendDlgItemMessage16(hWnd, cmb1, CB_ADDSTRING, 0,
|
||||
(LPARAM)lpofn->lpstrFilter + n );
|
||||
n += strlen(pstr) + 1;
|
||||
pstr += strlen(pstr) + 1;
|
||||
dprintf_commdlg(stddeb,"associated to '%s'\n", pstr);
|
||||
SendDlgItemMessage16(hWnd, cmb1, CB_SETITEMDATA, i, (LPARAM)pstr);
|
||||
pstr += n + 1;
|
||||
n += strlen(pstr) + 1;
|
||||
pstr += strlen(pstr) + 1;
|
||||
}
|
||||
/* set default filter */
|
||||
if (lpofn->nFilterIndex == 0 && lpofn->lpstrCustomFilter == (SEGPTR)NULL)
|
||||
|
@ -374,8 +385,10 @@ static LONG FILEDLG_WMInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||
lpofn->nFilterIndex, tmpstr);
|
||||
SetDlgItemText32A( hWnd, edt1, tmpstr );
|
||||
/* get drive list */
|
||||
*tmpstr = 0;
|
||||
DlgDirListComboBox16(hWnd, (LPSTR)MAKE_SEGPTR(tmpstr), cmb2, 0, 0xC000);
|
||||
pstr = SEGPTR_ALLOC(1);
|
||||
*pstr = 0;
|
||||
DlgDirListComboBox16(hWnd, SEGPTR_GET(pstr), cmb2, 0, 0xC000);
|
||||
SEGPTR_FREE(pstr);
|
||||
/* read initial directory */
|
||||
if (PTR_SEG_TO_LIN(lpofn->lpstrInitialDir) != NULL)
|
||||
{
|
||||
|
@ -398,7 +411,7 @@ static LONG FILEDLG_WMInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||
ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE);
|
||||
if (FILEDLG_HookCallChk(lpofn))
|
||||
return (BOOL)CallWindowProc16(lpofn->lpfnHook,
|
||||
hWnd, WM_INITDIALOG, wParam,(LPARAM)MAKE_SEGPTR(lpofn));
|
||||
hWnd, WM_INITDIALOG, wParam, lParam );
|
||||
else
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -419,7 +432,7 @@ static LRESULT FILEDLG_WMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||
control = wParam;
|
||||
notification = HIWORD(lParam);
|
||||
|
||||
lpofn = (LPOPENFILENAME)GetWindowLong32A(hWnd, DWL_USER);
|
||||
lpofn = (LPOPENFILENAME)PTR_SEG_TO_LIN(GetWindowLong32A(hWnd, DWL_USER));
|
||||
switch (control)
|
||||
{
|
||||
case lst1: /* file list */
|
||||
|
@ -428,10 +441,13 @@ static LRESULT FILEDLG_WMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||
goto almost_ok;
|
||||
lRet = SendDlgItemMessage16(hWnd, lst1, LB_GETCURSEL, 0, 0);
|
||||
if (lRet == LB_ERR) return TRUE;
|
||||
SendDlgItemMessage16(hWnd, lst1, LB_GETTEXT, lRet,
|
||||
(LPARAM)MAKE_SEGPTR(tmpstr));
|
||||
SetDlgItemText32A( hWnd, edt1, tmpstr );
|
||||
|
||||
if ((pstr = SEGPTR_ALLOC(512)))
|
||||
{
|
||||
SendDlgItemMessage16(hWnd, lst1, LB_GETTEXT, lRet,
|
||||
(LPARAM)SEGPTR_GET(pstr));
|
||||
SetDlgItemText32A( hWnd, edt1, pstr );
|
||||
SEGPTR_FREE(pstr);
|
||||
}
|
||||
if (FILEDLG_HookCallChk(lpofn))
|
||||
CallWindowProc16(lpofn->lpfnHook, hWnd,
|
||||
RegisterWindowMessage32A( LBSELCHSTRING ),
|
||||
|
@ -444,8 +460,11 @@ static LRESULT FILEDLG_WMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||
{
|
||||
lRet = SendDlgItemMessage16(hWnd, lst2, LB_GETCURSEL, 0, 0);
|
||||
if (lRet == LB_ERR) return TRUE;
|
||||
pstr = SEGPTR_ALLOC(512);
|
||||
SendDlgItemMessage16(hWnd, lst2, LB_GETTEXT, lRet,
|
||||
(LPARAM)MAKE_SEGPTR(tmpstr));
|
||||
(LPARAM)SEGPTR_GET(pstr));
|
||||
strcpy( tmpstr, pstr );
|
||||
SEGPTR_FREE(pstr);
|
||||
if (tmpstr[0] == '[')
|
||||
{
|
||||
tmpstr[strlen(tmpstr) - 1] = 0;
|
||||
|
@ -466,8 +485,11 @@ static LRESULT FILEDLG_WMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||
FILEDLG_StripEditControl(hWnd);
|
||||
lRet = SendDlgItemMessage16(hWnd, cmb2, CB_GETCURSEL, 0, 0L);
|
||||
if (lRet == LB_ERR) return 0;
|
||||
SendDlgItemMessage16(hWnd, cmb2, CB_GETLBTEXT, lRet, (LPARAM)MAKE_SEGPTR(tmpstr));
|
||||
sprintf(tmpstr, "%c:", tmpstr[2]);
|
||||
pstr = SEGPTR_ALLOC(512);
|
||||
SendDlgItemMessage16(hWnd, cmb2, CB_GETLBTEXT, lRet,
|
||||
(LPARAM)SEGPTR_GET(pstr));
|
||||
sprintf(tmpstr, "%c:", pstr[2]);
|
||||
SEGPTR_FREE(pstr);
|
||||
reset_scan:
|
||||
lRet = SendDlgItemMessage16(hWnd, cmb1, CB_GETCURSEL, 0, 0);
|
||||
if (lRet == LB_ERR)
|
||||
|
@ -561,15 +583,12 @@ static LRESULT FILEDLG_WMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||
{
|
||||
lRet = SendDlgItemMessage16(hWnd, lst1, LB_GETCURSEL, 0, 0);
|
||||
SendDlgItemMessage16(hWnd, lst1, LB_GETTEXT, lRet,
|
||||
(LPARAM)MAKE_SEGPTR(tmpstr));
|
||||
dprintf_commdlg(stddeb,"strcpy'ing '%s'\n",tmpstr); fflush(stdout);
|
||||
strcpy(PTR_SEG_TO_LIN(lpofn->lpstrFileTitle), tmpstr);
|
||||
lpofn->lpstrFileTitle );
|
||||
}
|
||||
if (FILEDLG_HookCallChk(lpofn))
|
||||
{
|
||||
lRet= (BOOL)CallWindowProc16(lpofn->lpfnHook,
|
||||
hWnd, RegisterWindowMessage32A( FILEOKSTRING ),
|
||||
0, (LPARAM)MAKE_SEGPTR(lpofn));
|
||||
hWnd, RegisterWindowMessage32A( FILEOKSTRING ), 0, lParam );
|
||||
if (lRet)
|
||||
{
|
||||
*lpofn=ofn2; /* restore old state */
|
||||
|
@ -594,7 +613,7 @@ static LRESULT FILEDLG_WMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||
*/
|
||||
LRESULT FileOpenDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
LPOPENFILENAME lpofn = (LPOPENFILENAME)GetWindowLong32A(hWnd, DWL_USER);
|
||||
LPOPENFILENAME lpofn = (LPOPENFILENAME)PTR_SEG_TO_LIN(GetWindowLong32A(hWnd, DWL_USER));
|
||||
|
||||
if (wMsg!=WM_INITDIALOG)
|
||||
if (FILEDLG_HookCallChk(lpofn))
|
||||
|
@ -637,7 +656,7 @@ LRESULT FileOpenDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
|
|||
*/
|
||||
LRESULT FileSaveDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
LPOPENFILENAME lpofn = (LPOPENFILENAME)GetWindowLong32A(hWnd, DWL_USER);
|
||||
LPOPENFILENAME lpofn = (LPOPENFILENAME)PTR_SEG_TO_LIN(GetWindowLong32A(hWnd, DWL_USER));
|
||||
|
||||
if (wMsg!=WM_INITDIALOG)
|
||||
if (FILEDLG_HookCallChk(lpofn))
|
||||
|
@ -791,7 +810,7 @@ static LRESULT FINDDLG_WMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||
int uFindReplaceMessage = RegisterWindowMessage32A( FINDMSGSTRING );
|
||||
int uHelpMessage = RegisterWindowMessage32A( HELPMSGSTRING );
|
||||
|
||||
lpfr = (LPFINDREPLACE)GetWindowLong32A(hWnd, DWL_USER);
|
||||
lpfr = (LPFINDREPLACE)PTR_SEG_TO_LIN(GetWindowLong32A(hWnd, DWL_USER));
|
||||
switch (wParam) {
|
||||
case IDOK:
|
||||
GetDlgItemText16(hWnd, edt1, lpfr->lpstrFindWhat, lpfr->wFindWhatLen);
|
||||
|
@ -806,12 +825,14 @@ static LRESULT FINDDLG_WMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||
else lpfr->Flags &= ~FR_MATCHCASE;
|
||||
lpfr->Flags &= ~(FR_REPLACE | FR_REPLACEALL | FR_DIALOGTERM);
|
||||
lpfr->Flags |= FR_FINDNEXT;
|
||||
SendMessage16(lpfr->hwndOwner, uFindReplaceMessage, 0, (LPARAM)MAKE_SEGPTR(lpfr));
|
||||
SendMessage16(lpfr->hwndOwner, uFindReplaceMessage, 0,
|
||||
GetWindowLong32A(hWnd, DWL_USER) );
|
||||
return TRUE;
|
||||
case IDCANCEL:
|
||||
lpfr->Flags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL);
|
||||
lpfr->Flags |= FR_DIALOGTERM;
|
||||
SendMessage16(lpfr->hwndOwner, uFindReplaceMessage, 0, (LPARAM)MAKE_SEGPTR(lpfr));
|
||||
SendMessage16(lpfr->hwndOwner, uFindReplaceMessage, 0,
|
||||
GetWindowLong32A(hWnd, DWL_USER) );
|
||||
DestroyWindow(hWnd);
|
||||
return TRUE;
|
||||
case pshHelp:
|
||||
|
@ -883,7 +904,7 @@ static LRESULT REPLACEDLG_WMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||
int uFindReplaceMessage = RegisterWindowMessage32A( FINDMSGSTRING );
|
||||
int uHelpMessage = RegisterWindowMessage32A( HELPMSGSTRING );
|
||||
|
||||
lpfr = (LPFINDREPLACE)GetWindowLong32A(hWnd, DWL_USER);
|
||||
lpfr = (LPFINDREPLACE)PTR_SEG_TO_LIN(GetWindowLong32A(hWnd, DWL_USER));
|
||||
switch (wParam) {
|
||||
case IDOK:
|
||||
GetDlgItemText16(hWnd, edt1, lpfr->lpstrFindWhat, lpfr->wFindWhatLen);
|
||||
|
@ -896,12 +917,14 @@ static LRESULT REPLACEDLG_WMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||
else lpfr->Flags &= ~FR_MATCHCASE;
|
||||
lpfr->Flags &= ~(FR_REPLACE | FR_REPLACEALL | FR_DIALOGTERM);
|
||||
lpfr->Flags |= FR_FINDNEXT;
|
||||
SendMessage16(lpfr->hwndOwner, uFindReplaceMessage, 0, (LPARAM)MAKE_SEGPTR(lpfr));
|
||||
SendMessage16(lpfr->hwndOwner, uFindReplaceMessage, 0,
|
||||
GetWindowLong32A(hWnd, DWL_USER) );
|
||||
return TRUE;
|
||||
case IDCANCEL:
|
||||
lpfr->Flags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL);
|
||||
lpfr->Flags |= FR_DIALOGTERM;
|
||||
SendMessage16(lpfr->hwndOwner, uFindReplaceMessage, 0, (LPARAM)MAKE_SEGPTR(lpfr));
|
||||
SendMessage16(lpfr->hwndOwner, uFindReplaceMessage, 0,
|
||||
GetWindowLong32A(hWnd, DWL_USER) );
|
||||
DestroyWindow(hWnd);
|
||||
return TRUE;
|
||||
case psh1:
|
||||
|
@ -915,7 +938,8 @@ static LRESULT REPLACEDLG_WMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||
else lpfr->Flags &= ~FR_MATCHCASE;
|
||||
lpfr->Flags &= ~(FR_FINDNEXT | FR_REPLACEALL | FR_DIALOGTERM);
|
||||
lpfr->Flags |= FR_REPLACE;
|
||||
SendMessage16(lpfr->hwndOwner, uFindReplaceMessage, 0, (LPARAM)MAKE_SEGPTR(lpfr));
|
||||
SendMessage16(lpfr->hwndOwner, uFindReplaceMessage, 0,
|
||||
GetWindowLong32A(hWnd, DWL_USER) );
|
||||
return TRUE;
|
||||
case psh2:
|
||||
GetDlgItemText16(hWnd, edt1, lpfr->lpstrFindWhat, lpfr->wFindWhatLen);
|
||||
|
@ -928,7 +952,8 @@ static LRESULT REPLACEDLG_WMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||
else lpfr->Flags &= ~FR_MATCHCASE;
|
||||
lpfr->Flags &= ~(FR_FINDNEXT | FR_REPLACE | FR_DIALOGTERM);
|
||||
lpfr->Flags |= FR_REPLACEALL;
|
||||
SendMessage16(lpfr->hwndOwner, uFindReplaceMessage, 0, (LPARAM)MAKE_SEGPTR(lpfr));
|
||||
SendMessage16(lpfr->hwndOwner, uFindReplaceMessage, 0,
|
||||
GetWindowLong32A(hWnd, DWL_USER) );
|
||||
return TRUE;
|
||||
case pshHelp:
|
||||
/* FIXME : should lpfr structure be passed as an argument ??? */
|
||||
|
@ -2254,7 +2279,8 @@ INT16 FontFamilyEnumProc( SEGPTR logfont, SEGPTR metrics,
|
|||
if (!(nFontType & 0x0004)) /* this means 'TRUETYPE_FONTTYPE' */
|
||||
return 1;
|
||||
|
||||
i=SendMessage16(hwnd,CB_ADDSTRING,0,(LPARAM)MAKE_SEGPTR(lplf->lfFaceName));
|
||||
i=SendMessage16(hwnd,CB_ADDSTRING,0,
|
||||
(LPARAM)logfont + ((char *)lplf->lfFaceName - (char *)lplf));
|
||||
if (i!=CB_ERR)
|
||||
{
|
||||
w=(lplf->lfCharSet << 8) | lplf->lfPitchAndFamily;
|
||||
|
@ -2297,7 +2323,9 @@ static int SetFontStylesToCombo2(HWND hwnd, HDC hdc, LPLOGFONT16 lplf,
|
|||
if (lptm->tmWeight==fontstyles[i].weight &&
|
||||
lptm->tmItalic==fontstyles[i].italic) /* font successful created ? */
|
||||
{
|
||||
j=SendMessage16(hwnd,CB_ADDSTRING,0,(LPARAM)MAKE_SEGPTR(fontstyles[i].stname));
|
||||
char *str = SEGPTR_STRDUP(fontstyles[i].stname);
|
||||
j=SendMessage16(hwnd,CB_ADDSTRING,0,(LPARAM)SEGPTR_GET(str) );
|
||||
SEGPTR_FREE(str);
|
||||
if (j==CB_ERR) return 1;
|
||||
j=SendMessage16(hwnd, CB_SETITEMDATA, j,
|
||||
MAKELONG(fontstyles[i].weight,fontstyles[i].italic));
|
||||
|
@ -2312,10 +2340,11 @@ static int SetFontStylesToCombo2(HWND hwnd, HDC hdc, LPLOGFONT16 lplf,
|
|||
*/
|
||||
static int SetFontSizesToCombo3(HWND hwnd, LPLOGFONT16 lplf, LPCHOOSEFONT lpcf)
|
||||
{
|
||||
int sizes[]={8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72,0};
|
||||
static const int sizes[]={8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72,0};
|
||||
int h,i,j;
|
||||
char buffer[20];
|
||||
char *buffer;
|
||||
|
||||
if (!(buffer = SEGPTR_ALLOC(20))) return 1;
|
||||
for (i=0;sizes[i] && !lplf->lfHeight;i++)
|
||||
{
|
||||
h=lplf->lfHeight ? lplf->lfHeight : sizes[i];
|
||||
|
@ -2324,16 +2353,20 @@ static int SetFontSizesToCombo3(HWND hwnd, LPLOGFONT16 lplf, LPCHOOSEFONT lpcf)
|
|||
((lpcf->Flags & CF_LIMITSIZE) && (h >= lpcf->nSizeMin) && (h <= lpcf->nSizeMax)))
|
||||
{
|
||||
sprintf(buffer,"%2d",h);
|
||||
j=SendMessage16(hwnd,CB_FINDSTRING,-1,(LPARAM)MAKE_SEGPTR(buffer));
|
||||
j=SendMessage16(hwnd,CB_FINDSTRING,-1,(LPARAM)SEGPTR_GET(buffer));
|
||||
if (j==CB_ERR)
|
||||
{
|
||||
j=SendMessage16(hwnd,CB_ADDSTRING,0,(LPARAM)MAKE_SEGPTR(buffer));
|
||||
if (j==CB_ERR) return 1;
|
||||
j=SendMessage16(hwnd, CB_SETITEMDATA, j, h);
|
||||
if (j==CB_ERR) return 1;
|
||||
j=SendMessage16(hwnd,CB_ADDSTRING,0,(LPARAM)SEGPTR_GET(buffer));
|
||||
if (j!=CB_ERR) j = SendMessage16(hwnd, CB_SETITEMDATA, j, h);
|
||||
if (j==CB_ERR)
|
||||
{
|
||||
SEGPTR_FREE(buffer);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
SEGPTR_FREE(buffer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2409,7 +2442,10 @@ LRESULT CFn_WMInitDialog(HWND hDlg, WPARAM wParam, LPARAM lParam)
|
|||
for (res=1,i=0;res && i<TEXT_COLORS;i++)
|
||||
{
|
||||
/* FIXME: load color name from resource: res=LoadString(...,i+....,buffer,.....); */
|
||||
j=SendDlgItemMessage16(hDlg,cmb4,CB_ADDSTRING,0,(LPARAM)MAKE_SEGPTR("[color name]"));
|
||||
char *name = SEGPTR_ALLOC(20);
|
||||
strcpy( name, "[color name]" );
|
||||
j=SendDlgItemMessage16(hDlg,cmb4,CB_ADDSTRING,0,(LPARAM)SEGPTR_GET(name));
|
||||
SEGPTR_FREE(name);
|
||||
SendDlgItemMessage16(hDlg,cmb4, CB_SETITEMDATA,j,textcolors[j]);
|
||||
/* look for a fitting value in color combobox */
|
||||
if (textcolors[j]==lpcf->rgbColors)
|
||||
|
@ -2509,7 +2545,7 @@ LRESULT CFn_WMMeasureItem(HWND hDlg, WPARAM wParam, LPARAM lParam)
|
|||
LRESULT CFn_WMDrawItem(HWND hDlg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
HBRUSH hBrush;
|
||||
char buffer[40];
|
||||
char *buffer;
|
||||
BITMAP16 bm;
|
||||
COLORREF cr;
|
||||
RECT16 rect;
|
||||
|
@ -2534,11 +2570,12 @@ LRESULT CFn_WMDrawItem(HWND hDlg, WPARAM wParam, LPARAM lParam)
|
|||
return TRUE; /* this should never happen */
|
||||
|
||||
rect=lpdi->rcItem;
|
||||
buffer = SEGPTR_ALLOC(40);
|
||||
switch (lpdi->CtlID)
|
||||
{
|
||||
case cmb1: /* dprintf_commdlg(stddeb,"WM_Drawitem cmb1\n"); */
|
||||
SendMessage16(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
|
||||
(LPARAM)MAKE_SEGPTR(buffer));
|
||||
(LPARAM)SEGPTR_GET(buffer));
|
||||
GetObject16( hBitmapTT, sizeof(bm), &bm );
|
||||
TextOut16(lpdi->hDC, lpdi->rcItem.left + bm.bmWidth + 10,
|
||||
lpdi->rcItem.top, buffer, lstrlen16(buffer));
|
||||
|
@ -2559,14 +2596,14 @@ LRESULT CFn_WMDrawItem(HWND hDlg, WPARAM wParam, LPARAM lParam)
|
|||
case cmb2:
|
||||
case cmb3: /* dprintf_commdlg(stddeb,"WM_DRAWITEN cmb2,cmb3\n"); */
|
||||
SendMessage16(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
|
||||
(LPARAM)MAKE_SEGPTR(buffer));
|
||||
(LPARAM)SEGPTR_GET(buffer));
|
||||
TextOut16(lpdi->hDC, lpdi->rcItem.left,
|
||||
lpdi->rcItem.top, buffer, lstrlen16(buffer));
|
||||
break;
|
||||
|
||||
case cmb4: /* dprintf_commdlg(stddeb,"WM_DRAWITEM cmb4 (=COLOR)\n"); */
|
||||
SendMessage16(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
|
||||
(LPARAM)MAKE_SEGPTR(buffer));
|
||||
(LPARAM)SEGPTR_GET(buffer));
|
||||
TextOut16(lpdi->hDC, lpdi->rcItem.left + 25+5,
|
||||
lpdi->rcItem.top, buffer, lstrlen16(buffer));
|
||||
cr = SendMessage16(lpdi->hwndItem, CB_GETITEMDATA, lpdi->itemID,0L);
|
||||
|
@ -2587,6 +2624,7 @@ LRESULT CFn_WMDrawItem(HWND hDlg, WPARAM wParam, LPARAM lParam)
|
|||
|
||||
default: return TRUE; /* this should never happen */
|
||||
}
|
||||
SEGPTR_FREE(buffer);
|
||||
if (lpdi->itemState ==ODS_SELECTED)
|
||||
InvertRect16(lpdi->hDC, &rect);
|
||||
}
|
||||
|
@ -2614,7 +2652,6 @@ LRESULT CFn_WMCtlColor(HWND hDlg, WPARAM wParam, LPARAM lParam)
|
|||
*/
|
||||
LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
char buffer[200];
|
||||
HFONT hFont/*,hFontOld*/;
|
||||
int i,j;
|
||||
long l;
|
||||
|
@ -2636,11 +2673,14 @@ LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
|
|||
if (i!=CB_ERR)
|
||||
{
|
||||
HCURSOR16 hcursor=SetCursor(LoadCursor16(0,IDC_WAIT));
|
||||
SendDlgItemMessage16(hDlg,cmb1,CB_GETLBTEXT,i,(LPARAM)MAKE_SEGPTR(buffer));
|
||||
dprintf_commdlg(stddeb,"WM_COMMAND/cmb1 =>%s\n",buffer);
|
||||
EnumFontFamilies(hdc,buffer,FontStyleEnumProc,
|
||||
char *str = SEGPTR_ALLOC(256);
|
||||
SendDlgItemMessage16(hDlg,cmb1,CB_GETLBTEXT,i,
|
||||
(LPARAM)SEGPTR_GET(str));
|
||||
dprintf_commdlg(stddeb,"WM_COMMAND/cmb1 =>%s\n",str);
|
||||
EnumFontFamilies(hdc,str,FontStyleEnumProc,
|
||||
MAKELONG(GetDlgItem(hDlg,cmb2),GetDlgItem(hDlg,cmb3)));
|
||||
SetCursor(hcursor);
|
||||
SetCursor(hcursor);
|
||||
SEGPTR_FREE(str);
|
||||
}
|
||||
if (!(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC))
|
||||
ReleaseDC(hDlg,hdc);
|
||||
|
@ -2657,13 +2697,15 @@ LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
|
|||
case cmb2:
|
||||
case cmb3:if (HIWORD(lParam)==CBN_SELCHANGE || HIWORD(lParam)== BN_CLICKED )
|
||||
{
|
||||
char *str = SEGPTR_ALLOC(256);
|
||||
dprintf_commdlg(stddeb,"WM_COMMAND/cmb2,3 =%08lX\n", lParam);
|
||||
i=SendDlgItemMessage16(hDlg,cmb1,CB_GETCURSEL,0,0);
|
||||
if (i==CB_ERR)
|
||||
i=GetDlgItemText32A( hDlg, cmb1, buffer, sizeof(buffer) );
|
||||
i=GetDlgItemText32A( hDlg, cmb1, str, 256 );
|
||||
else
|
||||
{
|
||||
SendDlgItemMessage16(hDlg,cmb1,CB_GETLBTEXT,i,(LPARAM)MAKE_SEGPTR(buffer));
|
||||
SendDlgItemMessage16(hDlg,cmb1,CB_GETLBTEXT,i,
|
||||
(LPARAM)SEGPTR_GET(str));
|
||||
l=SendDlgItemMessage16(hDlg,cmb1,CB_GETITEMDATA,i,0);
|
||||
j=HIWORD(l);
|
||||
lpcf->nFontType = LOWORD(l);
|
||||
|
@ -2673,7 +2715,8 @@ LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
|
|||
lpxx->lfPitchAndFamily=j&0xff;
|
||||
lpxx->lfCharSet=j>>8;
|
||||
}
|
||||
strcpy(lpxx->lfFaceName,buffer);
|
||||
strcpy(lpxx->lfFaceName,str);
|
||||
SEGPTR_FREE(str);
|
||||
i=SendDlgItemMessage16(hDlg,cmb2,CB_GETCURSEL,0,0);
|
||||
if (i!=CB_ERR)
|
||||
{
|
||||
|
@ -2725,7 +2768,9 @@ LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
|
|||
EndDialog(hDlg, TRUE);
|
||||
else
|
||||
{
|
||||
sprintf(buffer,"Select a font size among %d and %d points.",lpcf->nSizeMin,lpcf->nSizeMax);
|
||||
char buffer[80];
|
||||
sprintf(buffer,"Select a font size between %d and %d points.",
|
||||
lpcf->nSizeMin,lpcf->nSizeMax);
|
||||
MessageBox(hDlg,buffer,NULL,MB_OK);
|
||||
}
|
||||
return(TRUE);
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
#include <ctype.h>
|
||||
|
@ -176,3 +177,44 @@ void
|
|||
CRTDLL_putchar(INT32 x) {
|
||||
putchar(x);
|
||||
}
|
||||
|
||||
int
|
||||
CRTDLL__mbsicmp(unsigned char *x,unsigned char *y)
|
||||
{
|
||||
do {
|
||||
if (!*x)
|
||||
return !!*y;
|
||||
if (!*y)
|
||||
return !!*x;
|
||||
/* FIXME: MBCS handling... */
|
||||
if (*x!=*y)
|
||||
return 1;
|
||||
x++;
|
||||
y++;
|
||||
} while (1);
|
||||
}
|
||||
|
||||
unsigned char*
|
||||
CRTDLL__mbsinc(unsigned char *x)
|
||||
{
|
||||
/* FIXME: mbcs */
|
||||
return x++;
|
||||
}
|
||||
|
||||
int
|
||||
CRTDLL_vsprintf(DWORD *args)
|
||||
{
|
||||
return vsprintf((char *)args[0],(char *)args[1],args+2);
|
||||
}
|
||||
|
||||
unsigned char*
|
||||
CRTDLL__mbscpy(unsigned char *x,unsigned char *y)
|
||||
{
|
||||
return strcpy(x,y);
|
||||
}
|
||||
|
||||
unsigned char*
|
||||
CRTDLL__mbscat(unsigned char *x,unsigned char *y)
|
||||
{
|
||||
return strcat(x,y);
|
||||
}
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
#include "windows.h"
|
||||
#include "ldt.h"
|
||||
#include "module.h"
|
||||
#include "stackframe.h"
|
||||
#include "stddebug.h"
|
||||
#include "debug.h"
|
||||
#include "xmalloc.h"
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
#include <sys/stat.h>
|
||||
#include "windows.h"
|
||||
#include "file.h"
|
||||
#include "ldt.h"
|
||||
#include "lzexpand.h"
|
||||
#include "stackframe.h"
|
||||
#include "stddebug.h"
|
||||
#include "debug.h"
|
||||
#include "xmalloc.h"
|
||||
|
|
12
misc/main.c
12
misc/main.c
|
@ -55,10 +55,7 @@ const char people[] = "Wine is available thanks to the work of "
|
|||
"Jan Willamowius, Carl Williams, Karl Guenter Wuensch, Eric Youngdale, "
|
||||
"and James Youngman. ";
|
||||
|
||||
const struct _langentry {
|
||||
char *name;
|
||||
WORD langid;
|
||||
} languages[] =
|
||||
const WINE_LANGUAGE_DEF Languages[] =
|
||||
{
|
||||
{"En",0x0409}, /* LANG_En */
|
||||
{"Es",0x040A}, /* LANG_Es */
|
||||
|
@ -289,19 +286,20 @@ BOOL ParseDebugOptions(char *options)
|
|||
*/
|
||||
static void MAIN_ParseLanguageOption( char *arg )
|
||||
{
|
||||
const struct _langentry *p = languages;
|
||||
const WINE_LANGUAGE_DEF *p = Languages;
|
||||
|
||||
Options.language = LANG_En; /* First language */
|
||||
for (;p->name;p++)
|
||||
{
|
||||
if (!lstrcmpi32A( p->name, arg )) {
|
||||
if (!lstrcmpi32A( p->name, arg ))
|
||||
{
|
||||
WINE_LanguageId = p->langid;
|
||||
return;
|
||||
}
|
||||
Options.language++;
|
||||
}
|
||||
fprintf( stderr, "Invalid language specified '%s'. Supported languages are: ", arg );
|
||||
for (p = languages; p->name; p++) fprintf( stderr, "%s ", p->name );
|
||||
for (p = Languages; p->name; p++) fprintf( stderr, "%s ", p->name );
|
||||
fprintf( stderr, "\n" );
|
||||
exit(1);
|
||||
}
|
||||
|
|
348
misc/ole2nls.c
348
misc/ole2nls.c
|
@ -73,12 +73,14 @@ int GetLocaleInfoA(DWORD lcid,DWORD LCType,LPSTR buf,WORD len)
|
|||
int retLen;
|
||||
dprintf_ole(stddeb,"GetLocaleInfoA(%8lX,%8lX,%p,%4X)\n",
|
||||
lcid,LCType,buf,len);
|
||||
#if 0
|
||||
/* Wine is supporting only the default locale */
|
||||
if(lcid!=GetUserDefaultLCID())
|
||||
{
|
||||
dprintf_ole(stdnimp,"GetLocaleInfoA: Unknown locale\n");
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
/* As an option, we could obtain the value from win.ini.
|
||||
This would not match the Wine compile-time option.
|
||||
Also, not all identifiers are available from win.ini */
|
||||
|
@ -424,6 +426,131 @@ LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
|
|||
/* LOCVAL(LOCALE_INEGSEPBYSPACE) */
|
||||
break; /* LANG(Da) */
|
||||
|
||||
case LANG_En:
|
||||
/* This definitions apply to Germany only. Users in Austria
|
||||
or Switzerland might want to modify them */
|
||||
LOCVAL(LOCALE_ILANGUAGE,"9")
|
||||
LOCVAL(LOCALE_SLANGUAGE,"English")
|
||||
LOCVAL(LOCALE_SENGLANGUAGE,"English")
|
||||
LOCVAL(LOCALE_SABBREVLANGNAME,"enu")
|
||||
LOCVAL(LOCALE_SNATIVELANGNAME,"English")
|
||||
LOCVAL(LOCALE_ICOUNTRY,"11")
|
||||
LOCVAL(LOCALE_SCOUNTRY,"Deutschland")
|
||||
LOCVAL(LOCALE_SENGCOUNTRY,"Deutschland")
|
||||
LOCVAL(LOCALE_SABBREVCTRYNAME,"De")
|
||||
LOCVAL(LOCALE_SNATIVECTRYNAME,"Deutschland")
|
||||
LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9")
|
||||
LOCVAL(LOCALE_IDEFAULTCOUNTRY,"49")
|
||||
/* Dunno
|
||||
LOCVAL(LOCALE_IDEFAULTCODEPAGE)
|
||||
LOCVAL(LOCALE_IDEFAULTANSICODEPAGE)
|
||||
*/
|
||||
LOCVAL(LOCALE_SLIST,";")
|
||||
LOCVAL(LOCALE_IMEASURE,"0")
|
||||
LOCVAL(LOCALE_SDECIMAL,",")
|
||||
LOCVAL(LOCALE_STHOUSAND,".")
|
||||
/*
|
||||
LOCVAL(LOCALE_SGROUPING)
|
||||
*/
|
||||
LOCVAL(LOCALE_IDIGITS,"2")
|
||||
LOCVAL(LOCALE_ILZERO,"1")
|
||||
/*
|
||||
LOCVAL(LOCALE_INEGNUMBER)
|
||||
Is this "0123456789" ??
|
||||
LOCVAL(LOCALE_SNATIVEDIGITS)
|
||||
*/
|
||||
LOCVAL(LOCALE_SCURRENCY,"DM")
|
||||
/*
|
||||
LOCVAL(LOCALE_SINTLSYMBOL)
|
||||
LOCVAL(LOCALE_SMONDECIMALSEP)
|
||||
LOCVAL(LOCALE_SMONTHOUSANDSEP)
|
||||
LOCVAL(LOCALE_SMONGROUPING)
|
||||
*/
|
||||
LOCVAL(LOCALE_ICURRDIGITS,"2")
|
||||
/*
|
||||
LOCVAL(LOCALE_IINTLCURRDIGITS)
|
||||
*/
|
||||
LOCVAL(LOCALE_ICURRENCY,"3")
|
||||
LOCVAL(LOCALE_INEGCURR,"8")
|
||||
LOCVAL(LOCALE_SDATE,".")
|
||||
LOCVAL(LOCALE_STIME,":")
|
||||
LOCVAL(LOCALE_SSHORTDATE,"dd.MM.yyyy")
|
||||
LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
|
||||
/*
|
||||
LOCVAL(LOCALE_STIMEFORMAT)
|
||||
*/
|
||||
LOCVAL(LOCALE_IDATE,"1")
|
||||
/*
|
||||
LOCVAL(LOCALE_ILDATE)
|
||||
*/
|
||||
LOCVAL(LOCALE_ITIME,"1")
|
||||
/*
|
||||
LOCVAL(LOCALE_ITIMEMARKPOSN)
|
||||
LOCVAL(LOCALE_ICENTURY)
|
||||
*/
|
||||
LOCVAL(LOCALE_ITLZERO,"1")
|
||||
/*
|
||||
LOCVAL(LOCALE_IDAYLZERO)
|
||||
LOCVAL(LOCALE_IMONLZERO)
|
||||
LOCVAL(LOCALE_S1159)
|
||||
LOCVAL(LOCALE_S2359)
|
||||
LOCVAL(LOCALE_ICALENDARTYPE)
|
||||
LOCVAL(LOCALE_IOPTIONALCALENDAR)
|
||||
LOCVAL(LOCALE_IFIRSTDAYOFWEEK)
|
||||
LOCVAL(LOCALE_IFIRSTWEEKOFYEAR)
|
||||
*/
|
||||
LOCVAL(LOCALE_SDAYNAME1,"Montag")
|
||||
LOCVAL(LOCALE_SDAYNAME2,"Dienstag")
|
||||
LOCVAL(LOCALE_SDAYNAME3,"Mittwoch")
|
||||
LOCVAL(LOCALE_SDAYNAME4,"Donnerstag")
|
||||
LOCVAL(LOCALE_SDAYNAME5,"Freitag")
|
||||
LOCVAL(LOCALE_SDAYNAME6,"Sonnabend")
|
||||
LOCVAL(LOCALE_SDAYNAME7,"Sonntag")
|
||||
LOCVAL(LOCALE_SABBREVDAYNAME1,"Mo")
|
||||
LOCVAL(LOCALE_SABBREVDAYNAME2,"Di")
|
||||
LOCVAL(LOCALE_SABBREVDAYNAME3,"Mi")
|
||||
LOCVAL(LOCALE_SABBREVDAYNAME4,"Do")
|
||||
LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr")
|
||||
LOCVAL(LOCALE_SABBREVDAYNAME6,"Sa")
|
||||
LOCVAL(LOCALE_SABBREVDAYNAME7,"So")
|
||||
LOCVAL(LOCALE_SMONTHNAME1,"Januar")
|
||||
LOCVAL(LOCALE_SMONTHNAME2,"Februar")
|
||||
LOCVAL(LOCALE_SMONTHNAME3,"März")
|
||||
LOCVAL(LOCALE_SMONTHNAME4,"April")
|
||||
LOCVAL(LOCALE_SMONTHNAME5,"Mai")
|
||||
LOCVAL(LOCALE_SMONTHNAME6,"Juni")
|
||||
LOCVAL(LOCALE_SMONTHNAME7,"Juli")
|
||||
LOCVAL(LOCALE_SMONTHNAME8,"August")
|
||||
LOCVAL(LOCALE_SMONTHNAME9,"September")
|
||||
LOCVAL(LOCALE_SMONTHNAME10,"Oktober")
|
||||
LOCVAL(LOCALE_SMONTHNAME11,"November")
|
||||
LOCVAL(LOCALE_SMONTHNAME12,"Dezember")
|
||||
LOCVAL(LOCALE_SMONTHNAME13,"")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME1,"Jan")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME2,"Feb")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mär")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME4,"Apr")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME5,"Mai")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME6,"Jun")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME7,"Jul")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME8,"Aug")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME9,"Sep")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME10,"Okt")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME11,"Nov")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME12,"Dez")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
|
||||
/*
|
||||
LOCVAL(LOCALE_SPOSITIVESIGN)
|
||||
LOCVAL(LOCALE_SNEGATIVESIGN)
|
||||
LOCVAL(LOCALE_IPOSSIGNPOSN)
|
||||
LOCVAL(LOCALE_INEGSIGNPOSN)
|
||||
LOCVAL(LOCALE_IPOSSYMPRECEDES)
|
||||
LOCVAL(LOCALE_IPOSSEPBYSPACE)
|
||||
LOCVAL(LOCALE_INEGSYMPRECEDES)
|
||||
LOCVAL(LOCALE_INEGSEPBYSPACE)
|
||||
*/
|
||||
break; /* LANG(En) */
|
||||
|
||||
case LANG_Eo:
|
||||
/* LOCVAL(LOCALE_ILANGUAGE,"9") ISO numerical ID for language TODO */
|
||||
LOCVAL(LOCALE_SLANGUAGE,"Esperanto")
|
||||
|
@ -437,8 +564,8 @@ LOCVAL(LOCALE_SNATIVELANGNAME,"Esperanto")
|
|||
/* LOCVAL(LOCALE_SNATIVECTRYNAME,"Deutschland") */
|
||||
/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9") ISO ID of lang TODO */
|
||||
/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"49") */
|
||||
LOCVAL(LOCALE_IDEFAULTCODEPAGE,3) /* is this right? TODO */
|
||||
LOCVAL(LOCALE_IDEFAULTANSICODEPAGE,3) /* is this right? TODO */
|
||||
LOCVAL(LOCALE_IDEFAULTCODEPAGE,"3") /* is this right? TODO */
|
||||
LOCVAL(LOCALE_IDEFAULTANSICODEPAGE,"3") /* is this right? TODO */
|
||||
LOCVAL(LOCALE_SLIST,";")
|
||||
LOCVAL(LOCALE_IMEASURE,"0")
|
||||
LOCVAL(LOCALE_SDECIMAL,",")
|
||||
|
@ -772,6 +899,209 @@ LOCVAL(LOCALE_INEGSEPBYSPACE)
|
|||
*/
|
||||
break; /* LANG(It) */
|
||||
|
||||
case 0x0409:
|
||||
LOCVAL(LOCALE_ILANGUAGE, "0409")
|
||||
LOCVAL(LOCALE_SLANGUAGE, "English (United States)")
|
||||
LOCVAL(LOCALE_SENGLANGUAGE, "English")
|
||||
LOCVAL(LOCALE_SABBREVLANGNAME, "ENU")
|
||||
LOCVAL(LOCALE_SNATIVELANGNAME, "English")
|
||||
LOCVAL(LOCALE_ICOUNTRY, "1")
|
||||
LOCVAL(LOCALE_SCOUNTRY, "United States")
|
||||
LOCVAL(LOCALE_SENGCOUNTRY, "United States")
|
||||
LOCVAL(LOCALE_SABBREVCTRYNAME, "USA")
|
||||
LOCVAL(LOCALE_SNATIVECTRYNAME, "United States")
|
||||
LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0409")
|
||||
LOCVAL(LOCALE_IDEFAULTCOUNTRY, "1")
|
||||
LOCVAL(LOCALE_IDEFAULTCODEPAGE, "437")
|
||||
LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252")
|
||||
LOCVAL(LOCALE_SLIST, ",")
|
||||
LOCVAL(LOCALE_IMEASURE, "1")
|
||||
LOCVAL(LOCALE_SDECIMAL, ".")
|
||||
LOCVAL(LOCALE_STHOUSAND, ",")
|
||||
LOCVAL(LOCALE_SGROUPING, "3;0")
|
||||
LOCVAL(LOCALE_IDIGITS, "2")
|
||||
LOCVAL(LOCALE_ILZERO, "1")
|
||||
LOCVAL(LOCALE_INEGNUMBER, "1")
|
||||
LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
|
||||
LOCVAL(LOCALE_SCURRENCY, "$")
|
||||
LOCVAL(LOCALE_SINTLSYMBOL, "USD")
|
||||
LOCVAL(LOCALE_SMONDECIMALSEP, ".")
|
||||
LOCVAL(LOCALE_SMONTHOUSANDSEP, ",")
|
||||
LOCVAL(LOCALE_SMONGROUPING, "3;0")
|
||||
LOCVAL(LOCALE_ICURRDIGITS, "2")
|
||||
LOCVAL(LOCALE_IINTLCURRDIGITS, "2")
|
||||
LOCVAL(LOCALE_ICURRENCY, "0")
|
||||
LOCVAL(LOCALE_INEGCURR, "0")
|
||||
LOCVAL(LOCALE_SDATE, "/")
|
||||
LOCVAL(LOCALE_STIME, ":")
|
||||
LOCVAL(LOCALE_SSHORTDATE, "M/d/yy")
|
||||
LOCVAL(LOCALE_SLONGDATE, "dddd, MMMM dd, yyyy")
|
||||
LOCVAL(LOCALE_STIMEFORMAT, "h:mm:ss tt")
|
||||
LOCVAL(LOCALE_IDATE, "0")
|
||||
LOCVAL(LOCALE_ILDATE, "0")
|
||||
LOCVAL(LOCALE_ITIME, "0")
|
||||
LOCVAL(LOCALE_ITIMEMARKPOSN, "0")
|
||||
LOCVAL(LOCALE_ICENTURY, "0")
|
||||
LOCVAL(LOCALE_ITLZERO, "0")
|
||||
LOCVAL(LOCALE_IDAYLZERO, "0")
|
||||
LOCVAL(LOCALE_IMONLZERO, "0")
|
||||
LOCVAL(LOCALE_S1159, "AM")
|
||||
LOCVAL(LOCALE_S2359, "PM")
|
||||
LOCVAL(LOCALE_ICALENDARTYPE, "1")
|
||||
LOCVAL(LOCALE_IOPTIONALCALENDAR, "0")
|
||||
LOCVAL(LOCALE_IFIRSTDAYOFWEEK, "6")
|
||||
LOCVAL(LOCALE_IFIRSTWEEKOFYEAR, "0")
|
||||
LOCVAL(LOCALE_SDAYNAME1, "Monday")
|
||||
LOCVAL(LOCALE_SDAYNAME2, "Tuesday")
|
||||
LOCVAL(LOCALE_SDAYNAME3, "Wednesday")
|
||||
LOCVAL(LOCALE_SDAYNAME4, "Thursday")
|
||||
LOCVAL(LOCALE_SDAYNAME5, "Friday")
|
||||
LOCVAL(LOCALE_SDAYNAME6, "Saturday")
|
||||
LOCVAL(LOCALE_SDAYNAME7, "Sunday")
|
||||
LOCVAL(LOCALE_SABBREVDAYNAME1, "Mon")
|
||||
LOCVAL(LOCALE_SABBREVDAYNAME2, "Tue")
|
||||
LOCVAL(LOCALE_SABBREVDAYNAME3, "Wed")
|
||||
LOCVAL(LOCALE_SABBREVDAYNAME4, "Thu")
|
||||
LOCVAL(LOCALE_SABBREVDAYNAME5, "Fri")
|
||||
LOCVAL(LOCALE_SABBREVDAYNAME6, "Sat")
|
||||
LOCVAL(LOCALE_SABBREVDAYNAME7, "Sun")
|
||||
LOCVAL(LOCALE_SMONTHNAME1, "January")
|
||||
LOCVAL(LOCALE_SMONTHNAME2, "February")
|
||||
LOCVAL(LOCALE_SMONTHNAME3, "March")
|
||||
LOCVAL(LOCALE_SMONTHNAME4, "April")
|
||||
LOCVAL(LOCALE_SMONTHNAME5, "May")
|
||||
LOCVAL(LOCALE_SMONTHNAME6, "June")
|
||||
LOCVAL(LOCALE_SMONTHNAME7, "July")
|
||||
LOCVAL(LOCALE_SMONTHNAME8, "August")
|
||||
LOCVAL(LOCALE_SMONTHNAME9, "September")
|
||||
LOCVAL(LOCALE_SMONTHNAME10, "October")
|
||||
LOCVAL(LOCALE_SMONTHNAME11, "November")
|
||||
LOCVAL(LOCALE_SMONTHNAME12, "December")
|
||||
LOCVAL(LOCALE_SMONTHNAME13, "")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME1, "Jan")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME2, "Feb")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME3, "Mar")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME4, "Apr")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME5, "May")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME6, "Jun")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME7, "Jul")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME8, "Aug")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME9, "Sep")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME10, "Oct")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME11, "Nov")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME12, "Dec")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME13, "")
|
||||
LOCVAL(LOCALE_SPOSITIVESIGN, "")
|
||||
LOCVAL(LOCALE_SNEGATIVESIGN, "-")
|
||||
LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
|
||||
LOCVAL(LOCALE_INEGSIGNPOSN, "0")
|
||||
LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
|
||||
LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
|
||||
LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
|
||||
LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
|
||||
break; /* LANG(0x0409) (U.S. English) */
|
||||
|
||||
case 0x0809:
|
||||
LOCVAL(LOCALE_ILANGUAGE, "0809")
|
||||
LOCVAL(LOCALE_SLANGUAGE, "English (United Kingdom)")
|
||||
LOCVAL(LOCALE_SENGLANGUAGE, "English")
|
||||
LOCVAL(LOCALE_SABBREVLANGNAME, "ENG")
|
||||
LOCVAL(LOCALE_SNATIVELANGNAME, "English")
|
||||
LOCVAL(LOCALE_ICOUNTRY, "44")
|
||||
LOCVAL(LOCALE_SCOUNTRY, "United Kingdom")
|
||||
LOCVAL(LOCALE_SENGCOUNTRY, "United Kingdom")
|
||||
LOCVAL(LOCALE_SABBREVCTRYNAME, "GBR")
|
||||
LOCVAL(LOCALE_SNATIVECTRYNAME, "United Kingdom")
|
||||
LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0809")
|
||||
LOCVAL(LOCALE_IDEFAULTCOUNTRY, "44")
|
||||
LOCVAL(LOCALE_IDEFAULTCODEPAGE, "850")
|
||||
LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252")
|
||||
LOCVAL(LOCALE_SLIST, ",")
|
||||
LOCVAL(LOCALE_IMEASURE, "0")
|
||||
LOCVAL(LOCALE_SDECIMAL, ".")
|
||||
LOCVAL(LOCALE_STHOUSAND, ",")
|
||||
LOCVAL(LOCALE_SGROUPING, "3;0")
|
||||
LOCVAL(LOCALE_IDIGITS, "2")
|
||||
LOCVAL(LOCALE_ILZERO, "1")
|
||||
LOCVAL(LOCALE_INEGNUMBER, "1")
|
||||
LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
|
||||
LOCVAL(LOCALE_SCURRENCY, "£")
|
||||
LOCVAL(LOCALE_SINTLSYMBOL, "GBP")
|
||||
LOCVAL(LOCALE_SMONDECIMALSEP, ".")
|
||||
LOCVAL(LOCALE_SMONTHOUSANDSEP, ",")
|
||||
LOCVAL(LOCALE_SMONGROUPING, "3;0")
|
||||
LOCVAL(LOCALE_ICURRDIGITS, "2")
|
||||
LOCVAL(LOCALE_IINTLCURRDIGITS, "2")
|
||||
LOCVAL(LOCALE_ICURRENCY, "0")
|
||||
LOCVAL(LOCALE_INEGCURR, "1")
|
||||
LOCVAL(LOCALE_SDATE, "/")
|
||||
LOCVAL(LOCALE_STIME, ":")
|
||||
LOCVAL(LOCALE_SSHORTDATE, "dd/MM/yy")
|
||||
LOCVAL(LOCALE_SLONGDATE, "dd MMMM yyyy")
|
||||
LOCVAL(LOCALE_STIMEFORMAT, "HH:mm:ss")
|
||||
LOCVAL(LOCALE_IDATE, "1")
|
||||
LOCVAL(LOCALE_ILDATE, "1")
|
||||
LOCVAL(LOCALE_ITIME, "1")
|
||||
LOCVAL(LOCALE_ITIMEMARKPOSN, "0")
|
||||
LOCVAL(LOCALE_ICENTURY, "0")
|
||||
LOCVAL(LOCALE_ITLZERO, "1")
|
||||
LOCVAL(LOCALE_IDAYLZERO, "1")
|
||||
LOCVAL(LOCALE_IMONLZERO, "1")
|
||||
LOCVAL(LOCALE_S1159, "")
|
||||
LOCVAL(LOCALE_S2359, "")
|
||||
LOCVAL(LOCALE_ICALENDARTYPE, "1")
|
||||
LOCVAL(LOCALE_IOPTIONALCALENDAR, "0")
|
||||
LOCVAL(LOCALE_IFIRSTDAYOFWEEK, "0")
|
||||
LOCVAL(LOCALE_IFIRSTWEEKOFYEAR, "0")
|
||||
LOCVAL(LOCALE_SDAYNAME1, "Monday")
|
||||
LOCVAL(LOCALE_SDAYNAME2, "Tuesday")
|
||||
LOCVAL(LOCALE_SDAYNAME3, "Wednesday")
|
||||
LOCVAL(LOCALE_SDAYNAME4, "Thursday")
|
||||
LOCVAL(LOCALE_SDAYNAME5, "Friday")
|
||||
LOCVAL(LOCALE_SDAYNAME6, "Saturday")
|
||||
LOCVAL(LOCALE_SDAYNAME7, "Sunday")
|
||||
LOCVAL(LOCALE_SABBREVDAYNAME1, "Mon")
|
||||
LOCVAL(LOCALE_SABBREVDAYNAME2, "Tue")
|
||||
LOCVAL(LOCALE_SABBREVDAYNAME3, "Wed")
|
||||
LOCVAL(LOCALE_SABBREVDAYNAME4, "Thu")
|
||||
LOCVAL(LOCALE_SABBREVDAYNAME5, "Fri")
|
||||
LOCVAL(LOCALE_SABBREVDAYNAME6, "Sat")
|
||||
LOCVAL(LOCALE_SABBREVDAYNAME7, "Sun")
|
||||
LOCVAL(LOCALE_SMONTHNAME1, "January")
|
||||
LOCVAL(LOCALE_SMONTHNAME2, "February")
|
||||
LOCVAL(LOCALE_SMONTHNAME3, "March")
|
||||
LOCVAL(LOCALE_SMONTHNAME4, "April")
|
||||
LOCVAL(LOCALE_SMONTHNAME5, "May")
|
||||
LOCVAL(LOCALE_SMONTHNAME6, "June")
|
||||
LOCVAL(LOCALE_SMONTHNAME7, "July")
|
||||
LOCVAL(LOCALE_SMONTHNAME8, "August")
|
||||
LOCVAL(LOCALE_SMONTHNAME9, "September")
|
||||
LOCVAL(LOCALE_SMONTHNAME10, "October")
|
||||
LOCVAL(LOCALE_SMONTHNAME11, "November")
|
||||
LOCVAL(LOCALE_SMONTHNAME12, "December")
|
||||
LOCVAL(LOCALE_SMONTHNAME13, "")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME1, "Jan")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME2, "Feb")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME3, "Mar")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME4, "Apr")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME5, "May")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME6, "Jun")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME7, "Jul")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME8, "Aug")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME9, "Sep")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME10, "Oct")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME11, "Nov")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME12, "Dec")
|
||||
LOCVAL(LOCALE_SABBREVMONTHNAME13, "")
|
||||
LOCVAL(LOCALE_SPOSITIVESIGN, "")
|
||||
LOCVAL(LOCALE_SNEGATIVESIGN, "-")
|
||||
LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
|
||||
LOCVAL(LOCALE_INEGSIGNPOSN, "3")
|
||||
LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
|
||||
LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
|
||||
LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
|
||||
LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
|
||||
break; /* LANG(0x0809) (U.K. English) */
|
||||
|
||||
/*Insert other languages here*/
|
||||
|
||||
|
@ -792,6 +1122,20 @@ LOCVAL(LOCALE_INEGSEPBYSPACE)
|
|||
return retLen;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* GetLocaleInfo32W (KERNEL32.230)
|
||||
* Is the last parameter really WORD for Win16?
|
||||
*/
|
||||
INT32 GetLocaleInfo32W(LCID lcid,LCTYPE LCType,LPWSTR wbuf,INT32 len)
|
||||
{
|
||||
int i;
|
||||
LPSTR abuf = (LPSTR) wbuf;
|
||||
INT32 n = GetLocaleInfoA(lcid, LCType, abuf, len);
|
||||
for (i = n; i > 0; --i) {
|
||||
wbuf[i] = abuf[i];
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* CompareString16 (OLE2NLS.8)
|
||||
|
|
229
misc/shell.c
229
misc/shell.c
|
@ -14,11 +14,38 @@
|
|||
#include "resource.h"
|
||||
#include "dlgs.h"
|
||||
#include "win.h"
|
||||
#include "cursoricon.h"
|
||||
#include "stddebug.h"
|
||||
#include "debug.h"
|
||||
#include "xmalloc.h"
|
||||
#include "winreg.h"
|
||||
|
||||
/* .ICO file ICONDIR definitions */
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
typedef struct
|
||||
{
|
||||
BYTE bWidth; /* Width, in pixels, of the image */
|
||||
BYTE bHeight; /* Height, in pixels, of the image */
|
||||
BYTE bColorCount; /* Number of colors in image (0 if >=8bpp) */
|
||||
BYTE bReserved; /* Reserved ( must be 0) */
|
||||
WORD wPlanes; /* Color Planes */
|
||||
WORD wBitCount; /* Bits per pixel */
|
||||
DWORD dwBytesInRes; /* How many bytes in this resource? */
|
||||
DWORD dwImageOffset; /* Where in the file is this image? */
|
||||
} icoICONDIRENTRY, *LPicoICONDIRENTRY;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
WORD idReserved; /* Reserved (must be 0) */
|
||||
WORD idType; /* Resource Type (1 for icons) */
|
||||
WORD idCount; /* How many images? */
|
||||
icoICONDIRENTRY idEntries[1]; /* An entry for each image (idCount of 'em) */
|
||||
} icoICONDIR, *LPicoICONDIR;
|
||||
|
||||
#pragma pack(4)
|
||||
|
||||
extern HANDLE CURSORICON_LoadHandler( HANDLE, HINSTANCE, BOOL);
|
||||
extern WORD GetIconID( HANDLE hResource, DWORD resType );
|
||||
|
||||
|
@ -124,7 +151,7 @@ static HINSTANCE SHELL_FindExecutable( LPCSTR lpFile,
|
|||
HINSTANCE retval=31; /* default - 'No association was found' */
|
||||
char *tok; /* token pointer */
|
||||
int i; /* random counter */
|
||||
char xlpFile[256]; /* result of SearchPath */
|
||||
char xlpFile[256]; /* result of SearchPath */
|
||||
|
||||
dprintf_exec(stddeb, "SHELL_FindExecutable: File %s, Dir %s\n",
|
||||
(lpFile != NULL?lpFile:"-"),
|
||||
|
@ -140,6 +167,10 @@ static HINSTANCE SHELL_FindExecutable( LPCSTR lpFile,
|
|||
}
|
||||
if (SearchPath32A(lpDirectory,lpFile,NULL,sizeof(xlpFile),xlpFile,NULL))
|
||||
lpFile = xlpFile;
|
||||
else {
|
||||
if (SearchPath32A(lpDirectory,lpFile,".exe",sizeof(xlpFile),xlpFile,NULL))
|
||||
lpFile = xlpFile;
|
||||
}
|
||||
|
||||
/* First thing we need is the file's extension */
|
||||
extension = strrchr( xlpFile, '.' ); /* Assume last "." is the one; */
|
||||
|
@ -376,7 +407,7 @@ INT ShellAbout(HWND hWnd, LPCSTR szApp, LPCSTR szOtherStuff, HICON16 hIcon)
|
|||
*
|
||||
* FIXME: Implement GetPEResourceTable in w32sys.c and call it here.
|
||||
*/
|
||||
BYTE* SHELL_GetResourceTable(HFILE hFile)
|
||||
static BYTE* SHELL_GetResourceTable(HFILE hFile)
|
||||
{
|
||||
struct mz_header_s mz_header;
|
||||
struct ne_header_s ne_header;
|
||||
|
@ -391,7 +422,7 @@ BYTE* SHELL_GetResourceTable(HFILE hFile)
|
|||
return NULL;
|
||||
|
||||
if (ne_header.ne_magic == PE_SIGNATURE)
|
||||
{ fprintf(stdnimp,"Win32 FIXME: file %s line %i\n", __FILE__, __LINE__ );
|
||||
{ fprintf(stdnimp,"Win32s FIXME: file %s line %i\n", __FILE__, __LINE__ );
|
||||
return NULL; }
|
||||
|
||||
if (ne_header.ne_magic != NE_SIGNATURE) return NULL;
|
||||
|
@ -417,7 +448,7 @@ BYTE* SHELL_GetResourceTable(HFILE hFile)
|
|||
/*************************************************************************
|
||||
* SHELL_LoadResource
|
||||
*/
|
||||
HANDLE SHELL_LoadResource(HINSTANCE hInst, HFILE hFile, NE_NAMEINFO* pNInfo, WORD sizeShift)
|
||||
static HANDLE SHELL_LoadResource(HINSTANCE hInst, HFILE hFile, NE_NAMEINFO* pNInfo, WORD sizeShift)
|
||||
{
|
||||
BYTE* ptr;
|
||||
HANDLE handle = DirectResAlloc( hInst, 0x10, (DWORD)pNInfo->length << sizeShift);
|
||||
|
@ -431,6 +462,74 @@ HANDLE SHELL_LoadResource(HINSTANCE hInst, HFILE hFile, NE_NAMEINFO* pNInfo, WOR
|
|||
return (HANDLE)0;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* ICO_LoadIcon
|
||||
*/
|
||||
static HANDLE ICO_LoadIcon(HINSTANCE hInst, HFILE hFile, LPicoICONDIRENTRY lpiIDE)
|
||||
{
|
||||
BYTE* ptr;
|
||||
HANDLE handle = DirectResAlloc( hInst, 0x10, lpiIDE->dwBytesInRes);
|
||||
|
||||
if( (ptr = (BYTE*)GlobalLock16( handle )) )
|
||||
{
|
||||
_llseek( hFile, lpiIDE->dwImageOffset, SEEK_SET);
|
||||
FILE_Read( hFile, (char*)ptr, lpiIDE->dwBytesInRes);
|
||||
return handle;
|
||||
}
|
||||
return (HANDLE)0;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* ICO_GetIconDirectory
|
||||
*
|
||||
* Read .ico file and build phony ICONDIR struct for GetIconID
|
||||
*/
|
||||
static HANDLE ICO_GetIconDirectory(HINSTANCE hInst, HFILE hFile, LPicoICONDIR* lplpiID )
|
||||
{
|
||||
WORD id[3]; /* idReserved, idType, idCount */
|
||||
LPicoICONDIR lpiID;
|
||||
int i;
|
||||
|
||||
_llseek( hFile, 0, SEEK_SET );
|
||||
if( FILE_Read(hFile,(char*)id,sizeof(id)) != sizeof(id) ) return 0;
|
||||
|
||||
/* check .ICO header
|
||||
*
|
||||
* - see http://www.microsoft.com/win32dev/ui/icons.htm
|
||||
*/
|
||||
|
||||
if( id[0] || id[1] != 1 || !id[2] ) return 0;
|
||||
|
||||
i = id[2]*sizeof(icoICONDIRENTRY) + sizeof(id);
|
||||
|
||||
lpiID = (LPicoICONDIR)xmalloc(i);
|
||||
|
||||
if( FILE_Read(hFile,(char*)lpiID->idEntries,i) == i )
|
||||
{
|
||||
HANDLE handle = DirectResAlloc( hInst, 0x10,
|
||||
id[2]*sizeof(ICONDIRENTRY) + sizeof(id) );
|
||||
if( handle )
|
||||
{
|
||||
CURSORICONDIR* lpID = (CURSORICONDIR*)GlobalLock16( handle );
|
||||
lpID->idReserved = lpiID->idReserved = id[0];
|
||||
lpID->idType = lpiID->idType = id[1];
|
||||
lpID->idCount = lpiID->idCount = id[2];
|
||||
for( i=0; i < lpiID->idCount; i++ )
|
||||
{
|
||||
memcpy((void*)(lpID->idEntries + i),
|
||||
(void*)(lpiID->idEntries + i), sizeof(ICONDIRENTRY) - 2);
|
||||
lpID->idEntries[i].icon.wResId = i;
|
||||
}
|
||||
*lplpiID = lpiID;
|
||||
return handle;
|
||||
}
|
||||
}
|
||||
/* fail */
|
||||
|
||||
free(lpiID);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* InternalExtractIcon [SHELL.39]
|
||||
*
|
||||
|
@ -449,79 +548,87 @@ HICON16 InternalExtractIcon(HINSTANCE hInstance, LPCSTR lpszExeFileName, UINT nI
|
|||
|
||||
if( hFile == HFILE_ERROR || !n ) return 0;
|
||||
|
||||
hRet = GlobalAlloc16( GMEM_FIXED, sizeof(HICON16)*n);
|
||||
hRet = GlobalAlloc16( GMEM_FIXED | GMEM_ZEROINIT, sizeof(HICON16)*n);
|
||||
RetPtr = (HICON16*)GlobalLock16(hRet);
|
||||
|
||||
*RetPtr = (n == 0xFFFF)? 0: 1; /* error return values */
|
||||
|
||||
pData = SHELL_GetResourceTable(hFile);
|
||||
if( pData )
|
||||
{
|
||||
HICON16 hIcon = 0;
|
||||
BOOL icoFile = FALSE;
|
||||
UINT iconDirCount = 0;
|
||||
UINT iconCount = 0;
|
||||
NE_TYPEINFO* pTInfo = (NE_TYPEINFO*)(pData + 2);
|
||||
NE_NAMEINFO* pIconStorage = NULL;
|
||||
NE_NAMEINFO* pIconDir = NULL;
|
||||
LPicoICONDIR lpiID = NULL;
|
||||
|
||||
if( pData == (BYTE*)-1 )
|
||||
{
|
||||
/* FIXME: possible .ICO file */
|
||||
/* check for .ICO file */
|
||||
|
||||
fprintf(stddeb,"InternalExtractIcon: cannot handle file %s\n", lpszExeFileName);
|
||||
hIcon = ICO_GetIconDirectory(hInstance, hFile, &lpiID);
|
||||
if( hIcon )
|
||||
{ icoFile = TRUE; iconDirCount = 1; iconCount = lpiID->idCount; }
|
||||
}
|
||||
else /* got resource table */
|
||||
else while( pTInfo->type_id && !(pIconStorage && pIconDir) )
|
||||
{
|
||||
UINT iconDirCount = 0;
|
||||
UINT iconCount = 0;
|
||||
NE_TYPEINFO* pTInfo = (NE_TYPEINFO*)(pData + 2);
|
||||
NE_NAMEINFO* pIconStorage = NULL;
|
||||
NE_NAMEINFO* pIconDir = NULL;
|
||||
|
||||
/* find icon directory and icon repository */
|
||||
|
||||
while( pTInfo->type_id && !(pIconStorage && pIconDir) )
|
||||
if( pTInfo->type_id == NE_RSCTYPE_GROUP_ICON )
|
||||
{
|
||||
if( pTInfo->type_id == NE_RSCTYPE_GROUP_ICON )
|
||||
{
|
||||
iconDirCount = pTInfo->count;
|
||||
pIconDir = ((NE_NAMEINFO*)(pTInfo + 1));
|
||||
dprintf_reg(stddeb,"\tfound directory - %i icon families\n", iconDirCount);
|
||||
}
|
||||
if( pTInfo->type_id == NE_RSCTYPE_ICON )
|
||||
{
|
||||
iconCount = pTInfo->count;
|
||||
pIconStorage = ((NE_NAMEINFO*)(pTInfo + 1));
|
||||
dprintf_reg(stddeb,"\ttotal icons - %i\n", iconCount);
|
||||
}
|
||||
pTInfo = (NE_TYPEINFO *)((char*)(pTInfo+1)+pTInfo->count*sizeof(NE_NAMEINFO));
|
||||
}
|
||||
|
||||
/* load resources and create icons */
|
||||
|
||||
if( pIconStorage && pIconDir )
|
||||
|
||||
if( nIconIndex == (UINT)-1 ) RetPtr[0] = iconDirCount;
|
||||
else if( nIconIndex < iconDirCount )
|
||||
{
|
||||
HICON16 hIcon;
|
||||
UINT i, icon;
|
||||
|
||||
if( n > iconDirCount - nIconIndex ) n = iconDirCount - nIconIndex;
|
||||
|
||||
for( i = nIconIndex; i < nIconIndex + n; i++ )
|
||||
{
|
||||
hIcon = SHELL_LoadResource( hInstance, hFile, pIconDir + i,
|
||||
*(WORD*)pData );
|
||||
RetPtr[i-nIconIndex] = GetIconID( hIcon, 3 );
|
||||
GlobalFree16(hIcon);
|
||||
}
|
||||
|
||||
for( icon = nIconIndex; icon < nIconIndex + n; icon++ )
|
||||
{
|
||||
hIcon = 0;
|
||||
for( i = 0; i < iconCount; i++ )
|
||||
if( pIconStorage[i].id == (RetPtr[icon-nIconIndex] | 0x8000) )
|
||||
hIcon = SHELL_LoadResource( hInstance, hFile, pIconStorage + i,
|
||||
*(WORD*)pData );
|
||||
RetPtr[icon-nIconIndex] = (hIcon)?CURSORICON_LoadHandler( hIcon, hInstance, FALSE ):0;
|
||||
}
|
||||
}
|
||||
free(pData);
|
||||
iconDirCount = pTInfo->count;
|
||||
pIconDir = ((NE_NAMEINFO*)(pTInfo + 1));
|
||||
dprintf_reg(stddeb,"\tfound directory - %i icon families\n", iconDirCount);
|
||||
}
|
||||
if( pTInfo->type_id == NE_RSCTYPE_ICON )
|
||||
{
|
||||
iconCount = pTInfo->count;
|
||||
pIconStorage = ((NE_NAMEINFO*)(pTInfo + 1));
|
||||
dprintf_reg(stddeb,"\ttotal icons - %i\n", iconCount);
|
||||
}
|
||||
pTInfo = (NE_TYPEINFO *)((char*)(pTInfo+1)+pTInfo->count*sizeof(NE_NAMEINFO));
|
||||
}
|
||||
|
||||
/* load resources and create icons */
|
||||
|
||||
if( (pIconStorage && pIconDir) || icoFile )
|
||||
if( nIconIndex == (UINT)-1 ) RetPtr[0] = iconDirCount;
|
||||
else if( nIconIndex < iconDirCount )
|
||||
{
|
||||
UINT i, icon;
|
||||
|
||||
if( n > iconDirCount - nIconIndex ) n = iconDirCount - nIconIndex;
|
||||
|
||||
for( i = nIconIndex; i < nIconIndex + n; i++ )
|
||||
{
|
||||
/* .ICO files have only one icon directory */
|
||||
|
||||
if( !icoFile )
|
||||
hIcon = SHELL_LoadResource( hInstance, hFile, pIconDir + i,
|
||||
*(WORD*)pData );
|
||||
RetPtr[i-nIconIndex] = GetIconID( hIcon, 3 );
|
||||
GlobalFree16(hIcon);
|
||||
}
|
||||
|
||||
for( icon = nIconIndex; icon < nIconIndex + n; icon++ )
|
||||
{
|
||||
hIcon = 0;
|
||||
if( icoFile )
|
||||
hIcon = ICO_LoadIcon( hInstance, hFile, lpiID->idEntries + RetPtr[icon-nIconIndex]);
|
||||
else
|
||||
for( i = 0; i < iconCount; i++ )
|
||||
if( pIconStorage[i].id == (RetPtr[icon-nIconIndex] | 0x8000) )
|
||||
hIcon = SHELL_LoadResource( hInstance, hFile, pIconStorage + i,
|
||||
*(WORD*)pData );
|
||||
RetPtr[icon-nIconIndex] = (hIcon)?CURSORICON_LoadHandler( hIcon, hInstance, FALSE ):0;
|
||||
}
|
||||
}
|
||||
if( icoFile ) free(lpiID);
|
||||
else free(pData);
|
||||
}
|
||||
_lclose( hFile );
|
||||
|
||||
/* return array with icon handles */
|
||||
|
|
55
misc/spy.c
55
misc/spy.c
|
@ -20,11 +20,11 @@
|
|||
|
||||
static const char * const MessageTypeNames[SPY_MAX_MSGNUM + 1] =
|
||||
{
|
||||
"WM_NULL", /* 0x00 */
|
||||
"wm_null", /* 0x00 */
|
||||
"WM_CREATE",
|
||||
"WM_DESTROY",
|
||||
"WM_MOVE",
|
||||
"WM_SIZEWAIT",
|
||||
"wm_sizewait",
|
||||
"WM_SIZE",
|
||||
"WM_ACTIVATE",
|
||||
"WM_SETFOCUS",
|
||||
|
@ -43,7 +43,7 @@ static const char * const MessageTypeNames[SPY_MAX_MSGNUM + 1] =
|
|||
"WM_ERASEBKGND",
|
||||
"WM_SYSCOLORCHANGE",
|
||||
"WM_ENDSESSION",
|
||||
"WM_SYSTEMERROR",
|
||||
"wm_systemerror",
|
||||
"WM_SHOWWINDOW",
|
||||
"WM_CTLCOLOR",
|
||||
"WM_WININICHANGE",
|
||||
|
@ -57,11 +57,11 @@ static const char * const MessageTypeNames[SPY_MAX_MSGNUM + 1] =
|
|||
"WM_CHILDACTIVATE",
|
||||
"WM_QUEUESYNC",
|
||||
"WM_GETMINMAXINFO",
|
||||
"WM_UNUSED3",
|
||||
"WM_PAINTICON",
|
||||
"wm_unused3",
|
||||
"wm_painticon",
|
||||
"WM_ICONERASEBKGND",
|
||||
"WM_NEXTDLGCTL",
|
||||
"WM_ALTTABACTIVE",
|
||||
"wm_alttabactive",
|
||||
"WM_SPOOLERSTATUS",
|
||||
"WM_DRAWITEM",
|
||||
"WM_MEASUREITEM",
|
||||
|
@ -72,25 +72,27 @@ static const char * const MessageTypeNames[SPY_MAX_MSGNUM + 1] =
|
|||
"WM_GETFONT",
|
||||
"WM_SETHOTKEY",
|
||||
"WM_GETHOTKEY",
|
||||
"WM_FILESYSCHANGE",
|
||||
"WM_ISACTIVEICON",
|
||||
"WM_QUERYPARKICON",
|
||||
"wm_filesyschange",
|
||||
"wm_isactiveicon",
|
||||
"wm_queryparkicon",
|
||||
"WM_QUERYDRAGICON",
|
||||
"WM_QUERYSAVESTATE",
|
||||
"wm_querysavestate",
|
||||
"WM_COMPAREITEM",
|
||||
"WM_TESTING",
|
||||
"wm_testing",
|
||||
NULL,
|
||||
"WM_OTHERWINDOWCREATED",
|
||||
"WM_OTHERWINDOWDESTROYED",
|
||||
"WM_ACTIVATESHELLWINDOW",
|
||||
"wm_otherwindowcreated",
|
||||
"wm_otherwindowdestroyed",
|
||||
"wm_activateshellwindow",
|
||||
NULL,
|
||||
|
||||
NULL, /* 0x40 */
|
||||
"WM_COMPACTING", NULL, NULL,
|
||||
"wm_compacting", NULL, NULL,
|
||||
"WM_COMMNOTIFY", NULL,
|
||||
"WM_WINDOWPOSCHANGING", /* 0x0046 */
|
||||
"WM_WINDOWPOSCHANGED", /* 0x0047 */
|
||||
"WM_POWER", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
"WM_POWER", NULL,
|
||||
"WM_COPYDATA",
|
||||
"WM_CANCELJOURNAL", NULL, NULL, NULL, NULL,
|
||||
|
||||
NULL, /* 0x0050 */
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
|
@ -112,8 +114,8 @@ static const char * const MessageTypeNames[SPY_MAX_MSGNUM + 1] =
|
|||
"WM_NCPAINT", /* 0x0085 */
|
||||
"WM_NCACTIVATE", /* 0x0086 */
|
||||
"WM_GETDLGCODE", /* 0x0087 */
|
||||
"WM_SYNCPAINT",
|
||||
"WM_SYNCTASK", NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
"wm_syncpaint",
|
||||
"wm_synctask", NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
|
||||
/* 0x0090 */
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
|
@ -265,7 +267,7 @@ static const char * const MessageTypeNames[SPY_MAX_MSGNUM + 1] =
|
|||
"WM_PARENTNOTIFY", /* 0x0210 */
|
||||
"WM_ENTERMENULOOP", /* 0x0211 */
|
||||
"WM_EXITMENULOOP", /* 0x0212 */
|
||||
"WM_NEXTMENU", /* 0x0213 */
|
||||
"wm_nextmenu", /* 0x0213 */
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
|
||||
|
@ -292,7 +294,7 @@ static const char * const MessageTypeNames[SPY_MAX_MSGNUM + 1] =
|
|||
"WM_ENTERSIZEMOVE", /* 0x0231 */
|
||||
"WM_EXITSIZEMOVE", /* 0x0232 */
|
||||
"WM_DROPFILES", /* 0x0233 */
|
||||
NULL, NULL, NULL, NULL,
|
||||
"WM_MDIREFRESHMENU", NULL, NULL, NULL,
|
||||
/* 0x0238*/
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
|
||||
|
@ -350,8 +352,9 @@ static const char * const MessageTypeNames[SPY_MAX_MSGNUM + 1] =
|
|||
"WM_QUERYNEWPALETTE", /* 0x030f*/
|
||||
|
||||
"WM_PALETTEISCHANGING",
|
||||
"WM_PALETTECHANGED", /* 0x0311 */
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
"WM_PALETTECHANGED",
|
||||
"WM_HOTKEY", /* 0x0312 */
|
||||
NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
|
@ -371,7 +374,13 @@ static const char * const MessageTypeNames[SPY_MAX_MSGNUM + 1] =
|
|||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
|
||||
/* 0x0380 */
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
"WM_PENWINFIRST",
|
||||
"WM_RCRESULT",
|
||||
"WM_HOOKRCRESULT",
|
||||
"WM_GLOBALRCCHANGE",
|
||||
"WM_SKB",
|
||||
"WM_HEDITCTL",
|
||||
NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
|
||||
"WM_COALESCE_FIRST",
|
||||
|
|
10
misc/ver.c
10
misc/ver.c
|
@ -674,10 +674,8 @@ VerQueryValue16(SEGPTR segblock,LPCSTR subblock,SEGPTR *buffer,UINT16 *buflen)
|
|||
db=(struct db*)b;
|
||||
*buflen = db->datalen;
|
||||
/* let b point to data area */
|
||||
b = b+4+((strlen(db->name)+4)&3);
|
||||
/* now look up what the resp. SEGPTR would be ...
|
||||
* we could use MAKE_SEGPTR , but we don't need to
|
||||
*/
|
||||
b = b+4+((strlen(db->name)+4)&~3);
|
||||
/* now look up what the resp. SEGPTR would be ... */
|
||||
*buffer = (b-block)+segblock;
|
||||
fprintf(stderr," -> %s=%s\n",subblock,b);
|
||||
return 1;
|
||||
|
@ -703,7 +701,7 @@ VerQueryValue32A(LPVOID vblock,LPCSTR subblock,LPVOID *vbuffer,UINT32 *buflen)
|
|||
db=(struct db*)b;
|
||||
*buflen = db->datalen;
|
||||
/* let b point to data area */
|
||||
b = b+4+((strlen(db->name)+4)&3);
|
||||
b = b+4+((strlen(db->name)+4)&~3);
|
||||
*buffer = b;
|
||||
fprintf(stderr," -> %s=%s\n",subblock,b);
|
||||
return 1;
|
||||
|
@ -733,7 +731,7 @@ VerQueryValue32W(LPVOID vblock,LPCWSTR subblock,LPVOID *vbuffer,UINT32 *buflen)
|
|||
db=(struct db*)b;
|
||||
*buflen = db->datalen;
|
||||
/* let b point to data area */
|
||||
b = b+4+((strlen(db->name)+4)&3);
|
||||
b = b+4+((strlen(db->name)+4)&~3);
|
||||
*buffer = b;
|
||||
fprintf(stderr," -> %s=%s\n",sb,b);
|
||||
free(sb);
|
||||
|
|
|
@ -1127,8 +1127,8 @@ void DOS3Call( SIGCONTEXT *context )
|
|||
break;
|
||||
|
||||
case 0x39: /* "MKDIR" - CREATE SUBDIRECTORY */
|
||||
if (!CreateDirectory32A( PTR_SEG_OFF_TO_LIN( DS_reg(context),
|
||||
DX_reg(context) ), NULL))
|
||||
if (!CreateDirectory16( PTR_SEG_OFF_TO_LIN( DS_reg(context),
|
||||
DX_reg(context) ), NULL))
|
||||
{
|
||||
AX_reg(context) = DOS_ExtendedError;
|
||||
SET_CFLAG(context);
|
||||
|
@ -1136,8 +1136,8 @@ void DOS3Call( SIGCONTEXT *context )
|
|||
break;
|
||||
|
||||
case 0x3a: /* "RMDIR" - REMOVE SUBDIRECTORY */
|
||||
if (!RemoveDirectory32A( PTR_SEG_OFF_TO_LIN( DS_reg(context),
|
||||
DX_reg(context) )))
|
||||
if (!RemoveDirectory16( PTR_SEG_OFF_TO_LIN( DS_reg(context),
|
||||
DX_reg(context) )))
|
||||
{
|
||||
AX_reg(context) = DOS_ExtendedError;
|
||||
SET_CFLAG(context);
|
||||
|
@ -1584,8 +1584,43 @@ void DOS3Call( SIGCONTEXT *context )
|
|||
ExtendedOpenCreateFile(context);
|
||||
break;
|
||||
|
||||
case 0x71: /* MS-DOS 7 (Windows95) - LONG FILENAME FUNCTIONS */
|
||||
switch(AL_reg(context))
|
||||
{
|
||||
case 0x39: /* Create directory */
|
||||
if (!CreateDirectory32A( PTR_SEG_OFF_TO_LIN( DS_reg(context),
|
||||
DX_reg(context) ), NULL))
|
||||
{
|
||||
AX_reg(context) = DOS_ExtendedError;
|
||||
SET_CFLAG(context);
|
||||
}
|
||||
break;
|
||||
case 0x3a: /* Remove directory */
|
||||
if (!RemoveDirectory32A( PTR_SEG_OFF_TO_LIN( DS_reg(context),
|
||||
DX_reg(context) )))
|
||||
{
|
||||
AX_reg(context) = DOS_ExtendedError;
|
||||
SET_CFLAG(context);
|
||||
}
|
||||
break;
|
||||
case 0x3b: /* Change directory */
|
||||
case 0x41: /* Delete file */
|
||||
case 0x43: /* Get/Set file attributes */
|
||||
case 0x47: /* Get current directory */
|
||||
case 0x4e: /* Find first file */
|
||||
case 0x4f: /* Find next file */
|
||||
case 0x56: /* Move (rename) file */
|
||||
case 0x6c: /* Create/Open file */
|
||||
default:
|
||||
fprintf( stderr, "Unimplemented int21 long file name function:\n");
|
||||
INT_BARF( context, 0x21 );
|
||||
SET_CFLAG(context);
|
||||
AL_reg(context) = 0;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x70: /* MS-DOS 7 (Windows95) - ??? (country-specific?)*/
|
||||
case 0x71: /* MS-DOS 7 (Chicago) - LONG FILENAME FUNCTIONS */
|
||||
case 0x72: /* MS-DOS 7 (Windows95) - ??? */
|
||||
case 0x73: /* MS-DOS 7 (Windows95) - DRIVE LOCKING ??? */
|
||||
dprintf_int(stddeb,"int21: windows95 function AX %04x\n",
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
#include "driver.h"
|
||||
#include "mmsystem.h"
|
||||
#include "ldt.h"
|
||||
#include "stackframe.h"
|
||||
|
||||
#ifdef linux
|
||||
#include <linux/soundcard.h>
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -786,6 +786,7 @@ static void BITBLT_GetSrcAreaStretch( DC *dcSrc, DC *dcDst,
|
|||
RECT16 rectDst = *visRectDst;
|
||||
OffsetRect16( &rectSrc, -xSrc, -ySrc );
|
||||
OffsetRect16( &rectDst, -xDst, -yDst );
|
||||
/* FIXME: avoid BadMatch errors */
|
||||
imageSrc = XGetImage( display, dcSrc->u.x.drawable,
|
||||
visRectSrc->left, visRectSrc->top,
|
||||
visRectSrc->right - visRectSrc->left,
|
||||
|
@ -830,9 +831,19 @@ static void BITBLT_GetSrcArea( DC *dcSrc, DC *dcDst, Pixmap pixmap, GC gc,
|
|||
}
|
||||
else /* color -> color */
|
||||
{
|
||||
imageSrc = XGetImage( display, dcSrc->u.x.drawable,
|
||||
visRectSrc->left, visRectSrc->top,
|
||||
width, height, AllPlanes, ZPixmap );
|
||||
if (dcSrc->w.flags & DC_MEMORY)
|
||||
imageSrc = XGetImage( display, dcSrc->u.x.drawable,
|
||||
visRectSrc->left, visRectSrc->top,
|
||||
width, height, AllPlanes, ZPixmap );
|
||||
else
|
||||
{
|
||||
/* Make sure we don't get a BadMatch error */
|
||||
XCopyArea( display, dcSrc->u.x.drawable, pixmap, gc,
|
||||
visRectSrc->left, visRectSrc->top,
|
||||
width, height, 0, 0);
|
||||
imageSrc = XGetImage( display, pixmap, 0, 0, width, height,
|
||||
AllPlanes, ZPixmap );
|
||||
}
|
||||
for (y = 0; y < height; y++)
|
||||
for (x = 0; x < width; x++)
|
||||
XPutPixel(imageSrc, x, y,
|
||||
|
@ -864,6 +875,7 @@ static void BITBLT_GetSrcArea( DC *dcSrc, DC *dcDst, Pixmap pixmap, GC gc,
|
|||
}
|
||||
else /* color -> monochrome */
|
||||
{
|
||||
/* FIXME: avoid BadMatch error */
|
||||
imageSrc = XGetImage( display, dcSrc->u.x.drawable,
|
||||
visRectSrc->left, visRectSrc->top,
|
||||
width, height, AllPlanes, ZPixmap );
|
||||
|
@ -901,9 +913,20 @@ static void BITBLT_GetDstArea(DC *dc, Pixmap pixmap, GC gc, RECT16 *visRectDst)
|
|||
else
|
||||
{
|
||||
register short x, y;
|
||||
XImage *image = XGetImage( display, dc->u.x.drawable,
|
||||
visRectDst->left, visRectDst->top,
|
||||
width, height, AllPlanes, ZPixmap );
|
||||
XImage *image;
|
||||
|
||||
if (dc->w.flags & DC_MEMORY)
|
||||
image = XGetImage( display, dc->u.x.drawable,
|
||||
visRectDst->left, visRectDst->top,
|
||||
width, height, AllPlanes, ZPixmap );
|
||||
else
|
||||
{
|
||||
/* Make sure we don't get a BadMatch error */
|
||||
XCopyArea( display, dc->u.x.drawable, pixmap, gc,
|
||||
visRectDst->left, visRectDst->top, width, height, 0, 0);
|
||||
image = XGetImage( display, pixmap, 0, 0, width, height,
|
||||
AllPlanes, ZPixmap );
|
||||
}
|
||||
for (y = 0; y < height; y++)
|
||||
for (x = 0; x < width; x++)
|
||||
XPutPixel( image, x, y,
|
||||
|
|
|
@ -12,7 +12,6 @@
|
|||
#include "bitmap.h"
|
||||
#include "callback.h"
|
||||
#include "palette.h"
|
||||
#include "stackframe.h"
|
||||
#include "stddebug.h"
|
||||
#include "color.h"
|
||||
#include "debug.h"
|
||||
|
|
|
@ -12,7 +12,6 @@
|
|||
#include "bitmap.h"
|
||||
#include "file.h"
|
||||
#include "metafile.h"
|
||||
#include "stackframe.h"
|
||||
#include "stddebug.h"
|
||||
#include "debug.h"
|
||||
|
||||
|
@ -327,7 +326,7 @@ BOOL EnumMetaFile(HDC hdc, HMETAFILE16 hmf, MFENUMPROC16 lpEnumFunc,LPARAM lpDat
|
|||
{
|
||||
METAHEADER *mh = (METAHEADER *)GlobalLock16(hmf);
|
||||
METARECORD *mr;
|
||||
SEGPTR ht;
|
||||
SEGPTR ht, spRecord;
|
||||
int offset = 0;
|
||||
|
||||
dprintf_metafile(stddeb,"EnumMetaFile(%04x, %04x, %08lx, %08lx)\n",
|
||||
|
@ -343,10 +342,12 @@ BOOL EnumMetaFile(HDC hdc, HMETAFILE16 hmf, MFENUMPROC16 lpEnumFunc,LPARAM lpDat
|
|||
|
||||
/* loop through metafile records */
|
||||
|
||||
spRecord = WIN16_GlobalLock16(hmf);
|
||||
while (offset < (mh->mtSize * 2))
|
||||
{
|
||||
mr = (METARECORD *)((char *)mh + offset);
|
||||
if (!lpEnumFunc( hdc, ht, MAKE_SEGPTR(mr), /* FIXME!! */
|
||||
if (!lpEnumFunc( hdc, (HANDLETABLE16 *)ht,
|
||||
(METARECORD *)((UINT32)spRecord + offset),
|
||||
mh->mtNoObjects, (LONG)lpData))
|
||||
break;
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@ all: check_winerc $(PROGRAMS)
|
|||
@MAKE_RULES@
|
||||
|
||||
# Some strings need addresses >= 0x10000
|
||||
progman: $(MOSTOBJS) $(STRINGOBJS) $(WINELIB)
|
||||
progman: $(MOSTOBJS) $(STRINGOBJS)
|
||||
$(CC) -o progman $(MOSTOBJS) $(LDOPTIONS) $(ALL_LIBS) $(STRINGOBJS)
|
||||
|
||||
install: dummy
|
||||
|
|
|
@ -71,7 +71,7 @@ int PASCAL WinMain (HANDLE hInstance, HANDLE prev, LPSTR cmdline, int show)
|
|||
|
||||
/* Select Language */
|
||||
#ifdef WINELIB
|
||||
Globals.lpszLanguage = langNames[Options.language];
|
||||
Globals.lpszLanguage = Languages[Options.language].name;
|
||||
#else
|
||||
Globals.lpszLanguage = "En";
|
||||
#endif
|
||||
|
|
|
@ -122,8 +122,8 @@ VOID STRING_SelectLanguageByNumber(UINT num)
|
|||
|
||||
#ifdef WINELIB
|
||||
/* Update system menus */
|
||||
for (i = 0; langNames[i] && lstrcmp(lang, langNames[i]);) i++;
|
||||
if (langNames[i]) Options.language = i;
|
||||
for (i = 0; Languages[i].name && lstrcmp(lang, Languages[i].name);) i++;
|
||||
if (Languages[i].name) Options.language = i;
|
||||
|
||||
GetSystemMenu(Globals.hMainWnd, TRUE);
|
||||
for (hGroup = GROUP_FirstGroup(); hGroup;
|
||||
|
|
|
@ -36,7 +36,7 @@ all: check_winerc $(PROGRAMS)
|
|||
@MAKE_RULES@
|
||||
|
||||
# Some strings need addresses >= 0x10000
|
||||
winhelp: $(MOSTOBJS) $(STRINGOBJS) $(WINELIB)
|
||||
winhelp: $(MOSTOBJS) $(STRINGOBJS)
|
||||
$(CC) -o winhelp $(MOSTOBJS) $(LDOPTIONS) $(ALL_LIBS) $(STRINGOBJS)
|
||||
|
||||
hlp2sgml: hlp2sgml.o hlpfile.o
|
||||
|
|
|
@ -92,7 +92,7 @@ int PASCAL WinMain (HANDLE hInstance, HANDLE prev, LPSTR cmdline, int show)
|
|||
}
|
||||
|
||||
#ifdef WINELIB
|
||||
opt_lang = langNames[Options.language];
|
||||
opt_lang = Languages[Options.language].name;
|
||||
#endif
|
||||
|
||||
/* Find language specific string table */
|
||||
|
|
|
@ -1089,7 +1089,8 @@ static void BuildSpec32Files(void)
|
|||
printf( "\t.long Module_Start\n" ); /* Module start */
|
||||
printf( "\t.long %d\n", module_size ); /* Module size */
|
||||
printf( "\t.long %d\n", Base ); /* Base */
|
||||
printf( "\t.long %d\n", Limit ); /* Limit */
|
||||
printf( "\t.long %d\n", Limit+1 ); /* Size */
|
||||
printf( "\t.long Code_Start\n" ); /* Code start */
|
||||
printf( "\t.long Functions\n" ); /* Functions */
|
||||
printf( "\t.long FuncNames\n" ); /* Function names */
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@ struct FindFileContext32 {
|
|||
|
||||
typedef struct FindFileContext32 FindFileContext32;
|
||||
|
||||
const char *DOSFS_Hash(const char *, int);
|
||||
const char *DOSFS_Hash(const char *, int, int);
|
||||
|
||||
/* example D:\*.dbs */
|
||||
|
||||
|
@ -70,7 +70,7 @@ BOOL32 FindNextFile32A(HANDLE32 handle, LPWIN32_FIND_DATA32A data)
|
|||
strcmp(dirent->d_name, ".") == 0)
|
||||
continue;
|
||||
|
||||
strcpy(dosname, DOSFS_Hash(dirent->d_name, FALSE));
|
||||
strcpy(dosname, DOSFS_Hash(dirent->d_name, FALSE, FALSE));
|
||||
|
||||
if (MatchWildCard(dirent->d_name, context->mask)) {
|
||||
/* Full file name - is this a long file name?
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include <stdarg.h>
|
||||
#include "windows.h"
|
||||
#include "winerror.h"
|
||||
#include "stackframe.h"
|
||||
#include "heap.h"
|
||||
#include "xmalloc.h"
|
||||
#include "handle32.h"
|
||||
#include "struct32.h"
|
||||
|
@ -27,9 +27,11 @@
|
|||
BOOL USER32_GetMessageA(MSG32* lpmsg,DWORD hwnd,DWORD min,DWORD max)
|
||||
{
|
||||
BOOL ret;
|
||||
MSG16 msg;
|
||||
ret=GetMessage(MAKE_SEGPTR(&msg),(HWND)hwnd,min,max);
|
||||
STRUCT32_MSG16to32(&msg,lpmsg);
|
||||
MSG16 *msg = SEGPTR_NEW(MSG16);
|
||||
if (!msg) return 0;
|
||||
ret=GetMessage(SEGPTR_GET(msg),(HWND)hwnd,min,max);
|
||||
STRUCT32_MSG16to32(msg,lpmsg);
|
||||
SEGPTR_FREE(msg);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include "winpos.h"
|
||||
#include "string32.h"
|
||||
#include "syscolor.h"
|
||||
#include "sysmetrics.h"
|
||||
#include "stddebug.h"
|
||||
#include "debug.h"
|
||||
#include "spy.h"
|
||||
|
@ -101,7 +102,6 @@ static LRESULT DEFWND_DefWinProc( WND *wndPtr, UINT32 msg, WPARAM32 wParam,
|
|||
{
|
||||
switch(msg)
|
||||
{
|
||||
case WM_PAINTICON:
|
||||
case WM_NCPAINT:
|
||||
return NC_HandleNCPaint( wndPtr->hwndSelf, (HRGN)wParam );
|
||||
|
||||
|
@ -116,7 +116,7 @@ static LRESULT DEFWND_DefWinProc( WND *wndPtr, UINT32 msg, WPARAM32 wParam,
|
|||
return NC_HandleNCLButtonDblClk( wndPtr, wParam, lParam );
|
||||
|
||||
case WM_NCACTIVATE:
|
||||
return NC_HandleNCActivate( wndPtr->hwndSelf, wParam );
|
||||
return NC_HandleNCActivate( wndPtr, wParam );
|
||||
|
||||
case WM_NCDESTROY:
|
||||
if (wndPtr->text) HeapFree( SystemHeap, 0, wndPtr->text );
|
||||
|
@ -125,12 +125,26 @@ static LRESULT DEFWND_DefWinProc( WND *wndPtr, UINT32 msg, WPARAM32 wParam,
|
|||
if (wndPtr->pHScroll) HeapFree( SystemHeap, 0, wndPtr->pHScroll );
|
||||
wndPtr->pVScroll = wndPtr->pHScroll = NULL;
|
||||
return 0;
|
||||
|
||||
|
||||
case WM_PAINTICON:
|
||||
case WM_PAINT:
|
||||
{
|
||||
PAINTSTRUCT16 paintstruct;
|
||||
BeginPaint16( wndPtr->hwndSelf, &paintstruct );
|
||||
EndPaint16( wndPtr->hwndSelf, &paintstruct );
|
||||
PAINTSTRUCT16 ps;
|
||||
HDC hdc = BeginPaint16( wndPtr->hwndSelf, &ps );
|
||||
if( hdc )
|
||||
{
|
||||
if( (wndPtr->dwStyle & WS_MINIMIZE) && wndPtr->class->hIcon )
|
||||
{
|
||||
int x = (wndPtr->rectWindow.right - wndPtr->rectWindow.left -
|
||||
SYSMETRICS_CXICON)/2;
|
||||
int y = (wndPtr->rectWindow.bottom - wndPtr->rectWindow.top -
|
||||
SYSMETRICS_CYICON)/2;
|
||||
dprintf_win(stddeb,"Painting class icon: vis rect=(%i,%i - %i,%i)\n",
|
||||
ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right, ps.rcPaint.bottom );
|
||||
DrawIcon( hdc, x, y, wndPtr->class->hIcon );
|
||||
}
|
||||
EndPaint16( wndPtr->hwndSelf, &ps );
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -164,18 +178,33 @@ static LRESULT DEFWND_DefWinProc( WND *wndPtr, UINT32 msg, WPARAM32 wParam,
|
|||
case WM_ICONERASEBKGND:
|
||||
{
|
||||
if (!wndPtr->class->hbrBackground) return 0;
|
||||
if (wndPtr->class->hbrBackground <= (HBRUSH)(COLOR_MAX+1))
|
||||
|
||||
/* FIXME: should fill icon text with hbrushActiveCaption
|
||||
instead of this */
|
||||
|
||||
if (wndPtr->dwStyle & WS_MINIMIZE )
|
||||
{
|
||||
if( wndPtr->flags & WIN_NCACTIVATED )
|
||||
{
|
||||
FillWindow( GetParent(wndPtr->hwndSelf), wndPtr->hwndSelf,
|
||||
(HDC)wParam, sysColorObjects.hbrushActiveCaption );
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* FIXME: should draw parent' background somehow
|
||||
(e.g for textured desktop) ? */
|
||||
}
|
||||
|
||||
if (wndPtr->class->hbrBackground <= (HBRUSH)(COLOR_MAX+1))
|
||||
{
|
||||
HBRUSH hbrush;
|
||||
hbrush = CreateSolidBrush(
|
||||
GetSysColor(((DWORD)wndPtr->class->hbrBackground)-1));
|
||||
HBRUSH hbrush = CreateSolidBrush(
|
||||
GetSysColor(((DWORD)wndPtr->class->hbrBackground)-1));
|
||||
FillWindow( GetParent(wndPtr->hwndSelf), wndPtr->hwndSelf,
|
||||
(HDC)wParam, hbrush);
|
||||
DeleteObject (hbrush);
|
||||
}
|
||||
else
|
||||
FillWindow( GetParent(wndPtr->hwndSelf), wndPtr->hwndSelf,
|
||||
(HDC)wParam, wndPtr->class->hbrBackground );
|
||||
else FillWindow( GetParent(wndPtr->hwndSelf), wndPtr->hwndSelf,
|
||||
(HDC)wParam, wndPtr->class->hbrBackground );
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -12,7 +12,6 @@
|
|||
#include "heap.h"
|
||||
#include "win.h"
|
||||
#include "ldt.h"
|
||||
#include "stackframe.h"
|
||||
#include "string32.h"
|
||||
#include "user.h"
|
||||
#include "winproc.h"
|
||||
|
@ -724,33 +723,28 @@ static INT32 DIALOG_DoDialogBox( HWND hwnd, HWND owner )
|
|||
{
|
||||
WND * wndPtr;
|
||||
DIALOGINFO * dlgInfo;
|
||||
HANDLE msgHandle;
|
||||
MSG16* lpmsg;
|
||||
MSG16 msg;
|
||||
INT32 retval;
|
||||
|
||||
/* Owner must be a top-level window */
|
||||
owner = WIN_GetTopParent( owner );
|
||||
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return -1;
|
||||
if (!(msgHandle = USER_HEAP_ALLOC( sizeof(MSG16) ))) return -1;
|
||||
lpmsg = (MSG16 *) USER_HEAP_LIN_ADDR( msgHandle );
|
||||
dlgInfo = (DIALOGINFO *)wndPtr->wExtra;
|
||||
EnableWindow( owner, FALSE );
|
||||
ShowWindow( hwnd, SW_SHOW );
|
||||
|
||||
while (MSG_InternalGetMessage( (SEGPTR)USER_HEAP_SEG_ADDR(msgHandle), hwnd, owner,
|
||||
MSGF_DIALOGBOX, PM_REMOVE,
|
||||
!(wndPtr->dwStyle & DS_NOIDLEMSG) ))
|
||||
while (MSG_InternalGetMessage(&msg, hwnd, owner, MSGF_DIALOGBOX, PM_REMOVE,
|
||||
!(wndPtr->dwStyle & DS_NOIDLEMSG) ))
|
||||
{
|
||||
if (!IsDialogMessage( hwnd, lpmsg))
|
||||
if (!IsDialogMessage( hwnd, &msg))
|
||||
{
|
||||
TranslateMessage( lpmsg );
|
||||
DispatchMessage( lpmsg );
|
||||
TranslateMessage( &msg );
|
||||
DispatchMessage( &msg );
|
||||
}
|
||||
if (dlgInfo->fEnd) break;
|
||||
}
|
||||
retval = dlgInfo->msgResult;
|
||||
DestroyWindow( hwnd );
|
||||
USER_HEAP_FREE( msgHandle );
|
||||
EnableWindow( owner, TRUE );
|
||||
return retval;
|
||||
}
|
||||
|
|
|
@ -398,9 +398,9 @@ static void EVENT_Expose( WND *pWnd, XExposeEvent *event )
|
|||
rect.right = rect.left + event->width;
|
||||
rect.bottom = rect.top + event->height;
|
||||
|
||||
RedrawWindow32( pWnd->hwndSelf, &rect, 0,
|
||||
RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN | RDW_ERASE |
|
||||
(event->count ? 0 : RDW_ERASENOW) );
|
||||
PAINT_RedrawWindow( pWnd->hwndSelf, &rect, 0,
|
||||
RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN | RDW_ERASE |
|
||||
(event->count ? 0 : RDW_ERASENOW), 0 );
|
||||
}
|
||||
|
||||
|
||||
|
@ -420,9 +420,9 @@ static void EVENT_GraphicsExpose( WND *pWnd, XGraphicsExposeEvent *event )
|
|||
rect.right = rect.left + event->width;
|
||||
rect.bottom = rect.top + event->height;
|
||||
|
||||
RedrawWindow32( pWnd->hwndSelf, &rect, 0,
|
||||
RDW_INVALIDATE | RDW_ALLCHILDREN | RDW_ERASE |
|
||||
(event->count ? 0 : RDW_ERASENOW) );
|
||||
PAINT_RedrawWindow( pWnd->hwndSelf, &rect, 0,
|
||||
RDW_INVALIDATE | RDW_ALLCHILDREN | RDW_ERASE |
|
||||
(event->count ? 0 : RDW_ERASENOW), 0 );
|
||||
}
|
||||
|
||||
|
||||
|
@ -683,26 +683,17 @@ static void EVENT_ConfigureNotify( HWND hwnd, XConfigureEvent *event )
|
|||
}
|
||||
else
|
||||
{
|
||||
/* Managed window; most of this code is shamelessly
|
||||
* stolen from SetWindowPos - FIXME: outdated
|
||||
*/
|
||||
|
||||
WND *wndPtr;
|
||||
WINDOWPOS16 *winpos;
|
||||
RECT16 newWindowRect, newClientRect;
|
||||
HRGN hrgnOldPos, hrgnNewPos;
|
||||
|
||||
if (!(wndPtr = WIN_FindWndPtr( hwnd )))
|
||||
{
|
||||
dprintf_event(stddeb,"ConfigureNotify: invalid HWND %04x\n",hwnd);
|
||||
if (!(wndPtr = WIN_FindWndPtr( hwnd )) ||
|
||||
!(wndPtr->flags & WIN_MANAGED) )
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(winpos = SEGPTR_NEW(WINDOWPOS16))) return;
|
||||
|
||||
/* Artificial messages - what is this for? */
|
||||
SendMessage16(hwnd, WM_ENTERSIZEMOVE, 0, 0);
|
||||
SendMessage16(hwnd, WM_EXITSIZEMOVE, 0, 0);
|
||||
|
||||
/* Fill WINDOWPOS struct */
|
||||
winpos->flags = SWP_NOACTIVATE | SWP_NOZORDER;
|
||||
|
@ -744,8 +735,9 @@ static void EVENT_ConfigureNotify( HWND hwnd, XConfigureEvent *event )
|
|||
SEGPTR_FREE(winpos);
|
||||
|
||||
/* full window drag leaves unrepainted garbage without this */
|
||||
RedrawWindow32( 0, NULL, hrgnOldPos, RDW_INVALIDATE |
|
||||
RDW_ALLCHILDREN | RDW_ERASE | RDW_ERASENOW );
|
||||
PAINT_RedrawWindow( 0, NULL, hrgnOldPos, RDW_INVALIDATE |
|
||||
RDW_ALLCHILDREN | RDW_ERASE | RDW_ERASENOW,
|
||||
RDW_C_USEHRGN );
|
||||
DeleteObject(hrgnOldPos);
|
||||
DeleteObject(hrgnNewPos);
|
||||
}
|
||||
|
|
|
@ -581,6 +581,7 @@ COLORREF SetPixel( HDC hdc, short x, short y, COLORREF color )
|
|||
*/
|
||||
COLORREF GetPixel( HDC hdc, short x, short y )
|
||||
{
|
||||
static Pixmap pixmap = 0;
|
||||
XImage * image;
|
||||
int pixel;
|
||||
|
||||
|
@ -595,8 +596,21 @@ COLORREF GetPixel( HDC hdc, short x, short y )
|
|||
|
||||
x = dc->w.DCOrgX + XLPTODP( dc, x );
|
||||
y = dc->w.DCOrgY + YLPTODP( dc, y );
|
||||
image = XGetImage( display, dc->u.x.drawable, x, y,
|
||||
1, 1, AllPlanes, ZPixmap );
|
||||
if (dc->w.flags & DC_MEMORY)
|
||||
{
|
||||
image = XGetImage( display, dc->u.x.drawable, x, y, 1, 1,
|
||||
AllPlanes, ZPixmap );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* If we are reading from the screen, use a temporary copy */
|
||||
/* to avoid a BadMatch error */
|
||||
if (!pixmap) pixmap = XCreatePixmap( display, rootWindow,
|
||||
1, 1, dc->w.bitsPerPixel );
|
||||
XCopyArea( display, dc->u.x.drawable, pixmap, BITMAP_colorGC,
|
||||
x, y, 1, 1, 0, 0 );
|
||||
image = XGetImage( display, pixmap, 0, 0, 1, 1, AllPlanes, ZPixmap );
|
||||
}
|
||||
pixel = XGetPixel( image, 0, 0 );
|
||||
XDestroyImage( image );
|
||||
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
#include "user.h"
|
||||
#include "menu.h"
|
||||
#include "resource.h"
|
||||
#include "stackframe.h"
|
||||
#include "struct32.h"
|
||||
#include "sysmetrics.h"
|
||||
#include "stddebug.h"
|
||||
|
@ -129,8 +128,7 @@ static BOOL MDI_MenuDeleteItem(WND* clientWnd, HWND hWndChild )
|
|||
DeleteMenu(clientInfo->hWindowMenu,id,MF_BYCOMMAND);
|
||||
|
||||
/* walk the rest of MDI children to prevent gaps in the id
|
||||
* sequence and in the menu child list
|
||||
*/
|
||||
* sequence and in the menu child list */
|
||||
|
||||
for( index = id+1; index <= clientInfo->nActiveChildren +
|
||||
clientInfo->idFirstChild; index++ )
|
||||
|
@ -1223,6 +1221,29 @@ LRESULT DefFrameProc16( HWND16 hwnd, HWND16 hwndMDIClient, UINT16 message,
|
|||
MoveWindow(hwndMDIClient, 0, 0,
|
||||
LOWORD(lParam), HIWORD(lParam), TRUE);
|
||||
break;
|
||||
|
||||
case WM_NEXTMENU:
|
||||
|
||||
wndPtr = WIN_FindWndPtr(hwndMDIClient);
|
||||
ci = (MDICLIENTINFO*)wndPtr->wExtra;
|
||||
|
||||
if( !(wndPtr->parent->dwStyle & WS_MINIMIZE)
|
||||
&& ci->hwndActiveChild && !ci->hwndChildMaximized )
|
||||
{
|
||||
/* control menu is between the frame system menu and
|
||||
* the first entry of menu bar */
|
||||
|
||||
if( wParam == VK_LEFT )
|
||||
{ if( wndPtr->parent->wIDmenu != LOWORD(lParam) ) break; }
|
||||
else if( wParam == VK_RIGHT )
|
||||
{ if( GetSystemMenu( wndPtr->parent->hwndSelf, 0)
|
||||
!= LOWORD(lParam) ) break; }
|
||||
else break;
|
||||
|
||||
return MAKELONG( GetSystemMenu(ci->hwndActiveChild, 0),
|
||||
ci->hwndActiveChild );
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1420,13 +1441,19 @@ LRESULT DefMDIChildProc16( HWND16 hwnd, UINT16 message,
|
|||
|
||||
case WM_MENUCHAR:
|
||||
|
||||
/* MDI children don't have menus */
|
||||
/* MDI children don't have menu bars */
|
||||
PostMessage( clientWnd->parent->hwndSelf, WM_SYSCOMMAND,
|
||||
(WPARAM)SC_KEYMENU, (LPARAM)wParam);
|
||||
return 0x00010000L;
|
||||
|
||||
case WM_NEXTMENU:
|
||||
/* set current menu to child system menu */
|
||||
|
||||
if( wParam == VK_LEFT ) /* switch to frame system menu */
|
||||
return MAKELONG( GetSystemMenu(clientWnd->parent->hwndSelf, 0),
|
||||
clientWnd->parent->hwndSelf );
|
||||
if( wParam == VK_RIGHT ) /* to frame menu bar */
|
||||
return MAKELONG( clientWnd->parent->wIDmenu,
|
||||
clientWnd->parent->hwndSelf );
|
||||
|
||||
break;
|
||||
}
|
||||
|
@ -1468,7 +1495,7 @@ LRESULT DefMDIChildProc32A( HWND32 hwnd, UINT32 message,
|
|||
|
||||
case WM_MENUCHAR:
|
||||
|
||||
/* MDI children don't have menus */
|
||||
/* MDI children don't have menu bars */
|
||||
PostMessage( clientWnd->parent->hwndSelf, WM_SYSCOMMAND,
|
||||
(WPARAM)SC_KEYMENU, (LPARAM)LOWORD(wParam) );
|
||||
return 0x00010000L;
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
#include "heap.h"
|
||||
#include "hook.h"
|
||||
#include "spy.h"
|
||||
#include "stackframe.h"
|
||||
#include "winpos.h"
|
||||
#include "atom.h"
|
||||
#include "dde.h"
|
||||
|
@ -59,11 +58,12 @@ static BOOL MSG_TranslateMouseMsg( MSG16 *msg, BOOL remove )
|
|||
WND *pWnd;
|
||||
BOOL eatMsg = FALSE;
|
||||
INT16 hittest;
|
||||
MOUSEHOOKSTRUCT16 *hook;
|
||||
BOOL32 ret;
|
||||
static DWORD lastClickTime = 0;
|
||||
static WORD lastClickMsg = 0;
|
||||
static POINT16 lastClickPos = { 0, 0 };
|
||||
POINT16 pt = msg->pt;
|
||||
MOUSEHOOKSTRUCT16 hook = { msg->pt, 0, HTCLIENT, 0 };
|
||||
|
||||
BOOL mouseClick = ((msg->message == WM_LBUTTONDOWN) ||
|
||||
(msg->message == WM_RBUTTONDOWN) ||
|
||||
|
@ -73,12 +73,23 @@ static BOOL MSG_TranslateMouseMsg( MSG16 *msg, BOOL remove )
|
|||
|
||||
if ((msg->hwnd = GetCapture()) != 0)
|
||||
{
|
||||
BOOL32 ret;
|
||||
|
||||
ScreenToClient16( msg->hwnd, &pt );
|
||||
msg->lParam = MAKELONG( pt.x, pt.y );
|
||||
/* No need to further process the message */
|
||||
hook.hwnd = msg->hwnd;
|
||||
return !HOOK_CallHooks( WH_MOUSE, remove ? HC_ACTION : HC_NOREMOVE,
|
||||
msg->message, (LPARAM)MAKE_SEGPTR(&hook));
|
||||
|
||||
if (!HOOK_GetHook( WH_MOUSE, GetTaskQueue(0)) ||
|
||||
!(hook = SEGPTR_NEW(MOUSEHOOKSTRUCT16)))
|
||||
return TRUE;
|
||||
hook->pt = msg->pt;
|
||||
hook->hwnd = msg->hwnd;
|
||||
hook->wHitTestCode = HTCLIENT;
|
||||
hook->dwExtraInfo = 0;
|
||||
ret = !HOOK_CallHooks( WH_MOUSE, remove ? HC_ACTION : HC_NOREMOVE,
|
||||
msg->message, (LPARAM)SEGPTR_GET(hook));
|
||||
SEGPTR_FREE(hook);
|
||||
return ret;
|
||||
}
|
||||
|
||||
hittest = WINPOS_WindowFromPoint( msg->pt, &pWnd );
|
||||
|
@ -100,7 +111,7 @@ static BOOL MSG_TranslateMouseMsg( MSG16 *msg, BOOL remove )
|
|||
/* Send the WM_PARENTNOTIFY message */
|
||||
|
||||
WIN_SendParentNotify( msg->hwnd, msg->message, 0,
|
||||
MAKELONG( msg->pt.x, msg->pt.y ) );
|
||||
MAKELPARAM( msg->pt.x, msg->pt.y ) );
|
||||
|
||||
/* Activate the window if needed */
|
||||
|
||||
|
@ -167,11 +178,21 @@ static BOOL MSG_TranslateMouseMsg( MSG16 *msg, BOOL remove )
|
|||
msg->message += WM_NCLBUTTONDOWN - WM_LBUTTONDOWN;
|
||||
}
|
||||
msg->lParam = MAKELONG( pt.x, pt.y );
|
||||
|
||||
hook.hwnd = msg->hwnd;
|
||||
hook.wHitTestCode = hittest;
|
||||
return !HOOK_CallHooks( WH_MOUSE, remove ? HC_ACTION : HC_NOREMOVE,
|
||||
msg->message, (LPARAM)MAKE_SEGPTR(&hook));
|
||||
|
||||
/* Call the WH_MOUSE hook */
|
||||
|
||||
if (!HOOK_GetHook( WH_MOUSE, GetTaskQueue(0)) ||
|
||||
!(hook = SEGPTR_NEW(MOUSEHOOKSTRUCT16)))
|
||||
return TRUE;
|
||||
|
||||
hook->pt = msg->pt;
|
||||
hook->hwnd = msg->hwnd;
|
||||
hook->wHitTestCode = hittest;
|
||||
hook->dwExtraInfo = 0;
|
||||
ret = !HOOK_CallHooks( WH_MOUSE, remove ? HC_ACTION : HC_NOREMOVE,
|
||||
msg->message, (LPARAM)SEGPTR_GET(hook) );
|
||||
SEGPTR_FREE(hook);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
@ -214,6 +235,46 @@ static BOOL MSG_TranslateKeyboardMsg( MSG16 *msg, BOOL remove )
|
|||
msg->wParam, msg->lParam );
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* MSG_JournalRecordMsg
|
||||
*
|
||||
* Build an EVENTMSG structure and call JOURNALRECORD hook
|
||||
*/
|
||||
static void MSG_JournalRecordMsg( MSG16 *msg )
|
||||
{
|
||||
EVENTMSG16 *event = SEGPTR_NEW(EVENTMSG16);
|
||||
if (!event) return;
|
||||
event->message = msg->message;
|
||||
event->time = msg->time;
|
||||
if ((msg->message >= WM_KEYFIRST) && (msg->message <= WM_KEYLAST))
|
||||
{
|
||||
event->paramL = (msg->wParam & 0xFF) | (HIWORD(msg->lParam) << 8);
|
||||
event->paramH = msg->lParam & 0x7FFF;
|
||||
if (HIWORD(msg->lParam) & 0x0100)
|
||||
event->paramH |= 0x8000; /* special_key - bit */
|
||||
HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION, 0,
|
||||
(LPARAM)SEGPTR_GET(event) );
|
||||
}
|
||||
else if ((msg->message >= WM_MOUSEFIRST) && (msg->message <= WM_MOUSELAST))
|
||||
{
|
||||
event->paramL = LOWORD(msg->lParam); /* X pos */
|
||||
event->paramH = HIWORD(msg->lParam); /* Y pos */
|
||||
ClientToScreen16( msg->hwnd, (LPPOINT16)&event->paramL );
|
||||
HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION, 0,
|
||||
(LPARAM)SEGPTR_GET(event) );
|
||||
}
|
||||
else if ((msg->message >= WM_NCMOUSEMOVE) &&
|
||||
(msg->message <= WM_NCMBUTTONDBLCLK))
|
||||
{
|
||||
event->paramL = LOWORD(msg->lParam); /* X pos */
|
||||
event->paramH = HIWORD(msg->lParam); /* Y pos */
|
||||
event->message += WM_MOUSEMOVE-WM_NCMOUSEMOVE;/* give no info about NC area */
|
||||
HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION, 0,
|
||||
(LPARAM)SEGPTR_GET(event) );
|
||||
}
|
||||
SEGPTR_FREE(event);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* MSG_PeekHardwareMsg
|
||||
|
@ -246,10 +307,20 @@ static BOOL MSG_PeekHardwareMsg( MSG16 *msg, HWND hwnd, WORD first, WORD last,
|
|||
}
|
||||
else /* Non-standard hardware event */
|
||||
{
|
||||
HARDWAREHOOKSTRUCT16 hook = { msg->hwnd, msg->message,
|
||||
msg->wParam, msg->lParam };
|
||||
if (HOOK_CallHooks( WH_HARDWARE, remove ? HC_ACTION : HC_NOREMOVE,
|
||||
0, (LPARAM)MAKE_SEGPTR(&hook) )) continue;
|
||||
HARDWAREHOOKSTRUCT16 *hook;
|
||||
if ((hook = SEGPTR_NEW(HARDWAREHOOKSTRUCT16)))
|
||||
{
|
||||
BOOL32 ret;
|
||||
hook->hWnd = msg->hwnd;
|
||||
hook->wMessage = msg->message;
|
||||
hook->wParam = msg->wParam;
|
||||
hook->lParam = msg->lParam;
|
||||
ret = HOOK_CallHooks( WH_HARDWARE,
|
||||
remove ? HC_ACTION : HC_NOREMOVE,
|
||||
0, (LPARAM)SEGPTR_GET(hook) );
|
||||
SEGPTR_FREE(hook);
|
||||
if (ret) continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check message against filters */
|
||||
|
@ -261,35 +332,7 @@ static BOOL MSG_PeekHardwareMsg( MSG16 *msg, HWND hwnd, WORD first, WORD last,
|
|||
(GetWindowTask16(msg->hwnd) != GetCurrentTask()))
|
||||
continue; /* Not for this task */
|
||||
if (remove && HOOK_GetHook( WH_JOURNALRECORD, GetTaskQueue(0) ))
|
||||
{
|
||||
EVENTMSG16 *event = SEGPTR_NEW(EVENTMSG16);
|
||||
if (event)
|
||||
{
|
||||
event->message = msg->message;
|
||||
event->time = msg->time;
|
||||
if ((msg->message >= WM_KEYFIRST) &&
|
||||
(msg->message <= WM_KEYLAST))
|
||||
{
|
||||
event->paramL = (msg->wParam & 0xFF) |
|
||||
(HIWORD(msg->lParam) << 8);
|
||||
event->paramH = msg->lParam & 0x7FFF;
|
||||
if (HIWORD(msg->lParam) & 0x0100)
|
||||
event->paramH |= 0x8000; /* special_key - bit */
|
||||
HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION,
|
||||
0, (LPARAM)SEGPTR_GET(event) );
|
||||
}
|
||||
else if ((msg->message >= WM_MOUSEFIRST) &&
|
||||
(msg->message <= WM_MOUSELAST))
|
||||
{
|
||||
event->paramL = LOWORD(msg->lParam); /* X pos */
|
||||
event->paramH = HIWORD(msg->lParam); /* Y pos */
|
||||
ClientToScreen16( msg->hwnd, (LPPOINT16)&event->paramL );
|
||||
HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION,
|
||||
0, (LPARAM)SEGPTR_GET(event) );
|
||||
}
|
||||
SEGPTR_FREE(event);
|
||||
}
|
||||
}
|
||||
MSG_JournalRecordMsg( msg );
|
||||
if (remove) QUEUE_RemoveMsg( sysMsgQueue, pos );
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -336,7 +379,7 @@ static LRESULT MSG_SendMessage( HQUEUE16 hDestQueue, HWND hwnd, UINT msg,
|
|||
|
||||
if (queue->hWnd)
|
||||
{
|
||||
fprintf( stderr, "Nested SendMessage() not supported\n" );
|
||||
fprintf( stderr, "Nested SendMessage(), msg %04x skipped\n", msg );
|
||||
return 0;
|
||||
}
|
||||
queue->hWnd = hwnd;
|
||||
|
@ -479,24 +522,31 @@ static BOOL MSG_PeekMessage( LPMSG16 msg, HWND hwnd, WORD first, WORD last,
|
|||
|
||||
if ((msgQueue->wakeBits & mask) & QS_PAINT)
|
||||
{
|
||||
WND* wndPtr;
|
||||
msg->hwnd = WIN_FindWinToRepaint( hwnd , hQueue );
|
||||
msg->message = WM_PAINT;
|
||||
msg->wParam = 0;
|
||||
msg->lParam = 0;
|
||||
if( msg->hwnd &&
|
||||
(!hwnd || msg->hwnd == hwnd || IsChild(hwnd,msg->hwnd)) )
|
||||
{
|
||||
WND* wndPtr = WIN_FindWndPtr(msg->hwnd);
|
||||
|
||||
/* FIXME: WM_PAINTICON should be sent sometimes */
|
||||
if ((wndPtr = WIN_FindWndPtr(msg->hwnd)))
|
||||
{
|
||||
if( wndPtr->dwStyle & WS_MINIMIZE &&
|
||||
wndPtr->class->hIcon )
|
||||
{
|
||||
msg->message = WM_PAINTICON;
|
||||
msg->wParam = 1;
|
||||
}
|
||||
|
||||
if( wndPtr->flags & WIN_INTERNAL_PAINT && !wndPtr->hrgnUpdate)
|
||||
{
|
||||
wndPtr->flags &= ~WIN_INTERNAL_PAINT;
|
||||
QUEUE_DecPaintCount( hQueue );
|
||||
}
|
||||
break;
|
||||
}
|
||||
if( !hwnd || msg->hwnd == hwnd || IsChild(hwnd,msg->hwnd) )
|
||||
{
|
||||
if( wndPtr->flags & WIN_INTERNAL_PAINT && !wndPtr->hrgnUpdate)
|
||||
{
|
||||
wndPtr->flags &= ~WIN_INTERNAL_PAINT;
|
||||
QUEUE_DecPaintCount( hQueue );
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Check for timer messages, but yield first */
|
||||
|
@ -535,36 +585,52 @@ static BOOL MSG_PeekMessage( LPMSG16 msg, HWND hwnd, WORD first, WORD last,
|
|||
* 'hwnd' must be the handle of the dialog or menu window.
|
||||
* 'code' is the message filter value (MSGF_??? codes).
|
||||
*/
|
||||
BOOL MSG_InternalGetMessage( SEGPTR msg, HWND hwnd, HWND hwndOwner, short code,
|
||||
BOOL MSG_InternalGetMessage( MSG16 *msg, HWND hwnd, HWND hwndOwner, short code,
|
||||
WORD flags, BOOL sendIdle )
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
if (sendIdle)
|
||||
{
|
||||
if (!MSG_PeekMessage( (MSG16 *)PTR_SEG_TO_LIN(msg),
|
||||
0, 0, 0, flags, TRUE ))
|
||||
if (!MSG_PeekMessage( msg, 0, 0, 0, flags, TRUE ))
|
||||
{
|
||||
/* No message present -> send ENTERIDLE and wait */
|
||||
if (IsWindow(hwndOwner))
|
||||
SendMessage16( hwndOwner, WM_ENTERIDLE,
|
||||
code, (LPARAM)hwnd );
|
||||
MSG_PeekMessage( (MSG16 *)PTR_SEG_TO_LIN(msg),
|
||||
0, 0, 0, flags, FALSE );
|
||||
MSG_PeekMessage( msg, 0, 0, 0, flags, FALSE );
|
||||
}
|
||||
}
|
||||
else /* Always wait for a message */
|
||||
MSG_PeekMessage( (MSG16 *)PTR_SEG_TO_LIN(msg),
|
||||
0, 0, 0, flags, FALSE );
|
||||
MSG_PeekMessage( msg, 0, 0, 0, flags, FALSE );
|
||||
|
||||
if (!CallMsgFilter( msg, code ))
|
||||
return (((MSG16 *)PTR_SEG_TO_LIN(msg))->message != WM_QUIT);
|
||||
/* Call message filters */
|
||||
|
||||
/* Message filtered -> remove it from the queue */
|
||||
/* if it's still there. */
|
||||
if (!(flags & PM_REMOVE))
|
||||
MSG_PeekMessage( (MSG16 *)PTR_SEG_TO_LIN(msg),
|
||||
0, 0, 0, PM_REMOVE, TRUE );
|
||||
if (HOOK_GetHook( WH_SYSMSGFILTER, GetTaskQueue(0) ) ||
|
||||
HOOK_GetHook( WH_MSGFILTER, GetTaskQueue(0) ))
|
||||
{
|
||||
MSG16 *pmsg = SEGPTR_NEW(MSG16);
|
||||
if (pmsg)
|
||||
{
|
||||
BOOL32 ret;
|
||||
*pmsg = *msg;
|
||||
ret = (HOOK_CallHooks( WH_SYSMSGFILTER, code, 0,
|
||||
(LPARAM)SEGPTR_GET(pmsg) ) ||
|
||||
HOOK_CallHooks( WH_MSGFILTER, code, 0,
|
||||
(LPARAM)SEGPTR_GET(pmsg) ));
|
||||
SEGPTR_FREE(pmsg);
|
||||
if (ret)
|
||||
{
|
||||
/* Message filtered -> remove it from the queue */
|
||||
/* if it's still there. */
|
||||
if (!(flags & PM_REMOVE))
|
||||
MSG_PeekMessage( msg, 0, 0, 0, PM_REMOVE, TRUE );
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (msg->message != WM_QUIT);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -665,13 +731,6 @@ LRESULT SendMessage16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, LPARAM lParam)
|
|||
{
|
||||
WND * wndPtr;
|
||||
LRESULT ret;
|
||||
struct
|
||||
{
|
||||
LPARAM lParam;
|
||||
WPARAM16 wParam;
|
||||
UINT16 wMsg;
|
||||
HWND16 hWnd;
|
||||
} msgstruct = { lParam, wParam, msg, hwnd };
|
||||
|
||||
#ifdef CONFIG_IPC
|
||||
MSG16 DDE_msg = { hwnd, msg, wParam, lParam };
|
||||
|
@ -694,19 +753,37 @@ LRESULT SendMessage16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, LPARAM lParam)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
HOOK_CallHooks( WH_CALLWNDPROC, HC_ACTION, 1,
|
||||
(LPARAM)MAKE_SEGPTR(&msgstruct) );
|
||||
hwnd = msgstruct.hWnd;
|
||||
msg = msgstruct.wMsg;
|
||||
wParam = msgstruct.wParam;
|
||||
lParam = msgstruct.lParam;
|
||||
if (HOOK_GetHook( WH_CALLWNDPROC, GetTaskQueue(0) ))
|
||||
{
|
||||
struct msgstruct
|
||||
{
|
||||
LPARAM lParam;
|
||||
WPARAM16 wParam;
|
||||
UINT16 wMsg;
|
||||
HWND16 hWnd;
|
||||
} *pmsg;
|
||||
|
||||
if ((pmsg = SEGPTR_NEW(struct msgstruct)))
|
||||
{
|
||||
pmsg->hWnd = hwnd;
|
||||
pmsg->wMsg = msg;
|
||||
pmsg->wParam = wParam;
|
||||
pmsg->lParam = lParam;
|
||||
HOOK_CallHooks( WH_CALLWNDPROC, HC_ACTION, 1,
|
||||
(LPARAM)SEGPTR_GET(pmsg) );
|
||||
hwnd = pmsg->hWnd;
|
||||
msg = pmsg->wMsg;
|
||||
wParam = pmsg->wParam;
|
||||
lParam = pmsg->lParam;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(wndPtr = WIN_FindWndPtr( hwnd )))
|
||||
{
|
||||
fprintf( stderr, "SendMessage16: invalid hwnd %04x\n", hwnd );
|
||||
return 0;
|
||||
}
|
||||
if (wndPtr->hmemTaskQ == QUEUE_GetDoomedQueue())
|
||||
if (QUEUE_IsDoomedQueue(wndPtr->hmemTaskQ))
|
||||
return 0; /* Don't send anything if the task is dying */
|
||||
if (wndPtr->hmemTaskQ != GetTaskQueue(0))
|
||||
return MSG_SendMessage( wndPtr->hmemTaskQ, hwnd, msg, wParam, lParam );
|
||||
|
@ -758,8 +835,9 @@ LRESULT SendMessage32A(HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
|
|||
return ret;
|
||||
}
|
||||
|
||||
if (wndPtr->hmemTaskQ == QUEUE_GetDoomedQueue())
|
||||
if (QUEUE_IsDoomedQueue(wndPtr->hmemTaskQ))
|
||||
return 0; /* Don't send anything if the task is dying */
|
||||
|
||||
if (wndPtr->hmemTaskQ != GetTaskQueue(0))
|
||||
{
|
||||
fprintf( stderr, "SendMessage32A: intertask message not supported\n" );
|
||||
|
@ -800,7 +878,7 @@ LRESULT SendMessage32W(HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
|
|||
fprintf( stderr, "SendMessage32W: invalid hwnd %08x\n", hwnd );
|
||||
return 0;
|
||||
}
|
||||
if (wndPtr->hmemTaskQ == QUEUE_GetDoomedQueue())
|
||||
if (QUEUE_IsDoomedQueue(wndPtr->hmemTaskQ))
|
||||
return 0; /* Don't send anything if the task is dying */
|
||||
if (wndPtr->hmemTaskQ != GetTaskQueue(0))
|
||||
{
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
#include "menu.h"
|
||||
#include "winpos.h"
|
||||
#include "scroll.h"
|
||||
#include "stackframe.h"
|
||||
#include "nonclient.h"
|
||||
#include "graphics.h"
|
||||
#include "queue.h"
|
||||
|
@ -235,17 +234,20 @@ LONG NC_HandleNCCalcSize( WND *pWnd, RECT16 *winRect )
|
|||
{
|
||||
RECT16 tmpRect = { 0, 0, 0, 0 };
|
||||
|
||||
NC_AdjustRect( &tmpRect, pWnd->dwStyle, FALSE, pWnd->dwExStyle );
|
||||
winRect->left -= tmpRect.left;
|
||||
winRect->top -= tmpRect.top;
|
||||
winRect->right -= tmpRect.right;
|
||||
winRect->bottom -= tmpRect.bottom;
|
||||
|
||||
if (HAS_MENU(pWnd))
|
||||
if( !( pWnd->dwStyle & WS_MINIMIZE ) )
|
||||
{
|
||||
NC_AdjustRect( &tmpRect, pWnd->dwStyle, FALSE, pWnd->dwExStyle );
|
||||
winRect->left -= tmpRect.left;
|
||||
winRect->top -= tmpRect.top;
|
||||
winRect->right -= tmpRect.right;
|
||||
winRect->bottom -= tmpRect.bottom;
|
||||
|
||||
if (HAS_MENU(pWnd))
|
||||
{
|
||||
winRect->top += MENU_GetMenuBarHeight( pWnd->hwndSelf,
|
||||
winRect->right - winRect->left,
|
||||
-tmpRect.left, -tmpRect.top ) + 1;
|
||||
-tmpRect.left, -tmpRect.top ) + 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -430,14 +432,17 @@ void NC_DrawSysButton( HWND hwnd, HDC hdc, BOOL down )
|
|||
HBITMAP hbitmap;
|
||||
WND *wndPtr = WIN_FindWndPtr( hwnd );
|
||||
|
||||
NC_GetInsideRect( hwnd, &rect );
|
||||
hdcMem = CreateCompatibleDC( hdc );
|
||||
hbitmap = SelectObject( hdcMem, hbitmapClose );
|
||||
BitBlt( hdc, rect.left, rect.top, SYSMETRICS_CXSIZE, SYSMETRICS_CYSIZE,
|
||||
hdcMem, (wndPtr->dwStyle & WS_CHILD) ? SYSMETRICS_CXSIZE : 0, 0,
|
||||
down ? NOTSRCCOPY : SRCCOPY );
|
||||
SelectObject( hdcMem, hbitmap );
|
||||
DeleteDC( hdcMem );
|
||||
if( !(wndPtr->flags & WIN_MANAGED) )
|
||||
{
|
||||
NC_GetInsideRect( hwnd, &rect );
|
||||
hdcMem = CreateCompatibleDC( hdc );
|
||||
hbitmap = SelectObject( hdcMem, hbitmapClose );
|
||||
BitBlt( hdc, rect.left, rect.top, SYSMETRICS_CXSIZE, SYSMETRICS_CYSIZE,
|
||||
hdcMem, (wndPtr->dwStyle & WS_CHILD) ? SYSMETRICS_CXSIZE : 0, 0,
|
||||
down ? NOTSRCCOPY : SRCCOPY );
|
||||
SelectObject( hdcMem, hbitmap );
|
||||
DeleteDC( hdcMem );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -447,12 +452,17 @@ void NC_DrawSysButton( HWND hwnd, HDC hdc, BOOL down )
|
|||
static void NC_DrawMaxButton( HWND hwnd, HDC hdc, BOOL down )
|
||||
{
|
||||
RECT16 rect;
|
||||
NC_GetInsideRect( hwnd, &rect );
|
||||
GRAPH_DrawBitmap( hdc, (IsZoomed(hwnd) ?
|
||||
(down ? hbitmapRestoreD : hbitmapRestore) :
|
||||
(down ? hbitmapMaximizeD : hbitmapMaximize)),
|
||||
rect.right - SYSMETRICS_CXSIZE - 1, rect.top,
|
||||
0, 0, SYSMETRICS_CXSIZE+1, SYSMETRICS_CYSIZE );
|
||||
WND *wndPtr = WIN_FindWndPtr( hwnd );
|
||||
|
||||
if( !(wndPtr->flags & WIN_MANAGED) )
|
||||
{
|
||||
NC_GetInsideRect( hwnd, &rect );
|
||||
GRAPH_DrawBitmap( hdc, (IsZoomed(hwnd) ?
|
||||
(down ? hbitmapRestoreD : hbitmapRestore) :
|
||||
(down ? hbitmapMaximizeD : hbitmapMaximize)),
|
||||
rect.right - SYSMETRICS_CXSIZE - 1, rect.top,
|
||||
0, 0, SYSMETRICS_CXSIZE+1, SYSMETRICS_CYSIZE );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -463,11 +473,15 @@ static void NC_DrawMinButton( HWND hwnd, HDC hdc, BOOL down )
|
|||
{
|
||||
RECT16 rect;
|
||||
WND *wndPtr = WIN_FindWndPtr( hwnd );
|
||||
NC_GetInsideRect( hwnd, &rect );
|
||||
if (wndPtr->dwStyle & WS_MAXIMIZEBOX) rect.right -= SYSMETRICS_CXSIZE + 1;
|
||||
GRAPH_DrawBitmap( hdc, (down ? hbitmapMinimizeD : hbitmapMinimize),
|
||||
rect.right - SYSMETRICS_CXSIZE - 1, rect.top,
|
||||
0, 0, SYSMETRICS_CXSIZE+1, SYSMETRICS_CYSIZE );
|
||||
|
||||
if( !(wndPtr->flags & WIN_MANAGED) )
|
||||
{
|
||||
NC_GetInsideRect( hwnd, &rect );
|
||||
if (wndPtr->dwStyle & WS_MAXIMIZEBOX) rect.right -= SYSMETRICS_CXSIZE + 1;
|
||||
GRAPH_DrawBitmap( hdc, (down ? hbitmapMinimizeD : hbitmapMinimize),
|
||||
rect.right - SYSMETRICS_CXSIZE - 1, rect.top,
|
||||
0, 0, SYSMETRICS_CXSIZE+1, SYSMETRICS_CYSIZE );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -587,6 +601,8 @@ static void NC_DrawCaption( HDC hdc, RECT16 *rect, HWND hwnd,
|
|||
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
||||
char buffer[256];
|
||||
|
||||
if (wndPtr->flags & WIN_MANAGED) return;
|
||||
|
||||
if (!hbitmapClose)
|
||||
{
|
||||
if (!(hbitmapClose = LoadBitmap16( 0, MAKEINTRESOURCE(OBM_CLOSE) )))
|
||||
|
@ -658,7 +674,8 @@ void NC_DoNCPaint( HWND hwnd, HRGN clip, BOOL suppress_menupaint )
|
|||
|
||||
WND *wndPtr = WIN_FindWndPtr( hwnd );
|
||||
|
||||
if (!wndPtr || !(wndPtr->dwStyle & WS_VISIBLE)) return; /* Nothing to do */
|
||||
if (!wndPtr || wndPtr->dwStyle & WS_MINIMIZE ||
|
||||
!WIN_IsWindowDrawable( wndPtr, 0 )) return; /* Nothing to do */
|
||||
|
||||
active = wndPtr->flags & WIN_NCACTIVATED;
|
||||
|
||||
|
@ -666,29 +683,6 @@ void NC_DoNCPaint( HWND hwnd, HRGN clip, BOOL suppress_menupaint )
|
|||
|
||||
if (!(hdc = GetDCEx( hwnd, 0, DCX_USESTYLE | DCX_WINDOW ))) return;
|
||||
|
||||
/*
|
||||
* If this is an icon, we don't want to do any more nonclient painting
|
||||
* of the window manager.
|
||||
* If there is a class icon to draw, draw it
|
||||
*/
|
||||
if (IsIconic(hwnd))
|
||||
{
|
||||
if (wndPtr->class->hIcon)
|
||||
{
|
||||
SendMessage16(hwnd, WM_ICONERASEBKGND, (WPARAM)hdc, 0);
|
||||
DrawIcon( hdc, 0, 0, wndPtr->class->hIcon );
|
||||
}
|
||||
ReleaseDC(hwnd, hdc);
|
||||
wndPtr->flags &= ~WIN_INTERNAL_PAINT;
|
||||
if( wndPtr->hrgnUpdate )
|
||||
{
|
||||
DeleteObject( wndPtr->hrgnUpdate );
|
||||
QUEUE_DecPaintCount( wndPtr->hmemTaskQ );
|
||||
wndPtr->hrgnUpdate = 0;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (ExcludeVisRect( hdc, wndPtr->rectClient.left-wndPtr->rectWindow.left,
|
||||
wndPtr->rectClient.top-wndPtr->rectWindow.top,
|
||||
wndPtr->rectClient.right-wndPtr->rectWindow.left,
|
||||
|
@ -776,14 +770,23 @@ LONG NC_HandleNCPaint( HWND hwnd , HRGN clip)
|
|||
*
|
||||
* Handle a WM_NCACTIVATE message. Called from DefWindowProc().
|
||||
*/
|
||||
LONG NC_HandleNCActivate( HWND hwnd, WPARAM wParam )
|
||||
LONG NC_HandleNCActivate( WND *wndPtr, WPARAM wParam )
|
||||
{
|
||||
WND *wndPtr = WIN_FindWndPtr(hwnd);
|
||||
WORD wStateChange;
|
||||
|
||||
if (wParam != 0) wndPtr->flags |= WIN_NCACTIVATED;
|
||||
else wndPtr->flags &= ~WIN_NCACTIVATED;
|
||||
if( wParam ) wStateChange = !(wndPtr->flags & WIN_NCACTIVATED);
|
||||
else wStateChange = wndPtr->flags & WIN_NCACTIVATED;
|
||||
|
||||
NC_DoNCPaint( hwnd, (HRGN)1, FALSE );
|
||||
if( wStateChange )
|
||||
{
|
||||
if (wParam) wndPtr->flags |= WIN_NCACTIVATED;
|
||||
else wndPtr->flags &= ~WIN_NCACTIVATED;
|
||||
|
||||
if( wndPtr->dwStyle & WS_MINIMIZE )
|
||||
PAINT_RedrawWindow( wndPtr->hwndSelf, NULL, 0, RDW_INVALIDATE | RDW_ERASE | RDW_ERASENOW, 0 );
|
||||
else
|
||||
NC_DoNCPaint( wndPtr->hwndSelf, (HRGN)1, FALSE );
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -841,6 +844,21 @@ LONG NC_HandleSetCursor( HWND hwnd, WPARAM wParam, LPARAM lParam )
|
|||
return (LONG)SetCursor( LoadCursor16( 0, IDC_ARROW ) );
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* NC_GetSysPopupPos
|
||||
*/
|
||||
BOOL NC_GetSysPopupPos( WND* wndPtr, RECT16* rect )
|
||||
{
|
||||
if( !wndPtr->hSysMenu ) return FALSE;
|
||||
|
||||
NC_GetInsideRect( wndPtr->hwndSelf, rect );
|
||||
OffsetRect16( rect, wndPtr->rectWindow.left, wndPtr->rectWindow.top );
|
||||
if (wndPtr->dwStyle & WS_CHILD)
|
||||
ClientToScreen16( wndPtr->parent->hwndSelf, (POINT16 *)rect );
|
||||
rect->right = rect->left + SYSMETRICS_CXSIZE;
|
||||
rect->bottom = rect->top + SYSMETRICS_CYSIZE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* NC_TrackSysMenu
|
||||
|
@ -854,19 +872,16 @@ static void NC_TrackSysMenu( HWND hwnd, HDC hdc, POINT16 pt )
|
|||
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 );
|
||||
OffsetRect16( &rect, wndPtr->rectWindow.left, wndPtr->rectWindow.top );
|
||||
if (wndPtr->dwStyle & WS_CHILD)
|
||||
ClientToScreen16( wndPtr->parent->hwndSelf, (POINT16 *)&rect );
|
||||
rect.right = rect.left + SYSMETRICS_CXSIZE;
|
||||
rect.bottom = rect.top + SYSMETRICS_CYSIZE;
|
||||
|
||||
NC_GetSysPopupPos( wndPtr, &rect );
|
||||
if (!iconic) NC_DrawSysButton( hwnd, hdc, TRUE );
|
||||
TrackPopupMenu16( wndPtr->hSysMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON,
|
||||
TrackPopupMenu16( GetSystemMenu(hwnd, 0), TPM_LEFTALIGN | TPM_LEFTBUTTON,
|
||||
rect.left, rect.bottom, 0, hwnd, &rect );
|
||||
if (!iconic) NC_DrawSysButton( hwnd, hdc, FALSE );
|
||||
}
|
||||
|
@ -908,8 +923,7 @@ static LONG NC_StartSizeMove( HWND hwnd, WPARAM wParam, POINT16 *capturePoint )
|
|||
SetCapture(hwnd);
|
||||
while(!hittest)
|
||||
{
|
||||
MSG_InternalGetMessage( MAKE_SEGPTR(&msg), 0, 0, MSGF_SIZE,
|
||||
PM_REMOVE, FALSE );
|
||||
MSG_InternalGetMessage( &msg, 0, 0, MSGF_SIZE, PM_REMOVE, FALSE );
|
||||
switch(msg.message)
|
||||
{
|
||||
case WM_MOUSEMOVE:
|
||||
|
@ -1048,8 +1062,7 @@ static void NC_DoSizeMove( HWND hwnd, WORD wParam, POINT16 pt )
|
|||
{
|
||||
int dx = 0, dy = 0;
|
||||
|
||||
MSG_InternalGetMessage( MAKE_SEGPTR(&msg), 0, 0, MSGF_SIZE,
|
||||
PM_REMOVE, FALSE );
|
||||
MSG_InternalGetMessage( &msg, 0, 0, MSGF_SIZE, PM_REMOVE, FALSE );
|
||||
|
||||
/* Exit on button-up, Return, or Esc */
|
||||
if ((msg.message == WM_LBUTTONUP) ||
|
||||
|
@ -1151,7 +1164,7 @@ static void NC_TrackMinMaxBox( HWND hwnd, WORD wParam )
|
|||
do
|
||||
{
|
||||
BOOL oldstate = pressed;
|
||||
MSG_InternalGetMessage( MAKE_SEGPTR(&msg), 0, 0, 0, PM_REMOVE, FALSE );
|
||||
MSG_InternalGetMessage( &msg, 0, 0, 0, PM_REMOVE, FALSE );
|
||||
|
||||
pressed = (NC_HandleNCHitTest( hwnd, msg.pt ) == wParam);
|
||||
if (pressed != oldstate)
|
||||
|
|
|
@ -88,10 +88,13 @@ void WIN_UpdateNCArea(WND* wnd, BOOL bUpdate)
|
|||
*/
|
||||
HDC16 BeginPaint16( HWND16 hwnd, LPPAINTSTRUCT16 lps )
|
||||
{
|
||||
BOOL32 bIcon;
|
||||
HRGN hrgnUpdate;
|
||||
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
||||
WND *wndPtr = WIN_FindWndPtr( hwnd );
|
||||
if (!wndPtr) return 0;
|
||||
|
||||
bIcon = (wndPtr->dwStyle & WS_MINIMIZE && wndPtr->class->hIcon);
|
||||
|
||||
wndPtr->flags &= ~WIN_NEEDS_BEGINPAINT;
|
||||
|
||||
if (wndPtr->flags & WIN_NEEDS_NCPAINT) WIN_UpdateNCArea( wndPtr, TRUE );
|
||||
|
@ -107,13 +110,15 @@ HDC16 BeginPaint16( HWND16 hwnd, LPPAINTSTRUCT16 lps )
|
|||
|
||||
dprintf_win(stddeb,"hrgnUpdate = %04x, ", hrgnUpdate);
|
||||
|
||||
lps->hdc = GetDCEx( hwnd, hrgnUpdate, DCX_INTERSECTRGN | DCX_WINDOWPAINT | DCX_USESTYLE );
|
||||
/* When bIcon is TRUE hrgnUpdate is automatically in window coordinates
|
||||
* (because rectClient == rectWindow for WS_MINIMIZE windows).
|
||||
*/
|
||||
|
||||
lps->hdc = GetDCEx( hwnd, hrgnUpdate, DCX_INTERSECTRGN | DCX_WINDOWPAINT |
|
||||
DCX_USESTYLE | (bIcon ? DCX_WINDOW : 0) );
|
||||
|
||||
dprintf_win(stddeb,"hdc = %04x\n", lps->hdc);
|
||||
|
||||
/* pseudocode from "Internals" doesn't delete hrgnUpdate - yet another clue
|
||||
that ReleaseDC should take care of it (hence DCX_KEEPCLIPRGN) */
|
||||
|
||||
if (!lps->hdc)
|
||||
{
|
||||
fprintf(stderr, "GetDCEx() failed in BeginPaint(), hwnd=%04x\n", hwnd);
|
||||
|
@ -126,7 +131,9 @@ HDC16 BeginPaint16( HWND16 hwnd, LPPAINTSTRUCT16 lps )
|
|||
if (wndPtr->flags & WIN_NEEDS_ERASEBKGND)
|
||||
{
|
||||
wndPtr->flags &= ~WIN_NEEDS_ERASEBKGND;
|
||||
lps->fErase = !SendMessage16(hwnd, WM_ERASEBKGND, (WPARAM)lps->hdc, 0);
|
||||
lps->fErase = !SendMessage16(hwnd, (bIcon) ? WM_ICONERASEBKGND
|
||||
: WM_ERASEBKGND,
|
||||
(WPARAM)lps->hdc, 0 );
|
||||
}
|
||||
else lps->fErase = TRUE;
|
||||
|
||||
|
@ -218,20 +225,32 @@ HBRUSH GetControlBrush( HWND hwnd, HDC hdc, WORD control )
|
|||
|
||||
|
||||
/***********************************************************************
|
||||
* RedrawWindow32 (USER32.425)
|
||||
* PAINT_RedrawWindow
|
||||
*
|
||||
* Note: Windows uses WM_SYNCPAINT to cut down the number of intertask
|
||||
* SendMessage() calls. From SDK:
|
||||
* This message avoids lots of inter-app message traffic
|
||||
* by switching to the other task and continuing the
|
||||
* recursion there.
|
||||
*
|
||||
* wParam = flags
|
||||
* LOWORD(lParam) = hrgnClip
|
||||
* HIWORD(lParam) = hwndSkip (not used; always NULL)
|
||||
*/
|
||||
BOOL32 RedrawWindow32( HWND32 hwnd, const RECT32 *rectUpdate,
|
||||
HRGN32 hrgnUpdate, UINT32 flags )
|
||||
BOOL32 PAINT_RedrawWindow( HWND32 hwnd, const RECT32 *rectUpdate,
|
||||
HRGN32 hrgnUpdate, UINT32 flags, UINT32 control )
|
||||
{
|
||||
BOOL32 bIcon;
|
||||
HRGN hrgn;
|
||||
RECT32 rectClient;
|
||||
WND * wndPtr;
|
||||
WND* wndPtr;
|
||||
|
||||
if (!hwnd) hwnd = GetDesktopWindow();
|
||||
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
|
||||
if (!IsWindowVisible(hwnd) || (wndPtr->flags & WIN_NO_REDRAW))
|
||||
return TRUE; /* No redraw needed */
|
||||
|
||||
bIcon = (wndPtr->dwStyle & WS_MINIMIZE && wndPtr->class->hIcon);
|
||||
if (rectUpdate)
|
||||
{
|
||||
dprintf_win(stddeb, "RedrawWindow: %04x %d,%d-%d,%d %04x flags=%04x\n",
|
||||
|
@ -283,7 +302,7 @@ BOOL32 RedrawWindow32( HWND32 hwnd, const RECT32 *rectUpdate,
|
|||
}
|
||||
else
|
||||
if (flags & RDW_ERASE) wndPtr->flags |= WIN_NEEDS_ERASEBKGND;
|
||||
flags |= RDW_FRAME; /* Force invalidating the frame of children */
|
||||
flags |= RDW_FRAME; /* Force children frame invalidation */
|
||||
}
|
||||
else if (flags & RDW_VALIDATE) /* Validate */
|
||||
{
|
||||
|
@ -335,7 +354,8 @@ BOOL32 RedrawWindow32( HWND32 hwnd, const RECT32 *rectUpdate,
|
|||
|
||||
if (flags & RDW_UPDATENOW)
|
||||
{
|
||||
if (wndPtr->hrgnUpdate) SendMessage16( hwnd, WM_PAINT, 0, 0 );
|
||||
if (wndPtr->hrgnUpdate) /* wm_painticon wparam is 1 */
|
||||
SendMessage16( hwnd, (bIcon) ? WM_PAINTICON : WM_PAINT, bIcon, 0 );
|
||||
}
|
||||
else if (flags & RDW_ERASENOW)
|
||||
{
|
||||
|
@ -345,18 +365,16 @@ BOOL32 RedrawWindow32( HWND32 hwnd, const RECT32 *rectUpdate,
|
|||
if (wndPtr->flags & WIN_NEEDS_ERASEBKGND)
|
||||
{
|
||||
HDC hdc = GetDCEx( hwnd, wndPtr->hrgnUpdate,
|
||||
DCX_INTERSECTRGN | DCX_USESTYLE | DCX_KEEPCLIPRGN | DCX_WINDOWPAINT);
|
||||
DCX_INTERSECTRGN | DCX_USESTYLE |
|
||||
DCX_KEEPCLIPRGN | DCX_WINDOWPAINT |
|
||||
(bIcon ? DCX_WINDOW : 0) );
|
||||
if (hdc)
|
||||
{
|
||||
/* Don't send WM_ERASEBKGND to icons */
|
||||
/* (WM_ICONERASEBKGND is sent during processing of WM_NCPAINT) */
|
||||
if (!(wndPtr->dwStyle & WS_MINIMIZE) ||
|
||||
!wndPtr->class->hIcon)
|
||||
{
|
||||
if (SendMessage16( hwnd, WM_ERASEBKGND, (WPARAM)hdc, 0 ))
|
||||
wndPtr->flags &= ~WIN_NEEDS_ERASEBKGND;
|
||||
}
|
||||
ReleaseDC( hwnd, hdc );
|
||||
if (SendMessage16( hwnd, (bIcon) ? WM_ICONERASEBKGND
|
||||
: WM_ERASEBKGND,
|
||||
(WPARAM)hdc, 0 ))
|
||||
wndPtr->flags &= ~WIN_NEEDS_ERASEBKGND;
|
||||
ReleaseDC( hwnd, hdc );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -364,41 +382,64 @@ BOOL32 RedrawWindow32( HWND32 hwnd, const RECT32 *rectUpdate,
|
|||
/* Recursively process children */
|
||||
|
||||
if (!(flags & RDW_NOCHILDREN) &&
|
||||
((flags & RDW_ALLCHILDREN) || !(wndPtr->dwStyle & WS_CLIPCHILDREN)))
|
||||
((flags & RDW_ALLCHILDREN) || !(wndPtr->dwStyle & WS_CLIPCHILDREN)) &&
|
||||
!(wndPtr->dwStyle & WS_MINIMIZE) )
|
||||
{
|
||||
if (hrgnUpdate)
|
||||
if ( hrgnUpdate || rectUpdate )
|
||||
{
|
||||
HRGN hrgn = CreateRectRgn( 0, 0, 0, 0 );
|
||||
if (!hrgn) return TRUE;
|
||||
for (wndPtr = wndPtr->child; wndPtr; wndPtr = wndPtr->next)
|
||||
{
|
||||
CombineRgn( hrgn, hrgnUpdate, 0, RGN_COPY );
|
||||
OffsetRgn( hrgn, -wndPtr->rectClient.left,
|
||||
-wndPtr->rectClient.top );
|
||||
RedrawWindow32( wndPtr->hwndSelf, NULL, hrgn, flags );
|
||||
}
|
||||
DeleteObject( hrgn );
|
||||
}
|
||||
else
|
||||
{
|
||||
RECT32 rect;
|
||||
for (wndPtr = wndPtr->child; wndPtr; wndPtr = wndPtr->next)
|
||||
{
|
||||
if (rectUpdate)
|
||||
{
|
||||
rect = *rectUpdate;
|
||||
OffsetRect32( &rect, -wndPtr->rectClient.left,
|
||||
-wndPtr->rectClient.top );
|
||||
RedrawWindow32( wndPtr->hwndSelf, &rect, 0, flags );
|
||||
}
|
||||
else RedrawWindow32( wndPtr->hwndSelf, NULL, 0, flags );
|
||||
}
|
||||
if( !(hrgn = CreateRectRgn( 0, 0, 0, 0 )) ) return TRUE;
|
||||
if( !hrgnUpdate )
|
||||
{
|
||||
control |= (RDW_C_DELETEHRGN | RDW_C_USEHRGN);
|
||||
if( !(hrgnUpdate = CreateRectRgnIndirect32( rectUpdate )) )
|
||||
{
|
||||
DeleteObject( hrgn );
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
for (wndPtr = wndPtr->child; wndPtr; wndPtr = wndPtr->next)
|
||||
if( wndPtr->dwStyle & WS_VISIBLE )
|
||||
{
|
||||
SetRectRgn( hrgn, wndPtr->rectWindow.left, wndPtr->rectWindow.top,
|
||||
wndPtr->rectWindow.right, wndPtr->rectWindow.bottom);
|
||||
if( CombineRgn( hrgn, hrgn, hrgnUpdate, RGN_AND ) != NULLREGION )
|
||||
{
|
||||
if( control & RDW_C_USEHRGN &&
|
||||
wndPtr->dwStyle & WS_CLIPSIBLINGS )
|
||||
CombineRgn( hrgnUpdate, hrgnUpdate, hrgn, RGN_DIFF );
|
||||
|
||||
OffsetRgn( hrgn, -wndPtr->rectClient.left,
|
||||
-wndPtr->rectClient.top );
|
||||
PAINT_RedrawWindow( wndPtr->hwndSelf, NULL, hrgn, flags, RDW_C_USEHRGN );
|
||||
}
|
||||
}
|
||||
DeleteObject( hrgn );
|
||||
if( control & RDW_C_DELETEHRGN ) DeleteObject( hrgnUpdate );
|
||||
}
|
||||
else for (wndPtr = wndPtr->child; wndPtr; wndPtr = wndPtr->next)
|
||||
PAINT_RedrawWindow( wndPtr->hwndSelf, NULL, 0, flags, 0 );
|
||||
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* RedrawWindow32 (USER32.425)
|
||||
*/
|
||||
BOOL32 RedrawWindow32( HWND32 hwnd, const RECT32 *rectUpdate,
|
||||
HRGN32 hrgnUpdate, UINT32 flags )
|
||||
{
|
||||
WND* wnd = WIN_FindWndPtr( hwnd );
|
||||
|
||||
/* check if there is something to redraw */
|
||||
|
||||
return ( wnd && WIN_IsWindowDrawable( wnd, !(flags & RDW_FRAME) ) )
|
||||
? PAINT_RedrawWindow( hwnd, rectUpdate, hrgnUpdate, flags, 0 )
|
||||
: 1;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* RedrawWindow16 (USER.290)
|
||||
*/
|
||||
|
@ -429,7 +470,7 @@ void UpdateWindow( HWND32 hwnd )
|
|||
*/
|
||||
void InvalidateRgn( HWND32 hwnd, HRGN32 hrgn, BOOL32 erase )
|
||||
{
|
||||
RedrawWindow32(hwnd, NULL, hrgn, RDW_INVALIDATE | (erase ? RDW_ERASE : 0));
|
||||
RedrawWindow32(hwnd, NULL, hrgn, RDW_INVALIDATE | (erase ? RDW_ERASE : 0) );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -84,11 +84,11 @@ void QUEUE_WalkQueues(void)
|
|||
|
||||
|
||||
/***********************************************************************
|
||||
* QUEUE_GetDoomedQueue/QUEUE_SetDoomedQueue
|
||||
* QUEUE_IsDoomedQueue
|
||||
*/
|
||||
HQUEUE16 QUEUE_GetDoomedQueue()
|
||||
BOOL32 QUEUE_IsDoomedQueue( HQUEUE16 hQueue )
|
||||
{
|
||||
return hDoomedQueue;
|
||||
return (hDoomedQueue && (hQueue == hDoomedQueue));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -41,6 +41,8 @@ void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT16 rect, LPRECT16 clipRec
|
|||
(int)((clipRect)?clipRect->right:0),
|
||||
(int)((clipRect)?clipRect->bottom:0));
|
||||
|
||||
if ( !wndScroll || !WIN_IsWindowDrawable( wndScroll, TRUE ) ) return;
|
||||
|
||||
if ( !rect ) /* do not clip children */
|
||||
{
|
||||
GetClientRect16(hwnd, &rc);
|
||||
|
@ -87,10 +89,8 @@ void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT16 rect, LPRECT16 clipRec
|
|||
SWP_DEFERERASE );
|
||||
}
|
||||
|
||||
/* RDW_ALLCHILDREN is to account for dialog controls */
|
||||
|
||||
RedrawWindow32( hwnd, NULL, hrgnUpdate, RDW_ALLCHILDREN |
|
||||
RDW_INVALIDATE | RDW_ERASE | RDW_ERASENOW);
|
||||
PAINT_RedrawWindow( hwnd, NULL, hrgnUpdate, RDW_ALLCHILDREN |
|
||||
RDW_INVALIDATE | RDW_ERASE | RDW_ERASENOW, RDW_C_USEHRGN );
|
||||
|
||||
DeleteObject(hrgnUpdate);
|
||||
if( hCaretWnd ) ShowCaret(hCaretWnd);
|
||||
|
@ -250,8 +250,8 @@ int ScrollWindowEx(HWND hwnd, short dx, short dy, LPRECT16 rect, LPRECT16 clipRe
|
|||
|
||||
if (flags | SW_INVALIDATE)
|
||||
{
|
||||
RedrawWindow32( hwnd, NULL, hrgnUpdate, RDW_INVALIDATE | RDW_ERASE |
|
||||
((flags & SW_ERASE) ? RDW_ERASENOW : 0));
|
||||
PAINT_RedrawWindow( hwnd, NULL, hrgnUpdate, RDW_INVALIDATE | RDW_ERASE |
|
||||
((flags & SW_ERASE) ? RDW_ERASENOW : 0), 0 );
|
||||
}
|
||||
|
||||
ReleaseDC(hwnd, hdc);
|
||||
|
|
|
@ -224,7 +224,11 @@ HWND32 WIN_FindWinToRepaint( HWND32 hwnd, HQUEUE16 hQueue )
|
|||
HWND hwndRet;
|
||||
WND *pWnd = pWndDesktop;
|
||||
|
||||
/* Note: the desktop window never gets WM_PAINT messages */
|
||||
/* Note: the desktop window never gets WM_PAINT messages
|
||||
* The real reason why is because Windows DesktopWndProc
|
||||
* does ValidateRgn inside WM_ERASEBKGND handler.
|
||||
*/
|
||||
|
||||
pWnd = hwnd ? WIN_FindWndPtr( hwnd ) : pWndDesktop->child;
|
||||
|
||||
for ( ; pWnd ; pWnd = pWnd->next )
|
||||
|
@ -265,7 +269,7 @@ HWND32 WIN_FindWinToRepaint( HWND32 hwnd, HQUEUE16 hQueue )
|
|||
* Send a WM_PARENTNOTIFY to all ancestors of the given window, unless
|
||||
* the window has the WS_EX_NOPARENTNOTIFY style.
|
||||
*/
|
||||
void WIN_SendParentNotify( HWND32 hwnd, WORD event, WORD idChild, LONG lValue )
|
||||
void WIN_SendParentNotify(HWND32 hwnd, WORD event, WORD idChild, LPARAM lValue)
|
||||
{
|
||||
LPPOINT16 lppt = (LPPOINT16)&lValue;
|
||||
WND *wndPtr = WIN_FindWndPtr( hwnd );
|
||||
|
@ -274,10 +278,7 @@ void WIN_SendParentNotify( HWND32 hwnd, WORD event, WORD idChild, LONG lValue )
|
|||
/* if lValue contains cursor coordinates they have to be
|
||||
* mapped to the client area of parent window */
|
||||
|
||||
if (bMouse) MapWindowPoints16(0, hwnd, lppt, 1);
|
||||
#ifndef WINELIB32
|
||||
else lValue = MAKELONG( LOWORD(lValue), idChild );
|
||||
#endif
|
||||
if (bMouse) MapWindowPoints16( 0, hwnd, lppt, 1 );
|
||||
|
||||
while (wndPtr)
|
||||
{
|
||||
|
@ -291,12 +292,8 @@ void WIN_SendParentNotify( HWND32 hwnd, WORD event, WORD idChild, LONG lValue )
|
|||
}
|
||||
|
||||
wndPtr = wndPtr->parent;
|
||||
#ifdef WINELIB32
|
||||
SendMessage32A( wndPtr->hwndSelf, WM_PARENTNOTIFY,
|
||||
MAKEWPARAM( event, idChild ), lValue );
|
||||
#else
|
||||
SendMessage16( wndPtr->hwndSelf, WM_PARENTNOTIFY, event, (LPARAM)lValue);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -364,7 +361,6 @@ void WIN_DestroyQueueWindows( WND* wnd, HQUEUE16 hQueue )
|
|||
BOOL32 WIN_CreateDesktopWindow(void)
|
||||
{
|
||||
CLASS *class;
|
||||
HDC hdc;
|
||||
HWND hwndDesktop;
|
||||
|
||||
dprintf_win(stddeb,"Creating desktop window\n");
|
||||
|
@ -415,11 +411,7 @@ BOOL32 WIN_CreateDesktopWindow(void)
|
|||
WINPROC_SetProc( &pWndDesktop->winproc, (WNDPROC16)class->winproc, 0 );
|
||||
EVENT_RegisterWindow( pWndDesktop );
|
||||
SendMessage32A( hwndDesktop, WM_NCCREATE, 0, 0 );
|
||||
if ((hdc = GetDC( hwndDesktop )) != 0)
|
||||
{
|
||||
SendMessage32A( hwndDesktop, WM_ERASEBKGND, hdc, 0 );
|
||||
ReleaseDC( hwndDesktop, hdc );
|
||||
}
|
||||
pWndDesktop->flags |= WIN_NEEDS_ERASEBKGND;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -705,7 +697,7 @@ static HWND WIN_CreateWindowEx( CREATESTRUCT32A *cs, ATOM classAtom,
|
|||
wndPtr->rectClient.top ));
|
||||
}
|
||||
|
||||
WIN_SendParentNotify( hwnd, WM_CREATE, wndPtr->wIDmenu, (LONG)hwnd );
|
||||
WIN_SendParentNotify( hwnd, WM_CREATE, wndPtr->wIDmenu, (LPARAM)hwnd );
|
||||
if (!IsWindow(hwnd)) return 0;
|
||||
|
||||
/* Show the window, maximizing or minimizing if needed */
|
||||
|
@ -904,7 +896,7 @@ BOOL DestroyWindow( HWND hwnd )
|
|||
SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE );
|
||||
if ((hwnd == GetCapture()) || IsChild( hwnd, GetCapture() ))
|
||||
ReleaseCapture();
|
||||
WIN_SendParentNotify( hwnd, WM_DESTROY, wndPtr->wIDmenu, (LONG)hwnd );
|
||||
WIN_SendParentNotify( hwnd, WM_DESTROY, wndPtr->wIDmenu, (LPARAM)hwnd );
|
||||
|
||||
CLIPBOARD_DisOwn( hwnd );
|
||||
|
||||
|
@ -1543,8 +1535,29 @@ BOOL IsWindowVisible( HWND hwnd )
|
|||
return (wndPtr && (wndPtr->dwStyle & WS_VISIBLE));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* WIN_IsWindowDrawable
|
||||
*
|
||||
* hwnd is drawable when it is visible, all parents are not
|
||||
* minimized, and it is itself not minimized unless we are
|
||||
* trying to draw icon and the default class icon is set.
|
||||
*/
|
||||
BOOL32 WIN_IsWindowDrawable( WND* wnd , BOOL32 icon )
|
||||
{
|
||||
HWND hwnd= wnd->hwndSelf;
|
||||
BOOL32 yes = TRUE;
|
||||
|
||||
while(wnd && yes)
|
||||
{
|
||||
if( wnd->dwStyle & WS_MINIMIZE )
|
||||
if( wnd->hwndSelf != hwnd ) break;
|
||||
else if( icon && wnd->class->hIcon ) break;
|
||||
|
||||
yes = yes && (wnd->dwStyle & WS_VISIBLE);
|
||||
wnd = wnd->parent; }
|
||||
return (!wnd && yes);
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
* GetTopWindow (USER.229)
|
||||
*/
|
||||
|
@ -1824,8 +1837,8 @@ BOOL FlashWindow(HWND hWnd, BOOL bInvert)
|
|||
}
|
||||
else
|
||||
{
|
||||
RedrawWindow32( hWnd, 0, 0, RDW_INVALIDATE | RDW_ERASE |
|
||||
RDW_UPDATENOW | RDW_FRAME );
|
||||
PAINT_RedrawWindow( hWnd, 0, 0, RDW_INVALIDATE | RDW_ERASE |
|
||||
RDW_UPDATENOW | RDW_FRAME, 0 );
|
||||
wndPtr->flags &= ~WIN_NCACTIVATED;
|
||||
}
|
||||
return TRUE;
|
||||
|
|
323
windows/winpos.c
323
windows/winpos.c
|
@ -16,7 +16,6 @@
|
|||
#include "hook.h"
|
||||
#include "message.h"
|
||||
#include "queue.h"
|
||||
#include "stackframe.h"
|
||||
#include "options.h"
|
||||
#include "winpos.h"
|
||||
#include "dce.h"
|
||||
|
@ -32,6 +31,11 @@
|
|||
#define SWP_AGG_STATUSFLAGS \
|
||||
(SWP_AGG_NOPOSCHANGE | SWP_FRAMECHANGED | SWP_HIDEWINDOW | SWP_SHOWWINDOW)
|
||||
|
||||
#define SMC_NOCOPY 0x0001
|
||||
#define SMC_NOPARENTERASE 0x0002
|
||||
#define SMC_DRAWFRAME 0x0004
|
||||
#define SMC_SETXPOS 0x0008
|
||||
|
||||
/* ----- external functions ----- */
|
||||
|
||||
extern void FOCUS_SwitchFocus( HWND , HWND );
|
||||
|
@ -574,6 +578,7 @@ BOOL ShowWindow( HWND hwnd, int cmd )
|
|||
y = wndPtr->ptIconPos.y;
|
||||
cx = SYSMETRICS_CXICON;
|
||||
cy = SYSMETRICS_CYICON;
|
||||
swpflags |= SWP_NOCOPYBITS;
|
||||
}
|
||||
else swpflags |= SWP_NOSIZE | SWP_NOMOVE;
|
||||
break;
|
||||
|
@ -597,6 +602,7 @@ BOOL ShowWindow( HWND hwnd, int cmd )
|
|||
swpflags |= SWP_NOSIZE | SWP_NOMOVE;
|
||||
break;
|
||||
}
|
||||
else swpflags |= SWP_NOCOPYBITS;
|
||||
|
||||
cx = maxSize.x;
|
||||
cy = maxSize.y;
|
||||
|
@ -650,6 +656,7 @@ BOOL ShowWindow( HWND hwnd, int cmd )
|
|||
cx = wndPtr->rectNormal.right - wndPtr->rectNormal.left;
|
||||
cy = wndPtr->rectNormal.bottom - wndPtr->rectNormal.top;
|
||||
}
|
||||
swpflags |= SWP_NOCOPYBITS;
|
||||
}
|
||||
else if (wndPtr->dwStyle & WS_MAXIMIZE)
|
||||
{
|
||||
|
@ -1179,11 +1186,14 @@ static void WINPOS_MoveWindowZOrder( HWND hwnd, HWND hwndAfter )
|
|||
pWndCur = wndPtr->next;
|
||||
while (pWndCur != pWndPrevAfter)
|
||||
{
|
||||
RECT16 rect = pWndCur->rectWindow;
|
||||
OffsetRect16( &rect, -wndPtr->rectClient.left,
|
||||
RECT32 rect = { pWndCur->rectWindow.left,
|
||||
pWndCur->rectWindow.top,
|
||||
pWndCur->rectWindow.right,
|
||||
pWndCur->rectWindow.bottom };
|
||||
OffsetRect32( &rect, -wndPtr->rectClient.left,
|
||||
-wndPtr->rectClient.top );
|
||||
RedrawWindow16( hwnd, &rect, 0, RDW_INVALIDATE | RDW_ALLCHILDREN |
|
||||
RDW_FRAME | RDW_ERASE );
|
||||
PAINT_RedrawWindow( hwnd, &rect, 0, RDW_INVALIDATE | RDW_ALLCHILDREN |
|
||||
RDW_FRAME | RDW_ERASE, 0 );
|
||||
pWndCur = pWndCur->next;
|
||||
}
|
||||
}
|
||||
|
@ -1194,11 +1204,14 @@ static void WINPOS_MoveWindowZOrder( HWND hwnd, HWND hwndAfter )
|
|||
WIN_LinkWindow( hwnd, hwndAfter );
|
||||
while (pWndCur != wndPtr)
|
||||
{
|
||||
RECT16 rect = wndPtr->rectWindow;
|
||||
OffsetRect16( &rect, -pWndCur->rectClient.left,
|
||||
RECT32 rect = { pWndCur->rectWindow.left,
|
||||
pWndCur->rectWindow.top,
|
||||
pWndCur->rectWindow.right,
|
||||
pWndCur->rectWindow.bottom };
|
||||
OffsetRect32( &rect, -pWndCur->rectClient.left,
|
||||
-pWndCur->rectClient.top );
|
||||
RedrawWindow16( pWndCur->hwndSelf, &rect, 0, RDW_INVALIDATE |
|
||||
RDW_ALLCHILDREN | RDW_FRAME | RDW_ERASE );
|
||||
PAINT_RedrawWindow( pWndCur->hwndSelf, &rect, 0, RDW_INVALIDATE |
|
||||
RDW_ALLCHILDREN | RDW_FRAME | RDW_ERASE, 0 );
|
||||
pWndCur = pWndCur->next;
|
||||
}
|
||||
}
|
||||
|
@ -1288,7 +1301,7 @@ HWND WINPOS_ReorderOwnedPopups(HWND hwndInsertAfter, WND* wndPtr, WORD flags)
|
|||
* update regions are in window client coordinates
|
||||
* client and window rectangles are in parent client coordinates
|
||||
*/
|
||||
static void WINPOS_SizeMoveClean(WND* Wnd, HRGN oldVisRgn, LPRECT16 lpOldWndRect, LPRECT16 lpOldClientRect, BOOL bNoCopy )
|
||||
static UINT WINPOS_SizeMoveClean(WND* Wnd, HRGN oldVisRgn, LPRECT16 lpOldWndRect, LPRECT16 lpOldClientRect, UINT uFlags )
|
||||
{
|
||||
HRGN newVisRgn = DCE_GetVisRgn(Wnd->hwndSelf, DCX_WINDOW | DCX_CLIPSIBLINGS );
|
||||
HRGN dirtyRgn = CreateRectRgn(0,0,0,0);
|
||||
|
@ -1301,16 +1314,14 @@ static void WINPOS_SizeMoveClean(WND* Wnd, HRGN oldVisRgn, LPRECT16 lpOldWndRect
|
|||
Wnd->rectClient.left,Wnd->rectClient.top,Wnd->rectClient.right,Wnd->rectClient.bottom,
|
||||
lpOldClientRect->left,lpOldClientRect->top,lpOldClientRect->right,lpOldClientRect->bottom);
|
||||
|
||||
if( (lpOldWndRect->right - lpOldWndRect->left) != (Wnd->rectWindow.right - Wnd->rectWindow.left) ||
|
||||
(lpOldWndRect->bottom - lpOldWndRect->top) != (Wnd->rectWindow.bottom - Wnd->rectWindow.top) )
|
||||
uFlags |= SMC_DRAWFRAME;
|
||||
|
||||
CombineRgn( dirtyRgn, newVisRgn, 0, RGN_COPY);
|
||||
|
||||
if( !bNoCopy )
|
||||
{
|
||||
HRGN hRgn = CreateRectRgn( lpOldClientRect->left - lpOldWndRect->left, lpOldClientRect->top - lpOldWndRect->top,
|
||||
lpOldClientRect->right - lpOldWndRect->left, lpOldClientRect->bottom - lpOldWndRect->top);
|
||||
CombineRgn( newVisRgn, newVisRgn, oldVisRgn, RGN_AND );
|
||||
CombineRgn( newVisRgn, newVisRgn, hRgn, RGN_AND );
|
||||
DeleteObject(hRgn);
|
||||
}
|
||||
if( !(uFlags & SMC_NOCOPY) )
|
||||
CombineRgn( newVisRgn, newVisRgn, oldVisRgn, RGN_AND );
|
||||
|
||||
/* map regions to the parent client area */
|
||||
|
||||
|
@ -1331,72 +1342,78 @@ static void WINPOS_SizeMoveClean(WND* Wnd, HRGN oldVisRgn, LPRECT16 lpOldWndRect
|
|||
my = (Wnd->hrgnUpdate > 1)? CombineRgn( newVisRgn, newVisRgn, Wnd->hrgnUpdate, RGN_DIFF)
|
||||
: COMPLEXREGION;
|
||||
|
||||
if( bNoCopy ) /* invalidate Wnd visible region */
|
||||
if( uFlags & SMC_NOCOPY ) /* invalidate Wnd visible region */
|
||||
{
|
||||
if (my != NULLREGION) RedrawWindow32( Wnd->hwndSelf, NULL, newVisRgn, RDW_INVALIDATE |
|
||||
RDW_FRAME | RDW_ALLCHILDREN | RDW_ERASE );
|
||||
if (my != NULLREGION) PAINT_RedrawWindow( Wnd->hwndSelf, NULL, newVisRgn, RDW_INVALIDATE |
|
||||
RDW_FRAME | RDW_ALLCHILDREN | RDW_ERASE, RDW_C_USEHRGN );
|
||||
}
|
||||
else /* bitblt old client area */
|
||||
{
|
||||
HDC hDC;
|
||||
int update;
|
||||
HRGN updateRgn;
|
||||
int xfrom,yfrom,xto,yto,width,height;
|
||||
|
||||
/* client rect */
|
||||
if( uFlags & SMC_DRAWFRAME )
|
||||
{
|
||||
/* copy only client area, frame will be redrawn anyway */
|
||||
|
||||
updateRgn = CreateRectRgn( 0,0, Wnd->rectClient.right - Wnd->rectClient.left,
|
||||
Wnd->rectClient.bottom - Wnd->rectClient.top );
|
||||
xfrom = lpOldClientRect->left; yfrom = lpOldClientRect->top;
|
||||
xto = Wnd->rectClient.left; yto = Wnd->rectClient.top;
|
||||
width = lpOldClientRect->right - xfrom; height = lpOldClientRect->bottom - yfrom;
|
||||
updateRgn = CreateRectRgn( 0, 0, width, height );
|
||||
CombineRgn( newVisRgn, newVisRgn, updateRgn, RGN_AND );
|
||||
SetRectRgn( updateRgn, 0, 0, Wnd->rectClient.right - xto, Wnd->rectClient.bottom - yto );
|
||||
}
|
||||
else
|
||||
{
|
||||
xfrom = lpOldWndRect->left; yfrom = lpOldWndRect->top;
|
||||
xto = Wnd->rectWindow.left; yto = Wnd->rectWindow.top;
|
||||
width = lpOldWndRect->right - xfrom; height = lpOldWndRect->bottom - yfrom;
|
||||
updateRgn = CreateRectRgn( xto - Wnd->rectClient.left,
|
||||
yto - Wnd->rectClient.top,
|
||||
Wnd->rectWindow.right - Wnd->rectClient.left,
|
||||
Wnd->rectWindow.bottom - Wnd->rectClient.top );
|
||||
}
|
||||
|
||||
/* clip visible region with client rect */
|
||||
CombineRgn( newVisRgn, newVisRgn, updateRgn, RGN_AND );
|
||||
|
||||
my = CombineRgn( newVisRgn, newVisRgn, updateRgn, RGN_AND );
|
||||
|
||||
/* substract result from client rect to get region that won't be copied */
|
||||
/* substract new visRgn from target rect to get a region that won't be copied */
|
||||
|
||||
update = CombineRgn( updateRgn, updateRgn, newVisRgn, RGN_DIFF );
|
||||
|
||||
/* Blt valid bits using parent window DC */
|
||||
|
||||
if( my != NULLREGION )
|
||||
if( my != NULLREGION && (xfrom != xto || yfrom != yto) )
|
||||
{
|
||||
int xfrom = lpOldClientRect->left;
|
||||
int yfrom = lpOldClientRect->top;
|
||||
int xto = Wnd->rectClient.left;
|
||||
int yto = Wnd->rectClient.top;
|
||||
|
||||
/* compute clipping region in parent client coordinates */
|
||||
|
||||
/* check if we can skip copying */
|
||||
OffsetRgn( newVisRgn, Wnd->rectClient.left, Wnd->rectClient.top);
|
||||
CombineRgn( oldVisRgn, oldVisRgn, newVisRgn, RGN_OR );
|
||||
|
||||
if( xfrom != xto || yfrom != yto )
|
||||
{
|
||||
/* compute clipping region in parent client coordinates */
|
||||
hDC = GetDCEx( Wnd->parent->hwndSelf, oldVisRgn, DCX_KEEPCLIPRGN | DCX_INTERSECTRGN | DCX_CACHE | DCX_CLIPSIBLINGS);
|
||||
|
||||
OffsetRgn( newVisRgn, Wnd->rectClient.left, Wnd->rectClient.top);
|
||||
CombineRgn( oldVisRgn, oldVisRgn, newVisRgn, RGN_OR );
|
||||
|
||||
hDC = GetDCEx( Wnd->parent->hwndSelf, oldVisRgn, DCX_KEEPCLIPRGN | DCX_INTERSECTRGN | DCX_CACHE | DCX_CLIPSIBLINGS);
|
||||
|
||||
BitBlt(hDC, xto, yto, lpOldClientRect->right - lpOldClientRect->left,
|
||||
lpOldClientRect->bottom - lpOldClientRect->top,
|
||||
hDC, xfrom, yfrom, SRCCOPY );
|
||||
BitBlt( hDC, xto, yto, width, height, hDC, xfrom, yfrom, SRCCOPY );
|
||||
|
||||
ReleaseDC( Wnd->parent->hwndSelf, hDC);
|
||||
}
|
||||
ReleaseDC( Wnd->parent->hwndSelf, hDC);
|
||||
}
|
||||
|
||||
if( update != NULLREGION )
|
||||
RedrawWindow32( Wnd->hwndSelf, NULL, updateRgn, RDW_INVALIDATE |
|
||||
RDW_FRAME | RDW_ALLCHILDREN | RDW_ERASE );
|
||||
PAINT_RedrawWindow( Wnd->hwndSelf, NULL, updateRgn, RDW_INVALIDATE |
|
||||
RDW_FRAME | RDW_ALLCHILDREN | RDW_ERASE, RDW_C_USEHRGN );
|
||||
else if( uFlags & SMC_DRAWFRAME ) Wnd->flags |= WIN_NEEDS_NCPAINT;
|
||||
DeleteObject( updateRgn );
|
||||
}
|
||||
|
||||
/* erase uncovered areas */
|
||||
|
||||
if( other != NULLREGION )
|
||||
RedrawWindow32( Wnd->parent->hwndSelf, NULL, dirtyRgn,
|
||||
RDW_INVALIDATE | RDW_ALLCHILDREN | RDW_ERASE );
|
||||
|
||||
if( !(uFlags & SMC_NOPARENTERASE) && (other != NULLREGION ) )
|
||||
PAINT_RedrawWindow( Wnd->parent->hwndSelf, NULL, dirtyRgn,
|
||||
RDW_INVALIDATE | RDW_ALLCHILDREN | RDW_ERASE, RDW_C_USEHRGN );
|
||||
DeleteObject(dirtyRgn);
|
||||
DeleteObject(newVisRgn);
|
||||
return uFlags;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1510,11 +1527,13 @@ static void WINPOS_SetXWindowPos( WINDOWPOS16 *winpos )
|
|||
BOOL SetWindowPos( HWND hwnd, HWND hwndInsertAfter, INT x, INT y,
|
||||
INT cx, INT cy, WORD flags )
|
||||
{
|
||||
WINDOWPOS16 winpos;
|
||||
WINDOWPOS16 *winpos;
|
||||
WND * wndPtr;
|
||||
RECT16 newWindowRect, newClientRect;
|
||||
RECT16 newWindowRect, newClientRect, oldWindowRect;
|
||||
HRGN visRgn = 0;
|
||||
HWND tempInsertAfter= 0;
|
||||
int result = 0;
|
||||
UINT uFlags = 0;
|
||||
|
||||
dprintf_win(stddeb,"SetWindowPos: hwnd %04x, (%i,%i)-(%i,%i) flags %08x\n",
|
||||
hwnd, x, y, x+cx, y+cy, flags);
|
||||
|
@ -1526,15 +1545,16 @@ BOOL SetWindowPos( HWND hwnd, HWND hwndInsertAfter, INT x, INT y,
|
|||
if (wndPtr->dwStyle & WS_VISIBLE) flags &= ~SWP_SHOWWINDOW;
|
||||
else
|
||||
{
|
||||
uFlags |= SMC_NOPARENTERASE;
|
||||
flags &= ~SWP_HIDEWINDOW;
|
||||
if (!(flags & SWP_SHOWWINDOW)) flags |= SWP_NOREDRAW;
|
||||
}
|
||||
|
||||
/* Check for windows that may not be resized
|
||||
FIXME: this should be done only for Windows 3.0 programs
|
||||
*/ if (flags & (SWP_SHOWWINDOW | SWP_HIDEWINDOW ) )
|
||||
if (flags & (SWP_SHOWWINDOW | SWP_HIDEWINDOW ) )
|
||||
flags |= SWP_NOSIZE | SWP_NOMOVE;
|
||||
|
||||
*/
|
||||
/* Check dimensions */
|
||||
|
||||
if (cx <= 0) cx = 1;
|
||||
|
@ -1578,45 +1598,48 @@ BOOL SetWindowPos( HWND hwnd, HWND hwndInsertAfter, INT x, INT y,
|
|||
|
||||
/* Fill the WINDOWPOS structure */
|
||||
|
||||
winpos.hwnd = hwnd;
|
||||
winpos.hwndInsertAfter = hwndInsertAfter;
|
||||
winpos.x = x;
|
||||
winpos.y = y;
|
||||
winpos.cx = cx;
|
||||
winpos.cy = cy;
|
||||
winpos.flags = flags;
|
||||
if (!(winpos = SEGPTR_NEW(WINDOWPOS16))) return FALSE;
|
||||
winpos->hwnd = hwnd;
|
||||
winpos->hwndInsertAfter = hwndInsertAfter;
|
||||
winpos->x = x;
|
||||
winpos->y = y;
|
||||
winpos->cx = cx;
|
||||
winpos->cy = cy;
|
||||
winpos->flags = flags;
|
||||
|
||||
/* Send WM_WINDOWPOSCHANGING message */
|
||||
|
||||
if (!(flags & SWP_NOSENDCHANGING))
|
||||
SendMessage16( hwnd, WM_WINDOWPOSCHANGING, 0, (LPARAM)MAKE_SEGPTR(&winpos) );
|
||||
SendMessage16( hwnd, WM_WINDOWPOSCHANGING, 0,
|
||||
(LPARAM)SEGPTR_GET(winpos) );
|
||||
|
||||
/* Calculate new position and size */
|
||||
|
||||
newWindowRect = wndPtr->rectWindow;
|
||||
newClientRect = wndPtr->rectClient;
|
||||
newClientRect = (wndPtr->dwStyle & WS_MINIMIZE) ? wndPtr->rectWindow
|
||||
: wndPtr->rectClient;
|
||||
|
||||
if (!(winpos.flags & SWP_NOSIZE))
|
||||
if (!(winpos->flags & SWP_NOSIZE))
|
||||
{
|
||||
newWindowRect.right = newWindowRect.left + winpos.cx;
|
||||
newWindowRect.bottom = newWindowRect.top + winpos.cy;
|
||||
newWindowRect.right = newWindowRect.left + winpos->cx;
|
||||
newWindowRect.bottom = newWindowRect.top + winpos->cy;
|
||||
}
|
||||
if (!(winpos.flags & SWP_NOMOVE))
|
||||
if (!(winpos->flags & SWP_NOMOVE))
|
||||
{
|
||||
newWindowRect.left = winpos.x;
|
||||
newWindowRect.top = winpos.y;
|
||||
newWindowRect.right += winpos.x - wndPtr->rectWindow.left;
|
||||
newWindowRect.bottom += winpos.y - wndPtr->rectWindow.top;
|
||||
newWindowRect.left = winpos->x;
|
||||
newWindowRect.top = winpos->y;
|
||||
newWindowRect.right += winpos->x - wndPtr->rectWindow.left;
|
||||
newWindowRect.bottom += winpos->y - wndPtr->rectWindow.top;
|
||||
|
||||
OffsetRect16( &newClientRect, winpos.x - wndPtr->rectWindow.left,
|
||||
winpos.y - wndPtr->rectWindow.top );
|
||||
OffsetRect16( &newClientRect, winpos->x - wndPtr->rectWindow.left,
|
||||
winpos->y - wndPtr->rectWindow.top );
|
||||
}
|
||||
|
||||
winpos.flags |= SWP_NOCLIENTMOVE | SWP_NOCLIENTSIZE;
|
||||
winpos->flags |= SWP_NOCLIENTMOVE | SWP_NOCLIENTSIZE;
|
||||
|
||||
/* Reposition window in Z order */
|
||||
|
||||
if (!(winpos.flags & SWP_NOZORDER))
|
||||
if (!(winpos->flags & SWP_NOZORDER))
|
||||
{
|
||||
/* reorder owned popups if hwnd is top-level window
|
||||
*/
|
||||
|
@ -1626,10 +1649,10 @@ BOOL SetWindowPos( HWND hwnd, HWND hwndInsertAfter, INT x, INT y,
|
|||
|
||||
if (wndPtr->window)
|
||||
{
|
||||
WIN_UnlinkWindow( winpos.hwnd );
|
||||
WIN_LinkWindow( winpos.hwnd, hwndInsertAfter );
|
||||
WIN_UnlinkWindow( winpos->hwnd );
|
||||
WIN_LinkWindow( winpos->hwnd, hwndInsertAfter );
|
||||
}
|
||||
else WINPOS_MoveWindowZOrder( winpos.hwnd, hwndInsertAfter );
|
||||
else WINPOS_MoveWindowZOrder( winpos->hwnd, hwndInsertAfter );
|
||||
}
|
||||
|
||||
if ( !wndPtr->window && !(flags & SWP_NOREDRAW) &&
|
||||
|
@ -1640,26 +1663,26 @@ BOOL SetWindowPos( HWND hwnd, HWND hwndInsertAfter, INT x, INT y,
|
|||
/* Send WM_NCCALCSIZE message to get new client area */
|
||||
if( (flags & (SWP_FRAMECHANGED | SWP_NOSIZE)) != SWP_NOSIZE )
|
||||
{
|
||||
result = WINPOS_SendNCCalcSize( winpos.hwnd, TRUE, &newWindowRect,
|
||||
result = WINPOS_SendNCCalcSize( winpos->hwnd, TRUE, &newWindowRect,
|
||||
&wndPtr->rectWindow, &wndPtr->rectClient,
|
||||
MAKE_SEGPTR(&winpos), &newClientRect );
|
||||
SEGPTR_GET(winpos), &newClientRect );
|
||||
|
||||
/* FIXME: WVR_ALIGNxxx */
|
||||
|
||||
if( newClientRect.left != wndPtr->rectClient.left ||
|
||||
newClientRect.top != wndPtr->rectClient.top )
|
||||
winpos.flags &= ~SWP_NOCLIENTMOVE;
|
||||
winpos->flags &= ~SWP_NOCLIENTMOVE;
|
||||
|
||||
if( (newClientRect.right - newClientRect.left !=
|
||||
wndPtr->rectClient.right - wndPtr->rectClient.left) ||
|
||||
(newClientRect.bottom - newClientRect.top !=
|
||||
wndPtr->rectClient.bottom - wndPtr->rectClient.top) )
|
||||
winpos.flags &= ~SWP_NOCLIENTSIZE;
|
||||
winpos->flags &= ~SWP_NOCLIENTSIZE;
|
||||
}
|
||||
else
|
||||
if( !(flags & SWP_NOMOVE) && (newClientRect.left != wndPtr->rectClient.left ||
|
||||
newClientRect.top != wndPtr->rectClient.top) )
|
||||
winpos.flags &= ~SWP_NOCLIENTMOVE;
|
||||
winpos->flags &= ~SWP_NOCLIENTMOVE;
|
||||
|
||||
/* Update active DCEs */
|
||||
|
||||
|
@ -1673,33 +1696,40 @@ BOOL SetWindowPos( HWND hwnd, HWND hwndInsertAfter, INT x, INT y,
|
|||
DCE_InvalidateDCE(wndPtr->parent, &rect);
|
||||
}
|
||||
|
||||
/* Perform the moving and resizing */
|
||||
/* change geometry */
|
||||
|
||||
oldWindowRect = wndPtr->rectWindow;
|
||||
|
||||
if (wndPtr->window)
|
||||
{
|
||||
RECT16 oldWindowRect = wndPtr->rectWindow;
|
||||
RECT16 oldClientRect = wndPtr->rectClient;
|
||||
|
||||
HWND bogusInsertAfter = winpos.hwndInsertAfter;
|
||||
tempInsertAfter = winpos->hwndInsertAfter;
|
||||
|
||||
winpos.hwndInsertAfter = hwndInsertAfter;
|
||||
WINPOS_SetXWindowPos( &winpos );
|
||||
winpos->hwndInsertAfter = hwndInsertAfter;
|
||||
|
||||
/* postpone geometry change */
|
||||
|
||||
if( !(flags & (SWP_SHOWWINDOW | SWP_HIDEWINDOW)) )
|
||||
{
|
||||
WINPOS_SetXWindowPos( winpos );
|
||||
winpos->hwndInsertAfter = tempInsertAfter;
|
||||
}
|
||||
else uFlags |= SMC_SETXPOS;
|
||||
|
||||
wndPtr->rectWindow = newWindowRect;
|
||||
wndPtr->rectClient = newClientRect;
|
||||
winpos.hwndInsertAfter = bogusInsertAfter;
|
||||
|
||||
/* FIXME: should do something like WINPOS_SizeMoveClean */
|
||||
if( !(flags & (SWP_SHOWWINDOW | SWP_HIDEWINDOW)) )
|
||||
if( (oldClientRect.left - oldWindowRect.left !=
|
||||
newClientRect.left - newWindowRect.left) ||
|
||||
(oldClientRect.top - oldWindowRect.top !=
|
||||
newClientRect.top - newWindowRect.top) || winpos->flags & SWP_NOCOPYBITS )
|
||||
|
||||
if( (oldClientRect.left - oldWindowRect.left !=
|
||||
newClientRect.left - newWindowRect.left) ||
|
||||
(oldClientRect.top - oldWindowRect.top !=
|
||||
newClientRect.top - newWindowRect.top) )
|
||||
|
||||
RedrawWindow32( wndPtr->hwndSelf, NULL, 0, RDW_INVALIDATE |
|
||||
RDW_ALLCHILDREN | RDW_FRAME | RDW_ERASE );
|
||||
else
|
||||
if( winpos.flags & SWP_FRAMECHANGED )
|
||||
PAINT_RedrawWindow( wndPtr->hwndSelf, NULL, 0, RDW_INVALIDATE |
|
||||
RDW_ALLCHILDREN | RDW_FRAME | RDW_ERASE, 0 );
|
||||
else
|
||||
if( winpos->flags & SWP_FRAMECHANGED )
|
||||
{
|
||||
WORD wErase = 0;
|
||||
RECT32 rect;
|
||||
|
@ -1709,8 +1739,8 @@ BOOL SetWindowPos( HWND hwnd, HWND hwndInsertAfter, INT x, INT y,
|
|||
rect.left = newClientRect.right; rect.top = newClientRect.top;
|
||||
rect.right = oldClientRect.right; rect.bottom = newClientRect.bottom;
|
||||
wErase = 1;
|
||||
RedrawWindow32( wndPtr->hwndSelf, &rect, 0,
|
||||
RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN );
|
||||
PAINT_RedrawWindow( wndPtr->hwndSelf, &rect, 0,
|
||||
RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN, 0 );
|
||||
}
|
||||
if( oldClientRect.bottom > newClientRect.bottom )
|
||||
{
|
||||
|
@ -1718,33 +1748,41 @@ BOOL SetWindowPos( HWND hwnd, HWND hwndInsertAfter, INT x, INT y,
|
|||
rect.right = (wErase)?oldClientRect.right:newClientRect.right;
|
||||
rect.bottom = oldClientRect.bottom;
|
||||
wErase = 1;
|
||||
RedrawWindow32( wndPtr->hwndSelf, &rect, 0,
|
||||
RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN );
|
||||
PAINT_RedrawWindow( wndPtr->hwndSelf, &rect, 0,
|
||||
RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN, 0 );
|
||||
}
|
||||
if( !wErase ) wndPtr->flags |= WIN_NEEDS_NCPAINT;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
RECT16 oldWindowRect = wndPtr->rectWindow;
|
||||
RECT16 oldClientRect = wndPtr->rectClient;
|
||||
|
||||
wndPtr->rectWindow = newWindowRect;
|
||||
wndPtr->rectClient = newClientRect;
|
||||
|
||||
if( !(flags & SWP_NOREDRAW) )
|
||||
if( oldClientRect.bottom - oldClientRect.top ==
|
||||
newClientRect.bottom - newClientRect.top ) result &= ~WVR_VREDRAW;
|
||||
|
||||
if( oldClientRect.right - oldClientRect.left ==
|
||||
newClientRect.right - newClientRect.left ) result &= ~WVR_HREDRAW;
|
||||
|
||||
if( !(flags & (SWP_NOREDRAW | SWP_HIDEWINDOW | SWP_SHOWWINDOW)) )
|
||||
{
|
||||
BOOL bNoCopy = (flags & SWP_NOCOPYBITS) ||
|
||||
(result >= WVR_HREDRAW && result < WVR_VALIDRECTS);
|
||||
uFlags |= ((winpos->flags & SWP_NOCOPYBITS) ||
|
||||
(result >= WVR_HREDRAW && result < WVR_VALIDRECTS)) ? SMC_NOCOPY : 0;
|
||||
uFlags |= (winpos->flags & SWP_FRAMECHANGED) ? SMC_DRAWFRAME : 0;
|
||||
|
||||
if( (winpos.flags & SWP_AGG_NOGEOMETRYCHANGE) != SWP_AGG_NOGEOMETRYCHANGE )
|
||||
/* optimize cleanup by BitBlt'ing where possible */
|
||||
|
||||
WINPOS_SizeMoveClean(wndPtr, visRgn, &oldWindowRect, &oldClientRect, bNoCopy);
|
||||
if( (winpos->flags & SWP_AGG_NOGEOMETRYCHANGE) != SWP_AGG_NOGEOMETRYCHANGE )
|
||||
uFlags = WINPOS_SizeMoveClean(wndPtr, visRgn, &oldWindowRect,
|
||||
&oldClientRect, uFlags);
|
||||
else
|
||||
if( winpos.flags & SWP_FRAMECHANGED )
|
||||
RedrawWindow32( winpos.hwnd, NULL, 0, RDW_NOCHILDREN | RDW_FRAME );
|
||||
{
|
||||
/* adjust frame and do not erase parent */
|
||||
|
||||
if( winpos->flags & SWP_FRAMECHANGED ) wndPtr->flags |= WIN_NEEDS_NCPAINT;
|
||||
if( winpos->flags & SWP_NOZORDER ) uFlags |= SMC_NOPARENTERASE;
|
||||
}
|
||||
}
|
||||
DeleteObject(visRgn);
|
||||
}
|
||||
|
@ -1754,14 +1792,19 @@ BOOL SetWindowPos( HWND hwnd, HWND hwndInsertAfter, INT x, INT y,
|
|||
wndPtr->dwStyle |= WS_VISIBLE;
|
||||
if (wndPtr->window)
|
||||
{
|
||||
if( uFlags & SMC_SETXPOS )
|
||||
{
|
||||
WINPOS_SetXWindowPos( winpos );
|
||||
winpos->hwndInsertAfter = tempInsertAfter;
|
||||
}
|
||||
XMapWindow( display, wndPtr->window );
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!(flags & SWP_NOREDRAW))
|
||||
RedrawWindow32( winpos.hwnd, NULL, 0,
|
||||
PAINT_RedrawWindow( winpos->hwnd, NULL, 0,
|
||||
RDW_INVALIDATE | RDW_ALLCHILDREN |
|
||||
RDW_FRAME | RDW_ERASE );
|
||||
RDW_FRAME | RDW_ERASENOW | RDW_ERASE, 0 );
|
||||
}
|
||||
}
|
||||
else if (flags & SWP_HIDEWINDOW)
|
||||
|
@ -1770,25 +1813,35 @@ BOOL SetWindowPos( HWND hwnd, HWND hwndInsertAfter, INT x, INT y,
|
|||
if (wndPtr->window)
|
||||
{
|
||||
XUnmapWindow( display, wndPtr->window );
|
||||
if( uFlags & SMC_SETXPOS )
|
||||
{
|
||||
WINPOS_SetXWindowPos( winpos );
|
||||
winpos->hwndInsertAfter = tempInsertAfter;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!(flags & SWP_NOREDRAW))
|
||||
RedrawWindow16( wndPtr->parent->hwndSelf, &wndPtr->rectWindow, 0,
|
||||
RDW_INVALIDATE | RDW_ALLCHILDREN | RDW_ERASE );
|
||||
{
|
||||
RECT32 rect = { oldWindowRect.left, oldWindowRect.top,
|
||||
oldWindowRect.right, oldWindowRect.bottom };
|
||||
PAINT_RedrawWindow( wndPtr->parent->hwndSelf, &rect, 0,
|
||||
RDW_INVALIDATE | RDW_ALLCHILDREN | RDW_ERASE | RDW_ERASENOW, 0);
|
||||
}
|
||||
uFlags |= SMC_NOPARENTERASE;
|
||||
}
|
||||
|
||||
if ((winpos.hwnd == GetFocus()) || IsChild(winpos.hwnd, GetFocus()))
|
||||
SetFocus( GetParent(winpos.hwnd) ); /* Revert focus to parent */
|
||||
if ((winpos->hwnd == GetFocus()) || IsChild(winpos->hwnd, GetFocus()))
|
||||
SetFocus( GetParent(winpos->hwnd) ); /* Revert focus to parent */
|
||||
|
||||
if (winpos.hwnd == hwndActive)
|
||||
if (winpos->hwnd == hwndActive)
|
||||
{
|
||||
/* Activate previously active window if possible */
|
||||
HWND newActive = hwndPrevActive;
|
||||
if (!IsWindow(newActive) || (newActive == winpos.hwnd))
|
||||
if (!IsWindow(newActive) || (newActive == winpos->hwnd))
|
||||
{
|
||||
newActive = GetTopWindow( GetDesktopWindow() );
|
||||
if (newActive == winpos.hwnd)
|
||||
if (newActive == winpos->hwnd)
|
||||
newActive = wndPtr->next ? wndPtr->next->hwndSelf : 0;
|
||||
}
|
||||
WINPOS_ChangeActiveWindow( newActive, FALSE );
|
||||
|
@ -1798,7 +1851,7 @@ BOOL SetWindowPos( HWND hwnd, HWND hwndInsertAfter, INT x, INT y,
|
|||
/* Activate the window */
|
||||
|
||||
if (!(flags & SWP_NOACTIVATE))
|
||||
WINPOS_ChangeActiveWindow( winpos.hwnd, FALSE );
|
||||
WINPOS_ChangeActiveWindow( winpos->hwnd, FALSE );
|
||||
|
||||
/* Repaint the window */
|
||||
|
||||
|
@ -1806,19 +1859,21 @@ BOOL SetWindowPos( HWND hwnd, HWND hwndInsertAfter, INT x, INT y,
|
|||
|
||||
EVENT_DummyMotionNotify(); /* Simulate a mouse event to set the cursor */
|
||||
|
||||
if (!(flags & SWP_DEFERERASE))
|
||||
RedrawWindow32( wndPtr->parent->hwndSelf, NULL, 0,
|
||||
RDW_ALLCHILDREN | RDW_ERASENOW );
|
||||
if (!(flags & SWP_DEFERERASE) && !(uFlags & SMC_NOPARENTERASE) )
|
||||
PAINT_RedrawWindow( wndPtr->parent->hwndSelf, NULL, 0, RDW_ALLCHILDREN | RDW_ERASENOW, 0 );
|
||||
else if( wndPtr->parent == WIN_GetDesktop() && wndPtr->parent->flags & WIN_NEEDS_ERASEBKGND )
|
||||
PAINT_RedrawWindow( wndPtr->parent->hwndSelf, NULL, 0, RDW_NOCHILDREN | RDW_ERASENOW, 0 );
|
||||
|
||||
/* And last, send the WM_WINDOWPOSCHANGED message */
|
||||
|
||||
dprintf_win(stddeb,"\tstatus flags = %04x\n", winpos.flags & SWP_AGG_STATUSFLAGS);
|
||||
dprintf_win(stddeb,"\tstatus flags = %04x\n", winpos->flags & SWP_AGG_STATUSFLAGS);
|
||||
|
||||
if ( ((winpos.flags & SWP_AGG_STATUSFLAGS) != SWP_AGG_NOPOSCHANGE) &&
|
||||
!(winpos.flags & SWP_NOSENDCHANGING))
|
||||
SendMessage16( winpos.hwnd, WM_WINDOWPOSCHANGED,
|
||||
0, (LPARAM)MAKE_SEGPTR(&winpos) );
|
||||
if ( ((winpos->flags & SWP_AGG_STATUSFLAGS) != SWP_AGG_NOPOSCHANGE) &&
|
||||
!(winpos->flags & SWP_NOSENDCHANGING))
|
||||
SendMessage16( winpos->hwnd, WM_WINDOWPOSCHANGED,
|
||||
0, (LPARAM)SEGPTR_GET(winpos) );
|
||||
|
||||
SEGPTR_FREE(winpos);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -679,10 +679,6 @@ INT32 WINPROC_MapMsg16To32A( UINT16 msg16, WPARAM16 wParam16, UINT32 *pmsg32,
|
|||
*pwparam32 = MAKEWPARAM( wParam16, HIWORD(*plparam) );
|
||||
*plparam = (LPARAM)(HWND32)LOWORD(*plparam);
|
||||
}
|
||||
else
|
||||
{
|
||||
*pwparam32 = MAKEWPARAM( wParam16, 0 /* FIXME? */ );
|
||||
}
|
||||
return 0;
|
||||
case WM_SETTEXT:
|
||||
*plparam = (LPARAM)PTR_SEG_TO_LIN(*plparam);
|
||||
|
|
10
wine.ini
10
wine.ini
|
@ -3,10 +3,11 @@
|
|||
;;
|
||||
;; Each section has the following format:
|
||||
;; [Drive X]
|
||||
;; Path=xxx (Unix path for drive root)
|
||||
;; Type=xxx (supported types are 'floppy', 'hd', 'cdrom' and 'network')
|
||||
;; Label=xxx (drive label, at most 11 characters)
|
||||
;; Serial=xxx (serial number, 8 characters hexadecimal number)
|
||||
;; Path=xxx (Unix path for drive root)
|
||||
;; Type=xxx (supported types are 'floppy', 'hd', 'cdrom' and 'network')
|
||||
;; Label=xxx (drive label, at most 11 characters)
|
||||
;; Serial=xxx (serial number, 8 characters hexadecimal number)
|
||||
;; Filesystem=xxx (supported types are 'msdos','win95','unix')
|
||||
;;
|
||||
[Drive A]
|
||||
Path=/mnt/fd0
|
||||
|
@ -18,6 +19,7 @@ Serial=87654321
|
|||
Path=/c
|
||||
Type=hd
|
||||
Label=MS-DOS
|
||||
Filesystem=msdos
|
||||
|
||||
[Drive D]
|
||||
Path=/cdrom
|
||||
|
|
8
wine.man
8
wine.man
|
@ -205,6 +205,14 @@ default: 12345678
|
|||
Used to specify the drive serial number, as an 8-character hexadecimal
|
||||
number.
|
||||
.PP
|
||||
.I format: Filesystem = <fstype>
|
||||
.br
|
||||
default: unix
|
||||
.br
|
||||
Used to specify the type of the filesystem on which the drive resides;
|
||||
supported types are msdos (or fat), win95 (or vfat), unix. If the
|
||||
drive spans several different filesystems, say unix.
|
||||
.PP
|
||||
.B [wine]
|
||||
.br
|
||||
.I format: windows = <directory>
|
||||
|
|
Loading…
Reference in New Issue