Release 0.5
Sun Jan 2 12:38:53 1994 David Metcalfe <david@prism.demon.co.uk> * [windows/class.c] Implemented GetClassName and GetClassInfo. * [windows/caret.c] Various improvements to text caret code. Fri Dec 31 15:22:22 1993 John Brezak <brezak@apollo.hp.com> * [misc/comm.c] Patches to work with NetBSD. Thu Dec 30 12:11:55 1993 John Richardson <jrichard@cs.uml.edu> * [objects/bitblt.c] Added StretchBlt(). Tue Jan 4 05:22:07 1994 julliard@di.epfl.ch (Alexandre Julliard) * [misc/user.c] Added creation of system message queue. * [objects/bitmap.c] [objects/dcvalues.c] [windows/dc.c] Added DC size fields into DC structure. * [objects/clipping.c] Bug fix in CLIPPING_IntersectRect(). * [windows/class.c] Allocate a DCE instead of a DC for CS_CLASSDC classes. * [windows/clipping.c] Fixed GetUpdateRect() and GetUpdateRgn() to clip to the client area. * [windows/dce.c] Implemented GetDCEx() and GetWindowDC(). * [windows/defwnd.c] Implemented WM_WINDOWPOSCHANGED handling. * [windows/event.c] Preliminary support for Xlib event handling instead of Xt callbacks. Changed MSG_AddMsg() calls to hardware_event() or PostMessage(). * [windows/message.c] Preliminary support for multiple message queues. Implemented hardware_event() to store messages into the system queue. Implemented Get/SetTaskQueue(). Better WM_PAINT and WM_TIMER handling. Changes to use Xlib instead of Xt for events. * [windows/painting.c] Use GetDCEx() to retrieve the DC, to get a correct visible region. * [windows/timer.c] Moved the timer procedure callback into DispatchMessage(). Changed implementation to get rid of Xt timeouts. Timer checking is now done inside GetMessage(). * [windows/win.c] Allocate a DCE instead of a DC for CS_OWNDC windows. Replaced Xt calls with Xlib calls. Moved window positioning functions into windows/winpos.c * [windows/winpos.c] (New file) Rewritten most of the window positioning functions. Implemented SetWindowPos() and MapWindowPoints(). Jan 3, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte) * [if1632/user.spec] Bad arguments description for function SetDlgItemText. * [objects/text.c] Function DrawText now handle DT_CALCRECT request. * [misc/message.c] Message boxes now use DrawText with DT_CALCRECT. * [windows/graphics.c] Bug fix in function FrameRect, (it was using PEN instead of BRUSH). * [windows/win.c] Bug fix for flags in function ShowWindow. More accurate WM_SIZE generated by function ShowWindow. * [controls/listbox.c] More code for LBS_MULTIPLESEL. More code for LBS_MULTICOLUMN. * [include/windows.h] Bad define for MF_SEPARATOR. * [controls/menu.c] New functions: PopMenuWndProc() with 'glues', CreatePopupMenu(), AppendMenu(), InsertMenu(), RemoveMenu(), DeleteMenu(), ModifyMenu(), TrackPopupMenu(). Code in stubs: CreateMenu(), DestroyMenu(). Sat Jan 1 10:22:43 1994 Bob Amstadt (bob@pooh) * loader/wine.c: Added support for relocation types 5 and 6. Mon Dec 27 11:06:03 1993 Erik Bos (erik@trashcan.hacktic.nl) * [misc/comm.c] new functions: BuildCommDCB(), OpenComm(), CloseComm(), SetCommBreak(), ClearCommBreak(), EscapeCommFunction(), FlushComm(), GetCommError(), SetCommEventMask(), GetCommEventMask(), SetCommState(), GetCommState(), TransmitCommChar(), ReadComm(), WriteComm(). Wed Dec 22 13:00:15 1993 David Metcalfe <david@prism.demon.co.uk> * [windows/caret.c] Implemented text caret functions. Tue Dec 21 06:13:58 1993 julliard@di.epfl.ch (Alexandre Julliard) * [loader/wine.c] Bug fix in LoadImage(). * [objects/bitblt.c] [objects/clipping.c] [objects/text.c] [windows/dc.c] [windows/dce.c] [windows/graphics.c] Modified graphics calls to take into account the DC origin. * [windows/defwnd.c] Added preliminary WM_NCCALCSIZE handling. * [windows/event.c] Send WM_NCCALCSIZE message on resize event. * [windows/win.c] Send WM_NCCALCSIZE message in CreateWindow(). Realize widgets at creation time (should prevent problems with unrealized widgets). Dec 19, 93 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte) * [controls/static.c] Send mouse & keyboard message received to its parent. * [controls/scroll.c] Send keyboard message received to its parent. * [controls/listbox.c] Add Navigation keys . ListBox now use VSCROLL & HSCROLL instead of children. Alpha version of LBS_MULTIPLESEL. Alpha version of LBS_MULTICOLUMN. * [controls/combo.c] Add Navigation keys on closed ComboBox. Remove useless 'COMBOBOX_CreateComboBox' function. Mon Dec 19 20:39:34 1993 Erik Bos (erik@trashcan.hacktic.nl) * [loader/wine. LoadImage() modified to use FindFile(). * [misc/file.c] SetErrorMode added * [misc/dos_fs.c] bug fixes. Dec 13, 93 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte) * [memory/global.c] bug fix in GlobalGetFreeSegment : good ptr in 'g_prev'. * [sysres.dll] preliminary version of a 'glass of wine' bitmap * [windows/event.c] New function 'GetCapture'. * [controls/scroll.c] Remove useless 'SCROLLBAR_CreateScrollBar' function. * [controls/listbox.c] Remove useless 'LISTBOX_CreateListBox' function. Mon Dec 13 13:51:00 1993 David Metcalfe <david@prism.demon.co.uk> * [objects/font.c] Corrected bugs in GetCharWidth(). * [windows/event.c] Modified EVENT_key to send Windows virtual key codes for WM_KEYDOWN and WM_KEYUP messages, and a WM_CHAR message for printable characters. Wed Dec 08 19:20:00 1993 Karl Guenter Wuensch (hn324wu@unidui.uni-duisburg.de) * [windows/graphics.c] Added Polyline and Polygon Mon Dec 13 14:51:54 1993 Erik Bos (erik@trashcan.hacktic.nl) * [controls/listbox.c] ListBoxDirectory() modified to use dos_fs.c's functions to access files&|drives. Sat Dec 04 17:04:23 1993 Erik Bos (erik@trashcan.hacktic.nl) * [misc/dos_fs.c] Added FindFile() to search a file in a dos/unix style path. * [misc/file.c] New Win31 functions: OpenFile, _lcreate, _llseek, GetTempDrive, GetTempFileName, GetWindowsDirectory, GetSystemDirectory, GetDriveType. * [misc/int21.c] Modified. Wed Dec 1 16:20:45 1993 Miguel de Icaza (miguel@roxanne.nuclecu.unam.mx) * [misc/profile.c] The Profile functions now return the correct values. They now implement all the features described in the SDK. Tue Nov 30 13:55:27 1993 Bob Amstadt (bob at amscons) * [loader/selector.c] Rewrote selector aliasing routines to use System V IPC routine to alias memory segments. Nov 28, 93 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte) * [controls/listbox.c] More consistency in functions using wIndexes * [controls/scroll.c] New function : ShowScrollBar(). * [loader/cursor.c] ... New file Move cursor functions from [loader/resource.c]. New function : ClipCursor(). New function : GetClipCursor(). New function : CreateCursor(). SetCursor() now working using gloabal variable 'winHasCursor'. *[object/palette.c] New stub only : SelectPalette(). New stub only : RealizePalette(). *[win/event.c] New function : EVENT_enter_notify(), update 'winHasCursor' and send WM_SETCURSOR. *[win/defwnd.c] Add processing of WM_SETCURSOR message. *[win/win.c] New members in WND structure : hCursor, hWndVScroll & hWndHScroll. CreateWindowEx() now create children for WM_HSCROLL & WM_VSCROLL. New function ClientToScreen(). New function ScreenToClient(). Mon Nov 25 18:25:40 1993 Erik Bos (erik@trashcan.hacktic.nl) * [files.h / regfunc.h / misc/dos.c] Removed. * [misc/dos_fs.c] Added support for loading dosdrive cfg from wine.ini. * [misc/int21.c] Modified. Wed Nov 24 11:37:33 1993 julliard@disuns2.epfl.ch (Alexandre Julliard) * [include/atom.h] [memory/atom.c] Implemented atoms. * [windows/class.c] Modified RegisterClass() to use atoms. Implemented CS_GLOBALCLASS style. * [windows/message.c] Implemented RegisterWindowMessage(). * [loader/resource.c] Bug fix in LoadResource(). * [windows/dialog.c] Modified CreateDialogParam() to use Find/LoadResource().
This commit is contained in:
parent
e399fc3636
commit
5f721f81fd
293
ChangeLog
293
ChangeLog
|
@ -1,3 +1,295 @@
|
||||||
|
Sun Jan 2 12:38:53 1994 David Metcalfe <david@prism.demon.co.uk>
|
||||||
|
|
||||||
|
* [windows/class.c]
|
||||||
|
Implemented GetClassName and GetClassInfo.
|
||||||
|
|
||||||
|
* [windows/caret.c]
|
||||||
|
Various improvements to text caret code.
|
||||||
|
|
||||||
|
Fri Dec 31 15:22:22 1993 John Brezak <brezak@apollo.hp.com>
|
||||||
|
|
||||||
|
* [misc/comm.c]
|
||||||
|
Patches to work with NetBSD.
|
||||||
|
|
||||||
|
Thu Dec 30 12:11:55 1993 John Richardson <jrichard@cs.uml.edu>
|
||||||
|
|
||||||
|
* [objects/bitblt.c] Added StretchBlt().
|
||||||
|
|
||||||
|
Tue Jan 4 05:22:07 1994 julliard@di.epfl.ch (Alexandre Julliard)
|
||||||
|
|
||||||
|
* [misc/user.c]
|
||||||
|
Added creation of system message queue.
|
||||||
|
|
||||||
|
* [objects/bitmap.c] [objects/dcvalues.c] [windows/dc.c]
|
||||||
|
Added DC size fields into DC structure.
|
||||||
|
|
||||||
|
* [objects/clipping.c]
|
||||||
|
Bug fix in CLIPPING_IntersectRect().
|
||||||
|
|
||||||
|
* [windows/class.c]
|
||||||
|
Allocate a DCE instead of a DC for CS_CLASSDC classes.
|
||||||
|
|
||||||
|
* [windows/clipping.c]
|
||||||
|
Fixed GetUpdateRect() and GetUpdateRgn() to clip to the client area.
|
||||||
|
|
||||||
|
* [windows/dce.c]
|
||||||
|
Implemented GetDCEx() and GetWindowDC().
|
||||||
|
|
||||||
|
* [windows/defwnd.c]
|
||||||
|
Implemented WM_WINDOWPOSCHANGED handling.
|
||||||
|
|
||||||
|
* [windows/event.c]
|
||||||
|
Preliminary support for Xlib event handling instead of Xt callbacks.
|
||||||
|
Changed MSG_AddMsg() calls to hardware_event() or PostMessage().
|
||||||
|
|
||||||
|
* [windows/message.c]
|
||||||
|
Preliminary support for multiple message queues.
|
||||||
|
Implemented hardware_event() to store messages into the system queue.
|
||||||
|
Implemented Get/SetTaskQueue().
|
||||||
|
Better WM_PAINT and WM_TIMER handling.
|
||||||
|
Changes to use Xlib instead of Xt for events.
|
||||||
|
|
||||||
|
* [windows/painting.c]
|
||||||
|
Use GetDCEx() to retrieve the DC, to get a correct visible region.
|
||||||
|
|
||||||
|
* [windows/timer.c]
|
||||||
|
Moved the timer procedure callback into DispatchMessage().
|
||||||
|
Changed implementation to get rid of Xt timeouts. Timer checking
|
||||||
|
is now done inside GetMessage().
|
||||||
|
|
||||||
|
* [windows/win.c]
|
||||||
|
Allocate a DCE instead of a DC for CS_OWNDC windows.
|
||||||
|
Replaced Xt calls with Xlib calls.
|
||||||
|
Moved window positioning functions into windows/winpos.c
|
||||||
|
|
||||||
|
* [windows/winpos.c] (New file)
|
||||||
|
Rewritten most of the window positioning functions.
|
||||||
|
Implemented SetWindowPos() and MapWindowPoints().
|
||||||
|
|
||||||
|
Jan 3, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
|
||||||
|
|
||||||
|
* [if1632/user.spec]
|
||||||
|
Bad arguments description for function SetDlgItemText.
|
||||||
|
|
||||||
|
* [objects/text.c]
|
||||||
|
Function DrawText now handle DT_CALCRECT request.
|
||||||
|
|
||||||
|
* [misc/message.c]
|
||||||
|
Message boxes now use DrawText with DT_CALCRECT.
|
||||||
|
|
||||||
|
* [windows/graphics.c]
|
||||||
|
Bug fix in function FrameRect, (it was using PEN instead of BRUSH).
|
||||||
|
|
||||||
|
* [windows/win.c]
|
||||||
|
Bug fix for flags in function ShowWindow.
|
||||||
|
More accurate WM_SIZE generated by function ShowWindow.
|
||||||
|
|
||||||
|
* [controls/listbox.c]
|
||||||
|
More code for LBS_MULTIPLESEL.
|
||||||
|
More code for LBS_MULTICOLUMN.
|
||||||
|
|
||||||
|
* [include/windows.h]
|
||||||
|
Bad define for MF_SEPARATOR.
|
||||||
|
|
||||||
|
* [controls/menu.c]
|
||||||
|
New functions: PopMenuWndProc() with 'glues',
|
||||||
|
CreatePopupMenu(), AppendMenu(), InsertMenu(), RemoveMenu(),
|
||||||
|
DeleteMenu(), ModifyMenu(), TrackPopupMenu().
|
||||||
|
Code in stubs: CreateMenu(), DestroyMenu().
|
||||||
|
|
||||||
|
Sat Jan 1 10:22:43 1994 Bob Amstadt (bob@pooh)
|
||||||
|
|
||||||
|
* loader/wine.c: Added support for relocation types 5 and 6.
|
||||||
|
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
Mon Dec 27 11:06:03 1993 Erik Bos (erik@trashcan.hacktic.nl)
|
||||||
|
|
||||||
|
* [misc/comm.c]
|
||||||
|
new functions: BuildCommDCB(), OpenComm(), CloseComm(),
|
||||||
|
SetCommBreak(), ClearCommBreak(), EscapeCommFunction(), FlushComm(),
|
||||||
|
GetCommError(), SetCommEventMask(), GetCommEventMask(),
|
||||||
|
SetCommState(), GetCommState(), TransmitCommChar(), ReadComm(),
|
||||||
|
WriteComm().
|
||||||
|
|
||||||
|
Wed Dec 22 13:00:15 1993 David Metcalfe <david@prism.demon.co.uk>
|
||||||
|
|
||||||
|
* [windows/caret.c]
|
||||||
|
Implemented text caret functions.
|
||||||
|
|
||||||
|
Tue Dec 21 06:13:58 1993 julliard@di.epfl.ch (Alexandre Julliard)
|
||||||
|
|
||||||
|
* [loader/wine.c]
|
||||||
|
Bug fix in LoadImage().
|
||||||
|
|
||||||
|
* [objects/bitblt.c] [objects/clipping.c] [objects/text.c]
|
||||||
|
[windows/dc.c] [windows/dce.c] [windows/graphics.c]
|
||||||
|
Modified graphics calls to take into account the DC origin.
|
||||||
|
|
||||||
|
* [windows/defwnd.c]
|
||||||
|
Added preliminary WM_NCCALCSIZE handling.
|
||||||
|
|
||||||
|
* [windows/event.c]
|
||||||
|
Send WM_NCCALCSIZE message on resize event.
|
||||||
|
|
||||||
|
* [windows/win.c]
|
||||||
|
Send WM_NCCALCSIZE message in CreateWindow().
|
||||||
|
Realize widgets at creation time (should prevent problems with
|
||||||
|
unrealized widgets).
|
||||||
|
|
||||||
|
Dec 19, 93 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
|
||||||
|
|
||||||
|
* [controls/static.c]
|
||||||
|
Send mouse & keyboard message received to its parent.
|
||||||
|
|
||||||
|
* [controls/scroll.c]
|
||||||
|
Send keyboard message received to its parent.
|
||||||
|
|
||||||
|
* [controls/listbox.c]
|
||||||
|
Add Navigation keys .
|
||||||
|
ListBox now use VSCROLL & HSCROLL instead of children.
|
||||||
|
Alpha version of LBS_MULTIPLESEL.
|
||||||
|
Alpha version of LBS_MULTICOLUMN.
|
||||||
|
|
||||||
|
* [controls/combo.c]
|
||||||
|
Add Navigation keys on closed ComboBox.
|
||||||
|
Remove useless 'COMBOBOX_CreateComboBox' function.
|
||||||
|
|
||||||
|
Mon Dec 19 20:39:34 1993 Erik Bos (erik@trashcan.hacktic.nl)
|
||||||
|
|
||||||
|
* [loader/wine.
|
||||||
|
LoadImage() modified to use FindFile().
|
||||||
|
|
||||||
|
* [misc/file.c]
|
||||||
|
SetErrorMode added
|
||||||
|
|
||||||
|
* [misc/dos_fs.c]
|
||||||
|
bug fixes.
|
||||||
|
|
||||||
|
Dec 13, 93 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
|
||||||
|
|
||||||
|
* [memory/global.c]
|
||||||
|
bug fix in GlobalGetFreeSegment : good ptr in 'g_prev'.
|
||||||
|
|
||||||
|
* [sysres.dll]
|
||||||
|
preliminary version of a 'glass of wine' bitmap
|
||||||
|
|
||||||
|
* [windows/event.c]
|
||||||
|
New function 'GetCapture'.
|
||||||
|
|
||||||
|
* [controls/scroll.c]
|
||||||
|
Remove useless 'SCROLLBAR_CreateScrollBar' function.
|
||||||
|
|
||||||
|
* [controls/listbox.c]
|
||||||
|
Remove useless 'LISTBOX_CreateListBox' function.
|
||||||
|
|
||||||
|
Mon Dec 13 13:51:00 1993 David Metcalfe <david@prism.demon.co.uk>
|
||||||
|
|
||||||
|
* [objects/font.c]
|
||||||
|
Corrected bugs in GetCharWidth().
|
||||||
|
|
||||||
|
* [windows/event.c]
|
||||||
|
Modified EVENT_key to send Windows virtual key codes for
|
||||||
|
WM_KEYDOWN and WM_KEYUP messages, and a WM_CHAR message
|
||||||
|
for printable characters.
|
||||||
|
|
||||||
|
Wed Dec 08 19:20:00 1993 Karl Guenter Wuensch (hn324wu@unidui.uni-duisburg.de)
|
||||||
|
|
||||||
|
* [windows/graphics.c]
|
||||||
|
Added Polyline and Polygon
|
||||||
|
|
||||||
|
Mon Dec 13 14:51:54 1993 Erik Bos (erik@trashcan.hacktic.nl)
|
||||||
|
|
||||||
|
* [controls/listbox.c]
|
||||||
|
ListBoxDirectory() modified to use dos_fs.c's functions to
|
||||||
|
access files&|drives.
|
||||||
|
|
||||||
|
Sat Dec 04 17:04:23 1993 Erik Bos (erik@trashcan.hacktic.nl)
|
||||||
|
|
||||||
|
* [misc/dos_fs.c]
|
||||||
|
Added FindFile() to search a file in a dos/unix style path.
|
||||||
|
|
||||||
|
* [misc/file.c]
|
||||||
|
New Win31 functions: OpenFile, _lcreate, _llseek, GetTempDrive,
|
||||||
|
GetTempFileName, GetWindowsDirectory, GetSystemDirectory,
|
||||||
|
GetDriveType.
|
||||||
|
|
||||||
|
* [misc/int21.c]
|
||||||
|
Modified.
|
||||||
|
|
||||||
|
Wed Dec 1 16:20:45 1993 Miguel de Icaza (miguel@roxanne.nuclecu.unam.mx)
|
||||||
|
|
||||||
|
* [misc/profile.c]
|
||||||
|
The Profile functions now return the correct values. They now
|
||||||
|
implement all the features described in the SDK.
|
||||||
|
|
||||||
|
Tue Nov 30 13:55:27 1993 Bob Amstadt (bob at amscons)
|
||||||
|
|
||||||
|
* [loader/selector.c]
|
||||||
|
Rewrote selector aliasing routines to use System V IPC
|
||||||
|
routine to alias memory segments.
|
||||||
|
|
||||||
|
Nov 28, 93 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
|
||||||
|
|
||||||
|
* [controls/listbox.c]
|
||||||
|
More consistency in functions using wIndexes
|
||||||
|
|
||||||
|
* [controls/scroll.c]
|
||||||
|
New function : ShowScrollBar().
|
||||||
|
|
||||||
|
* [loader/cursor.c] ... New file
|
||||||
|
Move cursor functions from [loader/resource.c].
|
||||||
|
New function : ClipCursor().
|
||||||
|
New function : GetClipCursor().
|
||||||
|
New function : CreateCursor().
|
||||||
|
SetCursor() now working using gloabal variable 'winHasCursor'.
|
||||||
|
|
||||||
|
*[object/palette.c]
|
||||||
|
New stub only : SelectPalette().
|
||||||
|
New stub only : RealizePalette().
|
||||||
|
|
||||||
|
*[win/event.c]
|
||||||
|
New function : EVENT_enter_notify(),
|
||||||
|
update 'winHasCursor' and send WM_SETCURSOR.
|
||||||
|
|
||||||
|
*[win/defwnd.c]
|
||||||
|
Add processing of WM_SETCURSOR message.
|
||||||
|
|
||||||
|
*[win/win.c]
|
||||||
|
New members in WND structure : hCursor, hWndVScroll & hWndHScroll.
|
||||||
|
CreateWindowEx() now create children for WM_HSCROLL & WM_VSCROLL.
|
||||||
|
New function ClientToScreen().
|
||||||
|
New function ScreenToClient().
|
||||||
|
|
||||||
|
Mon Nov 25 18:25:40 1993 Erik Bos (erik@trashcan.hacktic.nl)
|
||||||
|
|
||||||
|
* [files.h / regfunc.h / misc/dos.c]
|
||||||
|
Removed.
|
||||||
|
|
||||||
|
* [misc/dos_fs.c]
|
||||||
|
Added support for loading dosdrive cfg from wine.ini.
|
||||||
|
|
||||||
|
* [misc/int21.c]
|
||||||
|
Modified.
|
||||||
|
|
||||||
|
|
||||||
|
Wed Nov 24 11:37:33 1993 julliard@disuns2.epfl.ch (Alexandre Julliard)
|
||||||
|
|
||||||
|
* [include/atom.h] [memory/atom.c]
|
||||||
|
Implemented atoms.
|
||||||
|
|
||||||
|
* [windows/class.c]
|
||||||
|
Modified RegisterClass() to use atoms.
|
||||||
|
Implemented CS_GLOBALCLASS style.
|
||||||
|
|
||||||
|
* [windows/message.c]
|
||||||
|
Implemented RegisterWindowMessage().
|
||||||
|
|
||||||
|
* [loader/resource.c]
|
||||||
|
Bug fix in LoadResource().
|
||||||
|
|
||||||
|
* [windows/dialog.c]
|
||||||
|
Modified CreateDialogParam() to use Find/LoadResource().
|
||||||
|
|
||||||
Mon Nov 22 13:58:56 1993 David Metcalfe <david@prism.demon.co.uk>
|
Mon Nov 22 13:58:56 1993 David Metcalfe <david@prism.demon.co.uk>
|
||||||
|
|
||||||
* [windows/scroll.c]
|
* [windows/scroll.c]
|
||||||
|
@ -37,7 +329,6 @@ Nov 21, 93 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
|
||||||
* [sysres.dll]
|
* [sysres.dll]
|
||||||
Resources only 16bits DLL for System Resources, icons, etc...
|
Resources only 16bits DLL for System Resources, icons, etc...
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
|
||||||
Sun Nov 14 14:39:06 1993 julliard@di.epfl.ch (Alexandre Julliard)
|
Sun Nov 14 14:39:06 1993 julliard@di.epfl.ch (Alexandre Julliard)
|
||||||
|
|
||||||
* [include/dialog.h] [windows/dialog.c]
|
* [include/dialog.h] [windows/dialog.c]
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
#include "Wine.tmpl"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is the first try at using Imakefiles. There are probably many
|
||||||
|
* problems and things I haven't even considered. I do not have a Linux
|
||||||
|
* system to test them on, just NetBSD, so you may need to change things
|
||||||
|
* like the the SYSLIBS definition below...
|
||||||
|
*
|
||||||
|
* Peter Galbavy, 5th Dec 1993 peter@wonderland.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define IHaveSubDirs
|
||||||
|
#define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)' 'CC=$(CC)'
|
||||||
|
|
||||||
|
SUBDIRS = \
|
||||||
|
tools \
|
||||||
|
controls \
|
||||||
|
debugger \
|
||||||
|
etc \
|
||||||
|
if1632 \
|
||||||
|
include \
|
||||||
|
loader \
|
||||||
|
memory \
|
||||||
|
misc \
|
||||||
|
objects \
|
||||||
|
test \
|
||||||
|
windows
|
||||||
|
|
||||||
|
WINEDIR = $(LIBDIR)/wine
|
||||||
|
|
||||||
|
OBJS = \
|
||||||
|
if1632.o \
|
||||||
|
controls.o \
|
||||||
|
loader.o \
|
||||||
|
memory.o \
|
||||||
|
misc.o \
|
||||||
|
objects.o \
|
||||||
|
windows.o \
|
||||||
|
debugger.o \
|
||||||
|
readline.o
|
||||||
|
|
||||||
|
#ifdef i386BsdArchitecture
|
||||||
|
SYSLIBS = -ll -lm -li386 -lgnumalloc
|
||||||
|
#else
|
||||||
|
#ifdef LinuxArchitechture
|
||||||
|
SYSLIBS = -lm
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
AllTarget(wine)
|
||||||
|
|
||||||
|
NamedTargetSubdirs($(OBJS),$(SUBDIRS),"making",PassCDebugFlags,all)
|
||||||
|
MakefileSubdirs($(SUBDIRS))
|
||||||
|
DependSubdirs($(SUBDIRS))
|
||||||
|
IncludesSubdirs($(SUBDIRS))
|
||||||
|
CleanSubdirs($(SUBDIRS))
|
||||||
|
|
||||||
|
NormalProgramTarget(wine,$(OBJS),XawClientDepLibs,XawClientLibs,$(SYSLIBS))
|
||||||
|
|
||||||
|
depend::
|
||||||
|
|
||||||
|
install::
|
||||||
|
|
||||||
|
includes::
|
||||||
|
|
||||||
|
clean::
|
|
@ -0,0 +1 @@
|
||||||
|
All code unless stated otherwise is covered by the GNU Pubic License.
|
8
Makefile
8
Makefile
|
@ -1,6 +1,6 @@
|
||||||
######################################################################
|
######################################################################
|
||||||
# These variables are inherited by the sub-makefiles
|
# These variables are inherited by the sub-makefiles
|
||||||
DEBUGOPTS=
|
DEBUGOPTS=-DUSE_XLIB
|
||||||
COPTS=-O2 -m486
|
COPTS=-O2 -m486
|
||||||
INCLUDE_DIR=include
|
INCLUDE_DIR=include
|
||||||
LDFLAGS=
|
LDFLAGS=
|
||||||
|
@ -12,11 +12,17 @@ LIBS=-L. -L/usr/X386/lib -lXext -lXaw -lXt -lXmu -lX11 -lm
|
||||||
OBJS=if1632/if1632.o controls/controls.o loader/loader.o \
|
OBJS=if1632/if1632.o controls/controls.o loader/loader.o \
|
||||||
memory/memory.o misc/misc.o objects/objects.o windows/windows.o debugger/debugger.o
|
memory/memory.o misc/misc.o objects/objects.o windows/windows.o debugger/debugger.o
|
||||||
SUBDIRS=if1632 controls loader memory misc objects windows debugger
|
SUBDIRS=if1632 controls loader memory misc objects windows debugger
|
||||||
|
TAGFILES=if1632/{*.c,*.S} controls/{*.c,*.S} loader/{*.c,*.S} \
|
||||||
|
memory/{*.c,*.S} misc/{*.c,*.S} objects/{*.c,*.S} \
|
||||||
|
windows/{*.c,*.S} debugger/{*.c,*.S}
|
||||||
|
|
||||||
all: $(TARGET)
|
all: $(TARGET)
|
||||||
|
|
||||||
dummy:
|
dummy:
|
||||||
|
|
||||||
|
tags:
|
||||||
|
etags $(TAGFILES)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f *~ *.o *#
|
rm -f *~ *.o *#
|
||||||
@for i in tools $(SUBDIRS); do (cd $$i && $(MAKE) clean) || exit; done
|
@for i in tools $(SUBDIRS); do (cd $$i && $(MAKE) clean) || exit; done
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
You may without charge, royalty or other payment, copy and
|
||||||
|
distribute copies of this work and derivative works of this work
|
||||||
|
in source or binary form provided that: (1)
|
||||||
|
you appropriately publish on each copy an appropriate copyright
|
||||||
|
notice; (2) faithfully reproduce all prior copyright notices
|
||||||
|
included in the original work (you may also add your own
|
||||||
|
copyright notice); and (3) agree to indemnify and hold all prior
|
||||||
|
authors, copyright holders and licensors of the work harmless
|
||||||
|
from and against all damages arising from use of the work.
|
||||||
|
|
||||||
|
You may distribute sources of derivative works of the work
|
||||||
|
provided that (1) (a) all source files of the original work that
|
||||||
|
have been modified, (b) all source files of the derivative work
|
||||||
|
that contain any party of the original work, and (c) all source
|
||||||
|
files of the derivative work that are necessary to compile, link
|
||||||
|
and run the derivative work without unresolved external calls and
|
||||||
|
with the same functionality of the original work ("Necessary
|
||||||
|
Sources") carry a prominent notice explaining the nature and date
|
||||||
|
of the modification and/or creation. You are encouraged to make
|
||||||
|
the Necessary Sources available under this license in order to
|
||||||
|
further the development and acceptance of the work.
|
||||||
|
|
||||||
|
EXCEPT AS OTHERWISE RESTRICTED BY LAW, THIS WORK IS PROVIDED
|
||||||
|
WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES OF ANY KIND, INCLUDING
|
||||||
|
BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE, MERCHANTABILITY OR TITLE. EXCEPT AS
|
||||||
|
OTHERWISE PROVIDED BY LAW, NO AUTHOR, COPYRIGHT HOLDER OR
|
||||||
|
LICENSOR SHALL BE LIABLE TO YOU FOR DAMAGES OF ANY KIND, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
54
README
54
README
|
@ -1,6 +1,6 @@
|
||||||
Copyright Robert J. Amstadt, 1993. All code is provided without
|
Copyright Robert J. Amstadt, 1993. All code is provided without
|
||||||
warranty. It is my intent to cover this code with the Gnu Public
|
warranty. All code is covered by the license contained in the file
|
||||||
License.
|
LICENSE unless explicitly stated in the individual source file.
|
||||||
|
|
||||||
INSTALLATION:
|
INSTALLATION:
|
||||||
|
|
||||||
|
@ -19,18 +19,56 @@ All:
|
||||||
|
|
||||||
To build Wine, first do a "make depend" and then a "make". The
|
To build Wine, first do a "make depend" and then a "make". The
|
||||||
executable "wine" will be built. "wine" will load and run Windows'
|
executable "wine" will be built. "wine" will load and run Windows'
|
||||||
executables. You must specify the entire path to the executable,
|
executables. You must have a file "wine.ini" in the current directory,
|
||||||
have the executable in the current directory, or specify a load
|
your homedirectory, or in the path specified by the environment
|
||||||
path with environment variable WINEPATH.
|
variable WINEPATH. Multiple directories in WINEPATH should be seperated
|
||||||
|
by semi-colons and NOT by colons!
|
||||||
|
|
||||||
For example, to run Windows' solitaire:
|
You must specify the entire path to the executable, or a filename only
|
||||||
|
(using the path= statement in wine.ini as the search path)
|
||||||
|
|
||||||
export WINEPATH=/dos/windows;/dos/windows/system
|
For example: to run Windows' solitaire:
|
||||||
wine sol
|
|
||||||
|
export WINEPATH=/etc;/usr/windows
|
||||||
|
|
||||||
|
wine sol (using the path= statement in wine.ini
|
||||||
|
wine sol.exe as the search path)
|
||||||
|
|
||||||
|
wine c:\\windows\\sol.exe (using a dosfilename)
|
||||||
|
|
||||||
|
wine /usr/windows/sol.exe (using a unixfilename)
|
||||||
|
|
||||||
Have a nice game of solitaire, but be careful. Emulation isn't perfect.
|
Have a nice game of solitaire, but be careful. Emulation isn't perfect.
|
||||||
So, occassionally it will crash.
|
So, occassionally it will crash.
|
||||||
|
|
||||||
|
WHAT'S NEW with version 0.5: (see ChangeLog for details)
|
||||||
|
- Working towards elimination of Xt-dependent code.
|
||||||
|
- StretchBlt()
|
||||||
|
- GetClassName() & GetClassInfo()
|
||||||
|
- Implemented loader relocation types 5 and 6.
|
||||||
|
|
||||||
|
WHAT'S NEW with version 0.4.14: (see ChangeLog for details)
|
||||||
|
- Bug fixes and enhancements
|
||||||
|
- Comm functions
|
||||||
|
- Text caret functions
|
||||||
|
|
||||||
|
WHAT'S NEW with version 0.4.13: (see ChangeLog for details)
|
||||||
|
- Bug fixes
|
||||||
|
- GetCapture()
|
||||||
|
- More keyboard handling
|
||||||
|
- Polyline() and Polygon()
|
||||||
|
|
||||||
|
WHAT'S NEW with version 0.4.12: (see ChangeLog for details)
|
||||||
|
- Bug fixes
|
||||||
|
- New DOS file functions
|
||||||
|
- Experimental Imakefiles
|
||||||
|
|
||||||
|
WHAT'S NEW with version 0.4.11: (see ChangeLog for details)
|
||||||
|
- Bug fixes
|
||||||
|
- New cursor functions
|
||||||
|
- New file system handling
|
||||||
|
- Atoms
|
||||||
|
|
||||||
WHAT'S NEW with version 0.4.10: (see ChangeLog for details)
|
WHAT'S NEW with version 0.4.10: (see ChangeLog for details)
|
||||||
- Bug fixes
|
- Bug fixes
|
||||||
- More scroll bar functions
|
- More scroll bar functions
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
EXCEPT AS OTHERWISE RESTRICTED BY LAW, THIS WORK IS PROVIDED
|
||||||
|
WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES OF ANY KIND, INCLUDING
|
||||||
|
BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE, MERCHANTABILITY OR TITLE. EXCEPT AS
|
||||||
|
OTHERWISE PROVIDED BY LAW, NO AUTHOR, COPYRIGHT HOLDER OR
|
||||||
|
LICENSOR SHALL BE LIABLE TO YOU FOR DAMAGES OF ANY KIND, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
|
@ -0,0 +1,29 @@
|
||||||
|
XCOMM $Id$
|
||||||
|
|
||||||
|
INCLUDES = -I$(TOP)/include
|
||||||
|
|
||||||
|
XCOMM Imake rules go here
|
||||||
|
|
||||||
|
XCOMM First, dll description to files etc
|
||||||
|
#ifndef MakeDllFromSpec
|
||||||
|
#define MakeDllFromSpec(name,objfile) @@\
|
||||||
|
objfile.o: Concat(dll_,name.o) Concat3(dll_,name,_tab.o) @@\
|
||||||
|
@@\
|
||||||
|
Concat(dll_,name.S) Concat3(dll_,name,_tab.c): name.spec $(TOP)/tools/build @@\
|
||||||
|
$(TOP)/tools/build name.spec @@\
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* WineRelocatableTarget - generate rules to produce a relocatable object
|
||||||
|
* file instead of a library.
|
||||||
|
*/
|
||||||
|
#ifndef WineRelocatableTarget
|
||||||
|
#define WineRelocatableTarget(objname,objlist,depobj) @@\
|
||||||
|
AllTarget(objname.o) @@\
|
||||||
|
@@\
|
||||||
|
objname.o: depobj @@\
|
||||||
|
$(RM) $@ @@\
|
||||||
|
$(LD) $(LDCOMBINEFLAGS) objlist depobj -o $@
|
||||||
|
#endif /* WineRelocatableTarget */
|
||||||
|
|
|
@ -6,7 +6,7 @@ diff -ruN ../Backup//Makefile ./Makefile
|
||||||
# These definitions are for the top level
|
# These definitions are for the top level
|
||||||
TARGET=wine
|
TARGET=wine
|
||||||
-LIBS=-L. -L/usr/X386/lib -lXext -lXaw -lXt -lXmu -lX11 -lm
|
-LIBS=-L. -L/usr/X386/lib -lXext -lXaw -lXt -lXmu -lX11 -lm
|
||||||
+LIBS=-L. -L/usr/X386/lib -lXext -lXaw -lXt -lXmu -lX11 -lm -li386 -lgnumalloc
|
+LIBS=-L. -L/usr/X386/lib -lXext -lXaw -lXt -lXmu -lX11 -lm -li386 -lgnumalloc -ll
|
||||||
OBJS=if1632/if1632.o controls/controls.o loader/loader.o \
|
OBJS=if1632/if1632.o controls/controls.o loader/loader.o \
|
||||||
memory/memory.o misc/misc.o objects/objects.o windows/windows.o
|
memory/memory.o misc/misc.o objects/objects.o windows/windows.o
|
||||||
SUBDIRS=if1632 controls loader memory misc objects windows
|
SUBDIRS=if1632 controls loader memory misc objects windows
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
#include "../Wine.tmpl"
|
||||||
|
|
||||||
|
MODULE = controls
|
||||||
|
|
||||||
|
SRCS = \
|
||||||
|
menu.c \
|
||||||
|
widgets.c \
|
||||||
|
button.c \
|
||||||
|
scroll.c \
|
||||||
|
listbox.c \
|
||||||
|
combo.c \
|
||||||
|
static.c \
|
||||||
|
SmeMenuButto.c \
|
||||||
|
WinLabel.c \
|
||||||
|
WinCommand.c \
|
||||||
|
WinMenuButto.c
|
||||||
|
|
||||||
|
OBJS = \
|
||||||
|
menu.o \
|
||||||
|
widgets.o \
|
||||||
|
button.o \
|
||||||
|
scroll.o \
|
||||||
|
listbox.o \
|
||||||
|
combo.o \
|
||||||
|
static.o \
|
||||||
|
SmeMenuButto.o \
|
||||||
|
WinLabel.o \
|
||||||
|
WinCommand.o \
|
||||||
|
WinMenuButto.o
|
||||||
|
|
||||||
|
WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
|
||||||
|
DependTarget()
|
||||||
|
CleanTarget()
|
||||||
|
|
||||||
|
includes::
|
||||||
|
|
||||||
|
install::
|
106
controls/combo.c
106
controls/combo.c
|
@ -17,60 +17,24 @@ static char Copyright[] = "Copyright Martin Ayotte, 1993";
|
||||||
#include "combo.h"
|
#include "combo.h"
|
||||||
#include "heap.h"
|
#include "heap.h"
|
||||||
#include "win.h"
|
#include "win.h"
|
||||||
#include "dirent.h"
|
#include <sys/types.h>
|
||||||
|
#include <dirent.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
LPHEADCOMBO ComboGetStorageHeader(HWND hwnd);
|
LPHEADCOMBO ComboGetStorageHeader(HWND hwnd);
|
||||||
int CreateComboStruct(HWND hwnd);
|
int CreateComboStruct(HWND hwnd);
|
||||||
|
|
||||||
|
|
||||||
void COMBOBOX_CreateComboBox(LPSTR className, LPSTR comboLabel, HWND hwnd)
|
|
||||||
{
|
|
||||||
WND *wndPtr = WIN_FindWndPtr(hwnd);
|
|
||||||
WND *parentPtr = WIN_FindWndPtr(wndPtr->hwndParent);
|
|
||||||
DWORD style;
|
|
||||||
char widgetName[15];
|
|
||||||
|
|
||||||
#ifdef DEBUG_COMBO
|
|
||||||
printf("combo: label = %s, x = %d, y = %d\n", comboLabel,
|
|
||||||
wndPtr->rectClient.left, wndPtr->rectClient.top);
|
|
||||||
printf(" width = %d, height = %d\n",
|
|
||||||
wndPtr->rectClient.right - wndPtr->rectClient.left,
|
|
||||||
wndPtr->rectClient.bottom - wndPtr->rectClient.top);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!wndPtr)
|
|
||||||
return;
|
|
||||||
|
|
||||||
style = wndPtr->dwStyle & 0x0000FFFF;
|
|
||||||
/*
|
|
||||||
if ((style & LBS_NOTIFY) == LBS_NOTIFY)
|
|
||||||
*/
|
|
||||||
sprintf(widgetName, "%s%d", className, wndPtr->wIDmenu);
|
|
||||||
wndPtr->winWidget = XtVaCreateManagedWidget(widgetName,
|
|
||||||
compositeWidgetClass,
|
|
||||||
parentPtr->winWidget,
|
|
||||||
XtNx, wndPtr->rectClient.left,
|
|
||||||
XtNy, wndPtr->rectClient.top,
|
|
||||||
XtNwidth, wndPtr->rectClient.right -
|
|
||||||
wndPtr->rectClient.left,
|
|
||||||
XtNheight, 16,
|
|
||||||
NULL );
|
|
||||||
GlobalUnlock(hwnd);
|
|
||||||
GlobalUnlock(wndPtr->hwndParent);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* WIDGETS_ComboWndProc
|
* ComboWndProc
|
||||||
*/
|
*/
|
||||||
LONG COMBOBOX_ComboBoxWndProc( HWND hwnd, WORD message,
|
LONG ComboBoxWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam )
|
||||||
WORD wParam, LONG lParam )
|
|
||||||
{
|
{
|
||||||
WORD wRet;
|
WORD wRet;
|
||||||
RECT rect;
|
RECT rect;
|
||||||
int y;
|
int y, count;
|
||||||
int width, height;
|
int width, height;
|
||||||
|
int AltState;
|
||||||
WND *wndPtr;
|
WND *wndPtr;
|
||||||
LPHEADCOMBO lphc;
|
LPHEADCOMBO lphc;
|
||||||
char str[128];
|
char str[128];
|
||||||
|
@ -106,17 +70,20 @@ LONG COMBOBOX_ComboBoxWndProc( HWND hwnd, WORD message,
|
||||||
case WM_DESTROY:
|
case WM_DESTROY:
|
||||||
lphc = ComboGetStorageHeader(hwnd);
|
lphc = ComboGetStorageHeader(hwnd);
|
||||||
if (lphc == 0) return 0;
|
if (lphc == 0) return 0;
|
||||||
|
/*
|
||||||
DestroyWindow(lphc->hWndDrop);
|
DestroyWindow(lphc->hWndDrop);
|
||||||
DestroyWindow(lphc->hWndEdit);
|
DestroyWindow(lphc->hWndEdit);
|
||||||
/*
|
|
||||||
DestroyWindow(lphc->hWndLBox);
|
|
||||||
*/
|
*/
|
||||||
|
DestroyWindow(lphc->hWndLBox);
|
||||||
free(lphc);
|
free(lphc);
|
||||||
|
/*
|
||||||
*((LPHEADCOMBO *)&wndPtr->wExtra[1]) = 0;
|
*((LPHEADCOMBO *)&wndPtr->wExtra[1]) = 0;
|
||||||
|
printf("Combo WM_DESTROY after clearing wExtra !\n");
|
||||||
|
*/
|
||||||
#ifdef DEBUG_COMBO
|
#ifdef DEBUG_COMBO
|
||||||
printf("Combo WM_DESTROY %lX !\n", lphc);
|
printf("Combo WM_DESTROY %lX !\n", lphc);
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return DefWindowProc( hwnd, message, wParam, lParam );
|
||||||
|
|
||||||
case WM_COMMAND:
|
case WM_COMMAND:
|
||||||
wndPtr = WIN_FindWndPtr(hwnd);
|
wndPtr = WIN_FindWndPtr(hwnd);
|
||||||
|
@ -169,9 +136,56 @@ LONG COMBOBOX_ComboBoxWndProc( HWND hwnd, WORD message,
|
||||||
break;
|
break;
|
||||||
case WM_LBUTTONDOWN:
|
case WM_LBUTTONDOWN:
|
||||||
printf("Combo WM_LBUTTONDOWN wParam=%x lParam=%lX !\n", wParam, lParam);
|
printf("Combo WM_LBUTTONDOWN wParam=%x lParam=%lX !\n", wParam, lParam);
|
||||||
|
wndPtr = WIN_FindWndPtr(hwnd);
|
||||||
|
lphc = ComboGetStorageHeader(hwnd);
|
||||||
|
lphc->dwState = lphc->dwState ^ CB_SHOWDROPDOWN;
|
||||||
|
if ((lphc->dwState & CB_SHOWDROPDOWN) == CB_SHOWDROPDOWN)
|
||||||
|
ShowWindow(lphc->hWndLBox, SW_SHOW);
|
||||||
break;
|
break;
|
||||||
case WM_KEYDOWN:
|
case WM_KEYDOWN:
|
||||||
printf("Combo WM_KEYDOWN wParam %X!\n", wParam);
|
wndPtr = WIN_FindWndPtr(hwnd);
|
||||||
|
lphc = ComboGetStorageHeader(hwnd);
|
||||||
|
y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
|
||||||
|
count = SendMessage(lphc->hWndLBox, LB_GETCOUNT, 0, 0L);
|
||||||
|
printf("COMBOBOX // GetKeyState(VK_MENU)=%d\n", GetKeyState(VK_MENU));
|
||||||
|
if (GetKeyState(VK_MENU) < 0) {
|
||||||
|
lphc->dwState = lphc->dwState ^ CB_SHOWDROPDOWN;
|
||||||
|
if ((lphc->dwState & CB_SHOWDROPDOWN) == CB_SHOWDROPDOWN) {
|
||||||
|
ShowWindow(lphc->hWndLBox, SW_SHOW);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ShowWindow(lphc->hWndLBox, SW_HIDE);
|
||||||
|
y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
|
||||||
|
if (y != LB_ERR) {
|
||||||
|
SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str);
|
||||||
|
SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch(wParam) {
|
||||||
|
case VK_HOME:
|
||||||
|
y = 0;
|
||||||
|
break;
|
||||||
|
case VK_END:
|
||||||
|
y = count - 1;
|
||||||
|
break;
|
||||||
|
case VK_UP:
|
||||||
|
y--;
|
||||||
|
break;
|
||||||
|
case VK_DOWN:
|
||||||
|
y++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (y < 0) y = 0;
|
||||||
|
if (y >= count) y = count - 1;
|
||||||
|
SendMessage(lphc->hWndLBox, LB_SETCURSEL, y, 0L);
|
||||||
|
SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str);
|
||||||
|
SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
|
||||||
|
SendMessage(GetParent(hwnd), WM_COMMAND, wndPtr->wIDmenu,
|
||||||
|
MAKELONG(hwnd, CBN_SELCHANGE));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case WM_CTLCOLOR:
|
case WM_CTLCOLOR:
|
||||||
return(SendMessage(GetParent(hwnd), WM_CTLCOLOR, wParam, lParam));
|
return(SendMessage(GetParent(hwnd), WM_CTLCOLOR, wParam, lParam));
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
616
controls/menu.c
616
controls/menu.c
|
@ -1,6 +1,8 @@
|
||||||
static char RCSId[] = "$Id$";
|
static char RCSId[] = "$Id$";
|
||||||
static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
|
static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
|
||||||
|
|
||||||
|
#define DEBUG_MENU
|
||||||
|
|
||||||
#include <X11/Intrinsic.h>
|
#include <X11/Intrinsic.h>
|
||||||
#include <X11/StringDefs.h>
|
#include <X11/StringDefs.h>
|
||||||
#include <X11/Xaw/SmeBSB.h>
|
#include <X11/Xaw/SmeBSB.h>
|
||||||
|
@ -22,7 +24,306 @@ static int lastLevel;
|
||||||
static int menuId = 0;
|
static int menuId = 0;
|
||||||
static Pixmap checkBitmap = XtUnspecifiedPixmap;
|
static Pixmap checkBitmap = XtUnspecifiedPixmap;
|
||||||
static Pixmap nocheckBitmap = XtUnspecifiedPixmap;
|
static Pixmap nocheckBitmap = XtUnspecifiedPixmap;
|
||||||
|
|
||||||
|
LPPOPUPMENU PopupMenuGetStorageHeader(HWND hwnd);
|
||||||
|
LPPOPUPMENU PopupMenuGetWindowAndStorage(HWND hwnd, WND **wndPtr);
|
||||||
|
void StdDrawPopupMenu(HWND hwnd);
|
||||||
|
LPMENUITEM PopupMenuFindItem(HWND hwnd, int x, int y, WORD *lpRet);
|
||||||
|
LPMENUITEM GetMenuItemPtr(LPPOPUPMENU menu, WORD nPos);
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* PopupMenuWndProc
|
||||||
|
*/
|
||||||
|
LONG PopupMenuWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam )
|
||||||
|
{
|
||||||
|
CREATESTRUCT *createStruct;
|
||||||
|
WORD wRet;
|
||||||
|
short x, y;
|
||||||
|
WND *wndPtr;
|
||||||
|
LPPOPUPMENU lppop;
|
||||||
|
LPMENUITEM lpitem, lpitem2;
|
||||||
|
HMENU hSubMenu;
|
||||||
|
RECT rect;
|
||||||
|
HDC hDC;
|
||||||
|
switch(message)
|
||||||
|
{
|
||||||
|
case WM_CREATE:
|
||||||
|
#ifdef DEBUG_MENU
|
||||||
|
printf("PopupMenu WM_CREATE lParam=%08X !\n", lParam);
|
||||||
|
#endif
|
||||||
|
createStruct = (CREATESTRUCT *)lParam;
|
||||||
|
lppop = (LPPOPUPMENU)createStruct->lpCreateParams;
|
||||||
|
if (lppop == 0) break;
|
||||||
|
wndPtr = WIN_FindWndPtr(hwnd);
|
||||||
|
*((LPPOPUPMENU *)&wndPtr->wExtra[1]) = lppop;
|
||||||
|
#ifdef DEBUG_MENU
|
||||||
|
printf("PopupMenu WM_CREATE lppop=%08X !\n", lppop);
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
case WM_DESTROY:
|
||||||
|
lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
|
||||||
|
#ifdef DEBUG_MENU
|
||||||
|
printf("PopupMenu WM_DESTROY %lX !\n", lppop);
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
case WM_LBUTTONDOWN:
|
||||||
|
lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
|
||||||
|
SetCapture(hwnd);
|
||||||
|
lpitem = PopupMenuFindItem(hwnd, LOWORD(lParam), HIWORD(lParam), &wRet);
|
||||||
|
printf("PopupMenu WM_LBUTTONDOWN wRet=%d lpitem=%08X !\n", wRet, lpitem);
|
||||||
|
if (lpitem != NULL) {
|
||||||
|
lppop->FocusedItem = wRet;
|
||||||
|
if (((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
|
||||||
|
((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
|
||||||
|
hDC = GetDC(hwnd);
|
||||||
|
InvertRect(hDC, &lpitem->rect);
|
||||||
|
ReleaseDC(hwnd, hDC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WM_LBUTTONUP:
|
||||||
|
lppop = PopupMenuGetStorageHeader(hwnd);
|
||||||
|
ReleaseCapture();
|
||||||
|
lpitem = PopupMenuFindItem(hwnd, LOWORD(lParam), HIWORD(lParam), &wRet);
|
||||||
|
printf("PopupMenu WM_LBUTTONUP wRet=%d lpitem=%08X !\n", wRet, lpitem);
|
||||||
|
if (lpitem != NULL) {
|
||||||
|
if (lppop->FocusedItem != (WORD)-1) {
|
||||||
|
lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
|
||||||
|
if (((lpitem2->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
|
||||||
|
((lpitem2->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
|
||||||
|
hDC = GetDC(hwnd);
|
||||||
|
InvertRect(hDC, &lpitem2->rect);
|
||||||
|
ReleaseDC(hwnd, hDC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
|
||||||
|
hSubMenu = (HMENU)lpitem->item_id;
|
||||||
|
printf("ShowSubmenu hSubMenu=%04X !\n", hSubMenu);
|
||||||
|
GetClientRect(hwnd, &rect);
|
||||||
|
x = rect.right;
|
||||||
|
GetWindowRect(hwnd, &rect);
|
||||||
|
x += rect.left;
|
||||||
|
TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON,
|
||||||
|
x, rect.top + HIWORD(lParam),
|
||||||
|
0, lppop->ownerWnd, (LPRECT)NULL);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
|
||||||
|
((lpitem->item_flags & MF_POPUP) != MF_POPUP)) {
|
||||||
|
SendMessage(lppop->ownerWnd, WM_COMMAND, lpitem->item_id, 0L);
|
||||||
|
printf("PopupMenu // SendMessage WM_COMMAND wParam=%d !\n",
|
||||||
|
lpitem->item_id);
|
||||||
|
ShowWindow(lppop->hWnd, SW_HIDE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WM_MOUSEMOVE:
|
||||||
|
if ((wParam & MK_LBUTTON) != 0) {
|
||||||
|
lppop = PopupMenuGetStorageHeader(hwnd);
|
||||||
|
lpitem = PopupMenuFindItem(hwnd, LOWORD(lParam), HIWORD(lParam), &wRet);
|
||||||
|
if ((lpitem != NULL) && (lppop->FocusedItem != wRet)) {
|
||||||
|
lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
|
||||||
|
hDC = GetDC(hwnd);
|
||||||
|
if (((lpitem2->item_flags & MF_POPUP) == MF_POPUP) ||
|
||||||
|
((lpitem2->item_flags & MF_STRING) == MF_STRING)) {
|
||||||
|
InvertRect(hDC, &lpitem2->rect);
|
||||||
|
}
|
||||||
|
lppop->FocusedItem = wRet;
|
||||||
|
printf("PopupMenu WM_MOUSEMOVE wRet=%d lpitem=%08X !\n", wRet, lpitem);
|
||||||
|
InvertRect(hDC, &lpitem->rect);
|
||||||
|
ReleaseDC(hwnd, hDC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_KEYDOWN:
|
||||||
|
case WM_KEYUP:
|
||||||
|
case WM_CHAR:
|
||||||
|
lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
|
||||||
|
return(SendMessage(wndPtr->hwndParent, message, wParam, lParam));
|
||||||
|
|
||||||
|
case WM_PAINT:
|
||||||
|
printf("PopupMenu WM_PAINT !\n");
|
||||||
|
StdDrawPopupMenu(hwnd);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return DefWindowProc( hwnd, message, wParam, lParam );
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
LPPOPUPMENU PopupMenuGetWindowAndStorage(HWND hwnd, WND **wndPtr)
|
||||||
|
{
|
||||||
|
WND *Ptr;
|
||||||
|
LPPOPUPMENU lppop;
|
||||||
|
*(wndPtr) = Ptr = WIN_FindWndPtr(hwnd);
|
||||||
|
if (Ptr == 0) {
|
||||||
|
printf("Bad Window handle on PopupMenu !\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
lppop = *((LPPOPUPMENU *)&Ptr->wExtra[1]);
|
||||||
|
return lppop;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LPPOPUPMENU PopupMenuGetStorageHeader(HWND hwnd)
|
||||||
|
{
|
||||||
|
WND *Ptr;
|
||||||
|
LPPOPUPMENU lppop;
|
||||||
|
Ptr = WIN_FindWndPtr(hwnd);
|
||||||
|
if (Ptr == 0) {
|
||||||
|
printf("Bad Window handle on PopupMenu !\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
lppop = *((LPPOPUPMENU *)&Ptr->wExtra[1]);
|
||||||
|
return lppop;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void StdDrawPopupMenu(HWND hwnd)
|
||||||
|
{
|
||||||
|
WND *wndPtr;
|
||||||
|
LPPOPUPMENU lppop;
|
||||||
|
LPMENUITEM lpitem;
|
||||||
|
PAINTSTRUCT ps;
|
||||||
|
HBRUSH hBrush;
|
||||||
|
HPEN hOldPen;
|
||||||
|
HWND hWndParent;
|
||||||
|
HDC hDC, hMemDC;
|
||||||
|
RECT rect, rect2, rect3;
|
||||||
|
HBITMAP hBitMap;
|
||||||
|
BITMAP bm;
|
||||||
|
UINT i;
|
||||||
|
hDC = BeginPaint( hwnd, &ps );
|
||||||
|
if (!IsWindowVisible(hwnd)) {
|
||||||
|
EndPaint( hwnd, &ps );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
|
||||||
|
if (lppop == NULL) goto EndOfPaint;
|
||||||
|
hBrush = SendMessage(lppop->ownerWnd, WM_CTLCOLOR, (WORD)hDC,
|
||||||
|
MAKELONG(hwnd, CTLCOLOR_LISTBOX));
|
||||||
|
if (hBrush == (HBRUSH)NULL) hBrush = GetStockObject(WHITE_BRUSH);
|
||||||
|
GetClientRect(hwnd, &rect);
|
||||||
|
GetClientRect(hwnd, &rect2);
|
||||||
|
FillRect(hDC, &rect, hBrush);
|
||||||
|
if (lppop->nItems == 0) goto EndOfPaint;
|
||||||
|
lpitem = lppop->firstItem->next;
|
||||||
|
if (lpitem == NULL) goto EndOfPaint;
|
||||||
|
for(i = 0; i < lppop->nItems; i++) {
|
||||||
|
if ((lpitem->item_flags & MF_SEPARATOR) == MF_SEPARATOR) {
|
||||||
|
rect2.bottom = rect2.top + 3;
|
||||||
|
CopyRect(&lpitem->rect, &rect2);
|
||||||
|
hOldPen = SelectObject(hDC, GetStockObject(BLACK_PEN));
|
||||||
|
MoveTo(hDC, rect2.left, rect2.top + 1);
|
||||||
|
LineTo(hDC, rect2.right, rect2.top + 1);
|
||||||
|
SelectObject(hDC, hOldPen);
|
||||||
|
rect2.top += 3;
|
||||||
|
}
|
||||||
|
if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
|
||||||
|
hBitMap = (HBITMAP)LOWORD(lpitem->item_text);
|
||||||
|
rect2.bottom = rect2.top + bm.bmHeight;
|
||||||
|
CopyRect(&lpitem->rect, &rect2);
|
||||||
|
hMemDC = CreateCompatibleDC(hDC);
|
||||||
|
SelectObject(hMemDC, hBitMap);
|
||||||
|
GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
|
||||||
|
BitBlt(hDC, rect2.left, rect2.top,
|
||||||
|
bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
|
||||||
|
DeleteDC(hMemDC);
|
||||||
|
rect2.top += bm.bmHeight;
|
||||||
|
}
|
||||||
|
if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
|
||||||
|
((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
|
||||||
|
((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
|
||||||
|
rect2.bottom = rect2.top + 15;
|
||||||
|
CopyRect(&lpitem->rect, &rect2);
|
||||||
|
TextOut(hDC, rect2.left + 5, rect2.top + 2,
|
||||||
|
(char *)lpitem->item_text, strlen((char *)lpitem->item_text));
|
||||||
|
rect2.top += 15;
|
||||||
|
}
|
||||||
|
if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) {
|
||||||
|
CopyRect(&rect3, &rect2);
|
||||||
|
rect3.left = rect3.right - rect3.bottom + rect3.top;
|
||||||
|
InvertRect(hDC, &rect3);
|
||||||
|
}
|
||||||
|
if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
|
||||||
|
CopyRect(&rect3, &rect2);
|
||||||
|
rect3.left = rect3.right - rect3.bottom + rect3.top;
|
||||||
|
FillRect(hDC, &rect3, GetStockObject(BLACK_BRUSH));
|
||||||
|
}
|
||||||
|
if (lpitem->next == NULL) goto EndOfPaint;
|
||||||
|
lpitem = (LPMENUITEM)lpitem->next;
|
||||||
|
}
|
||||||
|
EndOfPaint:
|
||||||
|
EndPaint( hwnd, &ps );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
LPMENUITEM PopupMenuFindItem(HWND hwnd, int x, int y, WORD *lpRet)
|
||||||
|
{
|
||||||
|
WND *wndPtr;
|
||||||
|
LPPOPUPMENU lppop;
|
||||||
|
LPMENUITEM lpitem;
|
||||||
|
RECT rect, rect2;
|
||||||
|
HBITMAP hBitMap;
|
||||||
|
BITMAP bm;
|
||||||
|
UINT i;
|
||||||
|
lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
|
||||||
|
if (lppop == NULL) return NULL;
|
||||||
|
GetClientRect(hwnd, &rect);
|
||||||
|
if (lppop->nItems == 0) return NULL;
|
||||||
|
lpitem = lppop->firstItem->next;
|
||||||
|
if (lpitem == NULL) return NULL;
|
||||||
|
for(i = 0; i < lppop->nItems; i++) {
|
||||||
|
if (y < rect2.top) return NULL;
|
||||||
|
if ((lpitem->item_flags & MF_SEPARATOR) == MF_SEPARATOR) {
|
||||||
|
rect2.bottom = rect2.top + 3;
|
||||||
|
rect2.top += 3;
|
||||||
|
}
|
||||||
|
if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
|
||||||
|
hBitMap = (HBITMAP)LOWORD(lpitem->item_text);
|
||||||
|
GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
|
||||||
|
rect2.bottom = rect2.top + bm.bmHeight;
|
||||||
|
rect2.top += bm.bmHeight;
|
||||||
|
}
|
||||||
|
if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
|
||||||
|
((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
|
||||||
|
((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
|
||||||
|
rect2.bottom = rect2.top + 15;
|
||||||
|
rect2.top += 15;
|
||||||
|
}
|
||||||
|
if (y < rect2.bottom) {
|
||||||
|
if (lpRet != NULL) *lpRet = i;
|
||||||
|
return lpitem;
|
||||||
|
}
|
||||||
|
if (lpitem->next == NULL) return NULL;
|
||||||
|
lpitem = (LPMENUITEM)lpitem->next;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
LPMENUITEM GetMenuItemPtr(LPPOPUPMENU menu, WORD nPos)
|
||||||
|
{
|
||||||
|
LPMENUITEM lpitem;
|
||||||
|
int i;
|
||||||
|
if (menu == NULL) return NULL;
|
||||||
|
lpitem = menu->firstItem;
|
||||||
|
for (i = 0; i < menu->nItems; i++) {
|
||||||
|
if (lpitem->next == NULL) return NULL;
|
||||||
|
lpitem = (LPMENUITEM)lpitem->next;
|
||||||
|
if (i == nPos) return(lpitem);
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* MENU_CheckWidget
|
* MENU_CheckWidget
|
||||||
*/
|
*/
|
||||||
|
@ -565,3 +866,316 @@ LoadMenu(HINSTANCE instance, char *menu_name)
|
||||||
|
|
||||||
return GlobalHandleFromPointer(menu->firstItem);
|
return GlobalHandleFromPointer(menu->firstItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* CheckMenuItem [USER.154]
|
||||||
|
*/
|
||||||
|
BOOL CheckMenuItem(HMENU hMenu, WORD wItemID, WORD wFlags)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* EnableMenuItem [USER.155]
|
||||||
|
*/
|
||||||
|
BOOL EnableMenuItem(HMENU hMenu, WORD wItemID, WORD wFlags)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* InsertMenu [USER.410]
|
||||||
|
*/
|
||||||
|
BOOL InsertMenu(HMENU hMenu, WORD nPos, WORD wFlags, WORD wItemID, LPSTR lpNewItem)
|
||||||
|
{
|
||||||
|
WND *wndPtr;
|
||||||
|
LPPOPUPMENU menu;
|
||||||
|
HANDLE hNewItem;
|
||||||
|
LPMENUITEM lpitem, lpitem2;
|
||||||
|
int i;
|
||||||
|
#ifdef DEBUG_MENU
|
||||||
|
printf("InsertMenu (%04X, %04X, %04X, %04X, %08X) !\n",
|
||||||
|
hMenu, nPos, wFlags, wItemID, lpNewItem);
|
||||||
|
#endif
|
||||||
|
menu = (LPPOPUPMENU) GlobalLock(hMenu);
|
||||||
|
if (menu == NULL) return FALSE;
|
||||||
|
lpitem = menu->firstItem;
|
||||||
|
for (i = 0; i < menu->nItems; i++) {
|
||||||
|
if (lpitem->next == NULL) break;
|
||||||
|
lpitem = (LPMENUITEM)lpitem->next;
|
||||||
|
printf("InsertMenu // during loop items !\n");
|
||||||
|
}
|
||||||
|
printf("InsertMenu // after loop items !\n");
|
||||||
|
hNewItem = GlobalAlloc(GMEM_MOVEABLE, sizeof(MENUITEM));
|
||||||
|
if (hNewItem == 0) return FALSE;
|
||||||
|
lpitem2 = (LPMENUITEM)GlobalLock(hNewItem);
|
||||||
|
if (lpitem2 == 0) {
|
||||||
|
GlobalFree(hNewItem);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
lpitem2->item_flags = wFlags;
|
||||||
|
lpitem2->item_id = wItemID;
|
||||||
|
if ((wFlags & MF_STRING) == MF_STRING) {
|
||||||
|
lpitem2->item_text = lpNewItem;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
lpitem2->item_text = lpNewItem;
|
||||||
|
lpitem2->prev = lpitem;
|
||||||
|
if (lpitem->next != NULL)
|
||||||
|
lpitem2->next = lpitem->next;
|
||||||
|
else
|
||||||
|
lpitem2->next = NULL;
|
||||||
|
lpitem->next = lpitem2;
|
||||||
|
lpitem2->child = NULL;
|
||||||
|
lpitem2->parent = NULL;
|
||||||
|
lpitem2->w = NULL;
|
||||||
|
lpitem2->menu_w = NULL;
|
||||||
|
menu->nItems++;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* AppendMenu [USER.411]
|
||||||
|
*/
|
||||||
|
BOOL AppendMenu(HMENU hMenu, WORD wFlags, WORD wItemID, LPSTR lpNewItem)
|
||||||
|
{
|
||||||
|
WND *wndPtr;
|
||||||
|
LPPOPUPMENU menu;
|
||||||
|
HANDLE hNewItem;
|
||||||
|
LPMENUITEM lpitem, lpitem2;
|
||||||
|
#ifdef DEBUG_MENU
|
||||||
|
printf("AppendMenu (%04X, %04X, %04X, %08X) !\n",
|
||||||
|
hMenu, wFlags, wItemID, lpNewItem);
|
||||||
|
#endif
|
||||||
|
menu = (LPPOPUPMENU) GlobalLock(hMenu);
|
||||||
|
if (menu == NULL) return FALSE;
|
||||||
|
lpitem = menu->firstItem;
|
||||||
|
while (lpitem->next != NULL) {
|
||||||
|
lpitem = (LPMENUITEM)lpitem->next;
|
||||||
|
printf("AppendMenu // during loop items !\n");
|
||||||
|
}
|
||||||
|
printf("AppendMenu // after loop items !\n");
|
||||||
|
hNewItem = GlobalAlloc(GMEM_MOVEABLE, sizeof(MENUITEM));
|
||||||
|
if (hNewItem == 0) return FALSE;
|
||||||
|
lpitem2 = (LPMENUITEM)GlobalLock(hNewItem);
|
||||||
|
if (lpitem2 == 0) {
|
||||||
|
GlobalFree(hNewItem);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
lpitem2->item_flags = wFlags;
|
||||||
|
lpitem2->item_id = wItemID;
|
||||||
|
if ((wFlags & MF_STRING) == MF_STRING) {
|
||||||
|
lpitem2->item_text = lpNewItem;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
lpitem2->item_text = lpNewItem;
|
||||||
|
lpitem->next = lpitem2;
|
||||||
|
lpitem2->prev = lpitem;
|
||||||
|
lpitem2->next = NULL;
|
||||||
|
lpitem2->child = NULL;
|
||||||
|
lpitem2->parent = NULL;
|
||||||
|
lpitem2->w = NULL;
|
||||||
|
lpitem2->menu_w = NULL;
|
||||||
|
menu->nItems++;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* RemoveMenu [USER.412]
|
||||||
|
*/
|
||||||
|
BOOL RemoveMenu(HMENU hMenu, WORD nPos, WORD wFlags)
|
||||||
|
{
|
||||||
|
WND *wndPtr;
|
||||||
|
LPPOPUPMENU menu;
|
||||||
|
LPMENUITEM lpitem;
|
||||||
|
int i;
|
||||||
|
#ifdef DEBUG_MENU
|
||||||
|
printf("RemoveMenu (%04X, %04X, %04X) !\n", hMenu, nPos, wFlags);
|
||||||
|
#endif
|
||||||
|
menu = (LPPOPUPMENU) GlobalLock(hMenu);
|
||||||
|
if (menu == NULL) return FALSE;
|
||||||
|
lpitem = menu->firstItem;
|
||||||
|
for (i = 0; i < menu->nItems; i++) {
|
||||||
|
if (lpitem->next == NULL) break;
|
||||||
|
lpitem = (LPMENUITEM)lpitem->next;
|
||||||
|
if (i == nPos) {
|
||||||
|
lpitem->prev->next = lpitem->next;
|
||||||
|
lpitem->next->prev = lpitem->prev;
|
||||||
|
GlobalFree(HIWORD(lpitem));
|
||||||
|
return(TRUE);
|
||||||
|
}
|
||||||
|
printf("RemoveMenu // during loop items !\n");
|
||||||
|
}
|
||||||
|
printf("RemoveMenu // after loop items !\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* DeleteMenu [USER.413]
|
||||||
|
*/
|
||||||
|
BOOL DeleteMenu(HMENU hMenu, WORD nPos, WORD wFlags)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_MENU
|
||||||
|
printf("DeleteMenu (%04X, %04X, %04X) !\n", hMenu, nPos, wFlags);
|
||||||
|
#endif
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* ModifyMenu [USER.414]
|
||||||
|
*/
|
||||||
|
BOOL ModifyMenu(HMENU hMenu, WORD nPos, WORD wFlags, WORD wItemID, LPSTR lpNewItem)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_MENU
|
||||||
|
printf("ModifyMenu (%04X, %04X, %04X, %04X, %08X) !\n",
|
||||||
|
hMenu, nPos, wFlags, wItemID, lpNewItem);
|
||||||
|
#endif
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* CreatePopupMenu [USER.415]
|
||||||
|
*/
|
||||||
|
HMENU CreatePopupMenu()
|
||||||
|
{
|
||||||
|
HANDLE hItem;
|
||||||
|
HMENU hMenu;
|
||||||
|
LPPOPUPMENU menu;
|
||||||
|
#ifdef DEBUG_MENU
|
||||||
|
printf("CreatePopupMenu !\n");
|
||||||
|
#endif
|
||||||
|
hMenu = GlobalAlloc(GMEM_MOVEABLE, sizeof(POPUPMENU));
|
||||||
|
menu = (LPPOPUPMENU) GlobalLock(hMenu);
|
||||||
|
if (menu == NULL) {
|
||||||
|
GlobalFree(hMenu);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
hItem = GlobalAlloc(GMEM_MOVEABLE, sizeof(MENUITEM));
|
||||||
|
if (hItem == 0) {
|
||||||
|
GlobalFree(hMenu);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
menu->nItems = 0;
|
||||||
|
menu->firstItem = (LPMENUITEM)GlobalLock(hItem);
|
||||||
|
menu->ownerWnd = 0;
|
||||||
|
menu->hWnd = 0;
|
||||||
|
|
||||||
|
menu->firstItem->next = NULL;
|
||||||
|
menu->firstItem->prev = NULL;
|
||||||
|
menu->firstItem->child = NULL;
|
||||||
|
menu->firstItem->parent = NULL;
|
||||||
|
menu->firstItem->item_flags = 0;
|
||||||
|
menu->firstItem->item_id = 0;
|
||||||
|
menu->firstItem->item_text = NULL;
|
||||||
|
menu->firstItem->w = NULL;
|
||||||
|
menu->firstItem->menu_w = NULL;
|
||||||
|
return hMenu;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* TrackPopupMenu [USER.414]
|
||||||
|
*/
|
||||||
|
BOOL TrackPopupMenu(HMENU hMenu, WORD wFlags, short x, short y,
|
||||||
|
short nReserved, HWND hWnd, LPRECT lpRect)
|
||||||
|
{
|
||||||
|
WND *wndPtr;
|
||||||
|
LPPOPUPMENU menu;
|
||||||
|
#ifdef DEBUG_MENU
|
||||||
|
printf("TrackPopupMenu (%04X, %04X, %d, %d, %04X, %04X, %08X) !\n",
|
||||||
|
hMenu, wFlags, x, y, nReserved, hWnd, lpRect);
|
||||||
|
#endif
|
||||||
|
menu = (LPPOPUPMENU) GlobalLock(hMenu);
|
||||||
|
if (menu == NULL) return FALSE;
|
||||||
|
wndPtr = WIN_FindWndPtr(hWnd);
|
||||||
|
menu->ownerWnd = hWnd;
|
||||||
|
if (menu->hWnd == NULL) {
|
||||||
|
menu->hWnd = CreateWindow("POPUPMENU", "", WS_CHILD | WS_VISIBLE,
|
||||||
|
x, y, 100, 150, hWnd, 0, wndPtr->hInstance, (LPSTR)menu);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ShowWindow(menu->hWnd, SW_SHOW);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* CreateMenu [USER.151]
|
||||||
|
*/
|
||||||
|
HMENU CreateMenu()
|
||||||
|
{
|
||||||
|
HANDLE hItem;
|
||||||
|
HMENU hMenu;
|
||||||
|
LPMENUBAR menu;
|
||||||
|
#ifdef DEBUG_MENU
|
||||||
|
printf("CreateMenu !\n");
|
||||||
|
#endif
|
||||||
|
hMenu = GlobalAlloc(GMEM_MOVEABLE, sizeof(MENUBAR));
|
||||||
|
menu = (LPMENUBAR) GlobalLock(hMenu);
|
||||||
|
if (menu == NULL) {
|
||||||
|
GlobalFree(hMenu);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
hItem = GlobalAlloc(GMEM_MOVEABLE, sizeof(MENUITEM));
|
||||||
|
if (hItem == 0) {
|
||||||
|
GlobalFree(hMenu);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
menu->menuDescription = 0;
|
||||||
|
menu->nItems = 0;
|
||||||
|
menu->parentWidget = NULL;
|
||||||
|
menu->firstItem = (LPMENUITEM) GlobalLock(hItem);
|
||||||
|
menu->ownerWnd = 0;
|
||||||
|
menu->menuBarWidget = NULL;
|
||||||
|
|
||||||
|
menu->firstItem->next = NULL;
|
||||||
|
menu->firstItem->prev = NULL;
|
||||||
|
menu->firstItem->child = NULL;
|
||||||
|
menu->firstItem->parent = NULL;
|
||||||
|
menu->firstItem->item_flags = 0;
|
||||||
|
menu->firstItem->item_id = 0;
|
||||||
|
menu->firstItem->item_text = NULL;
|
||||||
|
menu->firstItem->w = NULL;
|
||||||
|
menu->firstItem->menu_w = NULL;
|
||||||
|
return hMenu;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* DestroyMenu [USER.152]
|
||||||
|
*/
|
||||||
|
BOOL DestroyMenu(HMENU hMenu)
|
||||||
|
{
|
||||||
|
LPPOPUPMENU lppop;
|
||||||
|
LPMENUITEM lpitem, lpitem2;
|
||||||
|
#ifdef DEBUG_MENU
|
||||||
|
printf("DestroyMenu (%04X) !\n", hMenu);
|
||||||
|
#endif
|
||||||
|
if (hMenu == 0) return FALSE;
|
||||||
|
lppop = (LPPOPUPMENU) GlobalLock(hMenu);
|
||||||
|
if (lppop == NULL) return FALSE;
|
||||||
|
if (lppop->hWnd) DestroyWindow (lppop->hWnd);
|
||||||
|
lpitem = lppop->firstItem;
|
||||||
|
while (lpitem->next != NULL) {
|
||||||
|
#ifdef DEBUG_MENU
|
||||||
|
printf("DestroyMenu (%04X) // during loop items !\n", hMenu);
|
||||||
|
#endif
|
||||||
|
if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
|
||||||
|
DestroyMenu((HMENU)lpitem->item_id);
|
||||||
|
}
|
||||||
|
lpitem = (LPMENUITEM)lpitem->next;
|
||||||
|
}
|
||||||
|
GlobalFree(hMenu);
|
||||||
|
#ifdef DEBUG_MENU
|
||||||
|
printf("DestroyMenu (%04X) // End !\n", hMenu);
|
||||||
|
#endif
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,8 @@ static char Copyright[] = "Copyright Martin Ayotte, 1993";
|
||||||
#include "scroll.h"
|
#include "scroll.h"
|
||||||
#include "heap.h"
|
#include "heap.h"
|
||||||
#include "win.h"
|
#include "win.h"
|
||||||
#include "dirent.h"
|
#include <sys/types.h>
|
||||||
|
#include <dirent.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
LPHEADSCROLL ScrollBarGetWindowAndStorage(HWND hwnd, WND **wndPtr);
|
LPHEADSCROLL ScrollBarGetWindowAndStorage(HWND hwnd, WND **wndPtr);
|
||||||
|
@ -26,50 +27,10 @@ void StdDrawScrollBar(HWND hwnd);
|
||||||
int CreateScrollBarStruct(HWND hwnd);
|
int CreateScrollBarStruct(HWND hwnd);
|
||||||
|
|
||||||
|
|
||||||
void SCROLLBAR_CreateScrollBar(LPSTR className, LPSTR scrollLabel, HWND hwnd)
|
|
||||||
{
|
|
||||||
WND *wndPtr = WIN_FindWndPtr(hwnd);
|
|
||||||
WND *parentPtr = WIN_FindWndPtr(wndPtr->hwndParent);
|
|
||||||
DWORD style;
|
|
||||||
char widgetName[15];
|
|
||||||
|
|
||||||
#ifdef DEBUG_SCROLLBAR
|
|
||||||
printf("scroll: label = %s, x = %d, y = %d\n", scrollLabel,
|
|
||||||
wndPtr->rectClient.left, wndPtr->rectClient.top);
|
|
||||||
printf(" width = %d, height = %d\n",
|
|
||||||
wndPtr->rectClient.right - wndPtr->rectClient.left,
|
|
||||||
wndPtr->rectClient.bottom - wndPtr->rectClient.top);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!wndPtr)
|
|
||||||
return;
|
|
||||||
|
|
||||||
style = wndPtr->dwStyle & 0x0000FFFF;
|
|
||||||
/*
|
|
||||||
if ((style & SBS_NOTIFY) == SBS_NOTIFY)
|
|
||||||
*/
|
|
||||||
sprintf(widgetName, "%s%d", className, wndPtr->wIDmenu);
|
|
||||||
wndPtr->winWidget = XtVaCreateManagedWidget(widgetName,
|
|
||||||
compositeWidgetClass,
|
|
||||||
parentPtr->winWidget,
|
|
||||||
XtNx, wndPtr->rectClient.left,
|
|
||||||
XtNy, wndPtr->rectClient.top,
|
|
||||||
XtNwidth, wndPtr->rectClient.right -
|
|
||||||
wndPtr->rectClient.left,
|
|
||||||
XtNheight, wndPtr->rectClient.bottom -
|
|
||||||
wndPtr->rectClient.top,
|
|
||||||
NULL );
|
|
||||||
GlobalUnlock(hwnd);
|
|
||||||
GlobalUnlock(wndPtr->hwndParent);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* WIDGETS_ScrollBarWndProc
|
* WIDGETS_ScrollBarWndProc
|
||||||
*/
|
*/
|
||||||
LONG SCROLLBAR_ScrollBarWndProc( HWND hwnd, WORD message,
|
LONG ScrollBarWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam )
|
||||||
WORD wParam, LONG lParam )
|
|
||||||
{
|
{
|
||||||
WORD wRet;
|
WORD wRet;
|
||||||
short x, y;
|
short x, y;
|
||||||
|
@ -169,8 +130,11 @@ LONG SCROLLBAR_ScrollBarWndProc( HWND hwnd, WORD message,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_KEYDOWN:
|
case WM_KEYDOWN:
|
||||||
printf("ScrollBar WM_KEYDOWN wParam %X !\n", wParam);
|
case WM_KEYUP:
|
||||||
break;
|
case WM_CHAR:
|
||||||
|
lphs = ScrollBarGetWindowAndStorage(hwnd, &wndPtr);
|
||||||
|
return(SendMessage(wndPtr->hwndParent, message, wParam, lParam));
|
||||||
|
|
||||||
case WM_PAINT:
|
case WM_PAINT:
|
||||||
StdDrawScrollBar(hwnd);
|
StdDrawScrollBar(hwnd);
|
||||||
break;
|
break;
|
||||||
|
@ -330,36 +294,36 @@ int CreateScrollBarStruct(HWND hwnd)
|
||||||
wndPtr->hInstance, 0L);
|
wndPtr->hInstance, 0L);
|
||||||
}
|
}
|
||||||
if (lphs->MaxPix < 1) lphs->MaxPix = 1;
|
if (lphs->MaxPix < 1) lphs->MaxPix = 1;
|
||||||
|
if (wndPtr->hCursor == (HCURSOR)NULL)
|
||||||
|
wndPtr->hCursor = LoadCursor((HINSTANCE)NULL, IDC_ARROW);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
int GetScrollPos(HWND hwnd, int nBar)
|
* GetScrollWindowHandle
|
||||||
|
*/
|
||||||
|
HWND GetScrollWindowHandle(HWND hWnd, int nBar)
|
||||||
{
|
{
|
||||||
LPHEADSCROLL lphs;
|
WND *wndPtr;
|
||||||
lphs = ScrollBarGetStorageHeader(hwnd);
|
if (nBar != SB_CTL) {
|
||||||
if (lphs == NULL) return 0;
|
wndPtr = WIN_FindWndPtr(hWnd);
|
||||||
return lphs->CurVal;
|
if (nBar == SB_VERT) return wndPtr->hWndVScroll;
|
||||||
|
if (nBar == SB_HORZ) return wndPtr->hWndHScroll;
|
||||||
|
return (HWND)NULL;
|
||||||
|
}
|
||||||
|
return hWnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
void GetScrollRange(HWND hwnd, int nBar, LPINT lpMin, LPINT lpMax)
|
* SetScrollPos [USER.62]
|
||||||
{
|
*/
|
||||||
LPHEADSCROLL lphs;
|
|
||||||
lphs = ScrollBarGetStorageHeader(hwnd);
|
|
||||||
if (lphs == NULL) return;
|
|
||||||
*lpMin = lphs->MinVal;
|
|
||||||
*lpMax = lphs->MaxVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int SetScrollPos(HWND hwnd, int nBar, int nPos, BOOL bRedraw)
|
int SetScrollPos(HWND hwnd, int nBar, int nPos, BOOL bRedraw)
|
||||||
{
|
{
|
||||||
int nRet;
|
int nRet;
|
||||||
LPHEADSCROLL lphs;
|
LPHEADSCROLL lphs;
|
||||||
|
hwnd = GetScrollWindowHandle(hwnd, nBar);
|
||||||
lphs = ScrollBarGetStorageHeader(hwnd);
|
lphs = ScrollBarGetStorageHeader(hwnd);
|
||||||
if (lphs == NULL) return 0;
|
if (lphs == NULL) return 0;
|
||||||
nRet = lphs->CurVal;
|
nRet = lphs->CurVal;
|
||||||
|
@ -383,9 +347,27 @@ int SetScrollPos(HWND hwnd, int nBar, int nPos, BOOL bRedraw)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* GetScrollPos [USER.63]
|
||||||
|
*/
|
||||||
|
int GetScrollPos(HWND hwnd, int nBar)
|
||||||
|
{
|
||||||
|
LPHEADSCROLL lphs;
|
||||||
|
hwnd = GetScrollWindowHandle(hwnd, nBar);
|
||||||
|
lphs = ScrollBarGetStorageHeader(hwnd);
|
||||||
|
if (lphs == NULL) return 0;
|
||||||
|
return lphs->CurVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* SetScrollRange [USER.64]
|
||||||
|
*/
|
||||||
void SetScrollRange(HWND hwnd, int nBar, int MinPos, int MaxPos, BOOL bRedraw)
|
void SetScrollRange(HWND hwnd, int nBar, int MinPos, int MaxPos, BOOL bRedraw)
|
||||||
{
|
{
|
||||||
LPHEADSCROLL lphs;
|
LPHEADSCROLL lphs;
|
||||||
|
hwnd = GetScrollWindowHandle(hwnd, nBar);
|
||||||
lphs = ScrollBarGetStorageHeader(hwnd);
|
lphs = ScrollBarGetStorageHeader(hwnd);
|
||||||
if (lphs == NULL) return;
|
if (lphs == NULL) return;
|
||||||
lphs->MinVal = (short)MinPos;
|
lphs->MinVal = (short)MinPos;
|
||||||
|
@ -406,5 +388,50 @@ void SetScrollRange(HWND hwnd, int nBar, int MinPos, int MaxPos, BOOL bRedraw)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* GetScrollRange [USER.65]
|
||||||
|
*/
|
||||||
|
void GetScrollRange(HWND hwnd, int nBar, LPINT lpMin, LPINT lpMax)
|
||||||
|
{
|
||||||
|
LPHEADSCROLL lphs;
|
||||||
|
hwnd = GetScrollWindowHandle(hwnd, nBar);
|
||||||
|
lphs = ScrollBarGetStorageHeader(hwnd);
|
||||||
|
if (lphs == NULL) return;
|
||||||
|
*lpMin = lphs->MinVal;
|
||||||
|
*lpMax = lphs->MaxVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* ShowScrollBar [USER.267]
|
||||||
|
*/
|
||||||
|
void ShowScrollBar(HWND hWnd, WORD wBar, BOOL bFlag)
|
||||||
|
{
|
||||||
|
WND *wndPtr;
|
||||||
|
#ifdef DEBUG_SCROLL
|
||||||
|
printf("ShowScrollBar hWnd=%04X wBar=%d bFlag=%d\n", hWnd, wBar, bFlag);
|
||||||
|
#endif
|
||||||
|
if (wBar == SB_CTL) {
|
||||||
|
if (bFlag)
|
||||||
|
ShowWindow(hWnd, SW_SHOW);
|
||||||
|
else
|
||||||
|
ShowWindow(hWnd, SW_HIDE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
wndPtr = WIN_FindWndPtr(hWnd);
|
||||||
|
if ((wBar == SB_VERT) || (wBar == SB_BOTH)) {
|
||||||
|
if (bFlag)
|
||||||
|
ShowWindow(wndPtr->hWndVScroll, SW_SHOW);
|
||||||
|
else
|
||||||
|
ShowWindow(wndPtr->hWndVScroll, SW_HIDE);
|
||||||
|
}
|
||||||
|
if ((wBar == SB_HORZ) || (wBar == SB_BOTH)) {
|
||||||
|
if (bFlag)
|
||||||
|
ShowWindow(wndPtr->hWndHScroll, SW_SHOW);
|
||||||
|
else
|
||||||
|
ShowWindow(wndPtr->hWndHScroll, SW_HIDE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -109,6 +109,18 @@ LONG StaticWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam)
|
||||||
InvalidateRect(hWnd, NULL, TRUE);
|
InvalidateRect(hWnd, NULL, TRUE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case WM_KEYDOWN:
|
||||||
|
case WM_KEYUP:
|
||||||
|
case WM_CHAR:
|
||||||
|
case WM_LBUTTONDOWN:
|
||||||
|
case WM_LBUTTONUP:
|
||||||
|
case WM_MBUTTONDOWN:
|
||||||
|
case WM_MBUTTONUP:
|
||||||
|
case WM_RBUTTONDOWN:
|
||||||
|
case WM_RBUTTONUP:
|
||||||
|
case WM_MOUSEMOVE:
|
||||||
|
return(SendMessage(wndPtr->hwndParent, uMsg, wParam, lParam));
|
||||||
|
|
||||||
default:
|
default:
|
||||||
lResult = DefWindowProc(hWnd, uMsg, wParam, lParam);
|
lResult = DefWindowProc(hWnd, uMsg, wParam, lParam);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -13,23 +13,28 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
||||||
|
|
||||||
LONG ButtonWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam );
|
LONG ButtonWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam );
|
||||||
LONG StaticWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam );
|
LONG StaticWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam );
|
||||||
|
LONG ScrollBarWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam );
|
||||||
LONG SCROLLBAR_ScrollBarWndProc( HWND hwnd, WORD message,
|
LONG ListBoxWndProc ( HWND hwnd, WORD message, WORD wParam, LONG lParam );
|
||||||
WORD wParam, LONG lParam );
|
LONG ComboBoxWndProc ( HWND hwnd, WORD message, WORD wParam, LONG lParam );
|
||||||
LONG LISTBOX_ListBoxWndProc( HWND hwnd, WORD message,
|
LONG PopupMenuWndProc ( HWND hwnd, WORD message, WORD wParam, LONG lParam );
|
||||||
WORD wParam, LONG lParam );
|
|
||||||
LONG COMBOBOX_ComboBoxWndProc( HWND hwnd, WORD message,
|
|
||||||
WORD wParam, LONG lParam );
|
|
||||||
|
|
||||||
|
|
||||||
static WNDCLASS WIDGETS_BuiltinClasses[] =
|
static WNDCLASS WIDGETS_BuiltinClasses[] =
|
||||||
{
|
{
|
||||||
{ 0, (LONG(*)())ButtonWndProc, 0, 2, 0, 0, 0, 0, NULL, "BUTTON" },
|
{ CS_GLOBALCLASS, (LONG(*)())ButtonWndProc, 0, 2,
|
||||||
{ 0, (LONG(*)())StaticWndProc, 0, 0, 0, 0, 0, 0, NULL, "STATIC" },
|
0, 0, 0, 0, NULL, "BUTTON" },
|
||||||
{ 0, (LONG(*)())SCROLLBAR_ScrollBarWndProc, 0, 8, 0, 0, 0, 0, NULL, "SCROLLBAR" },
|
{ CS_GLOBALCLASS, (LONG(*)())StaticWndProc, 0, 0,
|
||||||
{ 0, (LONG(*)())LISTBOX_ListBoxWndProc, 0, 8, 0, 0, 0, 0, NULL, "LISTBOX" },
|
0, 0, 0, 0, NULL, "STATIC" },
|
||||||
{ 0, (LONG(*)())COMBOBOX_ComboBoxWndProc, 0, 8, 0, 0, 0, 0, NULL, "COMBOBOX" },
|
{ CS_GLOBALCLASS, (LONG(*)())ScrollBarWndProc, 0, 8,
|
||||||
{ 0, (LONG(*)())DefDlgProc, 0, DLGWINDOWEXTRA, 0, 0, 0, 0, NULL, DIALOG_CLASS_NAME }
|
0, 0, 0, 0, NULL, "SCROLLBAR" },
|
||||||
|
{ CS_GLOBALCLASS, (LONG(*)())ListBoxWndProc, 0, 8,
|
||||||
|
0, 0, 0, 0, NULL, "LISTBOX" },
|
||||||
|
{ CS_GLOBALCLASS, (LONG(*)())ComboBoxWndProc, 0, 8,
|
||||||
|
0, 0, 0, 0, NULL, "COMBOBOX" },
|
||||||
|
{ CS_GLOBALCLASS, (LONG(*)())PopupMenuWndProc, 0, 8,
|
||||||
|
0, 0, 0, 0, NULL, "POPUPMENU" },
|
||||||
|
{ CS_GLOBALCLASS, (LONG(*)())DefDlgProc, 0, DLGWINDOWEXTRA,
|
||||||
|
0, 0, 0, 0, NULL, DIALOG_CLASS_NAME }
|
||||||
};
|
};
|
||||||
|
|
||||||
#define NB_BUILTIN_CLASSES \
|
#define NB_BUILTIN_CLASSES \
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
#include "../Wine.tmpl"
|
||||||
|
|
||||||
|
#define IHavSubDirs
|
||||||
|
#define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)' 'CC=$(CC)'
|
||||||
|
|
||||||
|
MODULE = debugger
|
||||||
|
|
||||||
|
DEFINES = -DUSE_READLINE
|
||||||
|
|
||||||
|
SUBDIRS = readline
|
||||||
|
|
||||||
|
/* Quick and dirt hack, since i386 is defined as 1. sigh */
|
||||||
|
#define temp i386
|
||||||
|
#undef i386
|
||||||
|
|
||||||
|
SRCS = \
|
||||||
|
dbg.tab.c \
|
||||||
|
hash.c \
|
||||||
|
lex.yy.c \
|
||||||
|
info.c \
|
||||||
|
i386-pinsn.c
|
||||||
|
|
||||||
|
OBJS = \
|
||||||
|
dbg.tab.o \
|
||||||
|
hash.o \
|
||||||
|
lex.yy.o \
|
||||||
|
info.o \
|
||||||
|
i386-pinsn.o
|
||||||
|
|
||||||
|
#define i386 temp
|
||||||
|
#undef temp
|
||||||
|
|
||||||
|
/*
|
||||||
|
* All the SUBDIR stuff
|
||||||
|
*/
|
||||||
|
MakeSubdirs($(SUBDIRS))
|
||||||
|
MakefileSubdirs($(SUBDIRS))
|
||||||
|
DependSubdirs($(SUBDIRS))
|
||||||
|
CleanSubdirs($(SUBDIRS))
|
||||||
|
IncludesSubdirs($(SUBDIRS))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The main act
|
||||||
|
*/
|
||||||
|
WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
|
||||||
|
|
||||||
|
depend:: dbg.tab.c dbg.tab.h lex.yy.c
|
||||||
|
|
||||||
|
DependTarget()
|
||||||
|
|
||||||
|
includes::
|
||||||
|
|
||||||
|
install::
|
||||||
|
|
||||||
|
clean::
|
||||||
|
$(RM) lex.yy.c dbg.tab* y.tab.c
|
||||||
|
|
||||||
|
dbg.tab.c dbg.tab.h: dbg.y
|
||||||
|
$(YACC) -b dbg -d dbg.y
|
||||||
|
|
||||||
|
lex.yy.c: debug.l
|
||||||
|
$(LEX) -I debug.l
|
|
@ -0,0 +1,25 @@
|
||||||
|
#include "../../Wine.tmpl"
|
||||||
|
|
||||||
|
MODULE = readline
|
||||||
|
|
||||||
|
YACC = yacc -b dbg -d
|
||||||
|
|
||||||
|
DEFINES = -DANSI_ARROWS -DHAVE_TCGETATTR -DHIDE -DUSE_DIRENT -DSYS_UNIX
|
||||||
|
|
||||||
|
SRCS = \
|
||||||
|
complete.c \
|
||||||
|
editline.c \
|
||||||
|
sysunix.c
|
||||||
|
|
||||||
|
OBJS = \
|
||||||
|
complete.o \
|
||||||
|
editline.o \
|
||||||
|
sysunix.o
|
||||||
|
|
||||||
|
WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
|
||||||
|
DependTarget()
|
||||||
|
CleanTarget()
|
||||||
|
|
||||||
|
includes::
|
||||||
|
|
||||||
|
install::
|
|
@ -0,0 +1,11 @@
|
||||||
|
#include "../Wine.tmpl"
|
||||||
|
|
||||||
|
MODULE = etc
|
||||||
|
|
||||||
|
AllTarget()
|
||||||
|
|
||||||
|
depend::
|
||||||
|
|
||||||
|
CleanTarget()
|
||||||
|
|
||||||
|
includes::
|
|
@ -0,0 +1,358 @@
|
||||||
|
# Makefile generated by imake - do not edit!
|
||||||
|
# $XConsortium: imake.c,v 1.65 91/07/25 17:50:17 rws Exp $
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# Makefile generated from "Imake.tmpl" and <Imakefile>
|
||||||
|
# $XFree86: mit/config/Imake.tmpl,v 1.17 1993/06/03 15:26:36 dawes Exp $
|
||||||
|
# $XConsortium: Imake.tmpl,v 1.139 91/09/16 08:52:48 rws Exp $
|
||||||
|
#
|
||||||
|
# Platform-specific parameters may be set in the appropriate <vendor>.cf
|
||||||
|
# configuration files. Site-specific parameters should be set in the file
|
||||||
|
# site.def. Full rebuilds are recommended if any parameters are changed.
|
||||||
|
#
|
||||||
|
# If your C preprocessor does not define any unique symbols, you will need
|
||||||
|
# to set BOOTSTRAPCFLAGS when rebuilding imake (usually when doing
|
||||||
|
# "make World" the first time).
|
||||||
|
#
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# site-specific configuration parameters that need to come before
|
||||||
|
# the platform-specific parameters - edit site.def to change
|
||||||
|
|
||||||
|
# $XFree86: mit/config/site.def,v 1.65 1993/06/04 16:02:47 dawes Exp $
|
||||||
|
# site: $XConsortium: site.def,v 1.2 91/07/30 20:26:44 rws Exp $
|
||||||
|
|
||||||
|
# obz: changes for making Linux distribution
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# platform-specific configuration parameters - edit x386.cf to change
|
||||||
|
|
||||||
|
# $XFree86: mit/config/x386.cf,v 1.90 1993/06/04 16:02:50 dawes Exp $
|
||||||
|
# platform: $XConsortium: x386.cf,v 1.7 91/08/16 19:30:10 gildea Exp $
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# XFree86 version definition
|
||||||
|
# $XFree86: mit/config/xf86_vers.def,v 1.5 1993/06/01 09:12:47 dawes Exp $
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# XFree86 version: 1300
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# $XFree86: mit/config/lnuxLib.rules,v 1.2 1993/06/02 13:48:12 dawes Exp $
|
||||||
|
|
||||||
|
DLL_BINDIR = /usr/dll/bin
|
||||||
|
|
||||||
|
# operating system: Linux
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# site-specific configuration parameters that go after
|
||||||
|
# the platform-specific parameters - edit site.def to change
|
||||||
|
|
||||||
|
# $XFree86: mit/config/site.def,v 1.65 1993/06/04 16:02:47 dawes Exp $
|
||||||
|
# site: $XConsortium: site.def,v 1.2 91/07/30 20:26:44 rws Exp $
|
||||||
|
|
||||||
|
# obz: changes for making Linux distribution
|
||||||
|
|
||||||
|
SHELL = /bin/sh
|
||||||
|
|
||||||
|
TOP = ../.
|
||||||
|
CURRENT_DIR = ./etc
|
||||||
|
|
||||||
|
AR = ar clq
|
||||||
|
BOOTSTRAPCFLAGS =
|
||||||
|
CC = gcc
|
||||||
|
AS = as
|
||||||
|
|
||||||
|
LEX = flex
|
||||||
|
|
||||||
|
YACC = bison -y
|
||||||
|
|
||||||
|
COMPRESS = compress
|
||||||
|
CPP = /lib/cpp $(STD_CPP_DEFINES)
|
||||||
|
PREPROCESSCMD = /lib/cpp $(STD_CPP_DEFINES)
|
||||||
|
INSTALL = install
|
||||||
|
LD = ld
|
||||||
|
LINT = lint
|
||||||
|
LINTLIBFLAG = -C
|
||||||
|
LINTOPTS = -axz
|
||||||
|
LN = ln -s
|
||||||
|
MAKE = make
|
||||||
|
MV = mv
|
||||||
|
CP = cp
|
||||||
|
|
||||||
|
RANLIB = ranlib
|
||||||
|
RANLIBINSTFLAGS =
|
||||||
|
|
||||||
|
RM = rm -f
|
||||||
|
TROFF = psroff
|
||||||
|
MSMACROS = -ms
|
||||||
|
TBL = tbl
|
||||||
|
EQN = eqn
|
||||||
|
STD_INCLUDES =
|
||||||
|
STD_CPP_DEFINES = -traditional -D_POSIX_SOURCE -D_BSD_SOURCE -D_GNU_SOURCE -Dlinux
|
||||||
|
STD_DEFINES = -D_POSIX_SOURCE -D_BSD_SOURCE -D_GNU_SOURCE -Dlinux
|
||||||
|
EXTRA_LOAD_FLAGS =
|
||||||
|
EXTRA_LIBRARIES =
|
||||||
|
OS_LIBRARIES =
|
||||||
|
TAGS = ctags
|
||||||
|
|
||||||
|
SHAREDCODEDEF =
|
||||||
|
SHLIBDEF =
|
||||||
|
|
||||||
|
PROTO_DEFINES = -DFUNCPROTO=11 -DNARROWPROTO
|
||||||
|
|
||||||
|
INSTPGMFLAGS = -s
|
||||||
|
|
||||||
|
INSTBINFLAGS = -m 0755
|
||||||
|
INSTUIDFLAGS = -s -m 4755
|
||||||
|
INSTLIBFLAGS = -m 0644
|
||||||
|
INSTINCFLAGS = -m 0444
|
||||||
|
INSTMANFLAGS = -m 0444
|
||||||
|
INSTDATFLAGS = -m 0444
|
||||||
|
INSTKMEMFLAGS = -s -m 4755
|
||||||
|
|
||||||
|
PROJECTROOT = /usr/X386
|
||||||
|
|
||||||
|
TOP_INCLUDES = -I$(INCROOT)
|
||||||
|
|
||||||
|
CDEBUGFLAGS = -O2
|
||||||
|
CCOPTIONS = -m486 -DNO_ASM -fwritable-strings
|
||||||
|
ANSICCOPTIONS =
|
||||||
|
|
||||||
|
ALLINCLUDES = $(INCLUDES) $(EXTRA_INCLUDES) $(TOP_INCLUDES) $(STD_INCLUDES)
|
||||||
|
ALLDEFINES = $(ALLINCLUDES) $(STD_DEFINES) $(EXTRA_DEFINES) $(PROTO_DEFINES) $(DEFINES)
|
||||||
|
CFLAGS = $(ANSICCOPTIONS) $(CDEBUGFLAGS) $(CCOPTIONS) $(ALLDEFINES)
|
||||||
|
LINTFLAGS = $(LINTOPTS) -DLINT $(ALLDEFINES)
|
||||||
|
|
||||||
|
LDLIBS = $(OS_LIBRARIES) $(SYS_LIBRARIES) $(EXTRA_LIBRARIES)
|
||||||
|
|
||||||
|
LDOPTIONS = $(ANSICCOPTIONS) $(CDEBUGFLAGS) $(CCOPTIONS) $(LOCAL_LDFLAGS) -L$(USRLIBDIR)
|
||||||
|
|
||||||
|
LDCOMBINEFLAGS = -r
|
||||||
|
DEPENDFLAGS =
|
||||||
|
|
||||||
|
MACROFILE = x386.cf
|
||||||
|
RM_CMD = $(RM) *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut
|
||||||
|
|
||||||
|
IMAKE_DEFINES =
|
||||||
|
|
||||||
|
IRULESRC = $(CONFIGDIR)
|
||||||
|
IMAKE_CMD = $(IMAKE) -DUseInstalled -I$(IRULESRC) $(IMAKE_DEFINES)
|
||||||
|
|
||||||
|
ICONFIGFILES = $(IRULESRC)/Imake.tmpl $(IRULESRC)/Imake.rules $(IRULESRC)/Project.tmpl $(IRULESRC)/site.def $(IRULESRC)/$(MACROFILE) $(EXTRA_ICONFIGFILES)
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# X Window System Build Parameters
|
||||||
|
# $XFree86: mit/config/Project.tmpl,v 1.13 1993/03/27 03:32:45 dawes Exp $
|
||||||
|
# $XConsortium: Project.tmpl,v 1.138.1.1 92/11/11 09:49:19 rws Exp $
|
||||||
|
|
||||||
|
_percentC_ = %C
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# X Window System make variables; this need to be coordinated with rules
|
||||||
|
|
||||||
|
PATHSEP = /
|
||||||
|
USRLIBDIR = /usr/X386/lib
|
||||||
|
BINDIR = /usr/X386/bin
|
||||||
|
INCROOT = /usr/X386/include
|
||||||
|
BUILDINCROOT = $(TOP)
|
||||||
|
BUILDINCDIR = $(BUILDINCROOT)/X11
|
||||||
|
BUILDINCTOP = ..
|
||||||
|
INCDIR = $(INCROOT)/X11
|
||||||
|
ADMDIR = /usr/adm
|
||||||
|
LIBDIR = $(USRLIBDIR)/X11
|
||||||
|
CONFIGDIR = $(LIBDIR)/config
|
||||||
|
LINTLIBDIR = $(USRLIBDIR)/lint
|
||||||
|
|
||||||
|
FONTDIR = $(LIBDIR)/fonts
|
||||||
|
XINITDIR = $(LIBDIR)/xinit
|
||||||
|
XDMDIR = $(LIBDIR)/xdm
|
||||||
|
TWMDIR = $(LIBDIR)/twm
|
||||||
|
MANPATH = /usr/X386/man
|
||||||
|
MANSOURCEPATH = $(MANPATH)/man
|
||||||
|
MANSUFFIX = 1x
|
||||||
|
LIBMANSUFFIX = 3x
|
||||||
|
MANDIR = $(MANSOURCEPATH)1
|
||||||
|
LIBMANDIR = $(MANSOURCEPATH)3
|
||||||
|
NLSDIR = $(LIBDIR)/nls
|
||||||
|
PEXAPIDIR = $(LIBDIR)/PEX
|
||||||
|
XAPPLOADDIR = $(LIBDIR)/app-defaults
|
||||||
|
FONTCFLAGS = -t
|
||||||
|
LINKKITDIR = $(USRLIBDIR)/Server
|
||||||
|
|
||||||
|
INSTAPPFLAGS = $(INSTDATFLAGS)
|
||||||
|
|
||||||
|
IMAKE = imake
|
||||||
|
DEPEND = makedepend
|
||||||
|
RGB = rgb
|
||||||
|
|
||||||
|
FONTC = bdftopcf
|
||||||
|
|
||||||
|
MKFONTDIR = mkfontdir
|
||||||
|
MKDIRHIER = /bin/sh $(BINDIR)/mkdirhier
|
||||||
|
|
||||||
|
CONFIGSRC = $(TOP)/config
|
||||||
|
DOCUTILSRC = $(TOP)/doc/util
|
||||||
|
CLIENTSRC = $(TOP)/clients
|
||||||
|
DEMOSRC = $(TOP)/demos
|
||||||
|
LIBSRC = $(TOP)/lib
|
||||||
|
FONTSRC = $(TOP)/fonts
|
||||||
|
INCLUDESRC = $(TOP)/X11
|
||||||
|
SERVERSRC = $(TOP)/server
|
||||||
|
UTILSRC = $(TOP)/util
|
||||||
|
SCRIPTSRC = $(UTILSRC)/scripts
|
||||||
|
EXAMPLESRC = $(TOP)/examples
|
||||||
|
CONTRIBSRC = $(TOP)/../contrib
|
||||||
|
DOCSRC = $(TOP)/doc
|
||||||
|
RGBSRC = $(TOP)/rgb
|
||||||
|
DEPENDSRC = $(UTILSRC)/makedepend
|
||||||
|
IMAKESRC = $(CONFIGSRC)
|
||||||
|
XAUTHSRC = $(LIBSRC)/Xau
|
||||||
|
XLIBSRC = $(LIBSRC)/X
|
||||||
|
XMUSRC = $(LIBSRC)/Xmu
|
||||||
|
TOOLKITSRC = $(LIBSRC)/Xt
|
||||||
|
AWIDGETSRC = $(LIBSRC)/Xaw
|
||||||
|
OLDXLIBSRC = $(LIBSRC)/oldX
|
||||||
|
XDMCPLIBSRC = $(LIBSRC)/Xdmcp
|
||||||
|
BDFTOSNFSRC = $(FONTSRC)/bdftosnf
|
||||||
|
BDFTOSNFSRC = $(FONTSRC)/clients/bdftosnf
|
||||||
|
BDFTOPCFSRC = $(FONTSRC)/clients/bdftopcf
|
||||||
|
MKFONTDIRSRC = $(FONTSRC)/clients/mkfontdir
|
||||||
|
FSLIBSRC = $(FONTSRC)/lib/fs
|
||||||
|
FONTSERVERSRC = $(FONTSRC)/server
|
||||||
|
EXTENSIONSRC = $(TOP)/extensions
|
||||||
|
XILIBSRC = $(EXTENSIONSRC)/lib/xinput
|
||||||
|
PEXLIBSRC = $(EXTENSIONSRC)/lib/PEXlib
|
||||||
|
PHIGSLIBSRC = $(EXTENSIONSRC)/lib/PEX
|
||||||
|
|
||||||
|
# $XFree86: mit/config/lnuxLib.tmpl,v 1.1 1993/04/16 14:06:06 dawes Exp $
|
||||||
|
|
||||||
|
SHLIBLDFLAGS =
|
||||||
|
PICFLAGS = -B/usr/dll/jump/
|
||||||
|
|
||||||
|
DEPEXTENSIONLIB =
|
||||||
|
EXTENSIONLIB = -lXext
|
||||||
|
|
||||||
|
DEPXLIB = $(DEPEXTENSIONLIB)
|
||||||
|
XLIB = $(EXTENSIONLIB) -lX11
|
||||||
|
|
||||||
|
DEPXMULIB =
|
||||||
|
XMULIB = -lXmu
|
||||||
|
|
||||||
|
DEPXTOOLLIB =
|
||||||
|
XTOOLLIB = -lXt
|
||||||
|
|
||||||
|
DEPXAWLIB =
|
||||||
|
XAWLIB = -lXaw
|
||||||
|
|
||||||
|
DEPXILIB =
|
||||||
|
XILIB = -lXi
|
||||||
|
|
||||||
|
DEPXTESTLIB =
|
||||||
|
XTESTLIB = -lXtst
|
||||||
|
|
||||||
|
DEPPEXLIB =
|
||||||
|
PEXLIB = -lPEX5
|
||||||
|
|
||||||
|
SOXLIBREV = 3.0.1
|
||||||
|
SOXTREV = 3.0.1
|
||||||
|
SOXAWREV = 3.0.1
|
||||||
|
SOOLDXREV = 3.0.1
|
||||||
|
SOXMUREV = 3.0.1
|
||||||
|
SOXEXTREV = 3.0.1
|
||||||
|
SOXINPUTREV = 3.0.1
|
||||||
|
SOPEXREV = 1.0.1
|
||||||
|
|
||||||
|
DEPXAUTHLIB = $(USRLIBDIR)/libXau.a
|
||||||
|
XAUTHLIB = -lXau
|
||||||
|
DEPXDMCPLIB = $(USRLIBDIR)/libXdmcp.a
|
||||||
|
XDMCPLIB = -lXdmcp
|
||||||
|
|
||||||
|
DEPOLDXLIB = $(USRLIBDIR)/liboldX.a
|
||||||
|
OLDXLIB = -loldX
|
||||||
|
|
||||||
|
DEPPHIGSLIB = $(USRLIBDIR)/libphigs.a
|
||||||
|
PHIGSLIB = -lphigs
|
||||||
|
|
||||||
|
DEPXBSDLIB = $(USRLIBDIR)/libXbsd.a
|
||||||
|
XBSDLIB = -lXbsd
|
||||||
|
|
||||||
|
LINTEXTENSIONLIB = $(LINTLIBDIR)/llib-lXext.ln
|
||||||
|
LINTXLIB = $(LINTLIBDIR)/llib-lX11.ln
|
||||||
|
LINTXMU = $(LINTLIBDIR)/llib-lXmu.ln
|
||||||
|
LINTXTOOL = $(LINTLIBDIR)/llib-lXt.ln
|
||||||
|
LINTXAW = $(LINTLIBDIR)/llib-lXaw.ln
|
||||||
|
LINTXI = $(LINTLIBDIR)/llib-lXi.ln
|
||||||
|
LINTPEX = $(LINTLIBDIR)/llib-lPEX5.ln
|
||||||
|
LINTPHIGS = $(LINTLIBDIR)/llib-lphigs.ln
|
||||||
|
|
||||||
|
DEPLIBS = $(DEPXAWLIB) $(DEPXMULIB) $(DEPXTOOLLIB) $(DEPXLIB)
|
||||||
|
|
||||||
|
DEPLIBS1 = $(DEPLIBS)
|
||||||
|
DEPLIBS2 = $(DEPLIBS)
|
||||||
|
DEPLIBS3 = $(DEPLIBS)
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# Imake rules for building libraries, programs, scripts, and data files
|
||||||
|
# $XFree86: mit/config/Imake.rules,v 1.9 1993/03/23 12:56:27 dawes Exp $
|
||||||
|
# rules: $XConsortium: Imake.rules,v 1.123 91/09/16 20:12:16 rws Exp $
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# start of Imakefile
|
||||||
|
|
||||||
|
# $Id$
|
||||||
|
|
||||||
|
INCLUDES = -I$(TOP)/include
|
||||||
|
|
||||||
|
# Imake rules go here
|
||||||
|
|
||||||
|
# First, dll description to files etc
|
||||||
|
|
||||||
|
MODULE = etc
|
||||||
|
|
||||||
|
all::
|
||||||
|
|
||||||
|
depend::
|
||||||
|
|
||||||
|
clean::
|
||||||
|
$(RM_CMD) "#"*
|
||||||
|
|
||||||
|
includes::
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# common rules for all Makefiles - do not edit
|
||||||
|
|
||||||
|
emptyrule::
|
||||||
|
|
||||||
|
clean::
|
||||||
|
$(RM_CMD) "#"*
|
||||||
|
|
||||||
|
Makefile::
|
||||||
|
-@if [ -f Makefile ]; then set -x; \
|
||||||
|
$(RM) Makefile.bak; $(MV) Makefile Makefile.bak; \
|
||||||
|
else exit 0; fi
|
||||||
|
$(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR)
|
||||||
|
|
||||||
|
tags::
|
||||||
|
$(TAGS) -w *.[ch]
|
||||||
|
$(TAGS) -xw *.[ch] > TAGS
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# empty rules for directories that do not have SUBDIRS - do not edit
|
||||||
|
|
||||||
|
install::
|
||||||
|
@echo "install in $(CURRENT_DIR) done"
|
||||||
|
|
||||||
|
install.man::
|
||||||
|
@echo "install.man in $(CURRENT_DIR) done"
|
||||||
|
|
||||||
|
install.linkkit::
|
||||||
|
@echo "install.linkkit in $(CURRENT_DIR) done"
|
||||||
|
|
||||||
|
Makefiles::
|
||||||
|
|
||||||
|
includes::
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# dependencies generated by makedepend
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
#include "../Wine.tmpl"
|
||||||
|
|
||||||
|
MODULE = if1632
|
||||||
|
|
||||||
|
SRCS = \
|
||||||
|
call.S \
|
||||||
|
callback.c \
|
||||||
|
relay.c
|
||||||
|
|
||||||
|
OBJS = \
|
||||||
|
call.o \
|
||||||
|
callback.o \
|
||||||
|
relay.o
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If you add a new spec file, copy one of these lines
|
||||||
|
*/
|
||||||
|
MakeDllFromSpec(gdi,$(TOP)/$(MODULE))
|
||||||
|
MakeDllFromSpec(kernel,$(TOP)/$(MODULE))
|
||||||
|
MakeDllFromSpec(keyboard,$(TOP)/$(MODULE))
|
||||||
|
MakeDllFromSpec(shell,$(TOP)/$(MODULE))
|
||||||
|
MakeDllFromSpec(sound,$(TOP)/$(MODULE))
|
||||||
|
MakeDllFromSpec(unixlib,$(TOP)/$(MODULE))
|
||||||
|
MakeDllFromSpec(user,$(TOP)/$(MODULE))
|
||||||
|
MakeDllFromSpec(win87em,$(TOP)/$(MODULE))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Yes I know *.o is not veru clever, but can you do it cleaner ?
|
||||||
|
*/
|
||||||
|
WineRelocatableTarget($(TOP)/$(MODULE),*.o,$(OBJS))
|
||||||
|
|
||||||
|
clean::
|
||||||
|
$(RM) dll*
|
||||||
|
|
||||||
|
depend::
|
||||||
|
|
||||||
|
includes::
|
|
@ -7,7 +7,7 @@ static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
|
||||||
#include "segmem.h"
|
#include "segmem.h"
|
||||||
#include <setjmp.h>
|
#include <setjmp.h>
|
||||||
|
|
||||||
extern unsigned short SelectorOwners[];
|
extern SEGDESC Segments[];
|
||||||
extern unsigned short IF1632_Saved16_ss;
|
extern unsigned short IF1632_Saved16_ss;
|
||||||
extern unsigned long IF1632_Saved16_ebp;
|
extern unsigned long IF1632_Saved16_ebp;
|
||||||
extern unsigned long IF1632_Saved16_esp;
|
extern unsigned long IF1632_Saved16_esp;
|
||||||
|
@ -56,7 +56,7 @@ FindDataSegmentForCode(unsigned long csip)
|
||||||
unsigned int seg_idx;
|
unsigned int seg_idx;
|
||||||
|
|
||||||
seg_idx = (unsigned short) (csip >> 19);
|
seg_idx = (unsigned short) (csip >> 19);
|
||||||
return SelectorOwners[seg_idx];
|
return Segments[seg_idx].owner;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
|
|
|
@ -43,6 +43,11 @@ length 490
|
||||||
33 pascal TextOut(word s_word s_word ptr word) TextOut(1 2 3 4 5)
|
33 pascal TextOut(word s_word s_word ptr word) TextOut(1 2 3 4 5)
|
||||||
34 pascal BitBlt( word s_word s_word s_word s_word word s_word s_word long)
|
34 pascal BitBlt( word s_word s_word s_word s_word word s_word s_word long)
|
||||||
BitBlt(1 2 3 4 5 6 7 8 9)
|
BitBlt(1 2 3 4 5 6 7 8 9)
|
||||||
|
35 pascal StrechBlt( word s_word s_word s_word s_word word s_word s_word s_word s_word long)
|
||||||
|
StrechBlt(1 2 3 4 5 6 7 8 9 10 11)
|
||||||
|
|
||||||
|
36 pascal Polygon (word ptr word) Polygon (1 2 3)
|
||||||
|
37 pascal Polyline (word ptr word) Polyline (1 2 3)
|
||||||
39 pascal RestoreDC(word s_word) RestoreDC(1 2)
|
39 pascal RestoreDC(word s_word) RestoreDC(1 2)
|
||||||
40 pascal FillRgn(word word word) FillRgn(1 2 3)
|
40 pascal FillRgn(word word word) FillRgn(1 2 3)
|
||||||
43 pascal PaintRgn(word word) PaintRgn(1 2)
|
43 pascal PaintRgn(word word) PaintRgn(1 2)
|
||||||
|
|
|
@ -28,6 +28,8 @@ length 415
|
||||||
24 pascal UnlockSegment(s_word) KERNEL_UnlockSegment(1)
|
24 pascal UnlockSegment(s_word) KERNEL_UnlockSegment(1)
|
||||||
25 pascal GlobalCompact(long) GlobalCompact(1)
|
25 pascal GlobalCompact(long) GlobalCompact(1)
|
||||||
30 pascal WaitEvent(word) KERNEL_WaitEvent(1)
|
30 pascal WaitEvent(word) KERNEL_WaitEvent(1)
|
||||||
|
34 pascal SetTaskQueue(word word) SetTaskQueue(1 2)
|
||||||
|
35 pascal GetTaskQueue(word) GetTaskQueue(1)
|
||||||
49 pascal GetModuleFileName(word ptr s_word) KERNEL_GetModuleFileName(1 2 3)
|
49 pascal GetModuleFileName(word ptr s_word) KERNEL_GetModuleFileName(1 2 3)
|
||||||
50 pascal GetProcAddress(word ptr) GetProcAddress(1 2)
|
50 pascal GetProcAddress(word ptr) GetProcAddress(1 2)
|
||||||
51 pascal MakeProcInstance(ptr word) CALLBACK_MakeProcInstance(1 2)
|
51 pascal MakeProcInstance(ptr word) CALLBACK_MakeProcInstance(1 2)
|
||||||
|
@ -43,6 +45,8 @@ length 415
|
||||||
74 pascal OpenFile(ptr ptr word) KERNEL_OpenFile(1 2 3)
|
74 pascal OpenFile(ptr ptr word) KERNEL_OpenFile(1 2 3)
|
||||||
81 pascal _lclose(word) KERNEL__lclose(1)
|
81 pascal _lclose(word) KERNEL__lclose(1)
|
||||||
82 pascal _lread(word ptr word) KERNEL__lread(1 2 3)
|
82 pascal _lread(word ptr word) KERNEL__lread(1 2 3)
|
||||||
|
83 pascal _lcreate(ptr word) KERNEL__lcreate(1 2)
|
||||||
|
84 pascal _llseek(word long word) KERNEL__llseek(1 2 3)
|
||||||
85 pascal _lopen(ptr word) KERNEL__lopen(1 2)
|
85 pascal _lopen(ptr word) KERNEL__lopen(1 2)
|
||||||
86 pascal _lwrite(word ptr word) KERNEL__lwrite(1 2 3)
|
86 pascal _lwrite(word ptr word) KERNEL__lwrite(1 2 3)
|
||||||
88 pascal lstrcpy(ptr ptr) lstrcpy(1 2)
|
88 pascal lstrcpy(ptr ptr) lstrcpy(1 2)
|
||||||
|
@ -51,11 +55,14 @@ length 415
|
||||||
91 register InitTask(word word word word word
|
91 register InitTask(word word word word word
|
||||||
word word word word word)
|
word word word word word)
|
||||||
KERNEL_InitTask()
|
KERNEL_InitTask()
|
||||||
|
92 pascal GetTempDrive(byte) GetTempDrive(1)
|
||||||
95 pascal LoadLibrary(ptr) LoadLibrary(1)
|
95 pascal LoadLibrary(ptr) LoadLibrary(1)
|
||||||
96 pascal FreeLibrary(word) FreeLibrary(1)
|
96 pascal FreeLibrary(word) FreeLibrary(1)
|
||||||
|
97 pascal GetTempFileName(byte ptr word ptr) GetTempDrive(1 2 3 4)
|
||||||
102 register DOS3Call(word word word word word
|
102 register DOS3Call(word word word word word
|
||||||
word word word word word)
|
word word word word word)
|
||||||
KERNEL_DOS3Call()
|
KERNEL_DOS3Call()
|
||||||
|
107 pascal SetErrorMode(word) SetErrorMode(1)
|
||||||
111 pascal GlobalWire(word) GlobalLock(1)
|
111 pascal GlobalWire(word) GlobalLock(1)
|
||||||
112 pascal GlobalUnWire(word) GlobalUnlock(1)
|
112 pascal GlobalUnWire(word) GlobalUnlock(1)
|
||||||
115 pascal OutputDebugString(ptr) OutputDebugString(1)
|
115 pascal OutputDebugString(ptr) OutputDebugString(1)
|
||||||
|
@ -68,6 +75,9 @@ length 415
|
||||||
WritePrivateProfileString(1 2 3 4)
|
WritePrivateProfileString(1 2 3 4)
|
||||||
131 pascal GetDOSEnvironment() GetDOSEnvironment()
|
131 pascal GetDOSEnvironment() GetDOSEnvironment()
|
||||||
132 return GetWinFlags 0 0x413
|
132 return GetWinFlags 0 0x413
|
||||||
|
134 pascal GetWindowsDirectory(ptr word) GetWindowsDirectory(1 2)
|
||||||
|
135 pascal GetSystemDirectory(ptr word) GetSystemDirectory(1 2)
|
||||||
|
136 pascal GetDriveType(byte) GetWindowsDirectory(1)
|
||||||
154 return GlobalNotify 4 0
|
154 return GlobalNotify 4 0
|
||||||
163 pascal GlobalLRUOldest(word) ReturnArg(1)
|
163 pascal GlobalLRUOldest(word) ReturnArg(1)
|
||||||
164 pascal GlobalLRUNewest(word) ReturnArg(1)
|
164 pascal GlobalLRUNewest(word) ReturnArg(1)
|
||||||
|
|
|
@ -173,7 +173,7 @@ DLLRelay(unsigned int func_num, unsigned int seg_off)
|
||||||
case DLL_ARGTYPE_FARPTR:
|
case DLL_ARGTYPE_FARPTR:
|
||||||
ip = (int *) ((char *) arg_ptr + offset);
|
ip = (int *) ((char *) arg_ptr + offset);
|
||||||
if (*ip & 0xffff0000)
|
if (*ip & 0xffff0000)
|
||||||
arg_table[i] = SAFEMAKEPTR((unsigned) *ip >> 16, *ip);
|
arg_table[i] = FIXPTR(*ip);
|
||||||
else
|
else
|
||||||
arg_table[i] = *ip;
|
arg_table[i] = *ip;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -13,12 +13,16 @@ length 540
|
||||||
13 pascal GetTickCount() GetTickCount()
|
13 pascal GetTickCount() GetTickCount()
|
||||||
14 return GetTimerResolution 0 1000
|
14 return GetTimerResolution 0 1000
|
||||||
15 pascal GetCurrentTime() GetTickCount()
|
15 pascal GetCurrentTime() GetTickCount()
|
||||||
|
16 pascal ClipCursor(ptr) ClipCursor(1)
|
||||||
|
17 pascal GetCursorPos(ptr) GetCursorPos(1)
|
||||||
18 pascal SetCapture(word) SetCapture(1)
|
18 pascal SetCapture(word) SetCapture(1)
|
||||||
19 pascal ReleaseCapture() ReleaseCapture()
|
19 pascal ReleaseCapture() ReleaseCapture()
|
||||||
20 pascal SetDoubleClickTime(word) SetDoubleClickTime(1)
|
20 pascal SetDoubleClickTime(word) SetDoubleClickTime(1)
|
||||||
21 pascal GetDoubleClickTime() GetDoubleClickTime()
|
21 pascal GetDoubleClickTime() GetDoubleClickTime()
|
||||||
22 pascal SetFocus(word) SetFocus(1)
|
22 pascal SetFocus(word) SetFocus(1)
|
||||||
23 pascal GetFocus() GetFocus()
|
23 pascal GetFocus() GetFocus()
|
||||||
|
28 pascal ClientToScreen(word ptr) ClientToScreen(1 2)
|
||||||
|
29 pascal ScreenToClient(word ptr) ScreenToClient(1 2)
|
||||||
31 pascal IsIconic(word) IsIconic(1)
|
31 pascal IsIconic(word) IsIconic(1)
|
||||||
32 pascal GetWindowRect(word ptr) GetWindowRect(1 2)
|
32 pascal GetWindowRect(word ptr) GetWindowRect(1 2)
|
||||||
33 pascal GetClientRect(word ptr) GetClientRect(1 2)
|
33 pascal GetClientRect(word ptr) GetClientRect(1 2)
|
||||||
|
@ -41,13 +45,18 @@ length 540
|
||||||
56 pascal MoveWindow(word word word word word word)
|
56 pascal MoveWindow(word word word word word word)
|
||||||
MoveWindow(1 2 3 4 5 6)
|
MoveWindow(1 2 3 4 5 6)
|
||||||
57 pascal RegisterClass(ptr) RegisterClass(1)
|
57 pascal RegisterClass(ptr) RegisterClass(1)
|
||||||
|
58 pascal GetClassName(word ptr word) GetClassName(1 2 3)
|
||||||
61 pascal ScrollWindow(word s_word s_word ptr ptr) ScrollWindow(1 2 3 4 5)
|
61 pascal ScrollWindow(word s_word s_word ptr ptr) ScrollWindow(1 2 3 4 5)
|
||||||
62 pascal SetScrollPos(word word word word) SetScrollPos(1 2 3 4)
|
62 pascal SetScrollPos(word word word word) SetScrollPos(1 2 3 4)
|
||||||
|
63 pascal GetScrollPos(word word) GetScrollPos(1 2)
|
||||||
64 pascal SetScrollRange(word word word word word) SetScrollRange(1 2 3 4 5)
|
64 pascal SetScrollRange(word word word word word) SetScrollRange(1 2 3 4 5)
|
||||||
|
65 pascal GetScrollRange(word word ptr ptr) GetScrollRange(1 2 3 4)
|
||||||
66 pascal GetDC(word) GetDC(1)
|
66 pascal GetDC(word) GetDC(1)
|
||||||
|
67 pascal GetWindowDC(word) GetWindowDC(1)
|
||||||
68 pascal ReleaseDC(word word) ReleaseDC(1 2)
|
68 pascal ReleaseDC(word word) ReleaseDC(1 2)
|
||||||
69 pascal SetCursor(word word) SetCursor(1 2)
|
69 pascal SetCursor(word) SetCursor(1)
|
||||||
71 pascal ShowCursor(word word) ShowCursor(1 2)
|
70 pascal SetCursorPos(word word) SetCursorPos(1 2)
|
||||||
|
71 pascal ShowCursor(word) ShowCursor(1)
|
||||||
72 pascal SetRect(ptr s_word s_word s_word s_word) SetRect(1 2 3 4 5)
|
72 pascal SetRect(ptr s_word s_word s_word s_word) SetRect(1 2 3 4 5)
|
||||||
73 pascal SetRectEmpty(ptr) SetRectEmpty(1)
|
73 pascal SetRectEmpty(ptr) SetRectEmpty(1)
|
||||||
74 pascal CopyRect(ptr ptr) CopyRect(1 2)
|
74 pascal CopyRect(ptr ptr) CopyRect(1 2)
|
||||||
|
@ -67,7 +76,7 @@ length 540
|
||||||
89 pascal CreateDialog(word ptr word ptr) CreateDialog(1 2 3 4)
|
89 pascal CreateDialog(word ptr word ptr) CreateDialog(1 2 3 4)
|
||||||
90 pascal IsDialogMessage(word ptr) IsDialogMessage(1 2)
|
90 pascal IsDialogMessage(word ptr) IsDialogMessage(1 2)
|
||||||
91 pascal GetDlgItem(word word) GetDlgItem(1 2)
|
91 pascal GetDlgItem(word word) GetDlgItem(1 2)
|
||||||
92 pascal SetDlgItemText(word ptr) SetDlgItemText(1 2)
|
92 pascal SetDlgItemText(word word ptr) SetDlgItemText(1 2 3)
|
||||||
93 pascal GetDlgItemText(word word ptr word) GetDlgItemText(1 2 3 4)
|
93 pascal GetDlgItemText(word word ptr word) GetDlgItemText(1 2 3 4)
|
||||||
94 pascal SetDlgItemInt(word word word word) SetDlgItemInt(1 2 3 4)
|
94 pascal SetDlgItemInt(word word word word) SetDlgItemInt(1 2 3 4)
|
||||||
95 pascal GetDlgItemInt(word word ptr word) GetDlgItemInt(1 2 3 4)
|
95 pascal GetDlgItemInt(word word ptr word) GetDlgItemInt(1 2 3 4)
|
||||||
|
@ -106,9 +115,18 @@ length 540
|
||||||
136 pascal SetWindowLong(word s_word long) SetWindowLong(1 2 3)
|
136 pascal SetWindowLong(word s_word long) SetWindowLong(1 2 3)
|
||||||
150 pascal LoadMenu(word ptr) LoadMenu(1 2)
|
150 pascal LoadMenu(word ptr) LoadMenu(1 2)
|
||||||
151 pascal CreateMenu() CreateMenu()
|
151 pascal CreateMenu() CreateMenu()
|
||||||
154 pascal CheckMenu(word word word) CheckMenu(1 2 3)
|
152 pascal DestroyMenu(word) DestroyMenu(1)
|
||||||
|
154 pascal CheckMenuItem(word word word) CheckMenuItem(1 2 3)
|
||||||
|
155 pascal EnableMenuItem(word word word) EnableMenuItem(1 2 3)
|
||||||
157 pascal GetMenu(word) GetMenu(1)
|
157 pascal GetMenu(word) GetMenu(1)
|
||||||
158 pascal SetMenu(word word) SetMenu(1 2)
|
158 pascal SetMenu(word word) SetMenu(1 2)
|
||||||
|
163 pascal CreateCaret(word word word word) CreateCaret(1 2 3 4)
|
||||||
|
164 pascal DestroyCaret() DestroyCaret()
|
||||||
|
165 pascal SetCaretPos(word word) SetCaretPos(1 2)
|
||||||
|
166 pascal HideCaret(word) HideCaret(1)
|
||||||
|
167 pascal ShowCaret(word) ShowCaret(1)
|
||||||
|
166 pascal SetCaretBlinkTime(word) SetCaretBlinkTime(1)
|
||||||
|
169 pascal GetCaretBlinkTime() GetCaretBlinkTime()
|
||||||
171 pascal WinHelp(word word long) WinHelp(1 2 3)
|
171 pascal WinHelp(word word long) WinHelp(1 2 3)
|
||||||
173 pascal LoadCursor(word ptr) LoadCursor(1 2)
|
173 pascal LoadCursor(word ptr) LoadCursor(1 2)
|
||||||
174 pascal LoadIcon(word ptr) LoadIcon(1 2)
|
174 pascal LoadIcon(word ptr) LoadIcon(1 2)
|
||||||
|
@ -119,7 +137,24 @@ length 540
|
||||||
180 pascal GetSysColor(word) GetSysColor(1)
|
180 pascal GetSysColor(word) GetSysColor(1)
|
||||||
181 pascal SetSysColors(word ptr ptr) SetSysColors(1 2 3)
|
181 pascal SetSysColors(word ptr ptr) SetSysColors(1 2 3)
|
||||||
182 pascal KillSystemTimer(word word) KillSystemTimer(1 2)
|
182 pascal KillSystemTimer(word word) KillSystemTimer(1 2)
|
||||||
|
183 pascal GetCaretPos(ptr) GetCaretPos(1)
|
||||||
190 pascal GetUpdateRect(word ptr word) GetUpdateRect(1 2 3)
|
190 pascal GetUpdateRect(word ptr word) GetUpdateRect(1 2 3)
|
||||||
|
200 pascal OpenComm(ptr word word) OpenComm(1 2 3)
|
||||||
|
201 pascal SetCommState(ptr) SetCommState(1)
|
||||||
|
202 pascal GetCommState(word ptr) GetCommState(1 2)
|
||||||
|
203 pascal GetCommError(word ptr) GetCommError(1 2)
|
||||||
|
204 pascal ReadComm(word ptr word) ReadComm(1 2 3)
|
||||||
|
205 pascal WriteComm(word ptr word) WriteComm(1 2 3)
|
||||||
|
206 pascal TransmitCommChar(word byte) TransmitCommChar (1 2)
|
||||||
|
207 pascal CloseComm(word) CloseComm(1)
|
||||||
|
208 pascal SetCommEventMask(word word) SetCommEventMask(1 2)
|
||||||
|
209 pascal GetCommEventMask(word word) GetCommEventMask(1 2)
|
||||||
|
210 pascal SetCommBreak(word) SetCommBreak(1)
|
||||||
|
211 pascal ClearCommBreak(word) ClearCommBreak(1)
|
||||||
|
212 pascal UngetCommChar(word byte) UngetCommChar(1 2)
|
||||||
|
213 pascal BuildCommDCB(ptr ptr) BuildCommDCB(1 2)
|
||||||
|
214 pascal EscapeCommFunction(word word) EscapeCommFunction(1 2)
|
||||||
|
215 pascal FlushComm(word word) FlushComm(1 2)
|
||||||
218 pascal DialogBoxIndirect(word word word ptr) DialogBoxIndirect(1 2 3 4)
|
218 pascal DialogBoxIndirect(word word word ptr) DialogBoxIndirect(1 2 3 4)
|
||||||
219 pascal CreateDialogIndirect(word ptr word ptr)
|
219 pascal CreateDialogIndirect(word ptr word ptr)
|
||||||
CreateDialogIndirect(1 2 3 4)
|
CreateDialogIndirect(1 2 3 4)
|
||||||
|
@ -131,6 +166,7 @@ length 540
|
||||||
230 pascal GetNextWindow(word word) GetNextWindow(1 2)
|
230 pascal GetNextWindow(word word) GetNextWindow(1 2)
|
||||||
232 pascal SetWindowPos(word word word word word word word)
|
232 pascal SetWindowPos(word word word word word word word)
|
||||||
SetWindowPos(1 2 3 4 5 6 7)
|
SetWindowPos(1 2 3 4 5 6 7)
|
||||||
|
236 pascal GetCapture() GetCapture()
|
||||||
237 pascal GetUpdateRgn(word word word) GetUpdateRgn(1 2 3)
|
237 pascal GetUpdateRgn(word word word) GetUpdateRgn(1 2 3)
|
||||||
239 pascal DialogBoxParam(word ptr word ptr long) DialogBoxParam(1 2 3 4 5)
|
239 pascal DialogBoxParam(word ptr word ptr long) DialogBoxParam(1 2 3 4 5)
|
||||||
240 pascal DialogBoxIndirectParam(word word word ptr long)
|
240 pascal DialogBoxIndirectParam(word word word ptr long)
|
||||||
|
@ -140,9 +176,14 @@ length 540
|
||||||
242 pascal CreateDialogIndirectParam(word ptr word ptr long)
|
242 pascal CreateDialogIndirectParam(word ptr word ptr long)
|
||||||
CreateDialogIndirectParam(1 2 3 4 5)
|
CreateDialogIndirectParam(1 2 3 4 5)
|
||||||
244 pascal EqualRect(ptr ptr) EqualRect(1 2)
|
244 pascal EqualRect(ptr ptr) EqualRect(1 2)
|
||||||
|
258 pascal MapWindowPoints(word word ptr word) MapWindowPoints(1 2 3 4)
|
||||||
262 pascal GetWindow(word word) GetWindow(1 2)
|
262 pascal GetWindow(word word) GetWindow(1 2)
|
||||||
266 pascal SetMessageQueue(word) SetMessageQueue(1)
|
266 pascal SetMessageQueue(word) SetMessageQueue(1)
|
||||||
|
267 pascal ShowScrollBar(word word word) ShowScrollBar(1 2 3)
|
||||||
|
272 pascal IsZoomed(word) IsZoomed(1)
|
||||||
277 pascal GetDlgCtrlID(word) GetDlgCtrlID(1)
|
277 pascal GetDlgCtrlID(word) GetDlgCtrlID(1)
|
||||||
|
282 pascal SelectPalette(word word word) SelectPalette(1 2 3)
|
||||||
|
283 pascal RealizePalette(word) RealizePalette(1)
|
||||||
286 pascal GetDesktopWindow() GetDesktopWindow()
|
286 pascal GetDesktopWindow() GetDesktopWindow()
|
||||||
288 pascal GetMessageExtraInfo() GetMessageExtraInfo()
|
288 pascal GetMessageExtraInfo() GetMessageExtraInfo()
|
||||||
319 pascal ScrollWindowEx(word s_word s_word ptr ptr word ptr word)
|
319 pascal ScrollWindowEx(word s_word s_word ptr ptr word ptr word)
|
||||||
|
@ -151,9 +192,20 @@ length 540
|
||||||
325 pascal PaintRect(word word word word ptr) PaintRect(1 2 3 4 5)
|
325 pascal PaintRect(word word word word ptr) PaintRect(1 2 3 4 5)
|
||||||
334 pascal GetQueueStatus(word) GetQueueStatus(1)
|
334 pascal GetQueueStatus(word) GetQueueStatus(1)
|
||||||
335 pascal GetInputState() GetInputState()
|
335 pascal GetInputState() GetInputState()
|
||||||
|
359 pascal GetDCEx(word word long) GetDCEx(1 2 3)
|
||||||
373 pascal SubtractRect(ptr ptr ptr) SubtractRect(1 2 3)
|
373 pascal SubtractRect(ptr ptr ptr) SubtractRect(1 2 3)
|
||||||
403 pascal UnregisterClass(ptr word) UnregisterClass(1 2)
|
403 pascal UnregisterClass(ptr word) UnregisterClass(1 2)
|
||||||
|
404 pascal GetClassInfo(word ptr ptr) GetClassInfo(1 2 3)
|
||||||
|
406 pascal CreateCursor(word word word word word ptr ptr)
|
||||||
|
CreateCursor(1 2 3 4 5 6 7)
|
||||||
|
410 pascal InsertMenu(word word word word ptr) InsertMenu(1 2 3 4 5)
|
||||||
411 pascal AppendMenu(word word word ptr) AppendMenu(1 2 3 4)
|
411 pascal AppendMenu(word word word ptr) AppendMenu(1 2 3 4)
|
||||||
|
412 pascal RemoveMenu(word word word) RemoveMenu(1 2 3)
|
||||||
|
413 pascal DeleteMenu(word word word) DeleteMenu(1 2 3)
|
||||||
|
414 pascal ModifyMenu(word word word word ptr) ModifyMenu(1 2 3 4 5)
|
||||||
|
415 pascal CreatePopupMenu() CreatePopupMenu()
|
||||||
|
416 pascal TrackPopupMenu(word word word word word word ptr)
|
||||||
|
TrackPopupMenu(1 2 3 4 5 6 7)
|
||||||
420 pascal wsprintf(ptr ptr) wsprintf(1 2)
|
420 pascal wsprintf(ptr ptr) wsprintf(1 2)
|
||||||
421 pascal wvsprintf(ptr ptr ptr) wvsprintf(1 2 3)
|
421 pascal wvsprintf(ptr ptr ptr) wvsprintf(1 2 3)
|
||||||
430 pascal lstrcmp(ptr ptr) lstrcmp(1 2)
|
430 pascal lstrcmp(ptr ptr) lstrcmp(1 2)
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
#include "../Wine.tmpl"
|
||||||
|
|
||||||
|
MODULE = include
|
||||||
|
|
||||||
|
HEADERS = \
|
||||||
|
atom.h \
|
||||||
|
callback.h \
|
||||||
|
class.h \
|
||||||
|
combo.h \
|
||||||
|
cursor.h \
|
||||||
|
dce.h \
|
||||||
|
dialog.h \
|
||||||
|
dlls.h \
|
||||||
|
files.h \
|
||||||
|
gdi.h \
|
||||||
|
heap.h \
|
||||||
|
icon.h \
|
||||||
|
int21.h \
|
||||||
|
listbox.h \
|
||||||
|
menu.h \
|
||||||
|
message.h \
|
||||||
|
neexe.h \
|
||||||
|
prototypes.h \
|
||||||
|
regfunc.h \
|
||||||
|
scroll.h \
|
||||||
|
segmem.h \
|
||||||
|
user.h \
|
||||||
|
win.h \
|
||||||
|
windows.h \
|
||||||
|
wine.h
|
||||||
|
|
||||||
|
AllTarget()
|
||||||
|
|
||||||
|
depend::
|
||||||
|
|
||||||
|
CleanTarget()
|
||||||
|
|
||||||
|
includes::
|
|
@ -0,0 +1,360 @@
|
||||||
|
# Makefile generated by imake - do not edit!
|
||||||
|
# $XConsortium: imake.c,v 1.65 91/07/25 17:50:17 rws Exp $
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# Makefile generated from "Imake.tmpl" and <Imakefile>
|
||||||
|
# $XFree86: mit/config/Imake.tmpl,v 1.17 1993/06/03 15:26:36 dawes Exp $
|
||||||
|
# $XConsortium: Imake.tmpl,v 1.139 91/09/16 08:52:48 rws Exp $
|
||||||
|
#
|
||||||
|
# Platform-specific parameters may be set in the appropriate <vendor>.cf
|
||||||
|
# configuration files. Site-specific parameters should be set in the file
|
||||||
|
# site.def. Full rebuilds are recommended if any parameters are changed.
|
||||||
|
#
|
||||||
|
# If your C preprocessor does not define any unique symbols, you will need
|
||||||
|
# to set BOOTSTRAPCFLAGS when rebuilding imake (usually when doing
|
||||||
|
# "make World" the first time).
|
||||||
|
#
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# site-specific configuration parameters that need to come before
|
||||||
|
# the platform-specific parameters - edit site.def to change
|
||||||
|
|
||||||
|
# $XFree86: mit/config/site.def,v 1.65 1993/06/04 16:02:47 dawes Exp $
|
||||||
|
# site: $XConsortium: site.def,v 1.2 91/07/30 20:26:44 rws Exp $
|
||||||
|
|
||||||
|
# obz: changes for making Linux distribution
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# platform-specific configuration parameters - edit x386.cf to change
|
||||||
|
|
||||||
|
# $XFree86: mit/config/x386.cf,v 1.90 1993/06/04 16:02:50 dawes Exp $
|
||||||
|
# platform: $XConsortium: x386.cf,v 1.7 91/08/16 19:30:10 gildea Exp $
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# XFree86 version definition
|
||||||
|
# $XFree86: mit/config/xf86_vers.def,v 1.5 1993/06/01 09:12:47 dawes Exp $
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# XFree86 version: 1300
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# $XFree86: mit/config/lnuxLib.rules,v 1.2 1993/06/02 13:48:12 dawes Exp $
|
||||||
|
|
||||||
|
DLL_BINDIR = /usr/dll/bin
|
||||||
|
|
||||||
|
# operating system: Linux
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# site-specific configuration parameters that go after
|
||||||
|
# the platform-specific parameters - edit site.def to change
|
||||||
|
|
||||||
|
# $XFree86: mit/config/site.def,v 1.65 1993/06/04 16:02:47 dawes Exp $
|
||||||
|
# site: $XConsortium: site.def,v 1.2 91/07/30 20:26:44 rws Exp $
|
||||||
|
|
||||||
|
# obz: changes for making Linux distribution
|
||||||
|
|
||||||
|
SHELL = /bin/sh
|
||||||
|
|
||||||
|
TOP = ../.
|
||||||
|
CURRENT_DIR = ./include
|
||||||
|
|
||||||
|
AR = ar clq
|
||||||
|
BOOTSTRAPCFLAGS =
|
||||||
|
CC = gcc
|
||||||
|
AS = as
|
||||||
|
|
||||||
|
LEX = flex
|
||||||
|
|
||||||
|
YACC = bison -y
|
||||||
|
|
||||||
|
COMPRESS = compress
|
||||||
|
CPP = /lib/cpp $(STD_CPP_DEFINES)
|
||||||
|
PREPROCESSCMD = /lib/cpp $(STD_CPP_DEFINES)
|
||||||
|
INSTALL = install
|
||||||
|
LD = ld
|
||||||
|
LINT = lint
|
||||||
|
LINTLIBFLAG = -C
|
||||||
|
LINTOPTS = -axz
|
||||||
|
LN = ln -s
|
||||||
|
MAKE = make
|
||||||
|
MV = mv
|
||||||
|
CP = cp
|
||||||
|
|
||||||
|
RANLIB = ranlib
|
||||||
|
RANLIBINSTFLAGS =
|
||||||
|
|
||||||
|
RM = rm -f
|
||||||
|
TROFF = psroff
|
||||||
|
MSMACROS = -ms
|
||||||
|
TBL = tbl
|
||||||
|
EQN = eqn
|
||||||
|
STD_INCLUDES =
|
||||||
|
STD_CPP_DEFINES = -traditional -D_POSIX_SOURCE -D_BSD_SOURCE -D_GNU_SOURCE -Dlinux
|
||||||
|
STD_DEFINES = -D_POSIX_SOURCE -D_BSD_SOURCE -D_GNU_SOURCE -Dlinux
|
||||||
|
EXTRA_LOAD_FLAGS =
|
||||||
|
EXTRA_LIBRARIES =
|
||||||
|
OS_LIBRARIES =
|
||||||
|
TAGS = ctags
|
||||||
|
|
||||||
|
SHAREDCODEDEF =
|
||||||
|
SHLIBDEF =
|
||||||
|
|
||||||
|
PROTO_DEFINES = -DFUNCPROTO=11 -DNARROWPROTO
|
||||||
|
|
||||||
|
INSTPGMFLAGS = -s
|
||||||
|
|
||||||
|
INSTBINFLAGS = -m 0755
|
||||||
|
INSTUIDFLAGS = -s -m 4755
|
||||||
|
INSTLIBFLAGS = -m 0644
|
||||||
|
INSTINCFLAGS = -m 0444
|
||||||
|
INSTMANFLAGS = -m 0444
|
||||||
|
INSTDATFLAGS = -m 0444
|
||||||
|
INSTKMEMFLAGS = -s -m 4755
|
||||||
|
|
||||||
|
PROJECTROOT = /usr/X386
|
||||||
|
|
||||||
|
TOP_INCLUDES = -I$(INCROOT)
|
||||||
|
|
||||||
|
CDEBUGFLAGS = -O2
|
||||||
|
CCOPTIONS = -m486 -DNO_ASM -fwritable-strings
|
||||||
|
ANSICCOPTIONS =
|
||||||
|
|
||||||
|
ALLINCLUDES = $(INCLUDES) $(EXTRA_INCLUDES) $(TOP_INCLUDES) $(STD_INCLUDES)
|
||||||
|
ALLDEFINES = $(ALLINCLUDES) $(STD_DEFINES) $(EXTRA_DEFINES) $(PROTO_DEFINES) $(DEFINES)
|
||||||
|
CFLAGS = $(ANSICCOPTIONS) $(CDEBUGFLAGS) $(CCOPTIONS) $(ALLDEFINES)
|
||||||
|
LINTFLAGS = $(LINTOPTS) -DLINT $(ALLDEFINES)
|
||||||
|
|
||||||
|
LDLIBS = $(OS_LIBRARIES) $(SYS_LIBRARIES) $(EXTRA_LIBRARIES)
|
||||||
|
|
||||||
|
LDOPTIONS = $(ANSICCOPTIONS) $(CDEBUGFLAGS) $(CCOPTIONS) $(LOCAL_LDFLAGS) -L$(USRLIBDIR)
|
||||||
|
|
||||||
|
LDCOMBINEFLAGS = -r
|
||||||
|
DEPENDFLAGS =
|
||||||
|
|
||||||
|
MACROFILE = x386.cf
|
||||||
|
RM_CMD = $(RM) *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut
|
||||||
|
|
||||||
|
IMAKE_DEFINES =
|
||||||
|
|
||||||
|
IRULESRC = $(CONFIGDIR)
|
||||||
|
IMAKE_CMD = $(IMAKE) -DUseInstalled -I$(IRULESRC) $(IMAKE_DEFINES)
|
||||||
|
|
||||||
|
ICONFIGFILES = $(IRULESRC)/Imake.tmpl $(IRULESRC)/Imake.rules $(IRULESRC)/Project.tmpl $(IRULESRC)/site.def $(IRULESRC)/$(MACROFILE) $(EXTRA_ICONFIGFILES)
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# X Window System Build Parameters
|
||||||
|
# $XFree86: mit/config/Project.tmpl,v 1.13 1993/03/27 03:32:45 dawes Exp $
|
||||||
|
# $XConsortium: Project.tmpl,v 1.138.1.1 92/11/11 09:49:19 rws Exp $
|
||||||
|
|
||||||
|
_percentC_ = %C
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# X Window System make variables; this need to be coordinated with rules
|
||||||
|
|
||||||
|
PATHSEP = /
|
||||||
|
USRLIBDIR = /usr/X386/lib
|
||||||
|
BINDIR = /usr/X386/bin
|
||||||
|
INCROOT = /usr/X386/include
|
||||||
|
BUILDINCROOT = $(TOP)
|
||||||
|
BUILDINCDIR = $(BUILDINCROOT)/X11
|
||||||
|
BUILDINCTOP = ..
|
||||||
|
INCDIR = $(INCROOT)/X11
|
||||||
|
ADMDIR = /usr/adm
|
||||||
|
LIBDIR = $(USRLIBDIR)/X11
|
||||||
|
CONFIGDIR = $(LIBDIR)/config
|
||||||
|
LINTLIBDIR = $(USRLIBDIR)/lint
|
||||||
|
|
||||||
|
FONTDIR = $(LIBDIR)/fonts
|
||||||
|
XINITDIR = $(LIBDIR)/xinit
|
||||||
|
XDMDIR = $(LIBDIR)/xdm
|
||||||
|
TWMDIR = $(LIBDIR)/twm
|
||||||
|
MANPATH = /usr/X386/man
|
||||||
|
MANSOURCEPATH = $(MANPATH)/man
|
||||||
|
MANSUFFIX = 1x
|
||||||
|
LIBMANSUFFIX = 3x
|
||||||
|
MANDIR = $(MANSOURCEPATH)1
|
||||||
|
LIBMANDIR = $(MANSOURCEPATH)3
|
||||||
|
NLSDIR = $(LIBDIR)/nls
|
||||||
|
PEXAPIDIR = $(LIBDIR)/PEX
|
||||||
|
XAPPLOADDIR = $(LIBDIR)/app-defaults
|
||||||
|
FONTCFLAGS = -t
|
||||||
|
LINKKITDIR = $(USRLIBDIR)/Server
|
||||||
|
|
||||||
|
INSTAPPFLAGS = $(INSTDATFLAGS)
|
||||||
|
|
||||||
|
IMAKE = imake
|
||||||
|
DEPEND = makedepend
|
||||||
|
RGB = rgb
|
||||||
|
|
||||||
|
FONTC = bdftopcf
|
||||||
|
|
||||||
|
MKFONTDIR = mkfontdir
|
||||||
|
MKDIRHIER = /bin/sh $(BINDIR)/mkdirhier
|
||||||
|
|
||||||
|
CONFIGSRC = $(TOP)/config
|
||||||
|
DOCUTILSRC = $(TOP)/doc/util
|
||||||
|
CLIENTSRC = $(TOP)/clients
|
||||||
|
DEMOSRC = $(TOP)/demos
|
||||||
|
LIBSRC = $(TOP)/lib
|
||||||
|
FONTSRC = $(TOP)/fonts
|
||||||
|
INCLUDESRC = $(TOP)/X11
|
||||||
|
SERVERSRC = $(TOP)/server
|
||||||
|
UTILSRC = $(TOP)/util
|
||||||
|
SCRIPTSRC = $(UTILSRC)/scripts
|
||||||
|
EXAMPLESRC = $(TOP)/examples
|
||||||
|
CONTRIBSRC = $(TOP)/../contrib
|
||||||
|
DOCSRC = $(TOP)/doc
|
||||||
|
RGBSRC = $(TOP)/rgb
|
||||||
|
DEPENDSRC = $(UTILSRC)/makedepend
|
||||||
|
IMAKESRC = $(CONFIGSRC)
|
||||||
|
XAUTHSRC = $(LIBSRC)/Xau
|
||||||
|
XLIBSRC = $(LIBSRC)/X
|
||||||
|
XMUSRC = $(LIBSRC)/Xmu
|
||||||
|
TOOLKITSRC = $(LIBSRC)/Xt
|
||||||
|
AWIDGETSRC = $(LIBSRC)/Xaw
|
||||||
|
OLDXLIBSRC = $(LIBSRC)/oldX
|
||||||
|
XDMCPLIBSRC = $(LIBSRC)/Xdmcp
|
||||||
|
BDFTOSNFSRC = $(FONTSRC)/bdftosnf
|
||||||
|
BDFTOSNFSRC = $(FONTSRC)/clients/bdftosnf
|
||||||
|
BDFTOPCFSRC = $(FONTSRC)/clients/bdftopcf
|
||||||
|
MKFONTDIRSRC = $(FONTSRC)/clients/mkfontdir
|
||||||
|
FSLIBSRC = $(FONTSRC)/lib/fs
|
||||||
|
FONTSERVERSRC = $(FONTSRC)/server
|
||||||
|
EXTENSIONSRC = $(TOP)/extensions
|
||||||
|
XILIBSRC = $(EXTENSIONSRC)/lib/xinput
|
||||||
|
PEXLIBSRC = $(EXTENSIONSRC)/lib/PEXlib
|
||||||
|
PHIGSLIBSRC = $(EXTENSIONSRC)/lib/PEX
|
||||||
|
|
||||||
|
# $XFree86: mit/config/lnuxLib.tmpl,v 1.1 1993/04/16 14:06:06 dawes Exp $
|
||||||
|
|
||||||
|
SHLIBLDFLAGS =
|
||||||
|
PICFLAGS = -B/usr/dll/jump/
|
||||||
|
|
||||||
|
DEPEXTENSIONLIB =
|
||||||
|
EXTENSIONLIB = -lXext
|
||||||
|
|
||||||
|
DEPXLIB = $(DEPEXTENSIONLIB)
|
||||||
|
XLIB = $(EXTENSIONLIB) -lX11
|
||||||
|
|
||||||
|
DEPXMULIB =
|
||||||
|
XMULIB = -lXmu
|
||||||
|
|
||||||
|
DEPXTOOLLIB =
|
||||||
|
XTOOLLIB = -lXt
|
||||||
|
|
||||||
|
DEPXAWLIB =
|
||||||
|
XAWLIB = -lXaw
|
||||||
|
|
||||||
|
DEPXILIB =
|
||||||
|
XILIB = -lXi
|
||||||
|
|
||||||
|
DEPXTESTLIB =
|
||||||
|
XTESTLIB = -lXtst
|
||||||
|
|
||||||
|
DEPPEXLIB =
|
||||||
|
PEXLIB = -lPEX5
|
||||||
|
|
||||||
|
SOXLIBREV = 3.0.1
|
||||||
|
SOXTREV = 3.0.1
|
||||||
|
SOXAWREV = 3.0.1
|
||||||
|
SOOLDXREV = 3.0.1
|
||||||
|
SOXMUREV = 3.0.1
|
||||||
|
SOXEXTREV = 3.0.1
|
||||||
|
SOXINPUTREV = 3.0.1
|
||||||
|
SOPEXREV = 1.0.1
|
||||||
|
|
||||||
|
DEPXAUTHLIB = $(USRLIBDIR)/libXau.a
|
||||||
|
XAUTHLIB = -lXau
|
||||||
|
DEPXDMCPLIB = $(USRLIBDIR)/libXdmcp.a
|
||||||
|
XDMCPLIB = -lXdmcp
|
||||||
|
|
||||||
|
DEPOLDXLIB = $(USRLIBDIR)/liboldX.a
|
||||||
|
OLDXLIB = -loldX
|
||||||
|
|
||||||
|
DEPPHIGSLIB = $(USRLIBDIR)/libphigs.a
|
||||||
|
PHIGSLIB = -lphigs
|
||||||
|
|
||||||
|
DEPXBSDLIB = $(USRLIBDIR)/libXbsd.a
|
||||||
|
XBSDLIB = -lXbsd
|
||||||
|
|
||||||
|
LINTEXTENSIONLIB = $(LINTLIBDIR)/llib-lXext.ln
|
||||||
|
LINTXLIB = $(LINTLIBDIR)/llib-lX11.ln
|
||||||
|
LINTXMU = $(LINTLIBDIR)/llib-lXmu.ln
|
||||||
|
LINTXTOOL = $(LINTLIBDIR)/llib-lXt.ln
|
||||||
|
LINTXAW = $(LINTLIBDIR)/llib-lXaw.ln
|
||||||
|
LINTXI = $(LINTLIBDIR)/llib-lXi.ln
|
||||||
|
LINTPEX = $(LINTLIBDIR)/llib-lPEX5.ln
|
||||||
|
LINTPHIGS = $(LINTLIBDIR)/llib-lphigs.ln
|
||||||
|
|
||||||
|
DEPLIBS = $(DEPXAWLIB) $(DEPXMULIB) $(DEPXTOOLLIB) $(DEPXLIB)
|
||||||
|
|
||||||
|
DEPLIBS1 = $(DEPLIBS)
|
||||||
|
DEPLIBS2 = $(DEPLIBS)
|
||||||
|
DEPLIBS3 = $(DEPLIBS)
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# Imake rules for building libraries, programs, scripts, and data files
|
||||||
|
# $XFree86: mit/config/Imake.rules,v 1.9 1993/03/23 12:56:27 dawes Exp $
|
||||||
|
# rules: $XConsortium: Imake.rules,v 1.123 91/09/16 20:12:16 rws Exp $
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# start of Imakefile
|
||||||
|
|
||||||
|
# $Id$
|
||||||
|
|
||||||
|
INCLUDES = -I$(TOP)/include
|
||||||
|
|
||||||
|
# Imake rules go here
|
||||||
|
|
||||||
|
# First, dll description to files etc
|
||||||
|
|
||||||
|
MODULE = include
|
||||||
|
|
||||||
|
HEADERS = atom.h callback.h class.h combo.h cursor.h dce.h dialog.h dlls.h files.h gdi.h heap.h icon.h int21.h listbox.h menu.h message.h neexe.h prototypes.h regfunc.h scroll.h segmem.h user.h win.h windows.h wine.h
|
||||||
|
|
||||||
|
all::
|
||||||
|
|
||||||
|
depend::
|
||||||
|
|
||||||
|
clean::
|
||||||
|
$(RM_CMD) "#"*
|
||||||
|
|
||||||
|
includes::
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# common rules for all Makefiles - do not edit
|
||||||
|
|
||||||
|
emptyrule::
|
||||||
|
|
||||||
|
clean::
|
||||||
|
$(RM_CMD) "#"*
|
||||||
|
|
||||||
|
Makefile::
|
||||||
|
-@if [ -f Makefile ]; then set -x; \
|
||||||
|
$(RM) Makefile.bak; $(MV) Makefile Makefile.bak; \
|
||||||
|
else exit 0; fi
|
||||||
|
$(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR)
|
||||||
|
|
||||||
|
tags::
|
||||||
|
$(TAGS) -w *.[ch]
|
||||||
|
$(TAGS) -xw *.[ch] > TAGS
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# empty rules for directories that do not have SUBDIRS - do not edit
|
||||||
|
|
||||||
|
install::
|
||||||
|
@echo "install in $(CURRENT_DIR) done"
|
||||||
|
|
||||||
|
install.man::
|
||||||
|
@echo "install.man in $(CURRENT_DIR) done"
|
||||||
|
|
||||||
|
install.linkkit::
|
||||||
|
@echo "install.linkkit in $(CURRENT_DIR) done"
|
||||||
|
|
||||||
|
Makefiles::
|
||||||
|
|
||||||
|
includes::
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# dependencies generated by makedepend
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
/*
|
||||||
|
* Atom table definitions
|
||||||
|
*
|
||||||
|
* Copyright 1993 Alexandre Julliard
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ATOM_H
|
||||||
|
#define ATOM_H
|
||||||
|
|
||||||
|
#include "windows.h"
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
HANDLE next;
|
||||||
|
WORD refCount;
|
||||||
|
BYTE length;
|
||||||
|
BYTE str[1];
|
||||||
|
} ATOMENTRY;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
WORD size;
|
||||||
|
HANDLE entries[1];
|
||||||
|
} ATOMTABLE;
|
||||||
|
|
||||||
|
#endif /* ATOM_H */
|
|
@ -17,7 +17,7 @@ typedef struct tagCLASS
|
||||||
HCLASS hNext; /* Next class */
|
HCLASS hNext; /* Next class */
|
||||||
WORD wMagic; /* Magic number (must be CLASS_MAGIC) */
|
WORD wMagic; /* Magic number (must be CLASS_MAGIC) */
|
||||||
ATOM atomName; /* Name of the class */
|
ATOM atomName; /* Name of the class */
|
||||||
HDC hdc; /* Class DC (if CS_CLASSDC) */
|
HANDLE hdce; /* Class DCE (if CS_CLASSDC) */
|
||||||
WORD cWindows; /* Count of existing windows of this class */
|
WORD cWindows; /* Count of existing windows of this class */
|
||||||
WNDCLASS wc __attribute__ ((packed)); /* Class information */
|
WNDCLASS wc __attribute__ ((packed)); /* Class information */
|
||||||
WORD wExtra[1]; /* Class extra bytes */
|
WORD wExtra[1]; /* Class extra bytes */
|
||||||
|
|
|
@ -9,16 +9,27 @@
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
DCE_CACHE_DC, /* This is a cached DC (allocated by USER) */
|
||||||
|
DCE_CLASS_DC, /* This is a class DC (style CS_CLASSDC) */
|
||||||
|
DCE_WINDOW_DC /* This is a window DC (style CS_OWNDC) */
|
||||||
|
} DCE_TYPE;
|
||||||
|
|
||||||
|
|
||||||
typedef struct tagDCE
|
typedef struct tagDCE
|
||||||
{
|
{
|
||||||
HANDLE hNext;
|
HANDLE hNext;
|
||||||
HWND hwndCurrent;
|
HWND hwndCurrent;
|
||||||
HDC hdc;
|
HDC hdc;
|
||||||
BYTE flags;
|
DCE_TYPE type;
|
||||||
BOOL inUse;
|
BOOL inUse;
|
||||||
WORD xOrigin;
|
WORD xOrigin;
|
||||||
WORD yOrigin;
|
WORD yOrigin;
|
||||||
} DCE;
|
} DCE;
|
||||||
|
|
||||||
|
|
||||||
|
extern HANDLE DCE_AllocDCE( DCE_TYPE type );
|
||||||
|
extern void DCE_FreeDCE( HANDLE hdce );
|
||||||
|
|
||||||
#endif /* DCE_H */
|
#endif /* DCE_H */
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
#ifndef _FILES_H
|
|
||||||
#define _FILES_H
|
|
||||||
|
|
||||||
#define OPEN_MAX 256
|
|
||||||
|
|
||||||
/***************************************************************************
|
|
||||||
This structure stores the infomation needed for a single DOS drive
|
|
||||||
***************************************************************************/
|
|
||||||
struct DosDriveStruct
|
|
||||||
{
|
|
||||||
char RootDirectory [256]; /* Unix base for this drive letter */
|
|
||||||
char CurrentDirectory [256]; /* Current directory for this drive */
|
|
||||||
char VolumeLabel [11];
|
|
||||||
unsigned long serialnumber;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /*_FILES_H*/
|
|
|
@ -7,7 +7,7 @@
|
||||||
#ifndef GDI_H
|
#ifndef GDI_H
|
||||||
#define GDI_H
|
#define GDI_H
|
||||||
|
|
||||||
#include <X11/Intrinsic.h>
|
#include <X11/Xlib.h>
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
#include "segmem.h"
|
#include "segmem.h"
|
||||||
|
@ -158,6 +158,8 @@ typedef struct
|
||||||
WORD MapMode;
|
WORD MapMode;
|
||||||
short DCOrgX; /* DC origin */
|
short DCOrgX; /* DC origin */
|
||||||
short DCOrgY;
|
short DCOrgY;
|
||||||
|
short DCSizeX; /* DC dimensions */
|
||||||
|
short DCSizeY;
|
||||||
short CursPosX; /* Current position */
|
short CursPosX; /* Current position */
|
||||||
short CursPosY;
|
short CursPosY;
|
||||||
short WndOrgX;
|
short WndOrgX;
|
||||||
|
@ -200,7 +202,6 @@ typedef struct
|
||||||
{
|
{
|
||||||
GC gc; /* X Window GC */
|
GC gc; /* X Window GC */
|
||||||
Drawable drawable;
|
Drawable drawable;
|
||||||
Widget widget;
|
|
||||||
X_PHYSFONT font;
|
X_PHYSFONT font;
|
||||||
X_PHYSPEN pen;
|
X_PHYSPEN pen;
|
||||||
X_PHYSBRUSH brush;
|
X_PHYSBRUSH brush;
|
||||||
|
|
|
@ -1,15 +1,40 @@
|
||||||
#ifndef INT21_H
|
#ifndef INT21_H
|
||||||
#define INT21_H
|
#define INT21_H
|
||||||
|
#include <dirent.h>
|
||||||
|
|
||||||
|
struct dosdirent {
|
||||||
|
int inuse;
|
||||||
|
DIR *ds;
|
||||||
|
char unixpath[256];
|
||||||
|
char filename[256];
|
||||||
|
char attribute;
|
||||||
|
long filesize;
|
||||||
|
long filetime;
|
||||||
|
long filedate;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct diskinfo {
|
||||||
|
unsigned int infolevel;
|
||||||
|
unsigned long serialnumber;
|
||||||
|
char label[11];
|
||||||
|
char fstype[8];
|
||||||
|
};
|
||||||
|
|
||||||
#define DosVersion 0x0303;
|
#define DosVersion 0x0303;
|
||||||
|
|
||||||
#define SectorSize 0x200;
|
#define SectorSize 0x200;
|
||||||
#define SectorsPerCluster 0x04;
|
#define SectorsPerCluster 0x04;
|
||||||
|
|
||||||
#define AX context->sc_eax
|
#define EAX context->sc_eax
|
||||||
#define BX context->sc_ebx
|
#define EBX context->sc_ebx
|
||||||
#define CX context->sc_ecx
|
#define ECX context->sc_ecx
|
||||||
#define DX context->sc_edx
|
#define EDX context->sc_edx
|
||||||
|
|
||||||
|
#define AX (context->sc_eax & 0x0000ffffL)
|
||||||
|
#define BX (context->sc_ebx & 0x0000ffffL)
|
||||||
|
#define CX (context->sc_ecx & 0x0000ffffL)
|
||||||
|
#define DX (context->sc_edx & 0x0000ffffL)
|
||||||
|
|
||||||
#define ES context->sc_es
|
#define ES context->sc_es
|
||||||
#define DS context->sc_ds
|
#define DS context->sc_ds
|
||||||
#define DI context->sc_edi
|
#define DI context->sc_edi
|
||||||
|
@ -22,13 +47,6 @@
|
||||||
#define SetCflag (context->sc_efl |= 0x00000001L)
|
#define SetCflag (context->sc_efl |= 0x00000001L)
|
||||||
#define ResetCflag (context->sc_efl &= 0xfffffffeL)
|
#define ResetCflag (context->sc_efl &= 0xfffffffeL)
|
||||||
|
|
||||||
struct diskinfo {
|
|
||||||
WORD infolevel;
|
|
||||||
DWORD serialnumber;
|
|
||||||
char label[11];
|
|
||||||
char fstype[8];
|
|
||||||
};
|
|
||||||
|
|
||||||
/* extended error codes */
|
/* extended error codes */
|
||||||
|
|
||||||
#define NoError 0x00
|
#define NoError 0x00
|
||||||
|
|
|
@ -14,16 +14,17 @@ typedef LISTSTRUCT FAR* LPLISTSTRUCT;
|
||||||
|
|
||||||
typedef struct tagHEADLIST {
|
typedef struct tagHEADLIST {
|
||||||
short FirstVisible;
|
short FirstVisible;
|
||||||
short ItemSelect;
|
|
||||||
short ItemsCount;
|
short ItemsCount;
|
||||||
short ItemsVisible;
|
short ItemsVisible;
|
||||||
short ItemSelected;
|
short ColumnsVisible;
|
||||||
short PrevSelected;
|
short ItemsPerColumn;
|
||||||
|
short ItemFocused;
|
||||||
|
short PrevFocused;
|
||||||
short StdItemHeight;
|
short StdItemHeight;
|
||||||
|
short ColumnsWidth;
|
||||||
short DrawCtlType;
|
short DrawCtlType;
|
||||||
void *lpFirst;
|
void *lpFirst;
|
||||||
DWORD dwStyle;
|
DWORD dwStyle;
|
||||||
HWND hWndScroll;
|
|
||||||
HWND hWndLogicParent;
|
HWND hWndLogicParent;
|
||||||
} HEADLIST;
|
} HEADLIST;
|
||||||
typedef HEADLIST FAR* LPHEADLIST;
|
typedef HEADLIST FAR* LPHEADLIST;
|
||||||
|
|
|
@ -27,7 +27,10 @@ typedef struct tagMENUITEM
|
||||||
Widget w;
|
Widget w;
|
||||||
Widget menu_w;
|
Widget menu_w;
|
||||||
char menu_name[10];
|
char menu_name[10];
|
||||||
} MENUITEM;
|
RECT rect;
|
||||||
|
HBITMAP hCheckBit;
|
||||||
|
HBITMAP hUnCheckBit;
|
||||||
|
} MENUITEM, *LPMENUITEM;
|
||||||
|
|
||||||
typedef struct tagMENUBAR
|
typedef struct tagMENUBAR
|
||||||
{
|
{
|
||||||
|
@ -40,6 +43,16 @@ typedef struct tagMENUBAR
|
||||||
MENUITEM *firstItem;
|
MENUITEM *firstItem;
|
||||||
} MENUBAR, *LPMENUBAR;
|
} MENUBAR, *LPMENUBAR;
|
||||||
|
|
||||||
|
typedef struct tagPOPUPMENU
|
||||||
|
{
|
||||||
|
HWND hWnd; /* PopupMenu window handle */
|
||||||
|
HWND ownerWnd; /* Owner window */
|
||||||
|
WORD nItems; /* Number of items on menu */
|
||||||
|
MENUITEM *firstItem;
|
||||||
|
WORD FocusedItem;
|
||||||
|
WORD MouseFlags;
|
||||||
|
} POPUPMENU, *LPPOPUPMENU;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
WORD version; /* Should be zero */
|
WORD version; /* Should be zero */
|
||||||
|
|
|
@ -12,8 +12,8 @@
|
||||||
/* Message as stored in the queue (contains the extraInfo field) */
|
/* Message as stored in the queue (contains the extraInfo field) */
|
||||||
typedef struct tagQMSG
|
typedef struct tagQMSG
|
||||||
{
|
{
|
||||||
|
DWORD extraInfo; /* Only in 3.1 */
|
||||||
MSG msg;
|
MSG msg;
|
||||||
DWORD extraInfo __attribute__ ((packed)); /* Only in 3.1 */
|
|
||||||
} QMSG;
|
} QMSG;
|
||||||
|
|
||||||
|
|
||||||
|
@ -28,17 +28,28 @@ typedef struct tagMESSAGEQUEUE
|
||||||
WORD queueSize; /* Size of the queue */
|
WORD queueSize; /* Size of the queue */
|
||||||
DWORD GetMessageTimeVal; /* Value returned by GetMessageTime */
|
DWORD GetMessageTimeVal; /* Value returned by GetMessageTime */
|
||||||
DWORD GetMessagePosVal; /* Value returned by GetMessagePos */
|
DWORD GetMessagePosVal; /* Value returned by GetMessagePos */
|
||||||
WORD GetMessageExtraInfoVal; /* Value returned by GetMessageExtraInfo */
|
DWORD GetMessageExtraInfoVal; /* Value returned by GetMessageExtraInfo */
|
||||||
DWORD lParam; /* Next four values set by SetMessage */
|
DWORD lParam; /* Next four values set by SendMessage */
|
||||||
WORD wParam;
|
WORD wParam;
|
||||||
WORD msg;
|
WORD msg;
|
||||||
WORD hWnd;
|
WORD hWnd;
|
||||||
WORD wPostQMsg; /* PostQuitMessage flag */
|
WORD wPostQMsg; /* PostQuitMessage flag */
|
||||||
WORD wExitCode; /* PostQuitMessage exit code */
|
WORD wExitCode; /* PostQuitMessage exit code */
|
||||||
WORD InSendMessageHandle; /* Handle of task that sent a message */
|
WORD InSendMessageHandle; /* Handle of task that sent a message */
|
||||||
|
WORD wPaintCount; /* Number of WM_PAINT needed */
|
||||||
|
WORD wTimerCount; /* Number of timers for this application */
|
||||||
WORD tempStatus; /* State reset by GetQueueStatus */
|
WORD tempStatus; /* State reset by GetQueueStatus */
|
||||||
WORD status; /* Queue state */
|
WORD status; /* Queue state */
|
||||||
QMSG messages[1]; /* Queue messages */
|
QMSG messages[1]; /* Queue messages */
|
||||||
} MESSAGEQUEUE;
|
} MESSAGEQUEUE;
|
||||||
|
|
||||||
|
|
||||||
|
extern void MSG_IncPaintCount( HANDLE hQueue );
|
||||||
|
extern void MSG_DecPaintCount( HANDLE hQueue );
|
||||||
|
extern void MSG_IncTimerCount( HANDLE hQueue );
|
||||||
|
extern void MSG_DecTimerCount( HANDLE hQueue );
|
||||||
|
extern BOOL MSG_CreateSysMsgQueue( int size );
|
||||||
|
extern void hardware_event(HWND hwnd, WORD message, WORD wParam, LONG lParam,
|
||||||
|
WORD xPos, WORD yPos, DWORD time, DWORD extraInfo);
|
||||||
|
|
||||||
#endif /* MESSAGE_H */
|
#endif /* MESSAGE_H */
|
||||||
|
|
|
@ -136,7 +136,9 @@ struct relocation_entry_s
|
||||||
/* Used by Windows 3.0 programs, like when getting selector to be
|
/* Used by Windows 3.0 programs, like when getting selector to be
|
||||||
given to makeprocinst */
|
given to makeprocinst */
|
||||||
#define NE_RELTYPE_INT1 4
|
#define NE_RELTYPE_INT1 4
|
||||||
#define NE_RELTYPE_OFFSET16 5
|
#define NE_RELTYPE_ORDINALADD 5
|
||||||
|
#define NE_RELTYPE_NAMEADD 6
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* DOS PSP
|
* DOS PSP
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include "neexe.h"
|
#include "neexe.h"
|
||||||
#include "segmem.h"
|
#include "segmem.h"
|
||||||
#include "wine.h"
|
#include "wine.h"
|
||||||
|
#include "int21.h"
|
||||||
|
|
||||||
extern struct segment_descriptor_s *
|
extern struct segment_descriptor_s *
|
||||||
CreateSelectors(struct w_files *);
|
CreateSelectors(struct w_files *);
|
||||||
|
@ -33,5 +34,15 @@ extern int CurrentNEFile;
|
||||||
extern do_int1A(struct sigcontext_struct * context);
|
extern do_int1A(struct sigcontext_struct * context);
|
||||||
extern do_int21(struct sigcontext_struct * context);
|
extern do_int21(struct sigcontext_struct * context);
|
||||||
|
|
||||||
#endif /* PROTOTYPES_H */
|
extern void GetUnixDirName(char *rootdir, char *name);
|
||||||
|
extern char *GetDirectUnixFileName(char *dosfilename);
|
||||||
|
extern char *GetUnixFileName(char *dosfilename);
|
||||||
|
|
||||||
|
extern char *FindFile(char *buffer, int buflen, char *rootname, char **extensions, char *path);
|
||||||
|
extern char *WineIniFileName(void);
|
||||||
|
extern char *WinIniFileName(void);
|
||||||
|
extern struct dosdirent *DOS_opendir(char *dosdirname);
|
||||||
|
extern struct dosdirent *DOS_readdir(struct dosdirent *de);
|
||||||
|
extern void DOS_closedir(struct dosdirent *de);
|
||||||
|
|
||||||
|
#endif /* PROTOTYPES_H */
|
||||||
|
|
|
@ -6,6 +6,12 @@
|
||||||
#ifndef SEGMEM_H
|
#ifndef SEGMEM_H
|
||||||
#define SEGMEM_H
|
#define SEGMEM_H
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
|
#define HAVE_IPC
|
||||||
|
#include <sys/ipc.h>
|
||||||
|
#include <sys/shm.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Array to track selector allocation.
|
* Array to track selector allocation.
|
||||||
*/
|
*/
|
||||||
|
@ -15,21 +21,32 @@
|
||||||
|
|
||||||
extern unsigned short SelectorMap[MAX_SELECTORS];
|
extern unsigned short SelectorMap[MAX_SELECTORS];
|
||||||
|
|
||||||
|
#ifdef HAVE_IPC
|
||||||
|
#define SAFEMAKEPTR(s, o) (((int) (s) << 16) | ((o) & 0xffff))
|
||||||
|
#define FIXPTR(p) (p)
|
||||||
|
#else
|
||||||
#define SAFEMAKEPTR(s, o) \
|
#define SAFEMAKEPTR(s, o) \
|
||||||
(((int) SelectorMap[SelectorMap[(s) >> 3] & SELECTOR_INDEXMASK] << 19) \
|
(((int) SelectorMap[SelectorMap[(s) >> 3] & SELECTOR_INDEXMASK] << 19) \
|
||||||
| 0x70000 | ((o) & 0xffff))
|
| 0x70000 | ((o) & 0xffff))
|
||||||
|
#define FIXPTR(p) SAFEMAKEPTR((unsigned long) (p) >> 16, (p))
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Structure to hold info about each selector we create.
|
* Structure to hold info about each selector we create.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct segment_descriptor_s
|
typedef struct segment_descriptor_s
|
||||||
{
|
{
|
||||||
void *base_addr; /* Pointer to segment in flat memory */
|
void *base_addr; /* Pointer to segment in flat memory */
|
||||||
unsigned int length; /* Length of segment */
|
unsigned int length; /* Length of segment */
|
||||||
unsigned int flags; /* Segment flags (see neexe.h and below)*/
|
unsigned int flags; /* Segment flags (see neexe.h and below)*/
|
||||||
unsigned short selector; /* Selector used to access this segment */
|
unsigned short selector; /* Selector used to access this segment */
|
||||||
};
|
unsigned short owner; /* Handle of owner program */
|
||||||
|
unsigned char type; /* DATA or CODE */
|
||||||
|
#ifdef HAVE_IPC
|
||||||
|
key_t shm_key; /* Shared memory key or IPC_PRIVATE */
|
||||||
|
#endif
|
||||||
|
} SEGDESC;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Additional flags
|
* Additional flags
|
||||||
|
|
|
@ -15,6 +15,8 @@
|
||||||
extern MDESC *USER_Heap;
|
extern MDESC *USER_Heap;
|
||||||
|
|
||||||
#define USER_HEAP_ALLOC(f,size) ((int)HEAP_Alloc(&USER_Heap,f,size) & 0xffff)
|
#define USER_HEAP_ALLOC(f,size) ((int)HEAP_Alloc(&USER_Heap,f,size) & 0xffff)
|
||||||
|
#define USER_HEAP_REALLOC(handle,size,f) ((int)HEAP_ReAlloc(&USER_Heap, \
|
||||||
|
USER_HEAP_ADDR(handle),size,f) & 0xffff)
|
||||||
#define USER_HEAP_ADDR(handle) ((void *)(handle|((int)USER_Heap & 0xffff0000)))
|
#define USER_HEAP_ADDR(handle) ((void *)(handle|((int)USER_Heap & 0xffff0000)))
|
||||||
#define USER_HEAP_FREE(handle) (HEAP_Free(&USER_Heap,USER_HEAP_ADDR(handle)))
|
#define USER_HEAP_FREE(handle) (HEAP_Free(&USER_Heap,USER_HEAP_ADDR(handle)))
|
||||||
|
|
||||||
|
|
|
@ -8,8 +8,6 @@
|
||||||
#define WIN_H
|
#define WIN_H
|
||||||
|
|
||||||
#include <X11/Intrinsic.h>
|
#include <X11/Intrinsic.h>
|
||||||
#include <X11/StringDefs.h>
|
|
||||||
#include <X11/Core.h>
|
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
|
@ -26,31 +24,41 @@ typedef struct tagWND
|
||||||
HWND hwndOwner; /* Window owner */
|
HWND hwndOwner; /* Window owner */
|
||||||
HCLASS hClass; /* Window class */
|
HCLASS hClass; /* Window class */
|
||||||
HANDLE hInstance; /* Window hInstance (from CreateWindow) */
|
HANDLE hInstance; /* Window hInstance (from CreateWindow) */
|
||||||
RECT rectClient; /* Window client area screen coords */
|
RECT rectClient; /* Client area rel. to parent client area */
|
||||||
RECT rectWindow; /* Window whole area screen coords */
|
RECT rectWindow; /* Whole window rel. to parent client area */
|
||||||
|
HANDLE hmemTaskQ; /* Task queue global memory handle */
|
||||||
HRGN hrgnUpdate; /* Update region */
|
HRGN hrgnUpdate; /* Update region */
|
||||||
HWND hwndLastActive; /* Last active popup hwnd */
|
HWND hwndLastActive; /* Last active popup hwnd */
|
||||||
FARPROC lpfnWndProc; /* Window procedure */
|
FARPROC lpfnWndProc; /* Window procedure */
|
||||||
DWORD dwStyle; /* Window style (from CreateWindow) */
|
DWORD dwStyle; /* Window style (from CreateWindow) */
|
||||||
DWORD dwExStyle; /* Extended style (from CreateWindowEx) */
|
DWORD dwExStyle; /* Extended style (from CreateWindowEx) */
|
||||||
HDC hdc; /* Window DC (if CS_OWNDC) */
|
HANDLE hdce; /* Window DCE (if CS_OWNDC or CS_CLASSDC) */
|
||||||
HMENU hmenuSystem; /* System menu */
|
HMENU hmenuSystem; /* System menu */
|
||||||
|
HCURSOR hCursor; /* Window Current Cursor */
|
||||||
|
HWND hWndVScroll; /* Verti. ScrollBar handle of the window */
|
||||||
|
HWND hWndHScroll; /* Horiz. ScrollBar handle of the window */
|
||||||
WORD wIDmenu; /* ID or hmenu (from CreateWindow) */
|
WORD wIDmenu; /* ID or hmenu (from CreateWindow) */
|
||||||
HANDLE hText; /* Handle of window text */
|
HANDLE hText; /* Handle of window text */
|
||||||
WORD flags; /* Misc. flags */
|
WORD flags; /* Misc. flags */
|
||||||
Widget shellWidget; /* For top-level windows */
|
Widget shellWidget; /* For top-level windows */
|
||||||
Widget winWidget; /* For all windows */
|
Widget winWidget; /* For all windows */
|
||||||
Widget compositeWidget;/* For top-level windows */
|
Widget compositeWidget;/* For top-level windows */
|
||||||
|
Window window; /* X window */
|
||||||
LPMENUBAR menuBarPtr; /* Menu bar */
|
LPMENUBAR menuBarPtr; /* Menu bar */
|
||||||
WORD wExtra[1]; /* Window extra bytes */
|
WORD wExtra[1]; /* Window extra bytes */
|
||||||
} WND;
|
} WND;
|
||||||
|
|
||||||
/* WND flags values */
|
/* WND flags values */
|
||||||
#define WIN_ERASE_UPDATERGN 1 /* Update region needs erasing */
|
#define WIN_ERASE_UPDATERGN 0x01 /* Update region needs erasing */
|
||||||
|
#define WIN_NEEDS_BEGINPAINT 0x02 /* WM_PAINT sent to window */
|
||||||
|
#define WIN_GOT_SIZEMSG 0x04 /* WM_SIZE has been sent to the window */
|
||||||
|
#define WIN_OWN_DC 0x08 /* Win class has style CS_OWNDC */
|
||||||
|
#define WIN_CLASS_DC 0x10 /* Win class has style CS_CLASSDC */
|
||||||
|
|
||||||
/* Window functions */
|
/* Window functions */
|
||||||
WND * WIN_FindWndPtr( HWND hwnd );
|
WND *WIN_FindWndPtr( HWND hwnd );
|
||||||
|
BOOL WIN_UnlinkWindow( HWND hwnd );
|
||||||
|
BOOL WIN_LinkWindow( HWND hwnd, HWND hwndInsertAfter );
|
||||||
HWND WIN_FindWinToRepaint( HWND hwnd );
|
HWND WIN_FindWinToRepaint( HWND hwnd );
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -64,7 +64,8 @@ typedef int *LPCATCHBUF;
|
||||||
#define LOWORD(l) ((WORD)(l))
|
#define LOWORD(l) ((WORD)(l))
|
||||||
#define HIWORD(l) ((WORD)((DWORD)(l) >> 16))
|
#define HIWORD(l) ((WORD)((DWORD)(l) >> 16))
|
||||||
|
|
||||||
#define MAKELONG(low, high) ((LONG)(((WORD)(low)) | (((DWORD)((WORD)(high))) << 16)))
|
#define MAKELONG(low, high) ((LONG)(((WORD)(low)) | \
|
||||||
|
(((DWORD)((WORD)(high))) << 16)))
|
||||||
|
|
||||||
#ifndef max
|
#ifndef max
|
||||||
#define max(a,b) (((a) > (b)) ? (a) : (b))
|
#define max(a,b) (((a) > (b)) ? (a) : (b))
|
||||||
|
@ -208,6 +209,36 @@ typedef struct {
|
||||||
#define GW_OWNER 4
|
#define GW_OWNER 4
|
||||||
#define GW_CHILD 5
|
#define GW_CHILD 5
|
||||||
|
|
||||||
|
/* WM_WINDOWPOSCHANGING/CHANGED struct */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
HWND hwnd;
|
||||||
|
HWND hwndInsertAfter;
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
int cx;
|
||||||
|
int cy;
|
||||||
|
UINT flags;
|
||||||
|
} WINDOWPOS;
|
||||||
|
|
||||||
|
/* WM_NCCALCSIZE parameter structure */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
RECT rgrc[3];
|
||||||
|
WINDOWPOS FAR* lppos;
|
||||||
|
} NCCALCSIZE_PARAMS;
|
||||||
|
|
||||||
|
/* WM_NCCALCSIZE return flags */
|
||||||
|
#define WVR_ALIGNTOP 0x0010
|
||||||
|
#define WVR_ALIGNLEFT 0x0020
|
||||||
|
#define WVR_ALIGNBOTTOM 0x0040
|
||||||
|
#define WVR_ALIGNRIGHT 0x0080
|
||||||
|
#define WVR_HREDRAW 0x0100
|
||||||
|
#define WVR_VREDRAW 0x0200
|
||||||
|
#define WVR_REDRAW (WVR_HREDRAW | WVR_VREDRAW)
|
||||||
|
#define WVR_VALIDRECTS 0x0400
|
||||||
|
|
||||||
|
|
||||||
/* Dialogs */
|
/* Dialogs */
|
||||||
|
|
||||||
/* cbWndExtra bytes for dialog class */
|
/* cbWndExtra bytes for dialog class */
|
||||||
|
@ -275,6 +306,9 @@ typedef struct tagMSG
|
||||||
|
|
||||||
typedef WORD ATOM;
|
typedef WORD ATOM;
|
||||||
|
|
||||||
|
#define MAKEINTATOM(i) ((LPCSTR)MAKELP(0, (i)))
|
||||||
|
|
||||||
|
|
||||||
/* Raster operations */
|
/* Raster operations */
|
||||||
|
|
||||||
#define R2_BLACK 1
|
#define R2_BLACK 1
|
||||||
|
@ -558,6 +592,19 @@ typedef struct tagLOGPEN
|
||||||
#define RGN_DIFF 4
|
#define RGN_DIFF 4
|
||||||
#define RGN_COPY 5
|
#define RGN_COPY 5
|
||||||
|
|
||||||
|
/* Device contexts */
|
||||||
|
|
||||||
|
/* GetDCEx flags */
|
||||||
|
#define DCX_WINDOW 0x00000001
|
||||||
|
#define DCX_CACHE 0x00000002
|
||||||
|
#define DCX_CLIPCHILDREN 0x00000008
|
||||||
|
#define DCX_CLIPSIBLINGS 0x00000010
|
||||||
|
#define DCX_PARENTCLIP 0x00000020
|
||||||
|
#define DCX_EXCLUDERGN 0x00000040
|
||||||
|
#define DCX_INTERSECTRGN 0x00000080
|
||||||
|
#define DCX_LOCKWINDOWUPDATE 0x00000400
|
||||||
|
#define DCX_USESTYLE 0x00010000
|
||||||
|
|
||||||
/* Polygon modes */
|
/* Polygon modes */
|
||||||
#define ALTERNATE 1
|
#define ALTERNATE 1
|
||||||
#define WINDING 2
|
#define WINDING 2
|
||||||
|
@ -797,18 +844,6 @@ typedef struct tagBITMAPCOREHEADER
|
||||||
#define DIB_PAL_COLORS 1
|
#define DIB_PAL_COLORS 1
|
||||||
#define CBM_INIT 4
|
#define CBM_INIT 4
|
||||||
|
|
||||||
|
|
||||||
/* Unimplemented structs */
|
|
||||||
typedef struct {
|
|
||||||
BYTE Id; /* much more .... */
|
|
||||||
} DCB;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
BYTE i; /* much more .... */
|
|
||||||
} COMSTAT;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
BYTE i; /* much more .... */
|
BYTE i; /* much more .... */
|
||||||
} KANJISTRUCT;
|
} KANJISTRUCT;
|
||||||
|
@ -842,6 +877,160 @@ typedef OFSTRUCT *LPOFSTRUCT;
|
||||||
#define OF_SHARE_EXCLUSIVE 0x0010
|
#define OF_SHARE_EXCLUSIVE 0x0010
|
||||||
#define OF_VERIFY 0x0400
|
#define OF_VERIFY 0x0400
|
||||||
|
|
||||||
|
#define DRIVE_REMOVABLE 2
|
||||||
|
#define DRIVE_FIXED 3
|
||||||
|
#define DRIVE_REMOTE 4
|
||||||
|
|
||||||
|
#define HFILE_ERROR -1
|
||||||
|
|
||||||
|
#define DDL_READWRITE 0x0000
|
||||||
|
#define DDL_READONLY 0x0001
|
||||||
|
#define DDL_HIDDEN 0x0002
|
||||||
|
#define DDL_SYSTEM 0x0004
|
||||||
|
#define DDL_DIRECTORY 0x0010
|
||||||
|
#define DDL_ARCHIVE 0x0020
|
||||||
|
|
||||||
|
#define DDL_POSTMSGS 0x2000
|
||||||
|
#define DDL_DRIVES 0x4000
|
||||||
|
#define DDL_EXCLUSIVE 0x8000
|
||||||
|
|
||||||
|
/* comm */
|
||||||
|
|
||||||
|
#define CBR_110 0xFF10
|
||||||
|
#define CBR_300 0xFF11
|
||||||
|
#define CBR_600 0xFF12
|
||||||
|
#define CBR_1200 0xFF13
|
||||||
|
#define CBR_2400 0xFF14
|
||||||
|
#define CBR_4800 0xFF15
|
||||||
|
#define CBR_9600 0xFF16
|
||||||
|
#define CBR_14400 0xFF17
|
||||||
|
#define CBR_19200 0xFF18
|
||||||
|
#define CBR_38400 0xFF1B
|
||||||
|
#define CBR_56000 0xFF1F
|
||||||
|
#define CBR_128000 0xFF23
|
||||||
|
#define CBR_256000 0xFF27
|
||||||
|
|
||||||
|
#define NOPARITY 0
|
||||||
|
#define ODDPARITY 1
|
||||||
|
#define EVENPARITY 2
|
||||||
|
#define MARKPARITY 3
|
||||||
|
#define SPACEPARITY 4
|
||||||
|
#define ONESTOPBIT 0
|
||||||
|
#define ONE5STOPBITS 1
|
||||||
|
#define TWOSTOPBITS 2
|
||||||
|
#define IGNORE 0
|
||||||
|
#define INFINITE 0xFFFF
|
||||||
|
|
||||||
|
#define CE_RXOVER 0x0001
|
||||||
|
#define CE_OVERRUN 0x0002
|
||||||
|
#define CE_RXPARITY 0x0004
|
||||||
|
#define CE_FRAME 0x0008
|
||||||
|
#define CE_BREAK 0x0010
|
||||||
|
#define CE_CTSTO 0x0020
|
||||||
|
#define CE_DSRTO 0x0040
|
||||||
|
#define CE_RLSDTO 0x0080
|
||||||
|
#define CE_TXFULL 0x0100
|
||||||
|
#define CE_PTO 0x0200
|
||||||
|
#define CE_IOE 0x0400
|
||||||
|
#define CE_DNS 0x0800
|
||||||
|
#define CE_OOP 0x1000
|
||||||
|
#define CE_MODE 0x8000
|
||||||
|
|
||||||
|
#define IE_BADID -1
|
||||||
|
#define IE_OPEN -2
|
||||||
|
#define IE_NOPEN -3
|
||||||
|
#define IE_MEMORY -4
|
||||||
|
#define IE_DEFAULT -5
|
||||||
|
#define IE_HARDWARE -10
|
||||||
|
#define IE_BYTESIZE -11
|
||||||
|
#define IE_BAUDRATE -12
|
||||||
|
|
||||||
|
#define EV_RXCHAR 0x0001
|
||||||
|
#define EV_RXFLAG 0x0002
|
||||||
|
#define EV_TXEMPTY 0x0004
|
||||||
|
#define EV_CTS 0x0008
|
||||||
|
#define EV_DSR 0x0010
|
||||||
|
#define EV_RLSD 0x0020
|
||||||
|
#define EV_BREAK 0x0040
|
||||||
|
#define EV_ERR 0x0080
|
||||||
|
#define EV_RING 0x0100
|
||||||
|
#define EV_PERR 0x0200
|
||||||
|
#define EV_CTSS 0x0400
|
||||||
|
#define EV_DSRS 0x0800
|
||||||
|
#define EV_RLSDS 0x1000
|
||||||
|
#define EV_RINGTE 0x2000
|
||||||
|
#define EV_RingTe EV_RINGTE
|
||||||
|
|
||||||
|
#define SETXOFF 1
|
||||||
|
#define SETXON 2
|
||||||
|
#define SETRTS 3
|
||||||
|
#define CLRRTS 4
|
||||||
|
#define SETDTR 5
|
||||||
|
#define CLRDTR 6
|
||||||
|
#define RESETDEV 7
|
||||||
|
#define GETMAXLPT 8
|
||||||
|
#define GETMAXCOM 9
|
||||||
|
#define GETBASEIRQ 10
|
||||||
|
|
||||||
|
#define CN_RECEIVE 0x0001
|
||||||
|
#define CN_TRANSMIT 0x0002
|
||||||
|
#define CN_EVENT 0x0004
|
||||||
|
|
||||||
|
typedef struct tagDCB
|
||||||
|
{
|
||||||
|
BYTE Id;
|
||||||
|
UINT BaudRate;
|
||||||
|
BYTE ByteSize;
|
||||||
|
BYTE Parity;
|
||||||
|
BYTE StopBits;
|
||||||
|
UINT RlsTimeout;
|
||||||
|
UINT CtsTimeout;
|
||||||
|
UINT DsrTimeout;
|
||||||
|
|
||||||
|
UINT fBinary :1;
|
||||||
|
UINT fRtsDisable :1;
|
||||||
|
UINT fParity :1;
|
||||||
|
UINT fOutxCtsFlow :1;
|
||||||
|
UINT fOutxDsrFlow :1;
|
||||||
|
UINT fDummy :2;
|
||||||
|
UINT fDtrDisable :1;
|
||||||
|
|
||||||
|
UINT fOutX :1;
|
||||||
|
UINT fInX :1;
|
||||||
|
UINT fPeChar :1;
|
||||||
|
UINT fNull :1;
|
||||||
|
UINT fChEvt :1;
|
||||||
|
UINT fDtrflow :1;
|
||||||
|
UINT fRtsflow :1;
|
||||||
|
UINT fDummy2 :1;
|
||||||
|
|
||||||
|
char XonChar;
|
||||||
|
char XoffChar;
|
||||||
|
UINT XonLim;
|
||||||
|
UINT XoffLim;
|
||||||
|
char PeChar;
|
||||||
|
char EofChar;
|
||||||
|
char EvtChar;
|
||||||
|
UINT TxDelay;
|
||||||
|
} DCB;
|
||||||
|
typedef DCB FAR* LPDCB;
|
||||||
|
|
||||||
|
typedef struct tagCOMSTAT
|
||||||
|
{
|
||||||
|
BYTE status;
|
||||||
|
UINT cbInQue;
|
||||||
|
UINT cbOutQue;
|
||||||
|
} COMSTAT;
|
||||||
|
|
||||||
|
#define CSTF_CTSHOLD 0x01
|
||||||
|
#define CSTF_DSRHOLD 0x02
|
||||||
|
#define CSTF_RLSDHOLD 0x04
|
||||||
|
#define CSTF_XOFFHOLD 0x08
|
||||||
|
#define CSTF_XOFFSENT 0x10
|
||||||
|
#define CSTF_EOF 0x20
|
||||||
|
#define CSTF_TXIM 0x40
|
||||||
|
|
||||||
|
/* */
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -903,8 +1092,12 @@ enum { WM_NULL, WM_CREATE, WM_DESTROY, WM_MOVE, WM_UNUSED0, WM_SIZE, WM_ACTIVATE
|
||||||
WM_DELETEITEM, WM_VKEYTOITEM,
|
WM_DELETEITEM, WM_VKEYTOITEM,
|
||||||
WM_CHARTOITEM, WM_SETFONT, WM_GETFONT };
|
WM_CHARTOITEM, WM_SETFONT, WM_GETFONT };
|
||||||
|
|
||||||
|
#define WM_WINDOWPOSCHANGING 0x0046
|
||||||
|
#define WM_WINDOWPOSCHANGED 0x0047
|
||||||
|
|
||||||
#define WM_NCCREATE 0x0081
|
#define WM_NCCREATE 0x0081
|
||||||
#define WM_NCDESTROY 0x0082
|
#define WM_NCDESTROY 0x0082
|
||||||
|
#define WM_NCCALCSIZE 0x0083
|
||||||
|
|
||||||
#define WM_GETDLGCODE 0x0087
|
#define WM_GETDLGCODE 0x0087
|
||||||
|
|
||||||
|
@ -1008,6 +1201,12 @@ enum { SW_HIDE, SW_SHOWNORMAL, SW_NORMAL, SW_SHOWMINIMIZED, SW_SHOWMAXIMIZED,
|
||||||
#define HWND_TOPMOST ((HWND)-1)
|
#define HWND_TOPMOST ((HWND)-1)
|
||||||
#define HWND_NOTOPMOST ((HWND)-2)
|
#define HWND_NOTOPMOST ((HWND)-2)
|
||||||
|
|
||||||
|
/* Flags for TrackPopupMenu */
|
||||||
|
#define TPM_LEFTBUTTON 0x0000
|
||||||
|
#define TPM_RIGHTBUTTON 0x0002
|
||||||
|
#define TPM_LEFTALIGN 0x0000
|
||||||
|
#define TPM_CENTERALIGN 0x0004
|
||||||
|
#define TPM_RIGHTALIGN 0x0008
|
||||||
|
|
||||||
#define MF_INSERT 0
|
#define MF_INSERT 0
|
||||||
#define MF_CHANGE 0x0080
|
#define MF_CHANGE 0x0080
|
||||||
|
@ -1016,7 +1215,7 @@ enum { SW_HIDE, SW_SHOWNORMAL, SW_NORMAL, SW_SHOWMINIMIZED, SW_SHOWMAXIMIZED,
|
||||||
#define MF_REMOVE 0x1000
|
#define MF_REMOVE 0x1000
|
||||||
#define MF_BYCOMMAND 0
|
#define MF_BYCOMMAND 0
|
||||||
#define MF_BYPOSITION 0x0400
|
#define MF_BYPOSITION 0x0400
|
||||||
#define MF_SEPARATOR 0x080
|
#define MF_SEPARATOR 0x0800
|
||||||
#define MF_ENABLED 0
|
#define MF_ENABLED 0
|
||||||
#define MF_GRAYED 0x0001
|
#define MF_GRAYED 0x0001
|
||||||
#define MF_DISABLED 0x0002
|
#define MF_DISABLED 0x0002
|
||||||
|
@ -1492,6 +1691,80 @@ typedef struct tagCOMPAREITEMSTRUCT
|
||||||
typedef COMPAREITEMSTRUCT NEAR* PCOMPAREITEMSTRUCT;
|
typedef COMPAREITEMSTRUCT NEAR* PCOMPAREITEMSTRUCT;
|
||||||
typedef COMPAREITEMSTRUCT FAR* LPCOMPAREITEMSTRUCT;
|
typedef COMPAREITEMSTRUCT FAR* LPCOMPAREITEMSTRUCT;
|
||||||
|
|
||||||
|
/* Virtual key codes */
|
||||||
|
#define VK_LBUTTON 0x01
|
||||||
|
#define VK_RBUTTON 0x02
|
||||||
|
#define VK_CANCEL 0x03
|
||||||
|
#define VK_MBUTTON 0x04
|
||||||
|
#define VK_BACK 0x08
|
||||||
|
#define VK_TAB 0x09
|
||||||
|
#define VK_CLEAR 0x0C
|
||||||
|
#define VK_RETURN 0x0D
|
||||||
|
#define VK_SHIFT 0x10
|
||||||
|
#define VK_CONTROL 0x11
|
||||||
|
#define VK_MENU 0x12
|
||||||
|
#define VK_PAUSE 0x13
|
||||||
|
#define VK_CAPITAL 0x14
|
||||||
|
#define VK_ESCAPE 0x1B
|
||||||
|
#define VK_SPACE 0x20
|
||||||
|
#define VK_PRIOR 0x21
|
||||||
|
#define VK_NEXT 0x22
|
||||||
|
#define VK_END 0x23
|
||||||
|
#define VK_HOME 0x24
|
||||||
|
#define VK_LEFT 0x25
|
||||||
|
#define VK_UP 0x26
|
||||||
|
#define VK_RIGHT 0x27
|
||||||
|
#define VK_DOWN 0x28
|
||||||
|
#define VK_SELECT 0x29
|
||||||
|
#define VK_PRINT 0x2A
|
||||||
|
#define VK_EXECUTE 0x2B
|
||||||
|
#define VK_SNAPSHOT 0x2C
|
||||||
|
#define VK_INSERT 0x2D
|
||||||
|
#define VK_DELETE 0x2E
|
||||||
|
#define VK_HELP 0x2F
|
||||||
|
#define VK_NUMPAD0 0x60
|
||||||
|
#define VK_NUMPAD1 0x61
|
||||||
|
#define VK_NUMPAD2 0x62
|
||||||
|
#define VK_NUMPAD3 0x63
|
||||||
|
#define VK_NUMPAD4 0x64
|
||||||
|
#define VK_NUMPAD5 0x65
|
||||||
|
#define VK_NUMPAD6 0x66
|
||||||
|
#define VK_NUMPAD7 0x67
|
||||||
|
#define VK_NUMPAD8 0x68
|
||||||
|
#define VK_NUMPAD9 0x69
|
||||||
|
#define VK_MULTIPLY 0x6A
|
||||||
|
#define VK_ADD 0x6B
|
||||||
|
#define VK_SEPARATOR 0x6C
|
||||||
|
#define VK_SUBTRACT 0x6D
|
||||||
|
#define VK_DECIMAL 0x6E
|
||||||
|
#define VK_DIVIDE 0x6F
|
||||||
|
#define VK_F1 0x70
|
||||||
|
#define VK_F2 0x71
|
||||||
|
#define VK_F3 0x72
|
||||||
|
#define VK_F4 0x73
|
||||||
|
#define VK_F5 0x74
|
||||||
|
#define VK_F6 0x75
|
||||||
|
#define VK_F7 0x76
|
||||||
|
#define VK_F8 0x77
|
||||||
|
#define VK_F9 0x78
|
||||||
|
#define VK_F10 0x79
|
||||||
|
#define VK_F11 0x7A
|
||||||
|
#define VK_F12 0x7B
|
||||||
|
#define VK_F13 0x7C
|
||||||
|
#define VK_F14 0x7D
|
||||||
|
#define VK_F15 0x7E
|
||||||
|
#define VK_F16 0x7F
|
||||||
|
#define VK_F17 0x80
|
||||||
|
#define VK_F18 0x81
|
||||||
|
#define VK_F19 0x82
|
||||||
|
#define VK_F20 0x83
|
||||||
|
#define VK_F21 0x84
|
||||||
|
#define VK_F22 0x85
|
||||||
|
#define VK_F23 0x86
|
||||||
|
#define VK_F24 0x87
|
||||||
|
#define VK_NUMLOCK 0x90
|
||||||
|
#define VK_SCROLL 0x91
|
||||||
|
|
||||||
|
|
||||||
#define LMEM_MOVEABLE 0x0002
|
#define LMEM_MOVEABLE 0x0002
|
||||||
|
|
||||||
|
@ -1719,6 +1992,7 @@ Fa(WORD,EnumClipboardFormats,WORD,a)
|
||||||
Fa(WORD,FreeSelector,WORD,a)
|
Fa(WORD,FreeSelector,WORD,a)
|
||||||
Fa(WORD,GetDriveType,int,a)
|
Fa(WORD,GetDriveType,int,a)
|
||||||
Fa(WORD,GetMenuItemCount,HMENU,a)
|
Fa(WORD,GetMenuItemCount,HMENU,a)
|
||||||
|
Fa(WORD,GetTaskQueue,HANDLE,a)
|
||||||
Fa(WORD,GetTextAlign,HDC,a)
|
Fa(WORD,GetTextAlign,HDC,a)
|
||||||
Fa(WORD,GlobalFlags,HANDLE,a)
|
Fa(WORD,GlobalFlags,HANDLE,a)
|
||||||
Fa(WORD,GlobalPageLock,HANDLE,a)
|
Fa(WORD,GlobalPageLock,HANDLE,a)
|
||||||
|
@ -1726,9 +2000,9 @@ Fa(WORD,GlobalPageUnlock,HANDLE,a)
|
||||||
Fa(WORD,LocalCompact,WORD,a)
|
Fa(WORD,LocalCompact,WORD,a)
|
||||||
Fa(WORD,LocalFlags,HANDLE,a)
|
Fa(WORD,LocalFlags,HANDLE,a)
|
||||||
Fa(WORD,LocalSize,HANDLE,a)
|
Fa(WORD,LocalSize,HANDLE,a)
|
||||||
Fa(WORD,RealizePalette,HDC,a)
|
Fa(int,RealizePalette,HDC,a)
|
||||||
Fa(WORD,RegisterClipboardFormat,LPSTR,a)
|
Fa(WORD,RegisterClipboardFormat,LPCSTR,a)
|
||||||
Fa(WORD,RegisterWindowMessage,LPSTR,a)
|
Fa(WORD,RegisterWindowMessage,LPCSTR,a)
|
||||||
Fa(WORD,SetHandleCount,WORD,a)
|
Fa(WORD,SetHandleCount,WORD,a)
|
||||||
Fa(WORD,VkKeyScan,WORD,a)
|
Fa(WORD,VkKeyScan,WORD,a)
|
||||||
Fa(char NEAR*,LocalLock,HANDLE,a)
|
Fa(char NEAR*,LocalLock,HANDLE,a)
|
||||||
|
@ -1872,6 +2146,7 @@ Fb(WORD,IsDlgButtonChecked,HWND,a,WORD,b)
|
||||||
Fb(WORD,LocalShrink,HANDLE,a,WORD,b)
|
Fb(WORD,LocalShrink,HANDLE,a,WORD,b)
|
||||||
Fb(WORD,MapVirtualKey,WORD,a,WORD,b)
|
Fb(WORD,MapVirtualKey,WORD,a,WORD,b)
|
||||||
Fb(WORD,SetSystemPaletteUse,HDC,a,WORD,b)
|
Fb(WORD,SetSystemPaletteUse,HDC,a,WORD,b)
|
||||||
|
Fb(WORD,SetTaskQueue,HANDLE,a,HANDLE,b)
|
||||||
Fb(WORD,SetTextAlign,HDC,a,WORD,b)
|
Fb(WORD,SetTextAlign,HDC,a,WORD,b)
|
||||||
Fb(WORD,SizeofResource,HANDLE,a,HANDLE,b)
|
Fb(WORD,SizeofResource,HANDLE,a,HANDLE,b)
|
||||||
Fb(WORD,WinExec,LPSTR,a,WORD,b)
|
Fb(WORD,WinExec,LPSTR,a,WORD,b)
|
||||||
|
@ -1881,7 +2156,7 @@ Fb(int,BuildCommDCB,LPSTR,a,DCB*,b)
|
||||||
Fb(int,ConvertRequest,HWND,a,LPKANJISTRUCT,b)
|
Fb(int,ConvertRequest,HWND,a,LPKANJISTRUCT,b)
|
||||||
Fb(void,CopyRect,LPRECT,a,LPRECT,b)
|
Fb(void,CopyRect,LPRECT,a,LPRECT,b)
|
||||||
Fb(int,EnumProps,HWND,a,FARPROC,b)
|
Fb(int,EnumProps,HWND,a,FARPROC,b)
|
||||||
Fb(int,EscapeCommFunction,int,a,int,b)
|
Fb(LONG,EscapeCommFunction,int,a,int,b)
|
||||||
Fb(int,ExcludeUpdateRgn,HDC,a,HWND,b)
|
Fb(int,ExcludeUpdateRgn,HDC,a,HWND,b)
|
||||||
Fb(int,FlushComm,int,a,int,b)
|
Fb(int,FlushComm,int,a,int,b)
|
||||||
Fb(int,GetClipBox,HDC,a,LPRECT,b)
|
Fb(int,GetClipBox,HDC,a,LPRECT,b)
|
||||||
|
@ -1910,8 +2185,8 @@ Fb(void,MapDialogRect,HWND,a,LPRECT,b)
|
||||||
Fb(void,ProfSampRate,int,a,int,b)
|
Fb(void,ProfSampRate,int,a,int,b)
|
||||||
Fb(void,ProfSetup,int,a,int,b)
|
Fb(void,ProfSetup,int,a,int,b)
|
||||||
Fb(void,ScreenToClient,HWND,a,LPPOINT,b)
|
Fb(void,ScreenToClient,HWND,a,LPPOINT,b)
|
||||||
Fb(void,SetCaretPos,int,a,int,b)
|
Fb(void,SetCaretPos,short,a,short,b)
|
||||||
Fb(void,SetCursorPos,int,a,int,b)
|
Fb(void,SetCursorPos,short,a,short,b)
|
||||||
Fb(void,SetWindowText,HWND,a,LPSTR,b)
|
Fb(void,SetWindowText,HWND,a,LPSTR,b)
|
||||||
Fb(void,ShowOwnedPopups,HWND,a,BOOL,b)
|
Fb(void,ShowOwnedPopups,HWND,a,BOOL,b)
|
||||||
Fb(void,Throw,LPCATCHBUF,a,int,b)
|
Fb(void,Throw,LPCATCHBUF,a,int,b)
|
||||||
|
@ -1963,6 +2238,7 @@ Fc(HANDLE,GlobalReAlloc,HANDLE,a,DWORD,b,WORD,c)
|
||||||
Fc(HANDLE,LocalReAlloc,HANDLE,a,WORD,b,WORD,c)
|
Fc(HANDLE,LocalReAlloc,HANDLE,a,WORD,b,WORD,c)
|
||||||
Fc(HBITMAP,CreateCompatibleBitmap,HDC,a,short,b,short,c)
|
Fc(HBITMAP,CreateCompatibleBitmap,HDC,a,short,b,short,c)
|
||||||
Fc(HBITMAP,CreateDiscardableBitmap,HDC,a,short,b,short,c)
|
Fc(HBITMAP,CreateDiscardableBitmap,HDC,a,short,b,short,c)
|
||||||
|
Fc(HDC,GetDCEx,HWND,a,HRGN,b,DWORD,c)
|
||||||
Fc(HPALETTE,SelectPalette,HDC,a,HPALETTE,b,BOOL,c)
|
Fc(HPALETTE,SelectPalette,HDC,a,HPALETTE,b,BOOL,c)
|
||||||
Fc(HPEN,CreatePen,short,a,short,b,COLORREF,c)
|
Fc(HPEN,CreatePen,short,a,short,b,COLORREF,c)
|
||||||
Fc(HRGN,CreatePolygonRgn,LPPOINT,a,short,b,short,c)
|
Fc(HRGN,CreatePolygonRgn,LPPOINT,a,short,b,short,c)
|
||||||
|
@ -1985,7 +2261,7 @@ Fb(WORD,SetRelAbs,HDC,a,WORD,b)
|
||||||
Fb(WORD,SetROP2,HDC,a,WORD,b)
|
Fb(WORD,SetROP2,HDC,a,WORD,b)
|
||||||
Fb(WORD,SetStretchBltMode,HDC,a,WORD,b)
|
Fb(WORD,SetStretchBltMode,HDC,a,WORD,b)
|
||||||
Fc(int,FrameRect,HDC,a,LPRECT,b,HBRUSH,c)
|
Fc(int,FrameRect,HDC,a,LPRECT,b,HBRUSH,c)
|
||||||
Fc(int,GetClassName,HWND,a,LPSTR,b,int,c)
|
Fc(int,GetClassName,HWND,a,LPSTR,b,short,c)
|
||||||
Fc(int,GetClipboardFormatName,WORD,a,LPSTR,b,int,c)
|
Fc(int,GetClipboardFormatName,WORD,a,LPSTR,b,int,c)
|
||||||
Fc(int,GetEnvironment,LPSTR,a,LPSTR,b,WORD,c)
|
Fc(int,GetEnvironment,LPSTR,a,LPSTR,b,WORD,c)
|
||||||
Fc(int,GetInstanceData,HANDLE,a,NPSTR,b,int,c)
|
Fc(int,GetInstanceData,HANDLE,a,NPSTR,b,int,c)
|
||||||
|
@ -2066,7 +2342,7 @@ Fd(int,DialogBoxIndirect,HANDLE,a,HANDLE,b,HWND,c,FARPROC,d)
|
||||||
Fd(int,EnumFonts,HDC,a,LPSTR,b,FARPROC,c,LPSTR,d)
|
Fd(int,EnumFonts,HDC,a,LPSTR,b,FARPROC,c,LPSTR,d)
|
||||||
Fd(int,EnumObjects,HDC,a,int,b,FARPROC,c,LPSTR,d)
|
Fd(int,EnumObjects,HDC,a,int,b,FARPROC,c,LPSTR,d)
|
||||||
Fd(int,GetDlgItemText,HWND,a,WORD,b,LPSTR,c,WORD,d)
|
Fd(int,GetDlgItemText,HWND,a,WORD,b,LPSTR,c,WORD,d)
|
||||||
Fd(int,GetTempFileName,BYTE,a,LPSTR,b,WORD,c,LPSTR,d)
|
Fd(int,GetTempFileName,BYTE,a,LPCSTR,b,UINT,c,LPSTR,d)
|
||||||
Fd(int,LoadString,HANDLE,a,WORD,b,LPSTR,c,int,d)
|
Fd(int,LoadString,HANDLE,a,WORD,b,LPSTR,c,int,d)
|
||||||
Fd(int,MessageBox,HWND,a,LPSTR,b,LPSTR,c,WORD,d)
|
Fd(int,MessageBox,HWND,a,LPSTR,b,LPSTR,c,WORD,d)
|
||||||
Fd(int,SetScrollPos,HWND,a,int,b,int,c,BOOL,d)
|
Fd(int,SetScrollPos,HWND,a,int,b,int,c,BOOL,d)
|
||||||
|
@ -2074,9 +2350,10 @@ Fd(int,SetVoiceNote,int,a,int,b,int,c,int,d)
|
||||||
Fd(void,AdjustWindowRectEx,LPRECT,a,LONG,b,BOOL,c,DWORD,d)
|
Fd(void,AdjustWindowRectEx,LPRECT,a,LONG,b,BOOL,c,DWORD,d)
|
||||||
Fd(void,AnimatePalette,HPALETTE,a,WORD,b,WORD,c,LPPALETTEENTRY,d)
|
Fd(void,AnimatePalette,HPALETTE,a,WORD,b,WORD,c,LPPALETTEENTRY,d)
|
||||||
Fd(void,CheckRadioButton,HWND,a,WORD,b,WORD,c,WORD,d)
|
Fd(void,CheckRadioButton,HWND,a,WORD,b,WORD,c,WORD,d)
|
||||||
Fd(void,CreateCaret,HWND,a,HBITMAP,b,int,c,int,d)
|
Fd(void,CreateCaret,HWND,a,HBITMAP,b,short,c,short,d)
|
||||||
Fd(void,FillWindow,HWND,a,HWND,b,HDC,c,HBRUSH,d)
|
Fd(void,FillWindow,HWND,a,HWND,b,HDC,c,HBRUSH,d)
|
||||||
Fd(void,GetScrollRange,HWND,a,int,b,LPINT,c,LPINT,d)
|
Fd(void,GetScrollRange,HWND,a,int,b,LPINT,c,LPINT,d)
|
||||||
|
Fd(void,MapWindowPoints,HWND,a,HWND,b,LPPOINT,c,WORD,d)
|
||||||
Fd(void,PlayMetaFileRecord,HDC,a,LPHANDLETABLE,b,LPMETARECORD,c,WORD,d)
|
Fd(void,PlayMetaFileRecord,HDC,a,LPHANDLETABLE,b,LPMETARECORD,c,WORD,d)
|
||||||
Fd(void,SetDlgItemInt,HWND,a,WORD,b,WORD,c,BOOL,d)
|
Fd(void,SetDlgItemInt,HWND,a,WORD,b,WORD,c,BOOL,d)
|
||||||
Fe(BOOL,Rectangle,HDC,a,int,xLeft,int,yTop,int,xRight,int,yBottom)
|
Fe(BOOL,Rectangle,HDC,a,int,xLeft,int,yTop,int,xRight,int,yBottom)
|
||||||
|
@ -2122,17 +2399,17 @@ Ff(HBITMAP,CreateDIBitmap,HDC,a,LPBITMAPINFOHEADER,b,DWORD,c,LPSTR,d,LPBITMAPINF
|
||||||
Ff(HRGN,CreateRoundRectRgn,short,a,short,b,short,c,short,d,short,e,short,f)
|
Ff(HRGN,CreateRoundRectRgn,short,a,short,b,short,c,short,d,short,e,short,f)
|
||||||
Ff(short,GetPrivateProfileString,LPSTR,a,LPSTR,b,LPSTR,c,LPSTR,d,short,e,LPSTR,f)
|
Ff(short,GetPrivateProfileString,LPSTR,a,LPSTR,b,LPSTR,c,LPSTR,d,short,e,LPSTR,f)
|
||||||
Ff(void,LineDDA,short,a,short,b,short,c,short,d,FARPROC,e,long,f)
|
Ff(void,LineDDA,short,a,short,b,short,c,short,d,FARPROC,e,long,f)
|
||||||
Ff(void,MoveWindow,HWND,a,short,b,short,c,short,d,short,e,BOOL,f)
|
Ff(BOOL,MoveWindow,HWND,a,short,b,short,c,short,d,short,e,BOOL,f)
|
||||||
Ff(BOOL,ScaleViewportExtEx,HDC,a,short,b,short,c,short,d,short,e,LPSIZE,f)
|
Ff(BOOL,ScaleViewportExtEx,HDC,a,short,b,short,c,short,d,short,e,LPSIZE,f)
|
||||||
Ff(BOOL,ScaleWindowExtEx,HDC,a,short,b,short,c,short,d,short,e,LPSIZE,f)
|
Ff(BOOL,ScaleWindowExtEx,HDC,a,short,b,short,c,short,d,short,e,LPSIZE,f)
|
||||||
Fg(BOOL,RoundRect,HDC,a,short,b,short,c,short,d,short,e,short,f,short,g)
|
Fg(BOOL,RoundRect,HDC,a,short,b,short,c,short,d,short,e,short,f,short,g)
|
||||||
Fg(BOOL,ScrollDC,HDC,a,short,b,short,c,LPRECT,d,LPRECT,e,HRGN,f,LPRECT,g)
|
Fg(BOOL,ScrollDC,HDC,a,short,b,short,c,LPRECT,d,LPRECT,e,HRGN,f,LPRECT,g)
|
||||||
Fg(BOOL,TrackPopupMenu,HMENU,a,WORD,b,int,c,int,d,int,e,HWND,f,LPRECT,g)
|
Fg(BOOL,TrackPopupMenu,HMENU,a,WORD,b,short,c,short,d,short,e,HWND,f,LPRECT,g)
|
||||||
Fg(HCURSOR,CreateCursor,HANDLE,a,int,b,int,c,int,d,int,e,LPSTR,f,LPSTR,g)
|
Fg(HCURSOR,CreateCursor,HANDLE,a,short,b,short,c,short,d,short,e,LPSTR,f,LPSTR,g)
|
||||||
Fg(HICON,CreateIcon,HANDLE,a,int,b,int,c,BYTE,d,BYTE,e,LPSTR,f,LPSTR,g)
|
Fg(HICON,CreateIcon,HANDLE,a,int,b,int,c,BYTE,d,BYTE,e,LPSTR,f,LPSTR,g)
|
||||||
Fg(int,GetDIBits,HDC,a,HANDLE,a2,WORD,b,WORD,c,LPSTR,d,LPBITMAPINFO,e,WORD,f)
|
Fg(int,GetDIBits,HDC,a,HANDLE,a2,WORD,b,WORD,c,LPSTR,d,LPBITMAPINFO,e,WORD,f)
|
||||||
Fg(int,SetDIBits,HDC,a,HANDLE,a2,WORD,b,WORD,c,LPSTR,d,LPBITMAPINFO,e,WORD,f)
|
Fg(int,SetDIBits,HDC,a,HANDLE,a2,WORD,b,WORD,c,LPSTR,d,LPBITMAPINFO,e,WORD,f)
|
||||||
Fg(void,SetWindowPos,HWND,a,HWND,b,short,c,short,d,short,e,short,f,WORD,g)
|
Fg(BOOL,SetWindowPos,HWND,a,HWND,b,short,c,short,d,short,e,short,f,WORD,g)
|
||||||
Fh(BOOL,ExtTextOut,HDC,a,int,b,int,c,WORD,d,LPRECT,e,LPSTR,f,WORD,g,LPINT,h)
|
Fh(BOOL,ExtTextOut,HDC,a,int,b,int,c,WORD,d,LPRECT,e,LPSTR,f,WORD,g,LPINT,h)
|
||||||
Fh(HANDLE,DeferWindowPos,HANDLE,hWinPosInfo,HWND,hWnd,HWND,hWndInsertAfter,int,x,int,y,int,cx,int,cy,WORD,wFlags)
|
Fh(HANDLE,DeferWindowPos,HANDLE,hWinPosInfo,HWND,hWnd,HWND,hWndInsertAfter,int,x,int,y,int,cx,int,cy,WORD,wFlags)
|
||||||
Fh(LONG,TabbedTextOut,HDC,a,int,b,int,c,LPSTR,d,int,e,int,f,LPINT,g,int,h)
|
Fh(LONG,TabbedTextOut,HDC,a,int,b,int,c,LPSTR,d,int,e,int,f,LPINT,g,int,h)
|
||||||
|
|
|
@ -22,9 +22,14 @@ extern struct w_files * wine_files;
|
||||||
|
|
||||||
extern char *GetFilenameFromInstance(unsigned short instance);
|
extern char *GetFilenameFromInstance(unsigned short instance);
|
||||||
extern struct w_files *GetFileInfo(unsigned short instance);
|
extern struct w_files *GetFileInfo(unsigned short instance);
|
||||||
extern char *FindFileInPath(char *buffer, int buflen, char *rootname,
|
extern char *WineIniFileName(void);
|
||||||
char **extensions, char *path);
|
extern char *WinIniFileName(void);
|
||||||
extern char *GetSystemIniFilename(void);
|
|
||||||
|
#define MAX_DOS_DRIVES 26
|
||||||
|
|
||||||
|
#define WINE_INI WineIniFileName()
|
||||||
|
#define WIN_INI WinIniFileName()
|
||||||
|
|
||||||
#ifdef linux
|
#ifdef linux
|
||||||
struct sigcontext_struct {
|
struct sigcontext_struct {
|
||||||
unsigned short sc_gs, __gsh;
|
unsigned short sc_gs, __gsh;
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
#include "../Wine.tmpl"
|
||||||
|
|
||||||
|
MODULE = loader
|
||||||
|
|
||||||
|
SRCS = \
|
||||||
|
dump.c \
|
||||||
|
files.c \
|
||||||
|
ldt.c \
|
||||||
|
ldtlib.c \
|
||||||
|
resource.c \
|
||||||
|
selector.c \
|
||||||
|
signal.c \
|
||||||
|
library.c \
|
||||||
|
wine.c \
|
||||||
|
cursor.c
|
||||||
|
|
||||||
|
OBJS = \
|
||||||
|
dump.o \
|
||||||
|
files.o \
|
||||||
|
ldt.o \
|
||||||
|
ldtlib.o \
|
||||||
|
resource.o \
|
||||||
|
selector.o \
|
||||||
|
signal.o \
|
||||||
|
library.o \
|
||||||
|
wine.o \
|
||||||
|
cursor.o
|
||||||
|
|
||||||
|
WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
|
||||||
|
DependTarget()
|
||||||
|
CleanTarget()
|
||||||
|
|
||||||
|
includes::
|
||||||
|
|
||||||
|
install::
|
|
@ -1,7 +1,7 @@
|
||||||
CFLAGS=$(COPTS) $(DEBUGOPTS) -I../include
|
CFLAGS=$(COPTS) $(DEBUGOPTS) -I../include
|
||||||
|
|
||||||
OBJS=dump.o files.o ldt.o ldtlib.o resource.o selector.o signal.o int1a.o \
|
OBJS=dump.o ldt.o ldtlib.o resource.o selector.o signal.o library.o \
|
||||||
int21.o wine.o library.o
|
wine.o cursor.o
|
||||||
|
|
||||||
default: loader.o
|
default: loader.o
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,385 @@
|
||||||
|
/*
|
||||||
|
* WINE
|
||||||
|
*/
|
||||||
|
static char Copyright[] = "Copyright Martin Ayotte, 1993";
|
||||||
|
|
||||||
|
/*
|
||||||
|
#define DEBUG_CURSOR
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <X11/Intrinsic.h>
|
||||||
|
#include <X11/cursorfont.h>
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include "prototypes.h"
|
||||||
|
#include "windows.h"
|
||||||
|
#include "win.h"
|
||||||
|
#include "gdi.h"
|
||||||
|
#include "wine.h"
|
||||||
|
#include "cursor.h"
|
||||||
|
|
||||||
|
static int ShowCursCount = 0;
|
||||||
|
static HCURSOR hActiveCursor;
|
||||||
|
static HCURSOR hEmptyCursor = 0;
|
||||||
|
RECT ClipCursorRect;
|
||||||
|
extern HINSTANCE hSysRes;
|
||||||
|
extern Window winHasCursor;
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* LoadCursor [USER.173]
|
||||||
|
*/
|
||||||
|
HCURSOR LoadCursor(HANDLE instance, LPSTR cursor_name)
|
||||||
|
{
|
||||||
|
XColor bkcolor;
|
||||||
|
XColor fgcolor;
|
||||||
|
HCURSOR hCursor;
|
||||||
|
HANDLE rsc_mem;
|
||||||
|
WORD *lp;
|
||||||
|
CURSORDESCRIP *lpcurdesc;
|
||||||
|
CURSORALLOC *lpcur;
|
||||||
|
BITMAP BitMap;
|
||||||
|
HBITMAP hBitMap;
|
||||||
|
HDC hMemDC;
|
||||||
|
HDC hdc;
|
||||||
|
int i, j, image_size;
|
||||||
|
#ifdef DEBUG_RESOURCE
|
||||||
|
printf("LoadCursor: instance = %04x, name = %08x\n",
|
||||||
|
instance, cursor_name);
|
||||||
|
#endif
|
||||||
|
hCursor = GlobalAlloc(GMEM_MOVEABLE, sizeof(CURSORALLOC) + 1024L);
|
||||||
|
if (hCursor == (HCURSOR)NULL) return 0;
|
||||||
|
#ifdef DEBUG_CURSOR
|
||||||
|
printf("LoadCursor Alloc hCursor=%X\n", hCursor);
|
||||||
|
#endif
|
||||||
|
lpcur = (CURSORALLOC *)GlobalLock(hCursor);
|
||||||
|
memset(lpcur, 0, sizeof(CURSORALLOC));
|
||||||
|
if (instance == (HANDLE)NULL) {
|
||||||
|
instance = hSysRes;
|
||||||
|
switch((LONG)cursor_name) {
|
||||||
|
case IDC_ARROW:
|
||||||
|
lpcur->xcursor = XCreateFontCursor(XT_display, XC_top_left_arrow);
|
||||||
|
GlobalUnlock(hCursor);
|
||||||
|
return hCursor;
|
||||||
|
case IDC_CROSS:
|
||||||
|
lpcur->xcursor = XCreateFontCursor(XT_display, XC_crosshair);
|
||||||
|
GlobalUnlock(hCursor);
|
||||||
|
return hCursor;
|
||||||
|
case IDC_IBEAM:
|
||||||
|
lpcur->xcursor = XCreateFontCursor(XT_display, XC_xterm);
|
||||||
|
GlobalUnlock(hCursor);
|
||||||
|
return hCursor;
|
||||||
|
case IDC_WAIT:
|
||||||
|
lpcur->xcursor = XCreateFontCursor(XT_display, XC_watch);
|
||||||
|
GlobalUnlock(hCursor);
|
||||||
|
return hCursor;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!(hdc = GetDC(GetDesktopWindow()))) return 0;
|
||||||
|
rsc_mem = RSC_LoadResource(instance, cursor_name, NE_RSCTYPE_GROUP_CURSOR,
|
||||||
|
&image_size);
|
||||||
|
if (rsc_mem == (HANDLE)NULL) {
|
||||||
|
printf("LoadCursor / Cursor %08X not Found !\n", cursor_name);
|
||||||
|
ReleaseDC(GetDesktopWindow(), hdc);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
lp = (WORD *)GlobalLock(rsc_mem);
|
||||||
|
if (lp == NULL) {
|
||||||
|
GlobalFree(rsc_mem);
|
||||||
|
ReleaseDC(GetDesktopWindow(), hdc);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
lpcurdesc = (CURSORDESCRIP *)(lp + 3);
|
||||||
|
#ifdef DEBUG_CURSOR
|
||||||
|
printf("LoadCursor / image_size=%d\n", image_size);
|
||||||
|
printf("LoadCursor / curReserved=%X\n", *lp);
|
||||||
|
printf("LoadCursor / curResourceType=%X\n", *(lp + 1));
|
||||||
|
printf("LoadCursor / curResourceCount=%X\n", *(lp + 2));
|
||||||
|
printf("LoadCursor / cursor Width=%d\n", (int)lpcurdesc->Width);
|
||||||
|
printf("LoadCursor / cursor Height=%d\n", (int)lpcurdesc->Height);
|
||||||
|
printf("LoadCursor / cursor curXHotspot=%d\n", (int)lpcurdesc->curXHotspot);
|
||||||
|
printf("LoadCursor / cursor curYHotspot=%d\n", (int)lpcurdesc->curYHotspot);
|
||||||
|
printf("LoadCursor / cursor curDIBSize=%lX\n", (DWORD)lpcurdesc->curDIBSize);
|
||||||
|
printf("LoadCursor / cursor curDIBOffset=%lX\n", (DWORD)lpcurdesc->curDIBOffset);
|
||||||
|
#endif
|
||||||
|
lpcur->descriptor = *lpcurdesc;
|
||||||
|
GlobalUnlock(rsc_mem);
|
||||||
|
GlobalFree(rsc_mem);
|
||||||
|
rsc_mem = RSC_LoadResource(instance,
|
||||||
|
MAKEINTRESOURCE(lpcurdesc->curDIBOffset),
|
||||||
|
NE_RSCTYPE_CURSOR, &image_size);
|
||||||
|
if (rsc_mem == (HANDLE)NULL) {
|
||||||
|
printf("LoadCursor / Cursor %08X Bitmap not Found !\n", cursor_name);
|
||||||
|
ReleaseDC(GetDesktopWindow(), hdc);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
lp = (WORD *)GlobalLock(rsc_mem);
|
||||||
|
if (lp == NULL) {
|
||||||
|
GlobalFree(rsc_mem);
|
||||||
|
ReleaseDC(GetDesktopWindow(), hdc);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
lp += 2;
|
||||||
|
for (j = 0; j < 16; j++)
|
||||||
|
printf("%04X ", *(lp + j));
|
||||||
|
/*
|
||||||
|
if (*lp == sizeof(BITMAPINFOHEADER))
|
||||||
|
lpcur->hBitmap = ConvertInfoBitmap(hdc, (BITMAPINFO *)lp);
|
||||||
|
else
|
||||||
|
*/
|
||||||
|
lpcur->hBitmap = 0;
|
||||||
|
lp += sizeof(BITMAP);
|
||||||
|
for (i = 0; i < 81; i++) {
|
||||||
|
char temp = *((char *)lp + 162 + i);
|
||||||
|
*((char *)lp + 162 + i) = *((char *)lp + 324 - i);
|
||||||
|
*((char *)lp + 324 - i) = temp;
|
||||||
|
}
|
||||||
|
lpcur->pixshape = XCreatePixmapFromBitmapData(
|
||||||
|
XT_display, DefaultRootWindow(XT_display),
|
||||||
|
((char *)lp + 211), 32, 32,
|
||||||
|
/*
|
||||||
|
lpcurdesc->Width / 2, lpcurdesc->Height / 4,
|
||||||
|
*/
|
||||||
|
WhitePixel(XT_display, DefaultScreen(XT_display)),
|
||||||
|
BlackPixel(XT_display, DefaultScreen(XT_display)), 1);
|
||||||
|
lpcur->pixmask = XCreatePixmapFromBitmapData(
|
||||||
|
XT_display, DefaultRootWindow(XT_display),
|
||||||
|
((char *)lp + 211), 32, 32,
|
||||||
|
WhitePixel(XT_display, DefaultScreen(XT_display)),
|
||||||
|
BlackPixel(XT_display, DefaultScreen(XT_display)), 1);
|
||||||
|
memset(&bkcolor, 0, sizeof(XColor));
|
||||||
|
memset(&fgcolor, 0, sizeof(XColor));
|
||||||
|
bkcolor.pixel = WhitePixel(XT_display, DefaultScreen(XT_display));
|
||||||
|
fgcolor.pixel = BlackPixel(XT_display, DefaultScreen(XT_display));
|
||||||
|
printf("LoadCursor / before XCreatePixmapCursor !\n");
|
||||||
|
lpcur->xcursor = XCreatePixmapCursor(XT_display,
|
||||||
|
lpcur->pixshape, lpcur->pixmask,
|
||||||
|
&fgcolor, &bkcolor, lpcur->descriptor.curXHotspot,
|
||||||
|
lpcur->descriptor.curYHotspot);
|
||||||
|
GlobalUnlock(rsc_mem);
|
||||||
|
GlobalFree(rsc_mem);
|
||||||
|
/*
|
||||||
|
hCursor = CreateCursor(instance, lpcur->descriptor.curXHotspot,
|
||||||
|
lpcur->descriptor.curYHotspot, 32, 32,
|
||||||
|
(LPSTR)lp + 211, , (LPSTR)lp + 211);
|
||||||
|
*/
|
||||||
|
XFreePixmap(XT_display, lpcur->pixshape);
|
||||||
|
XFreePixmap(XT_display, lpcur->pixmask);
|
||||||
|
ReleaseDC(GetDesktopWindow(), hdc);
|
||||||
|
GlobalUnlock(hCursor);
|
||||||
|
return hCursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* CreateCursor [USER.406]
|
||||||
|
*/
|
||||||
|
HCURSOR CreateCursor(HANDLE instance, short nXhotspot, short nYhotspot,
|
||||||
|
short nWidth, short nHeight, LPSTR lpANDbitPlane, LPSTR lpXORbitPlane)
|
||||||
|
{
|
||||||
|
XColor bkcolor;
|
||||||
|
XColor fgcolor;
|
||||||
|
HCURSOR hCursor;
|
||||||
|
CURSORALLOC *lpcur;
|
||||||
|
BITMAP BitMap;
|
||||||
|
HBITMAP hBitMap;
|
||||||
|
HDC hMemDC;
|
||||||
|
HDC hdc;
|
||||||
|
int i, j;
|
||||||
|
#ifdef DEBUG_RESOURCE
|
||||||
|
printf("CreateCursor: inst=%04x nXhotspot=%d nYhotspot=%d nWidth=%d nHeight=%d\n",
|
||||||
|
nXhotspot, nYhotspot, nWidth, nHeight);
|
||||||
|
printf("CreateCursor: inst=%04x lpANDbitPlane=%08X lpXORbitPlane=%08X\n",
|
||||||
|
LPSTR lpANDbitPlane, LPSTR lpXORbitPlane);
|
||||||
|
#endif
|
||||||
|
if (!(hdc = GetDC(GetDesktopWindow()))) return 0;
|
||||||
|
hCursor = GlobalAlloc(GMEM_MOVEABLE, sizeof(CURSORALLOC) + 1024L);
|
||||||
|
if (hCursor == (HCURSOR)NULL) {
|
||||||
|
ReleaseDC(GetDesktopWindow(), hdc);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
printf("CreateCursor Alloc hCursor=%X\n", hCursor);
|
||||||
|
lpcur = (CURSORALLOC *)GlobalLock(hCursor);
|
||||||
|
memset(lpcur, 0, sizeof(CURSORALLOC));
|
||||||
|
lpcur->descriptor.curXHotspot = nXhotspot;
|
||||||
|
lpcur->descriptor.curYHotspot = nYhotspot;
|
||||||
|
lpcur->pixshape = XCreatePixmapFromBitmapData(
|
||||||
|
XT_display, DefaultRootWindow(XT_display),
|
||||||
|
lpXORbitPlane, nWidth, nHeight,
|
||||||
|
WhitePixel(XT_display, DefaultScreen(XT_display)),
|
||||||
|
BlackPixel(XT_display, DefaultScreen(XT_display)), 1);
|
||||||
|
lpcur->pixmask = XCreatePixmapFromBitmapData(
|
||||||
|
XT_display, DefaultRootWindow(XT_display),
|
||||||
|
lpANDbitPlane, nWidth, nHeight,
|
||||||
|
WhitePixel(XT_display, DefaultScreen(XT_display)),
|
||||||
|
BlackPixel(XT_display, DefaultScreen(XT_display)), 1);
|
||||||
|
memset(&bkcolor, 0, sizeof(XColor));
|
||||||
|
memset(&fgcolor, 0, sizeof(XColor));
|
||||||
|
bkcolor.pixel = WhitePixel(XT_display, DefaultScreen(XT_display));
|
||||||
|
fgcolor.pixel = BlackPixel(XT_display, DefaultScreen(XT_display));
|
||||||
|
lpcur->xcursor = XCreatePixmapCursor(XT_display,
|
||||||
|
lpcur->pixshape, lpcur->pixmask,
|
||||||
|
&fgcolor, &bkcolor, lpcur->descriptor.curXHotspot,
|
||||||
|
lpcur->descriptor.curYHotspot);
|
||||||
|
XFreePixmap(XT_display, lpcur->pixshape);
|
||||||
|
XFreePixmap(XT_display, lpcur->pixmask);
|
||||||
|
ReleaseDC(GetDesktopWindow(), hdc);
|
||||||
|
GlobalUnlock(hCursor);
|
||||||
|
return hCursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* DestroyCursor [USER.458]
|
||||||
|
*/
|
||||||
|
BOOL DestroyCursor(HCURSOR hCursor)
|
||||||
|
{
|
||||||
|
CURSORALLOC *lpcur;
|
||||||
|
if (hCursor == (HCURSOR)NULL) return FALSE;
|
||||||
|
lpcur = (CURSORALLOC *)GlobalLock(hCursor);
|
||||||
|
if (lpcur->hBitmap != (HBITMAP)NULL) DeleteObject(lpcur->hBitmap);
|
||||||
|
GlobalUnlock(hCursor);
|
||||||
|
GlobalFree(hCursor);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* SetCursor [USER.69]
|
||||||
|
*/
|
||||||
|
HCURSOR SetCursor(HCURSOR hCursor)
|
||||||
|
{
|
||||||
|
HDC hDC;
|
||||||
|
HDC hMemDC;
|
||||||
|
BITMAP bm;
|
||||||
|
CURSORALLOC *lpcur;
|
||||||
|
HCURSOR hOldCursor;
|
||||||
|
Window root, child;
|
||||||
|
int rootX, rootY;
|
||||||
|
int childX, childY;
|
||||||
|
unsigned int mousebut;
|
||||||
|
#ifdef DEBUG_CURSOR
|
||||||
|
printf("SetCursor / hCursor=%04X !\n", hCursor);
|
||||||
|
#endif
|
||||||
|
if (hCursor == (HCURSOR)NULL) return FALSE;
|
||||||
|
lpcur = (CURSORALLOC *)GlobalLock(hCursor);
|
||||||
|
hOldCursor = hActiveCursor;
|
||||||
|
#ifdef DEBUG_CURSOR
|
||||||
|
printf("SetCursor / lpcur->xcursor=%08X !\n", &lpcur->xcursor);
|
||||||
|
XQueryPointer(XT_display, DefaultRootWindow(XT_display),
|
||||||
|
&root, &child, &rootX, &rootY, &childX, &childY, &mousebut);
|
||||||
|
printf("SetCursor / winHasCursor=%08X !\n", winHasCursor);
|
||||||
|
printf("SetCursor / child=%08X !\n", child);
|
||||||
|
#endif
|
||||||
|
if (hActiveCursor != hCursor) ShowCursCount = 0;
|
||||||
|
if ((ShowCursCount >= 0) & (winHasCursor != 0)) {
|
||||||
|
/* XUndefineCursor(XT_display, winHasCursor); */
|
||||||
|
XDefineCursor(XT_display, winHasCursor, lpcur->xcursor);
|
||||||
|
}
|
||||||
|
GlobalUnlock(hCursor);
|
||||||
|
hActiveCursor = hCursor;
|
||||||
|
return hOldCursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* SetCursorPos [USER.70]
|
||||||
|
*/
|
||||||
|
void SetCursorPos(short x, short y)
|
||||||
|
{
|
||||||
|
Window root, child;
|
||||||
|
int rootX, rootY;
|
||||||
|
int childX, childY;
|
||||||
|
unsigned int mousebut;
|
||||||
|
#ifdef DEBUG_CURSOR
|
||||||
|
printf("SetCursorPos // x=%d y=%d\n", x, y);
|
||||||
|
#endif
|
||||||
|
XQueryPointer(XT_display, DefaultRootWindow(XT_display),
|
||||||
|
&root, &child, &rootX, &rootY, &childX, &childY, &mousebut);
|
||||||
|
XWarpPointer(XT_display, child, root, 0, 0,
|
||||||
|
DisplayWidth(XT_display, DefaultScreen(XT_display)),
|
||||||
|
DisplayHeight(XT_display, DefaultScreen(XT_display)),
|
||||||
|
(int)x, (int)y);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* GetCursorPos [USER.17]
|
||||||
|
*/
|
||||||
|
void GetCursorPos(LPPOINT lpRetPoint)
|
||||||
|
{
|
||||||
|
Window root, child;
|
||||||
|
int rootX, rootY;
|
||||||
|
int childX, childY;
|
||||||
|
unsigned int mousebut;
|
||||||
|
if (lpRetPoint != NULL) {
|
||||||
|
XQueryPointer(XT_display, DefaultRootWindow(XT_display),
|
||||||
|
&root, &child, &rootX, &rootY, &childX, &childY, &mousebut);
|
||||||
|
#ifdef DEBUG_CURSOR
|
||||||
|
printf("GetCursorPos // x=%d y=%d\n", rootX, rootY);
|
||||||
|
#endif
|
||||||
|
lpRetPoint->x = rootX;
|
||||||
|
lpRetPoint->y = rootY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* ShowCursor [USER.71]
|
||||||
|
*/
|
||||||
|
int ShowCursor(BOOL bShow)
|
||||||
|
{
|
||||||
|
HCURSOR hCursor;
|
||||||
|
#ifdef DEBUG_CURSOR
|
||||||
|
printf("ShowCursor bShow=%d ShowCount=%d !\n", bShow, ShowCursCount);
|
||||||
|
#endif
|
||||||
|
if (bShow)
|
||||||
|
ShowCursCount++;
|
||||||
|
else
|
||||||
|
ShowCursCount--;
|
||||||
|
if (ShowCursCount >= 0) {
|
||||||
|
/* if (hCursor == (HCURSOR)NULL) */
|
||||||
|
hCursor = LoadCursor((HINSTANCE)NULL, IDC_ARROW);
|
||||||
|
SetCursor(hCursor);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* XUndefineCursor(XT_display, winHasCursor); */
|
||||||
|
if (hEmptyCursor == (HCURSOR)NULL)
|
||||||
|
hEmptyCursor = CreateCursor((HINSTANCE)NULL, 1, 1, 1, 1,
|
||||||
|
"\xFF\xFF", "\xFF\xFF");
|
||||||
|
hCursor = SetCursor(hEmptyCursor);
|
||||||
|
hActiveCursor = hCursor;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* ClipCursor [USER.16]
|
||||||
|
*/
|
||||||
|
void ClipCursor(LPRECT lpNewClipRect)
|
||||||
|
{
|
||||||
|
CopyRect(&ClipCursorRect, lpNewClipRect);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* GetClipCursor [USER.309]
|
||||||
|
*/
|
||||||
|
void GetClipCursor(LPRECT lpRetClipRect)
|
||||||
|
{
|
||||||
|
if (lpRetClipRect != NULL)
|
||||||
|
CopyRect(lpRetClipRect, &ClipCursorRect);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
109
loader/files.c
109
loader/files.c
|
@ -1,109 +0,0 @@
|
||||||
static char RCSId[] = "$Id: wine.c,v 1.2 1993/07/04 04:04:21 root Exp root $";
|
|
||||||
static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
/**********************************************************************
|
|
||||||
* FindFileInPath
|
|
||||||
*/
|
|
||||||
char *
|
|
||||||
FindFileInPath(char *buffer, int buflen, char *rootname,
|
|
||||||
char **extensions, char *path)
|
|
||||||
{
|
|
||||||
char *workingpath;
|
|
||||||
char *dirname;
|
|
||||||
DIR *d;
|
|
||||||
struct dirent *f;
|
|
||||||
char **e;
|
|
||||||
int rootnamelen;
|
|
||||||
int found = 0;
|
|
||||||
|
|
||||||
if (strchr(rootname, '/') != NULL)
|
|
||||||
{
|
|
||||||
strncpy(buffer, rootname, buflen);
|
|
||||||
return buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
rootnamelen = strlen(rootname);
|
|
||||||
workingpath = malloc(strlen(path) + 1);
|
|
||||||
if (workingpath == NULL)
|
|
||||||
return NULL;
|
|
||||||
strcpy(workingpath, path);
|
|
||||||
|
|
||||||
for(dirname = strtok(workingpath, ":;");
|
|
||||||
dirname != NULL;
|
|
||||||
dirname = strtok(NULL, ":;"))
|
|
||||||
{
|
|
||||||
d = opendir(dirname);
|
|
||||||
if (d != NULL)
|
|
||||||
{
|
|
||||||
while ((f = readdir(d)) != NULL)
|
|
||||||
{
|
|
||||||
if (strncasecmp(rootname, f->d_name, rootnamelen) == 0)
|
|
||||||
{
|
|
||||||
if (extensions == NULL ||
|
|
||||||
strcasecmp(rootname, f->d_name) == 0)
|
|
||||||
{
|
|
||||||
found = 1;
|
|
||||||
}
|
|
||||||
else if (f->d_name[rootnamelen] == '.')
|
|
||||||
{
|
|
||||||
for (e = extensions; *e != NULL; e++)
|
|
||||||
{
|
|
||||||
if (strcasecmp(*e, f->d_name + rootnamelen + 1)
|
|
||||||
== 0)
|
|
||||||
{
|
|
||||||
found = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (found)
|
|
||||||
{
|
|
||||||
strncpy(buffer, dirname, buflen);
|
|
||||||
strncat(buffer, "/", buflen - strlen(buffer));
|
|
||||||
strncat(buffer, f->d_name, buflen - strlen(buffer));
|
|
||||||
closedir(d);
|
|
||||||
return buffer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
closedir(d);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**********************************************************************
|
|
||||||
* GetSystemIniFilename
|
|
||||||
*/
|
|
||||||
char *
|
|
||||||
GetSystemIniFilename()
|
|
||||||
{
|
|
||||||
static char *IniName = NULL;
|
|
||||||
char inipath[256];
|
|
||||||
|
|
||||||
if (IniName)
|
|
||||||
return IniName;
|
|
||||||
|
|
||||||
getcwd(inipath, 256);
|
|
||||||
strcat(inipath, ":");
|
|
||||||
strcat(inipath, getenv("HOME"));
|
|
||||||
strcat(inipath, ":");
|
|
||||||
strcat(inipath, getenv("WINEPATH"));
|
|
||||||
|
|
||||||
IniName = malloc(1024);
|
|
||||||
if (FindFileInPath(IniName, 1024, "wine.ini", NULL, inipath) == NULL)
|
|
||||||
{
|
|
||||||
free(IniName);
|
|
||||||
IniName = NULL;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
IniName = realloc(IniName, strlen(IniName) + 1);
|
|
||||||
return IniName;
|
|
||||||
}
|
|
|
@ -20,7 +20,7 @@ HANDLE LoadLibrary(LPSTR libname)
|
||||||
{
|
{
|
||||||
HANDLE hRet;
|
HANDLE hRet;
|
||||||
printf("LoadLibrary '%s'\n", libname);
|
printf("LoadLibrary '%s'\n", libname);
|
||||||
hRet = LoadImage(libname, NULL);
|
hRet = LoadImage(libname);
|
||||||
printf("after LoadLibrary hRet=%04X\n", hRet);
|
printf("after LoadLibrary hRet=%04X\n", hRet);
|
||||||
return hRet;
|
return hRet;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,6 @@ static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
|
||||||
#include "gdi.h"
|
#include "gdi.h"
|
||||||
#include "wine.h"
|
#include "wine.h"
|
||||||
#include "icon.h"
|
#include "icon.h"
|
||||||
#include "cursor.h"
|
|
||||||
|
|
||||||
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
||||||
|
|
||||||
|
@ -31,7 +30,6 @@ static int ResourceFd = -1;
|
||||||
static HANDLE ResourceInst = 0;
|
static HANDLE ResourceInst = 0;
|
||||||
static struct w_files *ResourceFileInfo = NULL;
|
static struct w_files *ResourceFileInfo = NULL;
|
||||||
static RESOURCE *Top = NULL;
|
static RESOURCE *Top = NULL;
|
||||||
static HCURSOR hActiveCursor;
|
|
||||||
extern HINSTANCE hSysRes;
|
extern HINSTANCE hSysRes;
|
||||||
|
|
||||||
HANDLE RSC_LoadResource(int instance, char *rsc_name, int type, int *image_size_ret);
|
HANDLE RSC_LoadResource(int instance, char *rsc_name, int type, int *image_size_ret);
|
||||||
|
@ -313,23 +311,26 @@ HICON LoadIcon(HANDLE instance, LPSTR icon_name)
|
||||||
instance, icon_name);
|
instance, icon_name);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (instance == (HANDLE)NULL) instance = hSysRes;
|
|
||||||
if (!(hdc = GetDC(GetDesktopWindow()))) return 0;
|
if (!(hdc = GetDC(GetDesktopWindow()))) return 0;
|
||||||
|
if (instance == (HANDLE)NULL) instance = hSysRes;
|
||||||
rsc_mem = RSC_LoadResource(instance, icon_name, NE_RSCTYPE_GROUP_ICON,
|
rsc_mem = RSC_LoadResource(instance, icon_name, NE_RSCTYPE_GROUP_ICON,
|
||||||
&image_size);
|
&image_size);
|
||||||
if (rsc_mem == (HANDLE)NULL) {
|
if (rsc_mem == (HANDLE)NULL) {
|
||||||
printf("LoadIcon / Icon %04X not Found !\n", icon_name);
|
printf("LoadIcon / Icon %04X not Found !\n", icon_name);
|
||||||
|
ReleaseDC(GetDesktopWindow(), hdc);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
lp = (WORD *)GlobalLock(rsc_mem);
|
lp = (WORD *)GlobalLock(rsc_mem);
|
||||||
if (lp == NULL) {
|
if (lp == NULL) {
|
||||||
GlobalFree(rsc_mem);
|
GlobalFree(rsc_mem);
|
||||||
|
ReleaseDC(GetDesktopWindow(), hdc);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
lpicodesc = (ICONDESCRIP *)(lp + 3);
|
lpicodesc = (ICONDESCRIP *)(lp + 3);
|
||||||
hIcon = GlobalAlloc(GMEM_MOVEABLE, sizeof(ICONALLOC) + 1024);
|
hIcon = GlobalAlloc(GMEM_MOVEABLE, sizeof(ICONALLOC) + 1024);
|
||||||
if (hIcon == (HICON)NULL) {
|
if (hIcon == (HICON)NULL) {
|
||||||
GlobalFree(rsc_mem);
|
GlobalFree(rsc_mem);
|
||||||
|
ReleaseDC(GetDesktopWindow(), hdc);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
printf("LoadIcon Alloc hIcon=%X\n", hIcon);
|
printf("LoadIcon Alloc hIcon=%X\n", hIcon);
|
||||||
|
@ -344,11 +345,13 @@ HICON LoadIcon(HANDLE instance, LPSTR icon_name)
|
||||||
NE_RSCTYPE_ICON, &image_size);
|
NE_RSCTYPE_ICON, &image_size);
|
||||||
if (rsc_mem == (HANDLE)NULL) {
|
if (rsc_mem == (HANDLE)NULL) {
|
||||||
printf("LoadIcon / Icon %04X Bitmaps not Found !\n", icon_name);
|
printf("LoadIcon / Icon %04X Bitmaps not Found !\n", icon_name);
|
||||||
|
ReleaseDC(GetDesktopWindow(), hdc);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
lp = (WORD *)GlobalLock(rsc_mem);
|
lp = (WORD *)GlobalLock(rsc_mem);
|
||||||
if (lp == NULL) {
|
if (lp == NULL) {
|
||||||
GlobalFree(rsc_mem);
|
GlobalFree(rsc_mem);
|
||||||
|
ReleaseDC(GetDesktopWindow(), hdc);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
bmi = (BITMAPINFO *)lp;
|
bmi = (BITMAPINFO *)lp;
|
||||||
|
@ -378,7 +381,6 @@ HICON LoadIcon(HANDLE instance, LPSTR icon_name)
|
||||||
(BITMAPINFO *)bih, DIB_RGB_COLORS );
|
(BITMAPINFO *)bih, DIB_RGB_COLORS );
|
||||||
GlobalUnlock(rsc_mem);
|
GlobalUnlock(rsc_mem);
|
||||||
GlobalFree(rsc_mem);
|
GlobalFree(rsc_mem);
|
||||||
|
|
||||||
hMemDC = CreateCompatibleDC(hdc);
|
hMemDC = CreateCompatibleDC(hdc);
|
||||||
hMemDC2 = CreateCompatibleDC(hdc);
|
hMemDC2 = CreateCompatibleDC(hdc);
|
||||||
SelectObject(hMemDC, lpico->hBitmap);
|
SelectObject(hMemDC, lpico->hBitmap);
|
||||||
|
@ -386,8 +388,7 @@ HICON LoadIcon(HANDLE instance, LPSTR icon_name)
|
||||||
BitBlt(hMemDC, 0, 0, bih->biWidth, bih->biHeight, hMemDC2, 0, 0, SRCINVERT);
|
BitBlt(hMemDC, 0, 0, bih->biWidth, bih->biHeight, hMemDC2, 0, 0, SRCINVERT);
|
||||||
DeleteDC(hMemDC);
|
DeleteDC(hMemDC);
|
||||||
DeleteDC(hMemDC2);
|
DeleteDC(hMemDC2);
|
||||||
|
ReleaseDC(GetDesktopWindow(), hdc);
|
||||||
ReleaseDC(0, hdc);
|
|
||||||
return hIcon;
|
return hIcon;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -406,165 +407,6 @@ BOOL DestroyIcon(HICON hIcon)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
|
||||||
* LoadCursor [USER.173]
|
|
||||||
*/
|
|
||||||
HCURSOR LoadCursor(HANDLE instance, LPSTR cursor_name)
|
|
||||||
{
|
|
||||||
XColor bkcolor;
|
|
||||||
XColor fgcolor;
|
|
||||||
HCURSOR hCursor;
|
|
||||||
HANDLE rsc_mem;
|
|
||||||
WORD *lp;
|
|
||||||
CURSORDESCRIP *lpcurdesc;
|
|
||||||
CURSORALLOC *lpcur;
|
|
||||||
BITMAP BitMap;
|
|
||||||
HBITMAP hBitMap;
|
|
||||||
HDC hMemDC;
|
|
||||||
HDC hdc;
|
|
||||||
int i, j, image_size;
|
|
||||||
#ifdef DEBUG_RESOURCE
|
|
||||||
printf("LoadCursor: instance = %04x, name = %08x\n",
|
|
||||||
instance, cursor_name);
|
|
||||||
#endif
|
|
||||||
if (!(hdc = GetDC(GetDesktopWindow()))) return 0;
|
|
||||||
if (instance == (HANDLE)NULL) instance = hSysRes;
|
|
||||||
rsc_mem = RSC_LoadResource(instance, cursor_name, NE_RSCTYPE_GROUP_CURSOR,
|
|
||||||
&image_size);
|
|
||||||
if (rsc_mem == (HANDLE)NULL) {
|
|
||||||
printf("LoadCursor / Cursor %08X not Found !\n", cursor_name);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
lp = (WORD *)GlobalLock(rsc_mem);
|
|
||||||
if (lp == NULL) {
|
|
||||||
GlobalFree(rsc_mem);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
lpcurdesc = (CURSORDESCRIP *)(lp + 3);
|
|
||||||
#ifdef DEBUG_CURSOR
|
|
||||||
printf("LoadCursor / image_size=%d\n", image_size);
|
|
||||||
printf("LoadCursor / curReserved=%X\n", *lp);
|
|
||||||
printf("LoadCursor / curResourceType=%X\n", *(lp + 1));
|
|
||||||
printf("LoadCursor / curResourceCount=%X\n", *(lp + 2));
|
|
||||||
printf("LoadCursor / cursor Width=%d\n", (int)lpcurdesc->Width);
|
|
||||||
printf("LoadCursor / cursor Height=%d\n", (int)lpcurdesc->Height);
|
|
||||||
printf("LoadCursor / cursor curXHotspot=%d\n", (int)lpcurdesc->curXHotspot);
|
|
||||||
printf("LoadCursor / cursor curYHotspot=%d\n", (int)lpcurdesc->curYHotspot);
|
|
||||||
printf("LoadCursor / cursor curDIBSize=%lX\n", (DWORD)lpcurdesc->curDIBSize);
|
|
||||||
printf("LoadCursor / cursor curDIBOffset=%lX\n", (DWORD)lpcurdesc->curDIBOffset);
|
|
||||||
#endif
|
|
||||||
hCursor = GlobalAlloc(GMEM_MOVEABLE, sizeof(CURSORALLOC) + 1024L);
|
|
||||||
if (hCursor == (HCURSOR)NULL) {
|
|
||||||
GlobalFree(rsc_mem);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
printf("LoadCursor Alloc hCursor=%X\n", hCursor);
|
|
||||||
lpcur = (CURSORALLOC *)GlobalLock(hCursor);
|
|
||||||
lpcur->descriptor = *lpcurdesc;
|
|
||||||
GlobalUnlock(rsc_mem);
|
|
||||||
GlobalFree(rsc_mem);
|
|
||||||
rsc_mem = RSC_LoadResource(instance,
|
|
||||||
MAKEINTRESOURCE(lpcurdesc->curDIBOffset),
|
|
||||||
NE_RSCTYPE_CURSOR, &image_size);
|
|
||||||
if (rsc_mem == (HANDLE)NULL) {
|
|
||||||
printf("LoadCursor / Cursor %08X Bitmap not Found !\n", cursor_name);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
lp = (WORD *)GlobalLock(rsc_mem);
|
|
||||||
if (lp == NULL) {
|
|
||||||
GlobalFree(rsc_mem);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
lp += 2;
|
|
||||||
for (j = 0; j < 16; j++)
|
|
||||||
printf("%04X ", *(lp + j));
|
|
||||||
if (*lp == sizeof(BITMAPINFOHEADER))
|
|
||||||
lpcur->hBitmap = ConvertInfoBitmap(hdc, (BITMAPINFO *)lp);
|
|
||||||
else
|
|
||||||
lpcur->hBitmap = 0;
|
|
||||||
lp += sizeof(BITMAP);
|
|
||||||
for (i = 0; i < 81; i++) {
|
|
||||||
char temp = *((char *)lp + 162 + i);
|
|
||||||
*((char *)lp + 162 + i) = *((char *)lp + 324 - i);
|
|
||||||
*((char *)lp + 324 - i) = temp;
|
|
||||||
}
|
|
||||||
printf("LoadCursor / before XCreatePixmapFromBitmapData !\n");
|
|
||||||
lpcur->pixshape = XCreatePixmapFromBitmapData(
|
|
||||||
XT_display, DefaultRootWindow(XT_display),
|
|
||||||
((char *)lp + 211), 32, 32,
|
|
||||||
/*
|
|
||||||
lpcurdesc->Width / 2, lpcurdesc->Height / 4,
|
|
||||||
*/
|
|
||||||
WhitePixel(XT_display, DefaultScreen(XT_display)),
|
|
||||||
BlackPixel(XT_display, DefaultScreen(XT_display)), 1);
|
|
||||||
lpcur->pixmask = lpcur->pixshape;
|
|
||||||
bkcolor.pixel = WhitePixel(XT_display, DefaultScreen(XT_display));
|
|
||||||
fgcolor.pixel = BlackPixel(XT_display, DefaultScreen(XT_display));
|
|
||||||
printf("LoadCursor / before XCreatePixmapCursor !\n");
|
|
||||||
lpcur->xcursor = XCreatePixmapCursor(XT_display,
|
|
||||||
lpcur->pixshape, lpcur->pixmask,
|
|
||||||
&fgcolor, &bkcolor, lpcur->descriptor.curXHotspot,
|
|
||||||
lpcur->descriptor.curYHotspot);
|
|
||||||
|
|
||||||
ReleaseDC(0, hdc);
|
|
||||||
GlobalUnlock(rsc_mem);
|
|
||||||
GlobalFree(rsc_mem);
|
|
||||||
return hCursor;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
|
||||||
* DestroyCursor [USER.458]
|
|
||||||
*/
|
|
||||||
BOOL DestroyCursor(HCURSOR hCursor)
|
|
||||||
{
|
|
||||||
CURSORALLOC *lpcur;
|
|
||||||
if (hCursor == (HCURSOR)NULL) return FALSE;
|
|
||||||
lpcur = (CURSORALLOC *)GlobalLock(hCursor);
|
|
||||||
if (lpcur->hBitmap != (HBITMAP)NULL) DeleteObject(lpcur->hBitmap);
|
|
||||||
GlobalUnlock(hCursor);
|
|
||||||
GlobalFree(hCursor);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
|
||||||
* SetCursor [USER.69]
|
|
||||||
*/
|
|
||||||
HCURSOR SetCursor(HCURSOR hCursor)
|
|
||||||
{
|
|
||||||
HDC hDC;
|
|
||||||
HDC hMemDC;
|
|
||||||
BITMAP bm;
|
|
||||||
CURSORALLOC *lpcur;
|
|
||||||
HCURSOR hOldCursor;
|
|
||||||
#ifdef DEBUG_CURSOR
|
|
||||||
printf("SetCursor / hCursor=%04X !\n", hCursor);
|
|
||||||
#endif
|
|
||||||
if (hCursor == (HCURSOR)NULL) return FALSE;
|
|
||||||
lpcur = (CURSORALLOC *)GlobalLock(hCursor);
|
|
||||||
hOldCursor = hActiveCursor;
|
|
||||||
|
|
||||||
printf("SetCursor / before XDefineCursor !\n");
|
|
||||||
XDefineCursor(XT_display, DefaultRootWindow(XT_display), lpcur->xcursor);
|
|
||||||
GlobalUnlock(hCursor);
|
|
||||||
hActiveCursor = hCursor;
|
|
||||||
return hOldCursor;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
|
||||||
* ShowCursor [USER.71]
|
|
||||||
*/
|
|
||||||
int ShowCursor(BOOL bShow)
|
|
||||||
{
|
|
||||||
if (bShow) {
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* LoadAccelerators
|
* LoadAccelerators
|
||||||
*/
|
*/
|
||||||
|
@ -586,6 +428,10 @@ HANDLE FindResource(HANDLE instance, LPSTR resource_name, LPSTR type_name)
|
||||||
if (instance == 0)
|
if (instance == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
#ifdef DEBUG_RESOURCE
|
||||||
|
printf("FindResource hInst=%04X typename=%08X resname=%08X\n",
|
||||||
|
instance, type_name, resource_name);
|
||||||
|
#endif
|
||||||
if (OpenResourceFile(instance) < 0)
|
if (OpenResourceFile(instance) < 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -644,6 +490,8 @@ HANDLE LoadResource(HANDLE instance, HANDLE hResInfo)
|
||||||
h = r->rsc_mem = GlobalAlloc(GMEM_MOVEABLE, image_size);
|
h = r->rsc_mem = GlobalAlloc(GMEM_MOVEABLE, image_size);
|
||||||
image = GlobalLock(h);
|
image = GlobalLock(h);
|
||||||
|
|
||||||
|
lseek(ResourceFd, ((int) r->nameinfo.offset << r->size_shift), SEEK_SET);
|
||||||
|
|
||||||
if (image == NULL || read(ResourceFd, image, image_size) != image_size)
|
if (image == NULL || read(ResourceFd, image, image_size) != image_size)
|
||||||
{
|
{
|
||||||
GlobalFree(h);
|
GlobalFree(h);
|
||||||
|
|
|
@ -7,7 +7,7 @@ static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#ifdef linux
|
#ifdef __linux__
|
||||||
#include <linux/unistd.h>
|
#include <linux/unistd.h>
|
||||||
#include <linux/head.h>
|
#include <linux/head.h>
|
||||||
#include <linux/mman.h>
|
#include <linux/mman.h>
|
||||||
|
@ -38,17 +38,16 @@ static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
|
||||||
#define UTEXTSEL 0x1f
|
#define UTEXTSEL 0x1f
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct segment_descriptor_s * EnvironmentSelector = NULL;
|
static SEGDESC * EnvironmentSelector = NULL;
|
||||||
static struct segment_descriptor_s * PSP_Selector = NULL;
|
static SEGDESC * PSP_Selector = NULL;
|
||||||
struct segment_descriptor_s * MakeProcThunks = NULL;
|
SEGDESC * MakeProcThunks = NULL;
|
||||||
unsigned short PSPSelector;
|
unsigned short PSPSelector;
|
||||||
unsigned char ran_out = 0;
|
unsigned char ran_out = 0;
|
||||||
unsigned short SelectorOwners[MAX_SELECTORS];
|
|
||||||
unsigned short SelectorMap[MAX_SELECTORS];
|
|
||||||
unsigned short SelectorLimits[MAX_SELECTORS];
|
|
||||||
unsigned char SelectorTypes[MAX_SELECTORS];
|
|
||||||
int LastUsedSelector = FIRST_SELECTOR - 1;
|
int LastUsedSelector = FIRST_SELECTOR - 1;
|
||||||
|
|
||||||
|
unsigned short SelectorMap[MAX_SELECTORS];
|
||||||
|
SEGDESC Segments[MAX_SELECTORS];
|
||||||
|
|
||||||
#ifdef DEV_ZERO
|
#ifdef DEV_ZERO
|
||||||
static FILE *zfile = NULL;
|
static FILE *zfile = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
@ -83,6 +82,74 @@ FindUnusedSelector(void)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_IPC
|
||||||
|
/**********************************************************************
|
||||||
|
* IPCCopySelector
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
IPCCopySelector(int i_old, int i_new, int swap_type)
|
||||||
|
{
|
||||||
|
SEGDESC *s_new, *s_old;
|
||||||
|
|
||||||
|
s_old = &Segments[i_old];
|
||||||
|
s_new = &Segments[i_new];
|
||||||
|
|
||||||
|
SelectorMap[i_new] = i_new;
|
||||||
|
|
||||||
|
s_new->selector = (i_new << 3) | 0x0007;
|
||||||
|
s_new->base_addr = (void *) ((long) s_new->selector << 16);
|
||||||
|
s_new->length = s_old->length;
|
||||||
|
s_new->flags = s_old->flags;
|
||||||
|
s_new->owner = s_old->owner;
|
||||||
|
if (swap_type)
|
||||||
|
{
|
||||||
|
if (s_old->type == MODIFY_LDT_CONTENTS_DATA)
|
||||||
|
s_new->type = MODIFY_LDT_CONTENTS_CODE;
|
||||||
|
else
|
||||||
|
s_new->type = MODIFY_LDT_CONTENTS_DATA;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
s_new->type = s_old->type;
|
||||||
|
|
||||||
|
if (s_old->shm_key == 0)
|
||||||
|
{
|
||||||
|
s_old->shm_key = shmget(IPC_PRIVATE, s_old->length, 0600);
|
||||||
|
if (s_old->shm_key == 0)
|
||||||
|
{
|
||||||
|
memset(s_new, 0, sizeof(*s_new));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (shmat(s_old->shm_key, s_new->base_addr, 0) == NULL)
|
||||||
|
{
|
||||||
|
memset(s_new, 0, sizeof(*s_new));
|
||||||
|
shmctl(s_old->shm_key, IPC_RMID, NULL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
memcpy(s_new->base_addr, s_old->base_addr, s_new->length);
|
||||||
|
munmap(s_old->base_addr,
|
||||||
|
((s_old->length + PAGE_SIZE) & ~(PAGE_SIZE - 1)));
|
||||||
|
shmat(s_old->shm_key, s_old->base_addr, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (shmat(s_old->shm_key, s_new->base_addr, 0) == NULL)
|
||||||
|
{
|
||||||
|
memset(s_new, 0, sizeof(*s_new));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
s_new->shm_key = s_old->shm_key;
|
||||||
|
|
||||||
|
if (set_ldt_entry(i_new, (unsigned long) s_new->base_addr,
|
||||||
|
s_new->length - 1, 0, s_new->type, 0, 0) < 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return s_new->selector;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* AllocSelector
|
* AllocSelector
|
||||||
*
|
*
|
||||||
|
@ -92,32 +159,38 @@ FindUnusedSelector(void)
|
||||||
unsigned int
|
unsigned int
|
||||||
AllocSelector(unsigned int old_selector)
|
AllocSelector(unsigned int old_selector)
|
||||||
{
|
{
|
||||||
|
SEGDESC *s_new, *s_old;
|
||||||
int i_new, i_old;
|
int i_new, i_old;
|
||||||
long base;
|
|
||||||
|
|
||||||
i_new = FindUnusedSelector();
|
i_new = FindUnusedSelector();
|
||||||
|
s_new = &Segments[i_new];
|
||||||
|
|
||||||
if (old_selector)
|
if (old_selector)
|
||||||
{
|
{
|
||||||
i_old = (old_selector >> 3);
|
i_old = (old_selector >> 3);
|
||||||
SelectorMap[i_new] = i_old;
|
#ifdef HAVE_IPC
|
||||||
base = SAFEMAKEPTR(old_selector, 0);
|
return IPCCopySelector(i_old, i_new, 0);
|
||||||
if (set_ldt_entry(i_new, base,
|
#else
|
||||||
SelectorLimits[i_old], 0,
|
s_old = &Segments[i_old];
|
||||||
SelectorTypes[i_old], 0, 0) < 0)
|
s_new->selector = (i_new << 3) | 0x0007;
|
||||||
|
*s_new = *s_old;
|
||||||
|
SelectorMap[i_new] = SelectorMap[i_old];
|
||||||
|
|
||||||
|
if (set_ldt_entry(i_new, s_new->base_addr,
|
||||||
|
s_new->length - 1, 0,
|
||||||
|
s_new->type, 0, 0) < 0)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
SelectorLimits[i_new] = SelectorLimits[i_old];
|
|
||||||
SelectorTypes[i_new] = SelectorTypes[i_old];
|
|
||||||
SelectorMap[i_new] = SelectorMap[i_old];
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
memset(s_new, 0, sizeof(*s_new));
|
||||||
SelectorMap[i_new] = i_new;
|
SelectorMap[i_new] = i_new;
|
||||||
}
|
}
|
||||||
|
|
||||||
return i_new;
|
return (i_new << 3) | 0x0007;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
|
@ -128,7 +201,36 @@ AllocSelector(unsigned int old_selector)
|
||||||
*/
|
*/
|
||||||
unsigned int PrestoChangoSelector(unsigned src_selector, unsigned dst_selector)
|
unsigned int PrestoChangoSelector(unsigned src_selector, unsigned dst_selector)
|
||||||
{
|
{
|
||||||
long dst_base, src_base;
|
#ifdef HAVE_IPC
|
||||||
|
SEGDESC *src_s;
|
||||||
|
int src_idx, dst_idx;
|
||||||
|
|
||||||
|
src_idx = src_selector >> 3;
|
||||||
|
dst_idx = dst_selector >> 3;
|
||||||
|
|
||||||
|
if (src_idx == dst_idx)
|
||||||
|
{
|
||||||
|
src_s = &Segments[src_idx];
|
||||||
|
|
||||||
|
if (src_s->type == MODIFY_LDT_CONTENTS_DATA)
|
||||||
|
src_s->type = MODIFY_LDT_CONTENTS_CODE;
|
||||||
|
else
|
||||||
|
src_s->type = MODIFY_LDT_CONTENTS_DATA;
|
||||||
|
|
||||||
|
if (set_ldt_entry(src_idx, (long) src_s->base_addr,
|
||||||
|
src_s->length - 1, 0, src_s->type, 0, 0) < 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return src_s->selector;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return IPCCopySelector(src_idx, dst_idx, 1);
|
||||||
|
}
|
||||||
|
#else /* HAVE_IPC */
|
||||||
|
SEGDESC *src_s, *dst_s;
|
||||||
char *p;
|
char *p;
|
||||||
int src_idx, dst_idx;
|
int src_idx, dst_idx;
|
||||||
int alias_count;
|
int alias_count;
|
||||||
|
@ -136,27 +238,27 @@ unsigned int PrestoChangoSelector(unsigned src_selector, unsigned dst_selector)
|
||||||
|
|
||||||
src_idx = (SelectorMap[src_selector >> 3]);
|
src_idx = (SelectorMap[src_selector >> 3]);
|
||||||
dst_idx = dst_selector >> 3;
|
dst_idx = dst_selector >> 3;
|
||||||
src_base = (src_idx << 19) | 0x70000;
|
src_s = &Segments[src_idx];
|
||||||
dst_base = (dst_idx << 19) | 0x70000;
|
dst_s = &Segments[dst_idx];
|
||||||
|
|
||||||
alias_count = 0;
|
alias_count = 0;
|
||||||
for (i = FIRST_SELECTOR; i < MAX_SELECTORS; i++)
|
for (i = FIRST_SELECTOR; i < MAX_SELECTORS; i++)
|
||||||
if (SelectorMap[i] == src_idx)
|
if (SelectorMap[i] == src_idx)
|
||||||
alias_count++;
|
alias_count++;
|
||||||
|
|
||||||
if (SelectorTypes[src_idx] == MODIFY_LDT_CONTENTS_DATA
|
if (src_s->type == MODIFY_LDT_CONTENTS_DATA
|
||||||
|| alias_count > 1 || src_idx == dst_idx)
|
|| alias_count > 1 || src_idx == dst_idx)
|
||||||
{
|
{
|
||||||
if (SelectorTypes[src_idx] == MODIFY_LDT_CONTENTS_DATA)
|
*dst_s = *src_s;
|
||||||
SelectorTypes[dst_idx] = MODIFY_LDT_CONTENTS_CODE;
|
|
||||||
|
if (src_s->type == MODIFY_LDT_CONTENTS_DATA)
|
||||||
|
dst_s->type = MODIFY_LDT_CONTENTS_CODE;
|
||||||
else
|
else
|
||||||
SelectorTypes[dst_idx] = MODIFY_LDT_CONTENTS_DATA;
|
dst_s->type = MODIFY_LDT_CONTENTS_DATA;
|
||||||
|
|
||||||
SelectorMap[dst_idx] = SelectorMap[src_idx];
|
SelectorMap[dst_idx] = SelectorMap[src_idx];
|
||||||
SelectorLimits[dst_idx] = SelectorLimits[src_idx];
|
if (set_ldt_entry(dst_idx, (long) dst_s->base_addr,
|
||||||
if (set_ldt_entry(dst_idx, src_base,
|
dst_s->length - 1, 0, dst_s->type, 0, 0) < 0)
|
||||||
SelectorLimits[dst_idx], 0,
|
|
||||||
SelectorTypes[dst_idx], 0, 0) < 0)
|
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -168,20 +270,22 @@ unsigned int PrestoChangoSelector(unsigned src_selector, unsigned dst_selector)
|
||||||
* segment. The SAFEST (but ugliest) way to deal with
|
* segment. The SAFEST (but ugliest) way to deal with
|
||||||
* this is to map the new segment and copy all the contents.
|
* this is to map the new segment and copy all the contents.
|
||||||
*/
|
*/
|
||||||
SelectorTypes[dst_idx] = MODIFY_LDT_CONTENTS_DATA;
|
SelectorMap[dst_idx] = dst_idx;
|
||||||
SelectorMap[dst_idx] = SelectorMap[src_idx];
|
*dst_s = *src_s;
|
||||||
SelectorLimits[dst_idx] = SelectorLimits[src_idx];
|
dst_s->selector = (dst_idx << 3) | 0x0007;
|
||||||
|
dst_s->base_addr = (void *) ((unsigned int) dst_s->selector << 16);
|
||||||
|
dst_s->type = MODIFY_LDT_CONTENTS_DATA;
|
||||||
#ifdef DEV_ZERO
|
#ifdef DEV_ZERO
|
||||||
if (zfile == NULL)
|
if (zfile == NULL)
|
||||||
zfile = fopen("/dev/zero","r");
|
zfile = fopen("/dev/zero","r");
|
||||||
p = (void *) mmap((char *) dst_base,
|
p = (void *) mmap((char *) dst_s->base_addr,
|
||||||
((SelectorLimits[dst_idx] + PAGE_SIZE)
|
((dst_s->length + PAGE_SIZE)
|
||||||
& ~(PAGE_SIZE - 1)),
|
& ~(PAGE_SIZE - 1)),
|
||||||
PROT_EXEC | PROT_READ | PROT_WRITE,
|
PROT_EXEC | PROT_READ | PROT_WRITE,
|
||||||
MAP_FIXED | MAP_PRIVATE, fileno(zfile), 0);
|
MAP_FIXED | MAP_PRIVATE, fileno(zfile), 0);
|
||||||
#else
|
#else
|
||||||
p = (void *) mmap((char *) dst_base,
|
p = (void *) mmap((char *) dst_s->base_addr,
|
||||||
((SelectorLimits[dst_idx] + PAGE_SIZE)
|
((dst_s->length + PAGE_SIZE)
|
||||||
& ~(PAGE_SIZE - 1)),
|
& ~(PAGE_SIZE - 1)),
|
||||||
PROT_EXEC | PROT_READ | PROT_WRITE,
|
PROT_EXEC | PROT_READ | PROT_WRITE,
|
||||||
MAP_FIXED | MAP_PRIVATE | MAP_ANON, -1, 0);
|
MAP_FIXED | MAP_PRIVATE | MAP_ANON, -1, 0);
|
||||||
|
@ -189,23 +293,27 @@ unsigned int PrestoChangoSelector(unsigned src_selector, unsigned dst_selector)
|
||||||
if (p == NULL)
|
if (p == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
memcpy((void *) dst_base, (void *) src_base,
|
memcpy((void *) dst_s->base_addr, (void *) src_s->base_addr,
|
||||||
SelectorLimits[dst_idx] + 1);
|
dst_s->length);
|
||||||
if (set_ldt_entry(src_idx, dst_base,
|
if (set_ldt_entry(src_idx, dst_s->base_addr,
|
||||||
SelectorLimits[dst_idx], 0,
|
dst_s->length - 1, 0, dst_s->type, 0, 0) < 0)
|
||||||
SelectorTypes[dst_idx], 0, 0) < 0)
|
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (set_ldt_entry(dst_idx, dst_base,
|
if (set_ldt_entry(dst_idx, dst_s->base_addr,
|
||||||
SelectorLimits[dst_idx], 0,
|
dst_s->length - 1, 0, dst_s->type, 0, 0) < 0)
|
||||||
SelectorTypes[dst_idx], 0, 0) < 0)
|
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
munmap(src_s->base_addr,
|
||||||
|
(src_s->length + PAGE_SIZE) & ~(PAGE_SIZE - 1));
|
||||||
|
SelectorMap[src_idx] = dst_idx;
|
||||||
|
src_s->base_addr = dst_s->base_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (dst_idx << 3) | 0x0007;
|
return dst_s->selector;
|
||||||
|
#endif /* HAVE_IPC */
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
|
@ -227,12 +335,46 @@ AllocDStoCSAlias(unsigned int ds_selector)
|
||||||
*/
|
*/
|
||||||
unsigned int FreeSelector(unsigned int sel)
|
unsigned int FreeSelector(unsigned int sel)
|
||||||
{
|
{
|
||||||
|
SEGDESC *s;
|
||||||
int sel_idx;
|
int sel_idx;
|
||||||
int alias_count;
|
int alias_count;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
#ifdef HAVE_IPC
|
||||||
|
sel_idx = sel >> 3;
|
||||||
|
|
||||||
|
if (sel_idx < FIRST_SELECTOR || sel_idx >= MAX_SELECTORS)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
s = &Segments[sel_idx];
|
||||||
|
if (s->shm_key == 0)
|
||||||
|
{
|
||||||
|
munmap(s->base_addr, ((s->length + PAGE_SIZE) & ~(PAGE_SIZE - 1)));
|
||||||
|
memcpy(s, 0, sizeof(*s));
|
||||||
|
SelectorMap[sel_idx] = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
shmdt(s->base_addr);
|
||||||
|
|
||||||
|
alias_count = 0;
|
||||||
|
for (i = FIRST_SELECTOR; i < MAX_SELECTORS; i++)
|
||||||
|
if (SelectorMap[i] && Segments[i].shm_key == s->shm_key)
|
||||||
|
alias_count++;
|
||||||
|
|
||||||
|
if (alias_count == 1)
|
||||||
|
shmctl(s->shm_key, IPC_RMID, NULL);
|
||||||
|
|
||||||
|
memcpy(s, 0, sizeof(*s));
|
||||||
|
SelectorMap[sel_idx] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* HAVE_IPC */
|
||||||
sel_idx = SelectorMap[sel >> 3];
|
sel_idx = SelectorMap[sel >> 3];
|
||||||
|
|
||||||
|
if (sel_idx < FIRST_SELECTOR || sel_idx >= MAX_SELECTORS)
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (sel_idx != (sel >> 3))
|
if (sel_idx != (sel >> 3))
|
||||||
{
|
{
|
||||||
SelectorMap[sel >> 3] = 0;
|
SelectorMap[sel >> 3] = 0;
|
||||||
|
@ -246,10 +388,12 @@ unsigned int FreeSelector(unsigned int sel)
|
||||||
|
|
||||||
if (alias_count == 1)
|
if (alias_count == 1)
|
||||||
{
|
{
|
||||||
munmap((char *) (sel << 16),
|
s = &Segments[sel_idx];
|
||||||
((SelectorLimits[sel_idx] + PAGE_SIZE) & ~(PAGE_SIZE - 1)));
|
munmap(s->base_addr, ((s->length + PAGE_SIZE) & ~(PAGE_SIZE - 1)));
|
||||||
|
memcpy(s, 0, sizeof(*s));
|
||||||
SelectorMap[sel >> 3] = 0;
|
SelectorMap[sel >> 3] = 0;
|
||||||
}
|
}
|
||||||
|
#endif /* HAVE_IPC */
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -257,10 +401,10 @@ unsigned int FreeSelector(unsigned int sel)
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* CreateNewSegment
|
* CreateNewSegment
|
||||||
*/
|
*/
|
||||||
struct segment_descriptor_s *
|
SEGDESC *
|
||||||
CreateNewSegment(int code_flag, int read_only, int length)
|
CreateNewSegment(int code_flag, int read_only, int length)
|
||||||
{
|
{
|
||||||
struct segment_descriptor_s *s;
|
SEGDESC *s;
|
||||||
int contents;
|
int contents;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -269,7 +413,7 @@ CreateNewSegment(int code_flag, int read_only, int length)
|
||||||
/*
|
/*
|
||||||
* Fill in selector info.
|
* Fill in selector info.
|
||||||
*/
|
*/
|
||||||
s = malloc(sizeof(*s));
|
s = &Segments[i];
|
||||||
if (code_flag)
|
if (code_flag)
|
||||||
{
|
{
|
||||||
contents = MODIFY_LDT_CONTENTS_CODE;
|
contents = MODIFY_LDT_CONTENTS_CODE;
|
||||||
|
@ -305,13 +449,12 @@ CreateNewSegment(int code_flag, int read_only, int length)
|
||||||
(s->length - 1) & 0xffff, 0,
|
(s->length - 1) & 0xffff, 0,
|
||||||
contents, read_only, 0) < 0)
|
contents, read_only, 0) < 0)
|
||||||
{
|
{
|
||||||
free(s);
|
memset(s, 0, sizeof(*s));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
SelectorMap[i] = (unsigned short) i;
|
SelectorMap[i] = (unsigned short) i;
|
||||||
SelectorLimits[i] = s->length - 1;
|
s->type = contents;
|
||||||
SelectorTypes[i] = contents;
|
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
@ -319,7 +462,7 @@ CreateNewSegment(int code_flag, int read_only, int length)
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* GetNextSegment
|
* GetNextSegment
|
||||||
*/
|
*/
|
||||||
struct segment_descriptor_s *
|
SEGDESC *
|
||||||
GetNextSegment(unsigned int flags, unsigned int limit)
|
GetNextSegment(unsigned int flags, unsigned int limit)
|
||||||
{
|
{
|
||||||
return CreateNewSegment(0, 0, limit);
|
return CreateNewSegment(0, 0, limit);
|
||||||
|
@ -494,11 +637,11 @@ GetDOSEnvironment()
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* CreateEnvironment
|
* CreateEnvironment
|
||||||
*/
|
*/
|
||||||
static struct segment_descriptor_s *
|
static SEGDESC *
|
||||||
CreateEnvironment(void)
|
CreateEnvironment(void)
|
||||||
{
|
{
|
||||||
char *p;
|
char *p;
|
||||||
struct segment_descriptor_s * s;
|
SEGDESC * s;
|
||||||
|
|
||||||
s = CreateNewSegment(0, 0, PAGE_SIZE);
|
s = CreateNewSegment(0, 0, PAGE_SIZE);
|
||||||
if (s == NULL)
|
if (s == NULL)
|
||||||
|
@ -521,12 +664,12 @@ CreateEnvironment(void)
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* CreatePSP
|
* CreatePSP
|
||||||
*/
|
*/
|
||||||
static struct segment_descriptor_s *
|
static SEGDESC *
|
||||||
CreatePSP(void)
|
CreatePSP(void)
|
||||||
{
|
{
|
||||||
struct dos_psp_s *psp;
|
struct dos_psp_s *psp;
|
||||||
unsigned short *usp;
|
unsigned short *usp;
|
||||||
struct segment_descriptor_s * s;
|
SEGDESC * s;
|
||||||
char *p1, *p2;
|
char *p1, *p2;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -572,13 +715,13 @@ CreatePSP(void)
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* CreateSelectors
|
* CreateSelectors
|
||||||
*/
|
*/
|
||||||
struct segment_descriptor_s *
|
SEGDESC *
|
||||||
CreateSelectors(struct w_files * wpnt)
|
CreateSelectors(struct w_files * wpnt)
|
||||||
{
|
{
|
||||||
int fd = wpnt->fd;
|
int fd = wpnt->fd;
|
||||||
struct ne_segment_table_entry_s *seg_table = wpnt->seg_table;
|
struct ne_segment_table_entry_s *seg_table = wpnt->seg_table;
|
||||||
struct ne_header_s *ne_header = wpnt->ne_header;
|
struct ne_header_s *ne_header = wpnt->ne_header;
|
||||||
struct segment_descriptor_s *selectors, *s, *stmp;
|
SEGDESC *selectors, *s, *stmp;
|
||||||
unsigned short auto_data_sel;
|
unsigned short auto_data_sel;
|
||||||
int contents, read_only;
|
int contents, read_only;
|
||||||
int SelectorTableLength;
|
int SelectorTableLength;
|
||||||
|
@ -692,7 +835,7 @@ CreateSelectors(struct w_files * wpnt)
|
||||||
|
|
||||||
s = selectors;
|
s = selectors;
|
||||||
for (i = 0; i < ne_header->n_segment_tab; i++, s++)
|
for (i = 0; i < ne_header->n_segment_tab; i++, s++)
|
||||||
SelectorOwners[s->selector >> 3] = auto_data_sel;
|
Segments[s->selector >> 3].owner = auto_data_sel;
|
||||||
|
|
||||||
if(!EnvironmentSelector) {
|
if(!EnvironmentSelector) {
|
||||||
EnvironmentSelector = CreateEnvironment();
|
EnvironmentSelector = CreateEnvironment();
|
||||||
|
|
|
@ -3,7 +3,11 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
#include <sys/syscall.h>
|
||||||
|
#else
|
||||||
#include <syscall.h>
|
#include <syscall.h>
|
||||||
|
#endif
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#ifdef linux
|
#ifdef linux
|
||||||
|
@ -85,11 +89,11 @@ static void win_fault(int signal, int code, struct sigcontext *scp){
|
||||||
if(!do_int21(scp)) goto oops;
|
if(!do_int21(scp)) goto oops;
|
||||||
break;
|
break;
|
||||||
case 0x11:
|
case 0x11:
|
||||||
scp->sc_eax = 0x00000000; /* get equipment list: we haven't */
|
scp->sc_eax = (scp->sc_eax & 0xffff0000L) | DOS_GetEquipment();
|
||||||
break; /* got anything */
|
break;
|
||||||
case 0x12:
|
case 0x12:
|
||||||
scp->sc_eax = 640L; /* get base mem size */
|
scp->sc_eax = (scp->sc_eax & 0xffff0000L) | 640L;
|
||||||
break;
|
break; /* get base mem size */
|
||||||
case 0x1A:
|
case 0x1A:
|
||||||
if(!do_int1A(scp)) goto oops;
|
if(!do_int1A(scp)) goto oops;
|
||||||
break;
|
break;
|
||||||
|
|
141
loader/wine.c
141
loader/wine.c
|
@ -28,11 +28,14 @@ extern void CallTo32();
|
||||||
|
|
||||||
char * GetModuleName(struct w_files * wpnt, int index, char *buffer);
|
char * GetModuleName(struct w_files * wpnt, int index, char *buffer);
|
||||||
extern unsigned char ran_out;
|
extern unsigned char ran_out;
|
||||||
|
extern char WindowsPath[256];
|
||||||
unsigned short WIN_StackSize;
|
unsigned short WIN_StackSize;
|
||||||
unsigned short WIN_HeapSize;
|
unsigned short WIN_HeapSize;
|
||||||
|
|
||||||
struct w_files * wine_files = NULL;
|
struct w_files * wine_files = NULL;
|
||||||
|
|
||||||
|
int WineForceFail = 0;
|
||||||
|
|
||||||
char **Argv;
|
char **Argv;
|
||||||
int Argc;
|
int Argc;
|
||||||
struct mz_header_s *CurrentMZHeader;
|
struct mz_header_s *CurrentMZHeader;
|
||||||
|
@ -40,11 +43,9 @@ struct ne_header_s *CurrentNEHeader;
|
||||||
int CurrentNEFile;
|
int CurrentNEFile;
|
||||||
HINSTANCE hSysRes;
|
HINSTANCE hSysRes;
|
||||||
|
|
||||||
static char *dllExtensions[] = { "dll", "exe", NULL };
|
static char *Extensions[] = { "dll", "exe", NULL };
|
||||||
static char *exeExtensions[] = { "exe", NULL };
|
|
||||||
static char *WinePath = NULL;
|
static char *WinePath = NULL;
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* DebugPrintString
|
* DebugPrintString
|
||||||
*/
|
*/
|
||||||
|
@ -101,12 +102,13 @@ GetFileInfo(unsigned short instance)
|
||||||
* LoadImage
|
* LoadImage
|
||||||
* Load one NE format executable into memory
|
* Load one NE format executable into memory
|
||||||
*/
|
*/
|
||||||
HINSTANCE LoadImage(char * filename, char * modulename)
|
HINSTANCE LoadImage(char *modulename)
|
||||||
{
|
{
|
||||||
unsigned int read_size;
|
unsigned int read_size;
|
||||||
int i;
|
int i;
|
||||||
struct w_files * wpnt, *wpnt1;
|
struct w_files * wpnt, *wpnt1;
|
||||||
unsigned int status;
|
unsigned int status;
|
||||||
|
char buffer[256];
|
||||||
|
|
||||||
/* First allocate a spot to store the info we collect, and add it to
|
/* First allocate a spot to store the info we collect, and add it to
|
||||||
* our linked list.
|
* our linked list.
|
||||||
|
@ -122,10 +124,24 @@ HINSTANCE LoadImage(char * filename, char * modulename)
|
||||||
};
|
};
|
||||||
wpnt->next = NULL;
|
wpnt->next = NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* search file
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (FindFile(buffer, sizeof(buffer), modulename, Extensions, WindowsPath)
|
||||||
|
==NULL)
|
||||||
|
{
|
||||||
|
char temp[256];
|
||||||
|
|
||||||
|
sprintf(temp,"LoadImage: I can't find %s !\n",modulename);
|
||||||
|
myerror(temp);
|
||||||
|
}
|
||||||
|
fprintf(stderr,"LoadImage: loading %s (%s)\n", modulename, buffer);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Open file for reading.
|
* Open file for reading.
|
||||||
*/
|
*/
|
||||||
wpnt->fd = open(filename, O_RDONLY);
|
wpnt->fd = open(buffer, O_RDONLY);
|
||||||
if (wpnt->fd < 0)
|
if (wpnt->fd < 0)
|
||||||
{
|
{
|
||||||
myerror(NULL);
|
myerror(NULL);
|
||||||
|
@ -133,7 +149,7 @@ HINSTANCE LoadImage(char * filename, char * modulename)
|
||||||
/*
|
/*
|
||||||
* Establish header pointers.
|
* Establish header pointers.
|
||||||
*/
|
*/
|
||||||
wpnt->filename = strdup(filename);
|
wpnt->filename = strdup(buffer);
|
||||||
wpnt->name = NULL;
|
wpnt->name = NULL;
|
||||||
if(modulename) wpnt->name = strdup(modulename);
|
if(modulename) wpnt->name = strdup(modulename);
|
||||||
|
|
||||||
|
@ -181,7 +197,7 @@ HINSTANCE LoadImage(char * filename, char * modulename)
|
||||||
wpnt->selector_table = CreateSelectors(wpnt);
|
wpnt->selector_table = CreateSelectors(wpnt);
|
||||||
wpnt->hinstance
|
wpnt->hinstance
|
||||||
= wpnt->
|
= wpnt->
|
||||||
selector_table[wine_files->ne_header->auto_data_seg-1].selector;
|
selector_table[wpnt->ne_header->auto_data_seg-1].selector;
|
||||||
|
|
||||||
/* Get the lookup table. This is used for looking up the addresses
|
/* Get the lookup table. This is used for looking up the addresses
|
||||||
of functions that are exported */
|
of functions that are exported */
|
||||||
|
@ -227,16 +243,10 @@ HINSTANCE LoadImage(char * filename, char * modulename)
|
||||||
|
|
||||||
if(FindDLLTable(buff)) continue; /* This module already loaded */
|
if(FindDLLTable(buff)) continue; /* This module already loaded */
|
||||||
|
|
||||||
if (FindFileInPath(buff2, sizeof(buff2),
|
LoadImage(buff);
|
||||||
buff, dllExtensions, WinePath) != NULL &&
|
/*
|
||||||
(fd = open(buff2, O_RDONLY)) >= 0)
|
|
||||||
{
|
|
||||||
close(fd);
|
|
||||||
LoadImage(buff2, buff);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(stderr,"Unable to load:%s\n", buff);
|
fprintf(stderr,"Unable to load:%s\n", buff);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
return(wpnt->hinstance);
|
return(wpnt->hinstance);
|
||||||
}
|
}
|
||||||
|
@ -249,6 +259,8 @@ _WinMain(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int segment;
|
int segment;
|
||||||
char *p;
|
char *p;
|
||||||
|
char *sysresname;
|
||||||
|
char syspath[256];
|
||||||
char exe_path[256];
|
char exe_path[256];
|
||||||
#ifdef WINESTAT
|
#ifdef WINESTAT
|
||||||
char * cp;
|
char * cp;
|
||||||
|
@ -273,19 +285,20 @@ _WinMain(int argc, char **argv)
|
||||||
strcat(WinePath, ";");
|
strcat(WinePath, ";");
|
||||||
strcat(WinePath, p);
|
strcat(WinePath, p);
|
||||||
|
|
||||||
if (FindFileInPath(exe_path, 256, argv[1], exeExtensions, WinePath)
|
LoadImage(argv[1]);
|
||||||
== NULL)
|
hSysRes = LoadImage("sysres.dll");
|
||||||
{
|
if (hSysRes == (HINSTANCE)NULL)
|
||||||
fprintf(stderr, "Could not find file '%s'\n", argv[1]);
|
printf("Error Loading System Resources !!!\n");
|
||||||
exit(1);
|
else
|
||||||
}
|
printf("System Resources Loaded // hSysRes='%04X'\n", hSysRes);
|
||||||
|
|
||||||
LoadImage(exe_path, NULL);
|
|
||||||
hSysRes = LoadImage("sysres.dll", NULL);
|
|
||||||
|
|
||||||
if(ran_out) exit(1);
|
if(ran_out) exit(1);
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
GetEntryDLLName("USER", "INITAPP", 0, 0);
|
{
|
||||||
|
int dummy1, dummy2;
|
||||||
|
|
||||||
|
GetEntryDLLName("USER", "INITAPP", &dummy1, &dummy2);
|
||||||
|
}
|
||||||
for(i=0; i<1024; i++) {
|
for(i=0; i<1024; i++) {
|
||||||
int j;
|
int j;
|
||||||
j = GetEntryPointFromOrdinal(wine_files, i);
|
j = GetEntryPointFromOrdinal(wine_files, i);
|
||||||
|
@ -327,6 +340,21 @@ _WinMain(int argc, char **argv)
|
||||||
|
|
||||||
init_wine_signals();
|
init_wine_signals();
|
||||||
|
|
||||||
|
if (WineForceFail)
|
||||||
|
{
|
||||||
|
p = (char *) ((cs_reg << 16) | ip_reg);
|
||||||
|
|
||||||
|
*p++ = 0xcd;
|
||||||
|
*p++ = 0x20;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ss_reg == 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "SS is 0. Send email to bob@amscons.com.\n");
|
||||||
|
fprintf(stderr, " No. Really. I want to know what programs\n");
|
||||||
|
fprintf(stderr, " do this.\n");
|
||||||
|
}
|
||||||
|
|
||||||
rv = CallToInit16(cs_reg << 16 | ip_reg, ss_reg << 16 | sp_reg, ds_reg);
|
rv = CallToInit16(cs_reg << 16 | ip_reg, ss_reg << 16 | sp_reg, ds_reg);
|
||||||
printf ("rv = %x\n", rv);
|
printf ("rv = %x\n", rv);
|
||||||
}
|
}
|
||||||
|
@ -392,12 +420,11 @@ GetModuleName(struct w_files * wpnt, int index, char *buffer)
|
||||||
int
|
int
|
||||||
FixupSegment(struct w_files * wpnt, int segment_num)
|
FixupSegment(struct w_files * wpnt, int segment_num)
|
||||||
{
|
{
|
||||||
int fd = wpnt->fd;
|
int fd = wpnt->fd;
|
||||||
struct mz_header_s * mz_header = wpnt->mz_header;
|
struct mz_header_s * mz_header = wpnt->mz_header;
|
||||||
struct ne_header_s *ne_header = wpnt->ne_header;
|
struct ne_header_s *ne_header = wpnt->ne_header;
|
||||||
struct ne_segment_table_entry_s *seg_table = wpnt->seg_table;
|
struct ne_segment_table_entry_s *seg_table = wpnt->seg_table;
|
||||||
struct segment_descriptor_s *selector_table = wpnt->selector_table;
|
struct segment_descriptor_s *selector_table = wpnt->selector_table;
|
||||||
|
|
||||||
struct relocation_entry_s *rep, *rep1;
|
struct relocation_entry_s *rep, *rep1;
|
||||||
struct ne_segment_table_entry_s *seg;
|
struct ne_segment_table_entry_s *seg;
|
||||||
struct segment_descriptor_s *sel;
|
struct segment_descriptor_s *sel;
|
||||||
|
@ -410,10 +437,14 @@ FixupSegment(struct w_files * wpnt, int segment_num)
|
||||||
char dll_name[257];
|
char dll_name[257];
|
||||||
char func_name[257];
|
char func_name[257];
|
||||||
int i, n_entries;
|
int i, n_entries;
|
||||||
|
int additive;
|
||||||
|
|
||||||
seg = &seg_table[segment_num];
|
seg = &seg_table[segment_num];
|
||||||
sel = &selector_table[segment_num];
|
sel = &selector_table[segment_num];
|
||||||
|
|
||||||
|
fprintf(stderr, "Segment fixups for %s, segment %d, selector %x\n",
|
||||||
|
wpnt->name, segment_num, (int) sel->base_addr >> 16);
|
||||||
|
|
||||||
if ((seg->seg_data_offset == 0) ||
|
if ((seg->seg_data_offset == 0) ||
|
||||||
!(seg->seg_flags & NE_SEGFLAGS_RELOC_DATA))
|
!(seg->seg_flags & NE_SEGFLAGS_RELOC_DATA))
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -445,8 +476,13 @@ FixupSegment(struct w_files * wpnt, int segment_num)
|
||||||
/*
|
/*
|
||||||
* Get the target address corresponding to this entry.
|
* Get the target address corresponding to this entry.
|
||||||
*/
|
*/
|
||||||
|
additive = 0;
|
||||||
|
|
||||||
switch (rep->relocation_type)
|
switch (rep->relocation_type)
|
||||||
{
|
{
|
||||||
|
case NE_RELTYPE_ORDINALADD:
|
||||||
|
additive = 1;
|
||||||
|
|
||||||
case NE_RELTYPE_ORDINAL:
|
case NE_RELTYPE_ORDINAL:
|
||||||
if (GetModuleName(wpnt, rep->target1,
|
if (GetModuleName(wpnt, rep->target1,
|
||||||
dll_name) == NULL)
|
dll_name) == NULL)
|
||||||
|
@ -474,6 +510,9 @@ FixupSegment(struct w_files * wpnt, int segment_num)
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case NE_RELTYPE_NAMEADD:
|
||||||
|
additive = 1;
|
||||||
|
|
||||||
case NE_RELTYPE_NAME:
|
case NE_RELTYPE_NAME:
|
||||||
if (GetModuleName(wpnt, rep->target1, dll_name)
|
if (GetModuleName(wpnt, rep->target1, dll_name)
|
||||||
== NULL)
|
== NULL)
|
||||||
|
@ -543,30 +582,50 @@ FixupSegment(struct w_files * wpnt, int segment_num)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
#ifndef DEBUG_FIXUP
|
|
||||||
fprintf(stderr,"%d: ADDR TYPE %d, TYPE %d, OFFSET %04.4x, ",
|
fprintf(stderr,"%d: ADDR TYPE %d, TYPE %d, OFFSET %04.4x, ",
|
||||||
i + 1, rep->address_type, rep->relocation_type,
|
i + 1, rep->address_type, rep->relocation_type,
|
||||||
rep->offset);
|
rep->offset);
|
||||||
fprintf(stderr,"TARGET %04.4x %04.4x\n", rep->target1, rep->target2);
|
fprintf(stderr,"TARGET %04.4x %04.4x\n",
|
||||||
#endif
|
rep->target1, rep->target2);
|
||||||
free(rep1);
|
free(rep1);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
#if 0
|
||||||
|
sp = (unsigned short *) ((char *) sel->base_addr + rep->offset);
|
||||||
|
fprintf(stderr, " FIXUP ADDRESS %04.4x:%04.4x\n",
|
||||||
|
(int) sel->base_addr >> 16, rep->offset);
|
||||||
|
WineForceFail = 1;
|
||||||
|
continue;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Stuff the right size result in.
|
* Stuff the right size result in.
|
||||||
*/
|
*/
|
||||||
sp = (unsigned short *) ((char *) sel->base_addr + rep->offset);
|
sp = (unsigned short *) ((char *) sel->base_addr + rep->offset);
|
||||||
|
if (additive)
|
||||||
|
{
|
||||||
|
if (FindDLLTable(dll_name) == NULL)
|
||||||
|
additive = 2;
|
||||||
|
|
||||||
|
fprintf(stderr,"%d: ADDR TYPE %d, TYPE %d, OFFSET %04.4x, ",
|
||||||
|
i + 1, rep->address_type, rep->relocation_type,
|
||||||
|
rep->offset);
|
||||||
|
fprintf(stderr,"TARGET %04.4x %04.4x\n",
|
||||||
|
rep->target1, rep->target2);
|
||||||
|
fprintf(stderr, " Additive = %d\n", additive);
|
||||||
|
}
|
||||||
|
|
||||||
switch (rep->address_type)
|
switch (rep->address_type)
|
||||||
{
|
{
|
||||||
case NE_RADDR_OFFSET16:
|
case NE_RADDR_OFFSET16:
|
||||||
do {
|
do {
|
||||||
next_addr = *sp;
|
next_addr = *sp;
|
||||||
*sp = (unsigned short) address;
|
*sp = (unsigned short) address;
|
||||||
|
if (additive == 2)
|
||||||
|
*sp += next_addr;
|
||||||
sp = (unsigned short *) ((char *) sel->base_addr + next_addr);
|
sp = (unsigned short *) ((char *) sel->base_addr + next_addr);
|
||||||
}
|
}
|
||||||
while (next_addr != 0xffff);
|
while (next_addr != 0xffff && !additive);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -574,10 +633,12 @@ FixupSegment(struct w_files * wpnt, int segment_num)
|
||||||
do {
|
do {
|
||||||
next_addr = *sp;
|
next_addr = *sp;
|
||||||
*sp = (unsigned short) address;
|
*sp = (unsigned short) address;
|
||||||
|
if (additive == 2)
|
||||||
|
*sp += next_addr;
|
||||||
*(sp+1) = (unsigned short) selector;
|
*(sp+1) = (unsigned short) selector;
|
||||||
sp = (unsigned short *) ((char *) sel->base_addr + next_addr);
|
sp = (unsigned short *) ((char *) sel->base_addr + next_addr);
|
||||||
}
|
}
|
||||||
while (next_addr != 0xffff);
|
while (next_addr != 0xffff && !additive);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -589,17 +650,15 @@ FixupSegment(struct w_files * wpnt, int segment_num)
|
||||||
if (rep->relocation_type == NE_RELTYPE_INT1) break;
|
if (rep->relocation_type == NE_RELTYPE_INT1) break;
|
||||||
|
|
||||||
}
|
}
|
||||||
while (next_addr != 0xffff);
|
while (next_addr != 0xffff && !additive);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
#ifndef DEBUG_FIXUP
|
|
||||||
printf("%d: ADDR TYPE %d, TYPE %d, OFFSET %04.4x, ",
|
printf("%d: ADDR TYPE %d, TYPE %d, OFFSET %04.4x, ",
|
||||||
i + 1, rep->address_type, rep->relocation_type,
|
i + 1, rep->address_type, rep->relocation_type,
|
||||||
rep->offset);
|
rep->offset);
|
||||||
printf("TARGET %04.4x %04.4x\n", rep->target1, rep->target2);
|
printf("TARGET %04.4x %04.4x\n", rep->target1, rep->target2);
|
||||||
#endif
|
|
||||||
free(rep1);
|
free(rep1);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
#include "../Wine.tmpl"
|
||||||
|
|
||||||
|
MODULE = memory
|
||||||
|
|
||||||
|
SRCS = \
|
||||||
|
global.c \
|
||||||
|
heap.c \
|
||||||
|
atom.c
|
||||||
|
|
||||||
|
OBJS = \
|
||||||
|
global.o \
|
||||||
|
heap.o \
|
||||||
|
atom.o
|
||||||
|
|
||||||
|
WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
|
||||||
|
DependTarget()
|
||||||
|
CleanTarget()
|
||||||
|
|
||||||
|
includes::
|
||||||
|
|
||||||
|
install::
|
|
@ -1,6 +1,6 @@
|
||||||
CFLAGS=$(COPTS) $(DEBUGOPTS) -I$(INCLUDE_DIR)
|
CFLAGS=$(COPTS) $(DEBUGOPTS) -I$(INCLUDE_DIR)
|
||||||
|
|
||||||
OBJS=global.o heap.o
|
OBJS=global.o heap.o atom.o
|
||||||
|
|
||||||
default: memory.o
|
default: memory.o
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,328 @@
|
||||||
|
/*
|
||||||
|
* Atom table functions
|
||||||
|
*
|
||||||
|
* Copyright 1993 Alexandre Julliard
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Current limitations:
|
||||||
|
*
|
||||||
|
* - This code should work fine when called from the emulation library,
|
||||||
|
* but probably not when called from the Windows program. The reason
|
||||||
|
* is that everything is allocated on the current local heap, instead
|
||||||
|
* of taking into account the DS register. Correcting this will also
|
||||||
|
* require some changes in the local heap management to bring it closer
|
||||||
|
* to Windows.
|
||||||
|
*
|
||||||
|
* - The code assumes that LocalAlloc() returns a block aligned on a
|
||||||
|
* 4-bytes boundary (because of the shifting done in HANDLETOATOM).
|
||||||
|
* If this is not the case, the allocation code will have to be changed.
|
||||||
|
*
|
||||||
|
* - Integer atoms created with MAKEINTATOM are not supported. This is
|
||||||
|
* because they can't generally be differentiated from string constants
|
||||||
|
* located below 0x10000 in the emulation library. If you need
|
||||||
|
* integer atoms, use the "#1234" form.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "atom.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define DEFAULT_ATOMTABLE_SIZE 37
|
||||||
|
#define MIN_STR_ATOM 0xc000
|
||||||
|
|
||||||
|
#define ATOMTOHANDLE(atom) ((HANDLE)(atom) << 2)
|
||||||
|
#define HANDLETOATOM(handle) ((ATOM)(0xc000 | ((handle) >> 2)))
|
||||||
|
|
||||||
|
|
||||||
|
static ATOMTABLE * localTable = NULL;
|
||||||
|
static ATOMTABLE * globalTable = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* ATOM_InitTable
|
||||||
|
*/
|
||||||
|
static BOOL ATOM_InitTable( ATOMTABLE ** table, WORD entries )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
HANDLE handle;
|
||||||
|
|
||||||
|
handle = LocalAlloc( LMEM_MOVEABLE, sizeof(ATOMTABLE) +
|
||||||
|
(entries-1) * sizeof(HANDLE) );
|
||||||
|
if (!handle) return FALSE;
|
||||||
|
*table = (ATOMTABLE *) LocalLock( handle );
|
||||||
|
(*table)->size = entries;
|
||||||
|
for (i = 0; i < entries; i++) (*table)->entries[i] = 0;
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* ATOM_Init
|
||||||
|
*
|
||||||
|
* Global table initialisation.
|
||||||
|
*/
|
||||||
|
BOOL ATOM_Init()
|
||||||
|
{
|
||||||
|
return ATOM_InitTable( &globalTable, DEFAULT_ATOMTABLE_SIZE );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* ATOM_MakePtr
|
||||||
|
*
|
||||||
|
* Make an ATOMENTRY pointer from a handle (obtained from GetAtomHandle()).
|
||||||
|
* Is is assumed that the atom is in the same segment as the table.
|
||||||
|
*/
|
||||||
|
static ATOMENTRY * ATOM_MakePtr( ATOMTABLE * table, HANDLE handle )
|
||||||
|
{
|
||||||
|
return (ATOMENTRY *) (((int)table & 0xffff0000) | (int)handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* ATOM_Hash
|
||||||
|
*/
|
||||||
|
static WORD ATOM_Hash( WORD entries, LPCSTR str, WORD len )
|
||||||
|
{
|
||||||
|
WORD i, hash = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < len; i++) hash ^= str[i] + i;
|
||||||
|
return hash % entries;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* ATOM_AddAtom
|
||||||
|
*/
|
||||||
|
static ATOM ATOM_AddAtom( ATOMTABLE * table, LPCSTR str )
|
||||||
|
{
|
||||||
|
WORD hash;
|
||||||
|
HANDLE entry;
|
||||||
|
ATOMENTRY * entryPtr;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
if ((len = strlen( str )) > 255) len = 255;
|
||||||
|
|
||||||
|
/* Check for integer atom */
|
||||||
|
/* if (!((int)str & 0xffff0000)) return (ATOM)((int)str & 0xffff); */
|
||||||
|
if (str[0] == '#') return atoi( &str[1] );
|
||||||
|
|
||||||
|
hash = ATOM_Hash( table->size, str, len );
|
||||||
|
entry = table->entries[hash];
|
||||||
|
while (entry)
|
||||||
|
{
|
||||||
|
entryPtr = ATOM_MakePtr( table, entry );
|
||||||
|
if ((entryPtr->length == len) &&
|
||||||
|
(!strncasecmp( entryPtr->str, str, len )))
|
||||||
|
{
|
||||||
|
entryPtr->refCount++;
|
||||||
|
return HANDLETOATOM( entry );
|
||||||
|
}
|
||||||
|
entry = entryPtr->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
entry = (int)LocalAlloc( LMEM_MOVEABLE, sizeof(ATOMENTRY)+len-1 ) & 0xffff;
|
||||||
|
if (!entry) return 0;
|
||||||
|
entryPtr = ATOM_MakePtr( table, entry );
|
||||||
|
entryPtr->next = table->entries[hash];
|
||||||
|
entryPtr->refCount = 1;
|
||||||
|
entryPtr->length = len;
|
||||||
|
memcpy( entryPtr->str, str, len );
|
||||||
|
table->entries[hash] = entry;
|
||||||
|
return HANDLETOATOM( entry );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* ATOM_DeleteAtom
|
||||||
|
*/
|
||||||
|
static ATOM ATOM_DeleteAtom( ATOMTABLE * table, ATOM atom )
|
||||||
|
{
|
||||||
|
ATOMENTRY * entryPtr;
|
||||||
|
HANDLE entry, *prevEntry;
|
||||||
|
WORD hash;
|
||||||
|
|
||||||
|
if (atom < MIN_STR_ATOM) return 0; /* Integer atom */
|
||||||
|
|
||||||
|
entry = ATOMTOHANDLE( atom );
|
||||||
|
entryPtr = ATOM_MakePtr( table, entry );
|
||||||
|
|
||||||
|
/* Find previous atom */
|
||||||
|
hash = ATOM_Hash( table->size, entryPtr->str, entryPtr->length );
|
||||||
|
prevEntry = &table->entries[hash];
|
||||||
|
while (*prevEntry && *prevEntry != entry)
|
||||||
|
{
|
||||||
|
ATOMENTRY * prevEntryPtr = ATOM_MakePtr( table, *prevEntry );
|
||||||
|
prevEntry = &prevEntryPtr->next;
|
||||||
|
}
|
||||||
|
if (!*prevEntry) return atom;
|
||||||
|
|
||||||
|
/* Delete atom */
|
||||||
|
if (--entryPtr->refCount == 0)
|
||||||
|
{
|
||||||
|
*prevEntry = entryPtr->next;
|
||||||
|
LocalFree( entry );
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* ATOM_FindAtom
|
||||||
|
*/
|
||||||
|
static ATOM ATOM_FindAtom( ATOMTABLE * table, LPCSTR str )
|
||||||
|
{
|
||||||
|
WORD hash;
|
||||||
|
HANDLE entry;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
if ((len = strlen( str )) > 255) len = 255;
|
||||||
|
|
||||||
|
/* Check for integer atom */
|
||||||
|
/* if (!((int)str & 0xffff0000)) return (ATOM)((int)str & 0xffff); */
|
||||||
|
if (str[0] == '#') return atoi( &str[1] );
|
||||||
|
|
||||||
|
hash = ATOM_Hash( table->size, str, len );
|
||||||
|
entry = table->entries[hash];
|
||||||
|
while (entry)
|
||||||
|
{
|
||||||
|
ATOMENTRY * entryPtr = ATOM_MakePtr( table, entry );
|
||||||
|
if ((entryPtr->length == len) &&
|
||||||
|
(!strncasecmp( entryPtr->str, str, len )))
|
||||||
|
return HANDLETOATOM( entry );
|
||||||
|
entry = entryPtr->next;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* ATOM_GetAtomName
|
||||||
|
*/
|
||||||
|
static WORD ATOM_GetAtomName( ATOMTABLE * table, ATOM atom,
|
||||||
|
LPSTR buffer, short count )
|
||||||
|
{
|
||||||
|
ATOMENTRY * entryPtr;
|
||||||
|
HANDLE entry;
|
||||||
|
char * strPtr;
|
||||||
|
int len;
|
||||||
|
char text[8];
|
||||||
|
|
||||||
|
if (!count) return 0;
|
||||||
|
if (atom < MIN_STR_ATOM)
|
||||||
|
{
|
||||||
|
sprintf( text, "#%d", atom );
|
||||||
|
len = strlen(text);
|
||||||
|
strPtr = text;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
entry = ATOMTOHANDLE( atom );
|
||||||
|
entryPtr = ATOM_MakePtr( table, entry );
|
||||||
|
len = entryPtr->length;
|
||||||
|
strPtr = entryPtr->str;
|
||||||
|
}
|
||||||
|
if (len >= count) len = count-1;
|
||||||
|
memcpy( buffer, strPtr, len );
|
||||||
|
buffer[len] = '\0';
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* InitAtomTable (KERNEL.68)
|
||||||
|
*/
|
||||||
|
BOOL InitAtomTable( WORD entries )
|
||||||
|
{
|
||||||
|
return ATOM_InitTable( &localTable, entries );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* GetAtomHandle (KERNEL.73)
|
||||||
|
*/
|
||||||
|
HANDLE GetAtomHandle( ATOM atom )
|
||||||
|
{
|
||||||
|
if (atom < MIN_STR_ATOM) return 0;
|
||||||
|
return ATOMTOHANDLE( atom );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* AddAtom (KERNEL.70)
|
||||||
|
*/
|
||||||
|
ATOM AddAtom( LPCSTR str )
|
||||||
|
{
|
||||||
|
if (!localTable) InitAtomTable( DEFAULT_ATOMTABLE_SIZE );
|
||||||
|
return ATOM_AddAtom( localTable, str );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* DeleteAtom (KERNEL.71)
|
||||||
|
*/
|
||||||
|
ATOM DeleteAtom( ATOM atom )
|
||||||
|
{
|
||||||
|
if (!localTable) InitAtomTable( DEFAULT_ATOMTABLE_SIZE );
|
||||||
|
return ATOM_DeleteAtom( localTable, atom );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* FindAtom (KERNEL.69)
|
||||||
|
*/
|
||||||
|
ATOM FindAtom( LPCSTR str )
|
||||||
|
{
|
||||||
|
if (!localTable) InitAtomTable( DEFAULT_ATOMTABLE_SIZE );
|
||||||
|
return ATOM_FindAtom( localTable, str );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* GetAtomName (KERNEL.72)
|
||||||
|
*/
|
||||||
|
WORD GetAtomName( ATOM atom, LPSTR buffer, short count )
|
||||||
|
{
|
||||||
|
if (!localTable) InitAtomTable( DEFAULT_ATOMTABLE_SIZE );
|
||||||
|
return ATOM_GetAtomName( localTable, atom, buffer, count );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* GlobalAddAtom (USER.268)
|
||||||
|
*/
|
||||||
|
ATOM GlobalAddAtom( LPCSTR str )
|
||||||
|
{
|
||||||
|
return ATOM_AddAtom( globalTable, str );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* GlobalDeleteAtom (USER.269)
|
||||||
|
*/
|
||||||
|
ATOM GlobalDeleteAtom( ATOM atom )
|
||||||
|
{
|
||||||
|
return ATOM_DeleteAtom( globalTable, atom );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* GlobalFindAtom (USER.270)
|
||||||
|
*/
|
||||||
|
ATOM GlobalFindAtom( LPCSTR str )
|
||||||
|
{
|
||||||
|
return ATOM_FindAtom( globalTable, str );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* GlobalGetAtomName (USER.271)
|
||||||
|
*/
|
||||||
|
WORD GlobalGetAtomName( ATOM atom, LPSTR buffer, short count )
|
||||||
|
{
|
||||||
|
return ATOM_GetAtomName( globalTable, atom, buffer, count );
|
||||||
|
}
|
|
@ -94,11 +94,15 @@ GlobalGetFreeSegments(unsigned int flags, int n_segments)
|
||||||
for (count = 0; count < n_segments; count++)
|
for (count = 0; count < n_segments; count++)
|
||||||
{
|
{
|
||||||
s = GetNextSegment(flags, 0x10000);
|
s = GetNextSegment(flags, 0x10000);
|
||||||
if (s == NULL)
|
if (s == NULL) {
|
||||||
|
printf("GlobalGetFreeSegments // bad GetNextSegment !\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
g = (GDESC *) malloc(sizeof(*g));
|
g = (GDESC *) malloc(sizeof(*g));
|
||||||
|
if (g == NULL) {
|
||||||
|
printf("GlobalGetFreeSegments // bad GDESC malloc !\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
g->prev = g_prev;
|
g->prev = g_prev;
|
||||||
g->next = NULL;
|
g->next = NULL;
|
||||||
g->handle = s->selector;
|
g->handle = s->selector;
|
||||||
|
@ -110,18 +114,15 @@ GlobalGetFreeSegments(unsigned int flags, int n_segments)
|
||||||
else
|
else
|
||||||
g->lock_count = 0;
|
g->lock_count = 0;
|
||||||
|
|
||||||
free(s);
|
if (count == 0) g_start = g;
|
||||||
|
|
||||||
if (count == 0)
|
|
||||||
g_start = g;
|
|
||||||
|
|
||||||
if (g_prev != NULL)
|
if (g_prev != NULL)
|
||||||
{
|
{
|
||||||
g_prev->next = g;
|
g_prev->next = g;
|
||||||
g->prev = g_prev;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
GlobalList = g;
|
GlobalList = g;
|
||||||
|
g_prev = g;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,6 +132,10 @@ GlobalGetFreeSegments(unsigned int flags, int n_segments)
|
||||||
g = g_start;
|
g = g_start;
|
||||||
for (i = 0; i < n_segments; i++, g = g->next)
|
for (i = 0; i < n_segments; i++, g = g->next)
|
||||||
{
|
{
|
||||||
|
if (g == NULL) {
|
||||||
|
printf("GlobalGetFreeSegments // bad Segments chain !\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
g->sequence = i + 1;
|
g->sequence = i + 1;
|
||||||
g->length = n_segments;
|
g->length = n_segments;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
#include "../Wine.tmpl"
|
||||||
|
|
||||||
|
MODULE = misc
|
||||||
|
|
||||||
|
SRCS = \
|
||||||
|
kernel.c \
|
||||||
|
user.c \
|
||||||
|
rect.c \
|
||||||
|
file.c \
|
||||||
|
sound.c \
|
||||||
|
emulate.c \
|
||||||
|
keyboard.c \
|
||||||
|
profile.c \
|
||||||
|
lstr.c \
|
||||||
|
exec.c \
|
||||||
|
message.c \
|
||||||
|
int1a.c \
|
||||||
|
int21.c \
|
||||||
|
dos_fs.c \
|
||||||
|
xt.c
|
||||||
|
|
||||||
|
OBJS = \
|
||||||
|
kernel.o \
|
||||||
|
user.o \
|
||||||
|
rect.o \
|
||||||
|
file.o \
|
||||||
|
sound.o \
|
||||||
|
emulate.o \
|
||||||
|
keyboard.o \
|
||||||
|
profile.o \
|
||||||
|
lstr.o \
|
||||||
|
exec.o \
|
||||||
|
message.o \
|
||||||
|
int1a.o \
|
||||||
|
int21.o \
|
||||||
|
dos_fs.o \
|
||||||
|
xt.o
|
||||||
|
|
||||||
|
WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
|
||||||
|
DependTarget()
|
||||||
|
CleanTarget()
|
||||||
|
|
||||||
|
includes::
|
||||||
|
|
||||||
|
install::
|
|
@ -1,7 +1,8 @@
|
||||||
CFLAGS=$(COPTS) $(DEBUGOPTS) -I$(INCLUDE_DIR)
|
CFLAGS=$(COPTS) $(DEBUGOPTS) -I../include
|
||||||
|
|
||||||
OBJS=dos.o kernel.o user.o xt.o rect.o file.o sound.o emulate.o \
|
OBJS=kernel.o user.o xt.o rect.o file.o sound.o emulate.o \
|
||||||
keyboard.o profile.o lstr.o exec.o message.o
|
keyboard.o profile.o lstr.o exec.o message.o int1a.o int21.o \
|
||||||
|
dos_fs.o comm.o
|
||||||
|
|
||||||
default: misc.o
|
default: misc.o
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,872 @@
|
||||||
|
/*
|
||||||
|
* DEC 93 Erik Bos (erik@trashcan.hacktic.nl)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <termios.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#endif
|
||||||
|
#include "wine.h"
|
||||||
|
#include "windows.h"
|
||||||
|
|
||||||
|
#define DEBUG_COMM
|
||||||
|
|
||||||
|
#define MAX_PORTS 16
|
||||||
|
|
||||||
|
int commerror = 0, eventmask = 0;
|
||||||
|
|
||||||
|
struct DosDeviceStruct {
|
||||||
|
char *devicename; /* /dev/cua1 */
|
||||||
|
int fd;
|
||||||
|
int suspended;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DosDeviceStruct COM[MAX_PORTS];
|
||||||
|
struct DosDeviceStruct LPT[MAX_PORTS];
|
||||||
|
|
||||||
|
void Comm_DeInit(void);
|
||||||
|
|
||||||
|
void Comm_Init(void)
|
||||||
|
{
|
||||||
|
int x, serial = 0, parallel = 0;
|
||||||
|
char option[10], temp[256], *ptr;
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
for (x=0; x!=MAX_PORTS; x++) {
|
||||||
|
strcpy(option,"COMx");
|
||||||
|
option[3] = '0' + x;
|
||||||
|
option[4] = '\0';
|
||||||
|
|
||||||
|
GetPrivateProfileString("serialports", option, "*", temp, sizeof(temp), WINE_INI);
|
||||||
|
if (!strcmp(temp, "*") || *temp == '\0')
|
||||||
|
COM[serial].devicename = NULL;
|
||||||
|
else {
|
||||||
|
stat(temp, &st);
|
||||||
|
if (!S_ISCHR(st.st_mode))
|
||||||
|
fprintf(stderr,"comm: can 't use `%s' as COM%d !\n", temp, x);
|
||||||
|
else
|
||||||
|
if ((ptr = malloc(strlen(temp)+1)) == NULL)
|
||||||
|
fprintf(stderr,"comm: can't malloc for device info!\n");
|
||||||
|
else {
|
||||||
|
COM[serial].fd = 0;
|
||||||
|
COM[serial].devicename = ptr;
|
||||||
|
strcpy(COM[serial++].devicename, temp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy(option, "LPTx");
|
||||||
|
option[3] = '0' + x;
|
||||||
|
option[4] = '\0';
|
||||||
|
|
||||||
|
GetPrivateProfileString("parallelports", option, "*", temp, sizeof(temp), WINE_INI);
|
||||||
|
if (!strcmp(temp, "*") || *temp == '\0')
|
||||||
|
LPT[parallel].devicename = NULL;
|
||||||
|
else {
|
||||||
|
stat(temp, &st);
|
||||||
|
if (!S_ISCHR(st.st_mode))
|
||||||
|
fprintf(stderr,"comm: can 't use `%s' as LPT%d !\n", temp, x);
|
||||||
|
else
|
||||||
|
if ((ptr = malloc(strlen(temp)+1)) == NULL)
|
||||||
|
fprintf(stderr,"comm: can't malloc for device info!\n");
|
||||||
|
else {
|
||||||
|
LPT[serial].fd = 0;
|
||||||
|
LPT[serial].devicename = ptr;
|
||||||
|
strcpy(LPT[serial++].devicename, temp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
atexit(Comm_DeInit);
|
||||||
|
|
||||||
|
#ifdef DEBUG_COMM
|
||||||
|
for (x=0; x!=MAX_PORTS; x++) {
|
||||||
|
if (COM[x].devicename)
|
||||||
|
fprintf(stderr, "comm: COM%d = %s\n", x, COM[x].devicename);
|
||||||
|
if (LPT[x].devicename)
|
||||||
|
fprintf(stderr, "comm: LPT%d = %s\n", x, LPT[x].devicename);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void Comm_DeInit(void)
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
|
||||||
|
for (x=0; x!=MAX_PORTS; x++) {
|
||||||
|
|
||||||
|
if (COM[x].devicename) {
|
||||||
|
if (COM[x].fd)
|
||||||
|
close(COM[x].fd);
|
||||||
|
fprintf(stderr, "comm: COM%d = %s\n",x,COM[x].devicename);
|
||||||
|
free(COM[x].devicename);
|
||||||
|
}
|
||||||
|
if (LPT[x].devicename) {
|
||||||
|
if (LPT[x].fd)
|
||||||
|
close(LPT[x].fd);
|
||||||
|
fprintf(stderr, "comm: LPT%d = %s\n",x,LPT[x].devicename);
|
||||||
|
free(LPT[x].devicename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct DosDeviceStruct *GetDeviceStruct(int fd)
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
|
||||||
|
for (x=0; x!=MAX_PORTS; x++) {
|
||||||
|
if (COM[x].fd == fd)
|
||||||
|
return &COM[x];
|
||||||
|
if (LPT[x].fd == fd)
|
||||||
|
return &LPT[x];
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ValidCOMPort(int x)
|
||||||
|
{
|
||||||
|
return(x < MAX_PORTS ? (int) COM[x].devicename : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ValidLPTPort(int x)
|
||||||
|
{
|
||||||
|
return(x < MAX_PORTS ? (int) LPT[x].devicename : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int WinError(void)
|
||||||
|
{
|
||||||
|
perror("comm");
|
||||||
|
switch (errno) {
|
||||||
|
default:
|
||||||
|
return CE_IOE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int BuildCommDCB(LPSTR device, DCB FAR *lpdcb)
|
||||||
|
{
|
||||||
|
/* "COM1:9600,n,8,1" */
|
||||||
|
/* 012345 */
|
||||||
|
|
||||||
|
int port;
|
||||||
|
char *ptr, *ptr2, temp[256],temp2[10];
|
||||||
|
|
||||||
|
#ifdef DEBUG_COMM
|
||||||
|
fprintf(stderr,"BuildCommDCB: (%s), ptr %d\n", device, lpdcb);
|
||||||
|
#endif
|
||||||
|
commerror = 0;
|
||||||
|
|
||||||
|
if (!strncmp(device,"COM",3)) {
|
||||||
|
port = device[3] - '0';
|
||||||
|
|
||||||
|
if (!ValidCOMPort(port)) {
|
||||||
|
commerror = IE_BADID;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!COM[port].fd) {
|
||||||
|
commerror = IE_NOPEN;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
lpdcb->Id = COM[port].fd;
|
||||||
|
|
||||||
|
if (!*(device+4))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (*(device+4) != ':')
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
strcpy(temp,device+5);
|
||||||
|
ptr = strtok(temp, ",");
|
||||||
|
|
||||||
|
fprintf(stderr,"BuildCommDCB: baudrate (%s)\n", ptr);
|
||||||
|
lpdcb->BaudRate = atoi(ptr);
|
||||||
|
|
||||||
|
ptr = strtok(NULL, ",");
|
||||||
|
if (islower(*ptr))
|
||||||
|
*ptr = toupper(*ptr);
|
||||||
|
|
||||||
|
fprintf(stderr,"BuildCommDCB: parity (%c)\n", *ptr);
|
||||||
|
switch (*ptr) {
|
||||||
|
case 'N':
|
||||||
|
lpdcb->Parity = NOPARITY;
|
||||||
|
lpdcb->fParity = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
lpdcb->fParity = 1;
|
||||||
|
|
||||||
|
case 'E':
|
||||||
|
lpdcb->Parity = EVENPARITY;
|
||||||
|
break;
|
||||||
|
case 'M':
|
||||||
|
lpdcb->Parity = MARKPARITY;
|
||||||
|
break;
|
||||||
|
case 'O':
|
||||||
|
lpdcb->Parity = ODDPARITY;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr,"comm: unknown parity `%c'!\n", *ptr);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr = strtok(NULL, ",");
|
||||||
|
fprintf(stderr, "BuildCommDCB: charsize (%c)\n", *ptr);
|
||||||
|
lpdcb->ByteSize = *ptr - '0';
|
||||||
|
|
||||||
|
ptr = strtok(NULL, ",");
|
||||||
|
fprintf(stderr, "BuildCommDCB: stopbits (%c)\n", *ptr);
|
||||||
|
switch (*ptr) {
|
||||||
|
case '1':
|
||||||
|
lpdcb->StopBits = ONESTOPBIT;
|
||||||
|
break;
|
||||||
|
case '2':
|
||||||
|
lpdcb->StopBits = TWOSTOPBITS;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr,"comm: unknown # of stopbits `%c'!\n", *ptr);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int OpenComm(LPSTR device, UINT cbInQueue, UINT cbOutQueue)
|
||||||
|
{
|
||||||
|
int port, fd;
|
||||||
|
|
||||||
|
#ifdef DEBUG_COMM
|
||||||
|
fprintf(stderr,"OpenComm: %s, %d, %d\n", device, cbInQueue, cbOutQueue);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
commerror = 0;
|
||||||
|
|
||||||
|
if (!strncmp(device,"COM",3)) {
|
||||||
|
port = device[3] - '0';
|
||||||
|
|
||||||
|
if (!ValidCOMPort(port)) {
|
||||||
|
commerror = IE_BADID;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (COM[port].fd) {
|
||||||
|
commerror = IE_OPEN;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fd = open(COM[port].devicename, O_RDWR | O_NONBLOCK, 0);
|
||||||
|
if (fd == -1) {
|
||||||
|
commerror = WinError();
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
COM[port].fd = fd;
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (!strncmp(device,"LPT",3)) {
|
||||||
|
port = device[3] - '0';
|
||||||
|
|
||||||
|
if (!ValidLPTPort(port)) {
|
||||||
|
commerror = IE_BADID;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (LPT[port].fd) {
|
||||||
|
commerror = IE_OPEN;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fd = open(LPT[port].devicename, O_RDWR | O_NONBLOCK, 0);
|
||||||
|
if (fd == -1) {
|
||||||
|
commerror = WinError();
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
LPT[port].fd = fd;
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CloseComm(int fd)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
|
||||||
|
#ifdef DEBUG_COMM
|
||||||
|
fprintf(stderr,"CloseComm: fd %d\n", fd);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (close(fd) == -1) {
|
||||||
|
commerror = WinError();
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
commerror = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int SetCommBreak(int fd)
|
||||||
|
{
|
||||||
|
struct DosDeviceStruct *ptr;
|
||||||
|
|
||||||
|
#ifdef DEBUG_COMM
|
||||||
|
fprintf(stderr,"SetCommBreak: fd: %d\n", fd);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ((ptr = GetDeviceStruct(fd)) == NULL) {
|
||||||
|
commerror = IE_BADID;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr->suspended = 1;
|
||||||
|
commerror = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ClearCommBreak(int fd)
|
||||||
|
{
|
||||||
|
struct DosDeviceStruct *ptr;
|
||||||
|
|
||||||
|
#ifdef DEBUG_COMM
|
||||||
|
fprintf(stderr,"ClearCommBreak: fd: %d\n", fd);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ((ptr = GetDeviceStruct(fd)) == NULL) {
|
||||||
|
commerror = IE_BADID;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr->suspended = 0;
|
||||||
|
commerror = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
LONG EscapeCommFunction(int fd, int nFunction)
|
||||||
|
{
|
||||||
|
int max;
|
||||||
|
struct termios port;
|
||||||
|
|
||||||
|
#ifdef DEBUG_COMM
|
||||||
|
fprintf(stderr,"EscapeCommFunction fd: %d, function: %d\n", fd, nFunction);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (tcgetattr(fd, &port) == -1) {
|
||||||
|
commerror = WinError();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (nFunction) {
|
||||||
|
case RESETDEV:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GETMAXCOM:
|
||||||
|
for (max = 0;COM[max].devicename;max++)
|
||||||
|
;
|
||||||
|
return max;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GETMAXLPT:
|
||||||
|
for (max = 0;LPT[max].devicename;max++)
|
||||||
|
;
|
||||||
|
return 0x80 + max;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CLRDTR:
|
||||||
|
port.c_cflag &= TIOCM_DTR;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CLRRTS:
|
||||||
|
port.c_cflag &= TIOCM_RTS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SETDTR:
|
||||||
|
port.c_cflag |= CRTSCTS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SETRTS:
|
||||||
|
port.c_cflag |= CRTSCTS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SETXOFF:
|
||||||
|
port.c_iflag |= IXOFF;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SETXON:
|
||||||
|
port.c_iflag |= IXON;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
fprintf(stderr,"EscapeCommFunction fd: %d, unknown function: %d\n", fd, nFunction);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tcsetattr(fd, TCSADRAIN, &port) == -1) {
|
||||||
|
commerror = WinError();
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
commerror = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int FlushComm(int fd, int fnQueue)
|
||||||
|
{
|
||||||
|
int queue;
|
||||||
|
|
||||||
|
#ifdef DEBUG_COMM
|
||||||
|
fprintf(stderr,"FlushComm fd: %d, queue: %d\n", fd, fnQueue);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
switch (fnQueue) {
|
||||||
|
case 0:
|
||||||
|
queue = TCOFLUSH;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
queue = TCIFLUSH;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr,"FlushComm fd: %d, UNKNOWN queue: %d\n", fd, fnQueue);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tcflush(fd, fnQueue)) {
|
||||||
|
commerror = WinError();
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
commerror = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int GetCommError(int fd, COMSTAT FAR *lpStat)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_COMM
|
||||||
|
fprintf(stderr,"GetCommError: fd %d (current error %d)\n", fd, commerror);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return(commerror);
|
||||||
|
}
|
||||||
|
|
||||||
|
UINT FAR* SetCommEventMask(int fd, UINT fuEvtMask)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_COMM
|
||||||
|
fprintf(stderr,"SetCommEventMask: fd %d, mask %d\n", fd, fuEvtMask);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
eventmask |= fuEvtMask;
|
||||||
|
return (UINT *)&eventmask;
|
||||||
|
}
|
||||||
|
|
||||||
|
UINT GetCommEventMask(int fd, int fnEvtClear)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_COMM
|
||||||
|
fprintf(stderr,"GetCommEventMask: fd %d, mask %d\n", fd, fnEvtClear);
|
||||||
|
#endif
|
||||||
|
eventmask &= ~fnEvtClear;
|
||||||
|
return eventmask;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SetCommState(DCB FAR *lpdcb)
|
||||||
|
{
|
||||||
|
struct termios port;
|
||||||
|
|
||||||
|
#ifdef DEBUG_COMM
|
||||||
|
fprintf(stderr,"SetCommState: fd %d, ptr %d\n", lpdcb->Id, lpdcb);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (tcgetattr(lpdcb->Id, &port) == -1) {
|
||||||
|
commerror = WinError();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
cfmakeraw(&port);
|
||||||
|
port.c_cc[VMIN] = 0;
|
||||||
|
port.c_cc[VTIME] = 0;
|
||||||
|
|
||||||
|
fprintf(stderr,"SetCommState: baudrate %d\n",lpdcb->BaudRate);
|
||||||
|
#ifdef CBAUD
|
||||||
|
port.c_cflag &= ~CBAUD;
|
||||||
|
switch (lpdcb->BaudRate) {
|
||||||
|
case 110:
|
||||||
|
case CBR_110:
|
||||||
|
port.c_cflag |= B110;
|
||||||
|
break;
|
||||||
|
case 300:
|
||||||
|
case CBR_300:
|
||||||
|
port.c_cflag |= B300;
|
||||||
|
break;
|
||||||
|
case 600:
|
||||||
|
case CBR_600:
|
||||||
|
port.c_cflag |= B600;
|
||||||
|
break;
|
||||||
|
case 1200:
|
||||||
|
case CBR_1200:
|
||||||
|
port.c_cflag |= B1200;
|
||||||
|
break;
|
||||||
|
case 2400:
|
||||||
|
case CBR_2400:
|
||||||
|
port.c_cflag |= B2400;
|
||||||
|
break;
|
||||||
|
case 4800:
|
||||||
|
case CBR_4800:
|
||||||
|
port.c_cflag |= B4800;
|
||||||
|
break;
|
||||||
|
case 9600:
|
||||||
|
case CBR_9600:
|
||||||
|
port.c_cflag |= B9600;
|
||||||
|
break;
|
||||||
|
case 19200:
|
||||||
|
case CBR_19200:
|
||||||
|
port.c_cflag |= B19200;
|
||||||
|
break;
|
||||||
|
case 38400:
|
||||||
|
case CBR_38400:
|
||||||
|
port.c_cflag |= B38400;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
commerror = IE_BAUDRATE;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
switch (lpdcb->BaudRate) {
|
||||||
|
case 110:
|
||||||
|
case CBR_110:
|
||||||
|
port.c_ospeed = B110;
|
||||||
|
break;
|
||||||
|
case 300:
|
||||||
|
case CBR_300:
|
||||||
|
port.c_ospeed = B300;
|
||||||
|
break;
|
||||||
|
case 600:
|
||||||
|
case CBR_600:
|
||||||
|
port.c_ospeed = B600;
|
||||||
|
break;
|
||||||
|
case 1200:
|
||||||
|
case CBR_1200:
|
||||||
|
port.c_ospeed = B1200;
|
||||||
|
break;
|
||||||
|
case 2400:
|
||||||
|
case CBR_2400:
|
||||||
|
port.c_ospeed = B2400;
|
||||||
|
break;
|
||||||
|
case 4800:
|
||||||
|
case CBR_4800:
|
||||||
|
port.c_ospeed = B4800;
|
||||||
|
break;
|
||||||
|
case 9600:
|
||||||
|
case CBR_9600:
|
||||||
|
port.c_ospeed = B9600;
|
||||||
|
break;
|
||||||
|
case 19200:
|
||||||
|
case CBR_19200:
|
||||||
|
port.c_ospeed = B19200;
|
||||||
|
break;
|
||||||
|
case 38400:
|
||||||
|
case CBR_38400:
|
||||||
|
port.c_ospeed = B38400;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
commerror = IE_BAUDRATE;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
port.c_ispeed = port.c_ospeed;
|
||||||
|
#endif
|
||||||
|
fprintf(stderr,"SetCommState: bytesize %d\n",lpdcb->ByteSize);
|
||||||
|
port.c_cflag &= ~CSIZE;
|
||||||
|
switch (lpdcb->ByteSize) {
|
||||||
|
case 5:
|
||||||
|
port.c_cflag |= CS5;
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
port.c_cflag |= CS6;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
port.c_cflag |= CS7;
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
port.c_cflag |= CS8;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
commerror = IE_BYTESIZE;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr,"SetCommState: parity %d\n",lpdcb->Parity);
|
||||||
|
port.c_cflag &= ~(PARENB | PARODD);
|
||||||
|
if (lpdcb->fParity)
|
||||||
|
switch (lpdcb->Parity) {
|
||||||
|
case NOPARITY:
|
||||||
|
port.c_iflag &= ~INPCK;
|
||||||
|
break;
|
||||||
|
case ODDPARITY:
|
||||||
|
port.c_cflag |= (PARENB | PARODD);
|
||||||
|
port.c_iflag |= INPCK;
|
||||||
|
break;
|
||||||
|
case EVENPARITY:
|
||||||
|
port.c_cflag |= PARENB;
|
||||||
|
port.c_iflag |= INPCK;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
commerror = IE_BYTESIZE;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fprintf(stderr,"SetCommState: stopbits %d\n",lpdcb->StopBits);
|
||||||
|
switch (lpdcb->StopBits) {
|
||||||
|
case ONESTOPBIT:
|
||||||
|
port.c_cflag &= ~CSTOPB;
|
||||||
|
break;
|
||||||
|
case TWOSTOPBITS:
|
||||||
|
port.c_cflag |= CSTOPB;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
commerror = IE_BYTESIZE;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lpdcb->fDtrflow || lpdcb->fRtsflow || lpdcb->fOutxCtsFlow)
|
||||||
|
port.c_cflag |= CRTSCTS;
|
||||||
|
|
||||||
|
if (lpdcb->fDtrDisable)
|
||||||
|
port.c_cflag &= ~CRTSCTS;
|
||||||
|
|
||||||
|
if (lpdcb->fInX)
|
||||||
|
port.c_iflag |= IXON;
|
||||||
|
if (lpdcb->fOutX)
|
||||||
|
port.c_iflag |= IXOFF;
|
||||||
|
|
||||||
|
if (tcsetattr(lpdcb->Id, TCSADRAIN, &port) == -1) {
|
||||||
|
commerror = WinError();
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
commerror = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int GetCommState(int fd, DCB FAR *lpdcb)
|
||||||
|
{
|
||||||
|
struct termios port;
|
||||||
|
|
||||||
|
#ifdef DEBUG_COMM
|
||||||
|
fprintf(stderr,"GetCommState: fd %d, ptr %d\n", fd, lpdcb);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (tcgetattr(fd, &port) == -1) {
|
||||||
|
commerror = WinError();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
lpdcb->Id = fd;
|
||||||
|
|
||||||
|
#ifdef CBAUD
|
||||||
|
switch (port.c_cflag & CBAUD) {
|
||||||
|
#else
|
||||||
|
switch (port.c_ospeed) {
|
||||||
|
#endif
|
||||||
|
case B110:
|
||||||
|
lpdcb->BaudRate = 110;
|
||||||
|
break;
|
||||||
|
case B300:
|
||||||
|
lpdcb->BaudRate = 300;
|
||||||
|
break;
|
||||||
|
case B600:
|
||||||
|
lpdcb->BaudRate = 600;
|
||||||
|
break;
|
||||||
|
case B1200:
|
||||||
|
lpdcb->BaudRate = 1200;
|
||||||
|
break;
|
||||||
|
case B2400:
|
||||||
|
lpdcb->BaudRate = 2400;
|
||||||
|
break;
|
||||||
|
case B4800:
|
||||||
|
lpdcb->BaudRate = 4800;
|
||||||
|
break;
|
||||||
|
case B9600:
|
||||||
|
lpdcb->BaudRate = 9600;
|
||||||
|
break;
|
||||||
|
case B19200:
|
||||||
|
lpdcb->BaudRate = 19200;
|
||||||
|
break;
|
||||||
|
case B38400:
|
||||||
|
lpdcb->BaudRate = 38400;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (port.c_cflag & CSIZE) {
|
||||||
|
case CS5:
|
||||||
|
lpdcb->ByteSize = 5;
|
||||||
|
break;
|
||||||
|
case CS6:
|
||||||
|
lpdcb->ByteSize = 6;
|
||||||
|
break;
|
||||||
|
case CS7:
|
||||||
|
lpdcb->ByteSize = 7;
|
||||||
|
break;
|
||||||
|
case CS8:
|
||||||
|
lpdcb->ByteSize = 8;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (port.c_cflag & ~(PARENB | PARODD)) {
|
||||||
|
case 0:
|
||||||
|
lpdcb->fParity = NOPARITY;
|
||||||
|
break;
|
||||||
|
case PARENB:
|
||||||
|
lpdcb->fParity = EVENPARITY;
|
||||||
|
break;
|
||||||
|
case (PARENB | PARODD):
|
||||||
|
lpdcb->fParity = ODDPARITY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (port.c_cflag & CSTOPB)
|
||||||
|
lpdcb->StopBits = TWOSTOPBITS;
|
||||||
|
else
|
||||||
|
lpdcb->StopBits = ONESTOPBIT;
|
||||||
|
|
||||||
|
lpdcb->RlsTimeout = 50;
|
||||||
|
lpdcb->CtsTimeout = 50;
|
||||||
|
lpdcb->DsrTimeout = 50;
|
||||||
|
lpdcb->fNull = 0;
|
||||||
|
lpdcb->fChEvt = 0;
|
||||||
|
lpdcb->fBinary = 1;
|
||||||
|
|
||||||
|
lpdcb->fDtrDisable = 0;
|
||||||
|
if (port.c_cflag & CRTSCTS) {
|
||||||
|
lpdcb->fDtrflow = 1;
|
||||||
|
lpdcb->fRtsflow = 1;
|
||||||
|
lpdcb->fOutxCtsFlow = 1;
|
||||||
|
lpdcb->fOutxDsrFlow = 1;
|
||||||
|
} else
|
||||||
|
lpdcb->fDtrDisable = 1;
|
||||||
|
|
||||||
|
if (port.c_iflag & IXON)
|
||||||
|
lpdcb->fInX = 1;
|
||||||
|
else
|
||||||
|
lpdcb->fInX = 0;
|
||||||
|
|
||||||
|
if (port.c_iflag & IXOFF)
|
||||||
|
lpdcb->fOutX = 1;
|
||||||
|
else
|
||||||
|
lpdcb->fOutX = 0;
|
||||||
|
/*
|
||||||
|
lpdcb->XonChar =
|
||||||
|
lpdcb->XoffChar =
|
||||||
|
*/
|
||||||
|
lpdcb->XonLim = 10;
|
||||||
|
lpdcb->XoffLim = 10;
|
||||||
|
|
||||||
|
commerror = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int TransmitCommChar(int fd, char chTransmit)
|
||||||
|
{
|
||||||
|
struct DosDeviceStruct *ptr;
|
||||||
|
|
||||||
|
#ifdef DEBUG_COMM
|
||||||
|
fprintf(stderr,"TransmitCommChar: fd %d, data %d \n", fd, chTransmit);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ((ptr = GetDeviceStruct(fd)) == NULL) {
|
||||||
|
commerror = IE_BADID;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ptr->suspended) {
|
||||||
|
commerror = IE_HARDWARE;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (write(fd, (void *) &chTransmit, 1) == -1) {
|
||||||
|
commerror = WinError();
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
commerror = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int UngetCommChar(int fd, char chUnget)
|
||||||
|
{
|
||||||
|
struct DosDeviceStruct *ptr;
|
||||||
|
|
||||||
|
#ifdef DEBUG_COMM
|
||||||
|
fprintf(stderr,"UngetCommChar: fd %d (char %d)\n", fd, chUnget);
|
||||||
|
#endif
|
||||||
|
fprintf(stderr,"NOT implemented!\n");
|
||||||
|
|
||||||
|
if ((ptr = GetDeviceStruct(fd)) == NULL) {
|
||||||
|
commerror = IE_BADID;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ptr->suspended) {
|
||||||
|
commerror = IE_HARDWARE;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
commerror = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ReadComm(int fd, LPSTR lpvBuf, int cbRead)
|
||||||
|
{
|
||||||
|
struct DosDeviceStruct *ptr;
|
||||||
|
#ifdef DEBUG_COMM
|
||||||
|
fprintf(stderr,"ReadComm: fd %d, ptr %d, length %d\n", fd, lpvBuf, cbRead);
|
||||||
|
#endif
|
||||||
|
if ((ptr = GetDeviceStruct(fd)) == NULL) {
|
||||||
|
commerror = IE_BADID;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ptr->suspended) {
|
||||||
|
commerror = IE_HARDWARE;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (read(fd, (void *) lpvBuf, cbRead) == -1) {
|
||||||
|
commerror = WinError();
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
commerror = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int WriteComm(int fd, LPSTR lpvBuf, int cbWrite)
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
struct DosDeviceStruct *ptr;
|
||||||
|
|
||||||
|
#ifdef DEBUG_COMM
|
||||||
|
fprintf(stderr,"WriteComm: fd %d, ptr %d, length %d\n", fd, lpvBuf, cbWrite);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ((ptr = GetDeviceStruct(fd)) == NULL) {
|
||||||
|
commerror = IE_BADID;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ptr->suspended) {
|
||||||
|
commerror = IE_HARDWARE;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (x=0; x != cbWrite ; x++)
|
||||||
|
fprintf(stderr,"%c", *(lpvBuf + x) );
|
||||||
|
|
||||||
|
if (write(fd, (void *) lpvBuf, cbWrite) == -1) {
|
||||||
|
commerror = WinError();
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
commerror = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
76
misc/dos.c
76
misc/dos.c
|
@ -1,76 +0,0 @@
|
||||||
static char RCSId[] = "$Id$";
|
|
||||||
static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include "prototypes.h"
|
|
||||||
#include "regfunc.h"
|
|
||||||
|
|
||||||
static void
|
|
||||||
GetTimeDate(int time_flag)
|
|
||||||
{
|
|
||||||
struct tm *now;
|
|
||||||
time_t ltime;
|
|
||||||
|
|
||||||
ltime = time(NULL);
|
|
||||||
now = localtime(<ime);
|
|
||||||
if (time_flag)
|
|
||||||
{
|
|
||||||
_CX = (now->tm_hour << 8) | now->tm_min;
|
|
||||||
_DX = now->tm_sec << 8;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_CX = now->tm_year + 1900;
|
|
||||||
_DX = ((now->tm_mon + 1) << 8) | now->tm_mday;
|
|
||||||
_AX &= 0xff00;
|
|
||||||
_AX |= now->tm_wday;
|
|
||||||
}
|
|
||||||
#ifdef DEBUG_DOS
|
|
||||||
printf("GetTimeDate: AX = %04x, CX = %04x, DX = %04x\n", _AX, _CX, _DX);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ReturnFromRegisterFunc();
|
|
||||||
/* Function does not return */
|
|
||||||
}
|
|
||||||
|
|
||||||
/**********************************************************************
|
|
||||||
* KERNEL_DOS3Call
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
KERNEL_DOS3Call()
|
|
||||||
{
|
|
||||||
switch ((_AX >> 8) & 0xff)
|
|
||||||
{
|
|
||||||
case 0x30:
|
|
||||||
_AX = 0x0303;
|
|
||||||
ReturnFromRegisterFunc();
|
|
||||||
/* Function does not return */
|
|
||||||
|
|
||||||
case 0x25:
|
|
||||||
case 0x35:
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case 0x2a:
|
|
||||||
GetTimeDate(0);
|
|
||||||
/* Function does not return */
|
|
||||||
|
|
||||||
case 0x2c:
|
|
||||||
GetTimeDate(1);
|
|
||||||
/* Function does not return */
|
|
||||||
|
|
||||||
case 0x4c:
|
|
||||||
exit(_AX & 0xff);
|
|
||||||
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "DOS: AX %04x, BX %04x, CX %04x, DX %04x\n",
|
|
||||||
_AX, _BX, _CX, _DX);
|
|
||||||
fprintf(stderr, " SP %04x, BP %04x, SI %04x, DI %04x\n",
|
|
||||||
_SP, _BP, _SI, _DI);
|
|
||||||
fprintf(stderr, " DS %04x, ES %04x\n",
|
|
||||||
_DS, _ES);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -0,0 +1,756 @@
|
||||||
|
/*
|
||||||
|
* DOS-FS
|
||||||
|
* NOV 1993 Erik Bos (erik@(trashcan.)hacktic.nl)
|
||||||
|
*
|
||||||
|
* FindFile by Bob, hacked for dos & unixpaths by Erik.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#ifdef __linux__
|
||||||
|
#include <sys/vfs.h>
|
||||||
|
#endif
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/mount.h>
|
||||||
|
#endif
|
||||||
|
#include <dirent.h>
|
||||||
|
#include "windows.h"
|
||||||
|
#include "wine.h"
|
||||||
|
#include "int21.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
#define DEBUG
|
||||||
|
*/
|
||||||
|
#define MAX_OPEN_DIRS 16
|
||||||
|
|
||||||
|
extern char WindowsDirectory[256], SystemDirectory[256],TempDirectory[256];
|
||||||
|
|
||||||
|
char WindowsPath[256];
|
||||||
|
|
||||||
|
void DOS_DeInitFS(void);
|
||||||
|
int DOS_SetDefaultDrive(int);
|
||||||
|
char *GetDirectUnixFileName(char *);
|
||||||
|
void ToDos(char *);
|
||||||
|
void ToUnix(char *);
|
||||||
|
|
||||||
|
int CurrentDrive = 2;
|
||||||
|
|
||||||
|
struct DosDriveStruct { /* eg: */
|
||||||
|
char *rootdir; /* /usr/windows */
|
||||||
|
char cwd[256]; /* / */
|
||||||
|
char label[13]; /* DRIVE-A */
|
||||||
|
unsigned int serialnumber; /* ABCD5678 */
|
||||||
|
int disabled; /* 0 */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DosDriveStruct DosDrives[MAX_DOS_DRIVES];
|
||||||
|
|
||||||
|
struct dosdirent DosDirs[MAX_OPEN_DIRS];
|
||||||
|
|
||||||
|
void DOS_InitFS(void)
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
char drive[2], temp[256], *ptr;
|
||||||
|
|
||||||
|
GetPrivateProfileString("wine", "windows", "c:\\windows",
|
||||||
|
WindowsDirectory, sizeof(WindowsDirectory), WINE_INI);
|
||||||
|
|
||||||
|
GetPrivateProfileString("wine", "system", "c:\\windows\\system",
|
||||||
|
SystemDirectory, sizeof(SystemDirectory), WINE_INI);
|
||||||
|
|
||||||
|
GetPrivateProfileString("wine", "temp", "c:\\windows",
|
||||||
|
TempDirectory, sizeof(TempDirectory), WINE_INI);
|
||||||
|
|
||||||
|
GetPrivateProfileString("wine", "path", "c:\\windows;c:\\windows\\system",
|
||||||
|
WindowsPath, sizeof(WindowsPath), WINE_INI);
|
||||||
|
|
||||||
|
ToDos(WindowsDirectory);
|
||||||
|
ToDos(SystemDirectory);
|
||||||
|
ToDos(TempDirectory);
|
||||||
|
ToDos(WindowsPath);
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr,"wine.ini = %s\n",WINE_INI);
|
||||||
|
fprintf(stderr,"win.ini = %s\n",WIN_INI);
|
||||||
|
fprintf(stderr,"windir = %s\n",WindowsDirectory);
|
||||||
|
fprintf(stderr,"sysdir = %s\n",SystemDirectory);
|
||||||
|
fprintf(stderr,"tempdir = %s\n",TempDirectory);
|
||||||
|
fprintf(stderr,"path = %s\n",WindowsPath);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (x=0; x!=MAX_DOS_DRIVES; x++) {
|
||||||
|
DosDrives[x].serialnumber = (0xEB0500L | x);
|
||||||
|
|
||||||
|
drive[0] = 'A' + x;
|
||||||
|
drive[1] = '\0';
|
||||||
|
GetPrivateProfileString("drives", drive, "*", temp, sizeof(temp), WINE_INI);
|
||||||
|
if (!strcmp(temp, "*") || *temp == '\0') {
|
||||||
|
DosDrives[x].rootdir = NULL;
|
||||||
|
DosDrives[x].cwd[0] = '\0';
|
||||||
|
DosDrives[x].label[0] = '\0';
|
||||||
|
DosDrives[x].disabled = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((ptr = (char *) malloc(strlen(temp)+1)) == NULL) {
|
||||||
|
fprintf(stderr,"DOSFS: can't malloc for drive info!");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (temp[strlen(temp)-1] == '/')
|
||||||
|
temp[strlen(temp)] = '\0';
|
||||||
|
DosDrives[x].rootdir = ptr;
|
||||||
|
strcpy(DosDrives[x].rootdir, temp);
|
||||||
|
strcpy(DosDrives[x].cwd, "/windows/");
|
||||||
|
strcpy(DosDrives[x].label, "DRIVE-");
|
||||||
|
strcat(DosDrives[x].label, drive);
|
||||||
|
DosDrives[x].disabled = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
atexit(DOS_DeInitFS);
|
||||||
|
|
||||||
|
DOS_SetDefaultDrive(2);
|
||||||
|
|
||||||
|
for (x=0; x!=MAX_DOS_DRIVES; x++) {
|
||||||
|
if (DosDrives[x].rootdir != NULL) {
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "DOSFS: %c: => %-40s %s %s %X %d\n",
|
||||||
|
'A'+x,
|
||||||
|
DosDrives[x].rootdir,
|
||||||
|
DosDrives[x].cwd,
|
||||||
|
DosDrives[x].label,
|
||||||
|
DosDrives[x].serialnumber,
|
||||||
|
DosDrives[x].disabled
|
||||||
|
);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (x=0; x!=MAX_OPEN_DIRS ; x++)
|
||||||
|
DosDirs[x].inuse = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void DOS_DeInitFS(void)
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
|
||||||
|
for (x=0; x!=MAX_DOS_DRIVES ; x++)
|
||||||
|
if (DosDrives[x].rootdir != NULL) {
|
||||||
|
#ifdef DEBUG
|
||||||
|
|
||||||
|
fprintf(stderr, "DOSFS: %c: => %s %s %s %X %d\n",
|
||||||
|
'A'+x,
|
||||||
|
DosDrives[x].rootdir,
|
||||||
|
DosDrives[x].cwd,
|
||||||
|
DosDrives[x].label,
|
||||||
|
DosDrives[x].serialnumber,
|
||||||
|
DosDrives[x].disabled
|
||||||
|
);
|
||||||
|
free(DosDrives[x].rootdir);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
WORD DOS_GetEquipment(void)
|
||||||
|
{
|
||||||
|
WORD equipment;
|
||||||
|
int diskdrives = 0;
|
||||||
|
|
||||||
|
/* borrowed from Ralph Brown's interrupt lists
|
||||||
|
|
||||||
|
bits 15-14: number of parallel devices
|
||||||
|
bit 13: [Conv] Internal modem
|
||||||
|
bit 12: reserved
|
||||||
|
bits 11- 9: number of serial devices
|
||||||
|
bit 8: reserved
|
||||||
|
bits 7- 6: number of diskette drives minus one
|
||||||
|
bits 5- 4: Initial video mode:
|
||||||
|
00b = EGA,VGA,PGA
|
||||||
|
01b = 40 x 25 color
|
||||||
|
10b = 80 x 25 color
|
||||||
|
11b = 80 x 25 mono
|
||||||
|
bit 3: reserved
|
||||||
|
bit 2: [PS] =1 if pointing device
|
||||||
|
[non-PS] reserved
|
||||||
|
bit 1: =1 if math co-processor
|
||||||
|
bit 0: =1 if diskette available for boot
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (DosDrives[0].rootdir != NULL)
|
||||||
|
diskdrives++;
|
||||||
|
if (DosDrives[1].rootdir != NULL)
|
||||||
|
diskdrives++;
|
||||||
|
if (diskdrives)
|
||||||
|
diskdrives--;
|
||||||
|
|
||||||
|
equipment = diskdrives << 6;
|
||||||
|
|
||||||
|
return (equipment);
|
||||||
|
}
|
||||||
|
|
||||||
|
int DOS_ValidDrive(int drive)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr,"ValidDrive %c (%d)\n",'A'+drive,drive);
|
||||||
|
#endif
|
||||||
|
*/
|
||||||
|
if (drive >= MAX_DOS_DRIVES)
|
||||||
|
return 0;
|
||||||
|
if (DosDrives[drive].rootdir == NULL)
|
||||||
|
return 0;
|
||||||
|
if (DosDrives[drive].disabled)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int DOS_GetDefaultDrive(void)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr,"GetDefaultDrive (%c)\n",'A'+CurrentDrive);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return( CurrentDrive);
|
||||||
|
}
|
||||||
|
|
||||||
|
int DOS_SetDefaultDrive(int drive)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr,"SetDefaultDrive to %c:\n",'A'+drive);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!DOS_ValidDrive(drive))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
CurrentDrive = drive;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToUnix(char *s)
|
||||||
|
{
|
||||||
|
while (*s) {
|
||||||
|
if (*s == '/')
|
||||||
|
break;
|
||||||
|
if (*s == '\\')
|
||||||
|
*s = '/';
|
||||||
|
if (isupper(*s))
|
||||||
|
*s = tolower(*s);
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToDos(char *s)
|
||||||
|
{
|
||||||
|
while (*s) {
|
||||||
|
if (*s == '/')
|
||||||
|
*s = '\\';
|
||||||
|
if (islower(*s))
|
||||||
|
*s = toupper(*s);
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int DOS_DisableDrive(int drive)
|
||||||
|
{
|
||||||
|
if (drive >= MAX_DOS_DRIVES)
|
||||||
|
return 0;
|
||||||
|
if (DosDrives[drive].rootdir == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
DosDrives[drive].disabled = 1;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int DOS_EnableDrive(int drive)
|
||||||
|
{
|
||||||
|
if (drive >= MAX_DOS_DRIVES)
|
||||||
|
return 0;
|
||||||
|
if (DosDrives[drive].rootdir == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
DosDrives[drive].disabled = 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GetUnixDirName(char *rootdir, char *name)
|
||||||
|
{
|
||||||
|
int filename;
|
||||||
|
char *nameptr, *cwdptr;
|
||||||
|
|
||||||
|
cwdptr = rootdir + strlen(rootdir);
|
||||||
|
nameptr = name;
|
||||||
|
/*
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr,"GetUnixDirName: %s <=> %s => ",rootdir, name);
|
||||||
|
#endif
|
||||||
|
*/
|
||||||
|
while (*nameptr) {
|
||||||
|
if (*nameptr == '.' & !filename) {
|
||||||
|
nameptr++;
|
||||||
|
if (*nameptr == '\0') {
|
||||||
|
cwdptr--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (*nameptr == '.') {
|
||||||
|
cwdptr--;
|
||||||
|
while (cwdptr != rootdir) {
|
||||||
|
cwdptr--;
|
||||||
|
if (*cwdptr == '/') {
|
||||||
|
*(cwdptr+1) = '\0';
|
||||||
|
goto next;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
goto next;
|
||||||
|
}
|
||||||
|
if (*nameptr == '\\' || *nameptr == '/') {
|
||||||
|
next: nameptr++;
|
||||||
|
filename = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (*nameptr == '\\' || *nameptr == '/') {
|
||||||
|
filename = 0;
|
||||||
|
if (nameptr == name)
|
||||||
|
cwdptr = rootdir;
|
||||||
|
*cwdptr++='/';
|
||||||
|
nameptr++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
filename = 1;
|
||||||
|
*cwdptr++ = *nameptr++;
|
||||||
|
}
|
||||||
|
*cwdptr = '\0';
|
||||||
|
|
||||||
|
ToUnix(rootdir);
|
||||||
|
/*
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr,"%s\n", rootdir);
|
||||||
|
#endif
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
char *GetDirectUnixFileName(char *dosfilename)
|
||||||
|
{
|
||||||
|
/* a:\windows\system.ini => /dos/windows/system.ini */
|
||||||
|
|
||||||
|
int drive;
|
||||||
|
char x, temp[256];
|
||||||
|
|
||||||
|
if (dosfilename[1] == ':')
|
||||||
|
{
|
||||||
|
drive = (islower(*dosfilename) ? toupper(*dosfilename) : *dosfilename) - 'A';
|
||||||
|
|
||||||
|
if (!DOS_ValidDrive(drive))
|
||||||
|
return NULL;
|
||||||
|
else
|
||||||
|
dosfilename+=2;
|
||||||
|
} else
|
||||||
|
drive = CurrentDrive;
|
||||||
|
|
||||||
|
strcpy(temp,DosDrives[drive].rootdir);
|
||||||
|
strcat(temp, DosDrives[drive].cwd);
|
||||||
|
GetUnixDirName(temp + strlen(DosDrives[drive].rootdir), dosfilename);
|
||||||
|
|
||||||
|
ToUnix(temp);
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr,"GetDirectUnixFileName: %c:%s => %s\n",'A'+ drive, dosfilename, temp);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return(temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *GetUnixFileName(char *dosfilename)
|
||||||
|
{
|
||||||
|
char *dirname, *unixname, workingpath[256], temp[256];
|
||||||
|
|
||||||
|
/* check if program specified a path */
|
||||||
|
|
||||||
|
if (*dosfilename == '.' || *dosfilename == '\\')
|
||||||
|
return( GetDirectUnixFileName(dosfilename) );
|
||||||
|
|
||||||
|
/* nope, lets find it */
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr,"GetUnixFileName: %s\n",dosfilename);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
strcpy(workingpath, WindowsPath);
|
||||||
|
|
||||||
|
for(dirname = strtok(workingpath, ";") ;
|
||||||
|
dirname != NULL;
|
||||||
|
dirname = strtok(NULL, ";"))
|
||||||
|
{
|
||||||
|
strcpy(temp,dirname);
|
||||||
|
if (temp[strlen(temp)-1] != '\\')
|
||||||
|
strcat(temp,"\\");
|
||||||
|
strcat(temp,dosfilename);
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr,"trying %s\n",temp);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ( (unixname = GetDirectUnixFileName(temp)) != NULL)
|
||||||
|
return unixname;
|
||||||
|
}
|
||||||
|
puts("FAILED!");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *DOS_GetCurrentDir(int drive, char *dirname)
|
||||||
|
{
|
||||||
|
/* should return 'windows\system' */
|
||||||
|
|
||||||
|
char temp[256];
|
||||||
|
|
||||||
|
if (!DOS_ValidDrive(drive))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
strcpy(temp, DosDrives[drive].cwd);
|
||||||
|
ToDos(temp);
|
||||||
|
|
||||||
|
if (temp[strlen(temp)-1] == '\\')
|
||||||
|
temp[strlen(temp)] = '\0';
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr,"DOS_GetCWD: %c:\%s",'A'+drive, temp+1);
|
||||||
|
#endif
|
||||||
|
return (temp+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int DOS_ChangeDir(int drive, char *dirname)
|
||||||
|
{
|
||||||
|
if (!DOS_ValidDrive(drive))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
GetUnixDirName(DosDrives[drive].cwd, dirname);
|
||||||
|
strcat(DosDrives[drive].cwd,"/");
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr,"DOS_SetCWD: %c:\%s",'A'+drive, DosDrives[drive].cwd);
|
||||||
|
#endif
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int DOS_MakeDir(int drive, char *dirname)
|
||||||
|
{
|
||||||
|
char temp[256];
|
||||||
|
|
||||||
|
if (!DOS_ValidDrive(drive))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
strcpy(temp, DosDrives[drive].cwd);
|
||||||
|
GetUnixDirName(temp, dirname);
|
||||||
|
strcat(DosDrives[drive].cwd,"/");
|
||||||
|
|
||||||
|
ToUnix(temp);
|
||||||
|
mkdir(temp,0);
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr,"DOS_MakeDir: %c:\%s => %s",'A'+drive, dirname, temp);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
void main(void)
|
||||||
|
{
|
||||||
|
strcpy(DosDrives[0].cwd, "1/2/3/");
|
||||||
|
|
||||||
|
puts(DosDrives[0].cwd);
|
||||||
|
ChangeDir(0,"..");
|
||||||
|
puts(DosDrives[0].cwd);
|
||||||
|
|
||||||
|
ChangeDir(0,"..\\..");
|
||||||
|
puts(DosDrives[0].cwd);
|
||||||
|
|
||||||
|
ChangeDir(0,".");
|
||||||
|
puts(DosDrives[0].cwd);
|
||||||
|
|
||||||
|
ChangeDir(0,"test");
|
||||||
|
puts(DosDrives[0].cwd);
|
||||||
|
|
||||||
|
ChangeDir(0,"\\qwerty\\ab");
|
||||||
|
puts(DosDrives[0].cwd);
|
||||||
|
|
||||||
|
ChangeDir(0,"erik\\.\\bos\\..\\24");
|
||||||
|
puts(DosDrives[0].cwd);
|
||||||
|
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
int DOS_GetSerialNumber(int drive, unsigned long *serialnumber)
|
||||||
|
{
|
||||||
|
if (!DOS_ValidDrive(drive))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
*serialnumber = DosDrives[drive].serialnumber;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int DOS_SetSerialNumber(int drive, unsigned long serialnumber)
|
||||||
|
{
|
||||||
|
if (!DOS_ValidDrive(drive))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
DosDrives[drive].serialnumber = serialnumber;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int DOS_GetFreeSpace(int drive, long *size, long *available)
|
||||||
|
{
|
||||||
|
struct statfs info;
|
||||||
|
|
||||||
|
if (!DOS_ValidDrive(drive))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (statfs(DosDrives[drive].rootdir, &info) < 0) {
|
||||||
|
fprintf(stderr,"dosfs: cannot do statfs(%s)\n",DosDrives[drive].rootdir);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
*size = info.f_bsize * info.f_blocks / 1024;
|
||||||
|
*available = info.f_bavail * info.f_bsize / 1024;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *FindFile(char *buffer, int buflen, char *rootname, char **extensions,
|
||||||
|
char *path)
|
||||||
|
{
|
||||||
|
char *workingpath;
|
||||||
|
char *dirname;
|
||||||
|
DIR *d;
|
||||||
|
struct dirent *f;
|
||||||
|
char **e;
|
||||||
|
int rootnamelen;
|
||||||
|
int found = 0;
|
||||||
|
|
||||||
|
|
||||||
|
if (strchr(rootname, '\\') != NULL)
|
||||||
|
{
|
||||||
|
strncpy(buffer, GetDirectUnixFileName(rootname), buflen);
|
||||||
|
ToUnix(buffer);
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr,"FindFile: %s -> %s\n",rootname,buffer);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strchr(rootname, '/') != NULL)
|
||||||
|
{
|
||||||
|
strncpy(buffer, rootname, buflen);
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr,"FindFile: %s -> %s\n",rootname,buffer);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr,"FindFile: looking for %s\n",rootname);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ToUnix(rootname);
|
||||||
|
|
||||||
|
rootnamelen = strlen(rootname);
|
||||||
|
workingpath = malloc(strlen(path) + 1);
|
||||||
|
if (workingpath == NULL)
|
||||||
|
return NULL;
|
||||||
|
strcpy(workingpath, path);
|
||||||
|
|
||||||
|
for(dirname = strtok(workingpath, ";");
|
||||||
|
dirname != NULL;
|
||||||
|
dirname = strtok(NULL, ";"))
|
||||||
|
{
|
||||||
|
if (strchr(dirname, '\\')!=NULL)
|
||||||
|
d = opendir( GetDirectUnixFileName(dirname) );
|
||||||
|
else
|
||||||
|
d = opendir( dirname );
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr,"in %s\n",dirname);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (d != NULL)
|
||||||
|
{
|
||||||
|
while ((f = readdir(d)) != NULL)
|
||||||
|
{
|
||||||
|
if (strncasecmp(rootname, f->d_name, rootnamelen) == 0)
|
||||||
|
{
|
||||||
|
if (extensions == NULL ||
|
||||||
|
strcasecmp(rootname, f->d_name) == 0)
|
||||||
|
{
|
||||||
|
found = 1;
|
||||||
|
}
|
||||||
|
else if (f->d_name[rootnamelen] == '.')
|
||||||
|
{
|
||||||
|
for (e = extensions; *e != NULL; e++)
|
||||||
|
{
|
||||||
|
if (strcasecmp(*e, f->d_name + rootnamelen + 1)
|
||||||
|
== 0)
|
||||||
|
{
|
||||||
|
found = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (found)
|
||||||
|
{
|
||||||
|
if (strchr(dirname, '\\')!=NULL)
|
||||||
|
strncpy(buffer, GetDirectUnixFileName(dirname), buflen);
|
||||||
|
else
|
||||||
|
strncpy(buffer, dirname, buflen);
|
||||||
|
|
||||||
|
if (buffer[strlen(buffer)-1]!='/')
|
||||||
|
strncat(buffer, "/", buflen - strlen(buffer));
|
||||||
|
|
||||||
|
strncat(buffer, f->d_name, buflen - strlen(buffer));
|
||||||
|
closedir(d);
|
||||||
|
|
||||||
|
ToUnix(buffer);
|
||||||
|
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
closedir(d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* WineIniFileName
|
||||||
|
*/
|
||||||
|
char *WineIniFileName(void)
|
||||||
|
{
|
||||||
|
static char *IniName = NULL;
|
||||||
|
char inipath[256];
|
||||||
|
|
||||||
|
if (IniName)
|
||||||
|
return IniName;
|
||||||
|
|
||||||
|
getcwd(inipath, 256);
|
||||||
|
strcat(inipath, ";");
|
||||||
|
strcat(inipath, getenv("HOME"));
|
||||||
|
strcat(inipath, ";");
|
||||||
|
strcat(inipath, getenv("WINEPATH"));
|
||||||
|
|
||||||
|
IniName = malloc(1024);
|
||||||
|
if (FindFile(IniName, 1024, "wine.ini", NULL, inipath) == NULL)
|
||||||
|
{
|
||||||
|
free(IniName);
|
||||||
|
IniName = NULL;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
IniName = realloc(IniName, strlen(IniName) + 1);
|
||||||
|
|
||||||
|
ToUnix(IniName);
|
||||||
|
|
||||||
|
return IniName;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *WinIniFileName()
|
||||||
|
{
|
||||||
|
char name[256];
|
||||||
|
|
||||||
|
strcpy(name,GetDirectUnixFileName(WindowsDirectory));
|
||||||
|
strcat(name,"win.ini");
|
||||||
|
|
||||||
|
ToUnix(name);
|
||||||
|
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct dosdirent *DOS_opendir(char *dosdirname)
|
||||||
|
{
|
||||||
|
int x,y;
|
||||||
|
char *unixdirname;
|
||||||
|
char temp[256];
|
||||||
|
|
||||||
|
for (x=0; x != MAX_OPEN_DIRS && DosDirs[x].inuse; x++)
|
||||||
|
;
|
||||||
|
|
||||||
|
if (x == MAX_OPEN_DIRS)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if ((unixdirname = GetDirectUnixFileName(dosdirname)) == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
strcpy(temp,unixdirname);
|
||||||
|
|
||||||
|
|
||||||
|
y = strlen(temp);
|
||||||
|
|
||||||
|
while (y--)
|
||||||
|
{
|
||||||
|
if (temp[y] == '/')
|
||||||
|
{
|
||||||
|
temp[y] = '\0';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr,"%s -> %s\n",unixdirname,temp);
|
||||||
|
|
||||||
|
DosDirs[x].inuse = 1;
|
||||||
|
strcpy(DosDirs[x].unixpath, temp);
|
||||||
|
|
||||||
|
if ((DosDirs[x].ds = opendir(temp)) == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return &DosDirs[x];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct dosdirent *DOS_readdir(struct dosdirent *de)
|
||||||
|
{
|
||||||
|
char temp[256];
|
||||||
|
struct dirent *d;
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
if (!de->inuse)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if ((d = readdir(de->ds)) == NULL)
|
||||||
|
{
|
||||||
|
closedir(de->ds);
|
||||||
|
de->inuse = 0;
|
||||||
|
return de;
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy(de->filename, d->d_name);
|
||||||
|
if (d->d_reclen > 12)
|
||||||
|
de->filename[12] = '\0';
|
||||||
|
ToDos (de->filename);
|
||||||
|
|
||||||
|
de->attribute = 0x0;
|
||||||
|
|
||||||
|
strcpy(temp,de->unixpath);
|
||||||
|
strcat(temp,"/");
|
||||||
|
strcat(temp,de->filename);
|
||||||
|
ToUnix(temp);
|
||||||
|
stat (temp, &st);
|
||||||
|
if S_ISDIR(st.st_mode)
|
||||||
|
de->attribute |= 0x08;
|
||||||
|
|
||||||
|
return de;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DOS_closedir(struct dosdirent *de)
|
||||||
|
{
|
||||||
|
if (de->inuse)
|
||||||
|
{
|
||||||
|
closedir(de->ds);
|
||||||
|
de->inuse = 0;
|
||||||
|
}
|
||||||
|
}
|
287
misc/file.c
287
misc/file.c
|
@ -3,98 +3,29 @@
|
||||||
*
|
*
|
||||||
* File I/O routines for the Linux Wine Project.
|
* File I/O routines for the Linux Wine Project.
|
||||||
*
|
*
|
||||||
* There are two main parts to this module - first there are the
|
|
||||||
* actual emulation functions, and secondly a routine for translating
|
|
||||||
* DOS filenames into UNIX style filenames.
|
|
||||||
*
|
|
||||||
* For each DOS drive letter, we need to store the location in the unix
|
|
||||||
* file system to map that drive to, and the current directory for that
|
|
||||||
* drive.
|
|
||||||
*
|
|
||||||
* Finally we need to store the current drive letter in this module.
|
|
||||||
*
|
|
||||||
* WARNING : Many options of OpenFile are not yet implemeted.
|
* WARNING : Many options of OpenFile are not yet implemeted.
|
||||||
*
|
*
|
||||||
|
* NOV 93 Erik Bos (erik@(trashcan.)hacktic.nl
|
||||||
|
* - removed ParseDosFileName, and DosDrive structures.
|
||||||
|
* - structures dynamically configured at runtime.
|
||||||
|
* - _lopen modified to use GetUnixFileName.
|
||||||
|
*
|
||||||
|
* DEC 93 Erik Bos (erik@(trashcan.)hacktic.nl)
|
||||||
|
* - Existing functions modified to use dosfs functions.
|
||||||
|
* - Added _llseek, _lcreate, GetDriveType, GetTempDrive,
|
||||||
|
* GetWindowsDirectory, GetSystemDirectory, GetTempFileName.
|
||||||
*
|
*
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
#define DEBUG_FILE
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <assert.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <string.h>
|
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
#include "prototypes.h"
|
||||||
|
|
||||||
#define OPEN_MAX 256
|
char WindowsDirectory[256], SystemDirectory[256], TempDirectory[256];
|
||||||
|
|
||||||
/***************************************************************************
|
|
||||||
This structure stores the infomation needed for a single DOS drive
|
|
||||||
***************************************************************************/
|
|
||||||
struct DosDriveStruct
|
|
||||||
{
|
|
||||||
char RootDirectory [256]; /* Unix base for this drive letter */
|
|
||||||
char CurrentDirectory [256]; /* Current directory for this drive */
|
|
||||||
};
|
|
||||||
|
|
||||||
/***************************************************************************
|
|
||||||
Table for DOS drives
|
|
||||||
***************************************************************************/
|
|
||||||
struct DosDriveStruct DosDrives[] =
|
|
||||||
{
|
|
||||||
{"/mnt/floppy1" , ""},
|
|
||||||
{"/mnt/floppy2" , ""},
|
|
||||||
{"/mnt/HardDisk", "/wine"},
|
|
||||||
{"" , "/wine/Wine"}
|
|
||||||
};
|
|
||||||
|
|
||||||
#define NUM_DRIVES (sizeof (DosDrives) / sizeof (struct DosDriveStruct))
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************
|
|
||||||
Global variable to store current drive letter (0 = A, 1 = B etc)
|
|
||||||
**************************************************************************/
|
|
||||||
int CurrentDrive = 2;
|
|
||||||
|
|
||||||
/**************************************************************************
|
|
||||||
ParseDOSFileName
|
|
||||||
|
|
||||||
Return a fully specified DOS filename with the disk letter separated from
|
|
||||||
the path information.
|
|
||||||
**************************************************************************/
|
|
||||||
void ParseDOSFileName (char *UnixFileName, char *DosFileName, int *Drive)
|
|
||||||
{
|
|
||||||
int character;
|
|
||||||
|
|
||||||
for (character = 0; character < strlen(DosFileName); character++)
|
|
||||||
{
|
|
||||||
if (DosFileName[character] == '\\')
|
|
||||||
DosFileName[character] = '/';
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (DosFileName[1] == ':')
|
|
||||||
{
|
|
||||||
*Drive = DosFileName[0] - 'A';
|
|
||||||
if (*Drive > 26)
|
|
||||||
*Drive = *Drive - 'a' + 'A';
|
|
||||||
DosFileName = DosFileName + 2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
*Drive = CurrentDrive;
|
|
||||||
|
|
||||||
if (DosFileName[0] == '/')
|
|
||||||
{
|
|
||||||
strcpy (UnixFileName, DosDrives[*Drive].RootDirectory);
|
|
||||||
strcat (UnixFileName, DosFileName);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy (UnixFileName, DosDrives[*Drive].RootDirectory);
|
|
||||||
strcat (UnixFileName, DosDrives[*Drive].CurrentDirectory);
|
|
||||||
strcat (UnixFileName, "/");
|
|
||||||
strcat (UnixFileName, DosFileName);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
|
@ -104,20 +35,26 @@ void ParseDOSFileName (char *UnixFileName, char *DosFileName, int *Drive)
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
WORD KERNEL__lopen (LPSTR lpPathName, WORD iReadWrite)
|
WORD KERNEL__lopen (LPSTR lpPathName, WORD iReadWrite)
|
||||||
{
|
{
|
||||||
char UnixFileName[256];
|
|
||||||
int Drive;
|
|
||||||
int handle;
|
int handle;
|
||||||
|
char *UnixFileName;
|
||||||
|
|
||||||
ParseDOSFileName (UnixFileName, lpPathName, &Drive);
|
#ifdef DEBUG_FILE
|
||||||
|
fprintf (stderr, "_lopen: open %s\n", lpPathName);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ((UnixFileName = GetUnixFileName(lpPathName)) == NULL)
|
||||||
|
return HFILE_ERROR;
|
||||||
|
|
||||||
handle = open (UnixFileName, iReadWrite);
|
handle = open (UnixFileName, iReadWrite);
|
||||||
|
|
||||||
#ifdef DEBUG_FILE
|
#ifdef DEBUG_FILE
|
||||||
fprintf (stderr, "_lopen: %s (Handle = %d)\n", UnixFileName, handle);
|
fprintf (stderr, "_lopen: open: %s (handle %d)\n", UnixFileName, handle);
|
||||||
#endif
|
#endif
|
||||||
return handle;
|
|
||||||
|
if (handle == -1)
|
||||||
|
return HFILE_ERROR;
|
||||||
|
else
|
||||||
|
return handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
|
@ -127,25 +64,36 @@ WORD KERNEL__lread (WORD hFile, LPSTR lpBuffer, WORD wBytes)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
result = read (hFile, lpBuffer, wBytes);
|
|
||||||
#ifdef DEBUG_FILE
|
#ifdef DEBUG_FILE
|
||||||
fprintf(stderr, "_lread: hFile = %d, lpBuffer = %s, wBytes = %d\n",
|
fprintf(stderr, "_lread: handle %d, buffer = %ld, length = %d\n",
|
||||||
hFile, lpBuffer, wBytes);
|
hFile, lpBuffer, wBytes);
|
||||||
#endif
|
#endif
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
result = read (hFile, lpBuffer, wBytes);
|
||||||
|
|
||||||
|
if (result == -1)
|
||||||
|
return HFILE_ERROR;
|
||||||
|
else
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
_lwrite
|
_lwrite
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
WORD KERNEL__lwrite (WORD hFile, LPSTR lpBuffer, WORD wBytes)
|
WORD KERNEL__lwrite (WORD hFile, LPSTR lpBuffer, WORD wBytes)
|
||||||
{
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
#ifdef DEBUG_FILE
|
#ifdef DEBUG_FILE
|
||||||
fprintf(stderr, "_lwrite: hFile = %d, lpBuffer = %s, wBytes = %d\n",
|
fprintf(stderr, "_lwrite: handle %d, buffer = %ld, length = %d\n",
|
||||||
hFile, lpBuffer, wBytes);
|
hFile, lpBuffer, wBytes);
|
||||||
#endif
|
#endif
|
||||||
return write (hFile, lpBuffer, wBytes);
|
result = write (hFile, lpBuffer, wBytes);
|
||||||
|
|
||||||
|
if (result == -1)
|
||||||
|
return HFILE_ERROR;
|
||||||
|
else
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
|
@ -153,6 +101,10 @@ WORD KERNEL__lwrite (WORD hFile, LPSTR lpBuffer, WORD wBytes)
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
WORD KERNEL__lclose (WORD hFile)
|
WORD KERNEL__lclose (WORD hFile)
|
||||||
{
|
{
|
||||||
|
#ifdef DEBUG_FILE
|
||||||
|
fprintf(stderr, "_lclose: handle %d\n", hFile);
|
||||||
|
#endif
|
||||||
|
|
||||||
close (hFile);
|
close (hFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -166,7 +118,9 @@ WORD KERNEL_OpenFile (LPSTR lpFileName, LPOFSTRUCT ofs, WORD wStyle)
|
||||||
{
|
{
|
||||||
int base,flags;
|
int base,flags;
|
||||||
|
|
||||||
|
#ifdef DEBUG_FILE
|
||||||
fprintf(stderr,"Openfile(%s,<struct>,%d) ",lpFileName,wStyle);
|
fprintf(stderr,"Openfile(%s,<struct>,%d) ",lpFileName,wStyle);
|
||||||
|
#endif
|
||||||
|
|
||||||
base=wStyle&0xF;
|
base=wStyle&0xF;
|
||||||
flags=wStyle&0xFFF0;
|
flags=wStyle&0xFFF0;
|
||||||
|
@ -204,7 +158,148 @@ WORD SetHandleCount (WORD wNumber)
|
||||||
return((wNumber<OPEN_MAX) ? wNumber : OPEN_MAX);
|
return((wNumber<OPEN_MAX) ? wNumber : OPEN_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
_llseek
|
||||||
|
***************************************************************************/
|
||||||
|
LONG KERNEL__llseek (WORD hFile, LONG lOffset, int nOrigin)
|
||||||
|
{
|
||||||
|
int origin;
|
||||||
|
|
||||||
|
#ifdef DEBUG_FILE
|
||||||
|
fprintf(stderr, "_llseek: handle %d, offset %ld, origin %d\n", hFile, lOffset, nOrigin);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
switch (nOrigin) {
|
||||||
|
case 1: origin = SEEK_CUR;
|
||||||
|
break;
|
||||||
|
case 2: origin = SEEK_END;
|
||||||
|
break;
|
||||||
|
default: origin = SEEK_SET;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ( lseek(hFile, lOffset, origin) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
_lcreate
|
||||||
|
***************************************************************************/
|
||||||
|
LONG KERNEL__lcreate (LPSTR lpszFilename, int fnAttribute)
|
||||||
|
{
|
||||||
|
int handle;
|
||||||
|
char *UnixFileName;
|
||||||
|
|
||||||
|
#ifdef DEBUG_FILE
|
||||||
|
fprintf(stderr, "_lcreate: filename %s, attributes %d\n",lpszFilename,
|
||||||
|
fnAttribute);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ((UnixFileName = GetUnixFileName(lpszFilename)) == NULL)
|
||||||
|
return HFILE_ERROR;
|
||||||
|
|
||||||
|
handle = open (UnixFileName, O_CREAT | O_TRUNC | O_WRONLY );
|
||||||
|
|
||||||
|
if (handle == -1)
|
||||||
|
return HFILE_ERROR;
|
||||||
|
else
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
GetDriveType
|
||||||
|
***************************************************************************/
|
||||||
|
UINT GetDriveType(int drive)
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifdef DEBUG_FILE
|
||||||
|
fprintf(stderr,"GetDriveType %c:\n",'A'+drive);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!DOS_ValidDrive(drive))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (drive == 0 || drive == 1)
|
||||||
|
return DRIVE_REMOVABLE;
|
||||||
|
|
||||||
|
return DRIVE_REMOTE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
GetTempDrive
|
||||||
|
***************************************************************************/
|
||||||
|
BYTE GetTempDrive(BYTE chDriveLetter)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_FILE
|
||||||
|
fprintf(stderr,"GetTempDrive (%d)\n",chDriveLetter);
|
||||||
|
#endif
|
||||||
|
return('C');
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
GetWindowsDirectory
|
||||||
|
***************************************************************************/
|
||||||
|
UINT GetWindowsDirectory(LPSTR lpszSysPath, UINT cbSysPath)
|
||||||
|
{
|
||||||
|
if (cbSysPath < strlen(WindowsDirectory))
|
||||||
|
*lpszSysPath = 0;
|
||||||
|
else
|
||||||
|
strcpy(lpszSysPath, WindowsDirectory);
|
||||||
|
|
||||||
|
#ifdef DEBUG_FILE
|
||||||
|
fprintf(stderr,"GetWindowsDirectory (%s)\n",lpszSysPath);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return(strlen(lpszSysPath));
|
||||||
|
}
|
||||||
|
/***************************************************************************
|
||||||
|
GetSystemDirectory
|
||||||
|
***************************************************************************/
|
||||||
|
UINT GetSystemDirectory(LPSTR lpszSysPath, UINT cbSysPath)
|
||||||
|
{
|
||||||
|
if (cbSysPath < strlen(SystemDirectory))
|
||||||
|
*lpszSysPath = 0;
|
||||||
|
else
|
||||||
|
strcpy(lpszSysPath, SystemDirectory);
|
||||||
|
|
||||||
|
#ifdef DEBUG_FILE
|
||||||
|
fprintf(stderr,"GetSystemDirectory (%s)\n",lpszSysPath);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return(strlen(lpszSysPath));
|
||||||
|
}
|
||||||
|
/***************************************************************************
|
||||||
|
GetTempFileName
|
||||||
|
***************************************************************************/
|
||||||
|
int GetTempFileName(BYTE bDriveLetter, LPCSTR lpszPrefixString, UINT uUnique, LPSTR lpszTempFileName)
|
||||||
|
{
|
||||||
|
int unique;
|
||||||
|
char tempname[256];
|
||||||
|
|
||||||
|
if (uUnique == 0)
|
||||||
|
unique = time(NULL)%99999L;
|
||||||
|
else
|
||||||
|
unique = uUnique%99999L;
|
||||||
|
|
||||||
|
strcpy(tempname,lpszPrefixString);
|
||||||
|
tempname[3]='\0';
|
||||||
|
|
||||||
|
sprintf(lpszTempFileName,"%s\%s%d.tmp",WindowsDirectory, tempname,
|
||||||
|
unique);
|
||||||
|
|
||||||
|
ToDos(lpszTempFileName);
|
||||||
|
|
||||||
|
#ifdef DEBUG_FILE
|
||||||
|
fprintf(stderr,"GetTempFilename: %c %s %d => %s\n",bDriveLetter,
|
||||||
|
lpszPrefixString,uUnique,lpszTempFileName);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return unique;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
SetErrorMode
|
||||||
|
***************************************************************************/
|
||||||
|
WORD SetErrorMode(WORD x)
|
||||||
|
{
|
||||||
|
fprintf(stderr,"wine: SetErrorMode %4x (ignored)\n",x);
|
||||||
|
}
|
||||||
|
|
|
@ -51,7 +51,7 @@ int do_int1A(struct sigcontext_struct * context){
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
fprintf(stderr,"Unable to handle int 0x1A AX %x\n", context->sc_eax);
|
fprintf(stderr,"Unable to handle int 0x1A AX %04x\n", context->sc_eax & 0xffffL);
|
||||||
return 1;
|
return 1;
|
||||||
};
|
};
|
||||||
return 1;
|
return 1;
|
File diff suppressed because it is too large
Load Diff
|
@ -21,6 +21,8 @@ typedef struct tagMSGBOX {
|
||||||
HWND hWndNo;
|
HWND hWndNo;
|
||||||
HWND hWndCancel;
|
HWND hWndCancel;
|
||||||
HICON hIcon;
|
HICON hIcon;
|
||||||
|
RECT rectIcon;
|
||||||
|
RECT rectStr;
|
||||||
} MSGBOX;
|
} MSGBOX;
|
||||||
typedef MSGBOX FAR* LPMSGBOX;
|
typedef MSGBOX FAR* LPMSGBOX;
|
||||||
|
|
||||||
|
@ -57,7 +59,7 @@ int MessageBox( HWND hWnd, LPSTR str, LPSTR title, WORD type )
|
||||||
mb.wType = type;
|
mb.wType = type;
|
||||||
mb.ActiveFlg = TRUE;
|
mb.ActiveFlg = TRUE;
|
||||||
hDlg = CreateWindow("MESSAGEBOX", title,
|
hDlg = CreateWindow("MESSAGEBOX", title,
|
||||||
WS_POPUP | WS_DLGFRAME | WS_VISIBLE, 100, 150, 320, 120,
|
WS_POPUP | WS_DLGFRAME | WS_VISIBLE, 100, 150, 400, 120,
|
||||||
(HWND)NULL, (HMENU)NULL, wndPtr->hInstance, (LPSTR)&mb);
|
(HWND)NULL, (HMENU)NULL, wndPtr->hInstance, (LPSTR)&mb);
|
||||||
if (hDlg == 0) return 0;
|
if (hDlg == 0) return 0;
|
||||||
while(TRUE) {
|
while(TRUE) {
|
||||||
|
@ -113,47 +115,63 @@ LONG SystemMessageBoxProc(HWND hWnd, WORD message, WORD wParam, LONG lParam)
|
||||||
*((LPMSGBOX *)&wndPtr->wExtra[1]) = lpmbInit;
|
*((LPMSGBOX *)&wndPtr->wExtra[1]) = lpmbInit;
|
||||||
lpmb = MsgBoxGetStorageHeader(hWnd);
|
lpmb = MsgBoxGetStorageHeader(hWnd);
|
||||||
GetClientRect(hWnd, &rect);
|
GetClientRect(hWnd, &rect);
|
||||||
|
CopyRect(&lpmb->rectStr, &rect);
|
||||||
|
lpmb->rectStr.bottom -= 32;
|
||||||
switch(lpmb->wType & MB_TYPEMASK) {
|
switch(lpmb->wType & MB_TYPEMASK) {
|
||||||
case MB_OK :
|
case MB_OK :
|
||||||
lpmb->hWndYes = CreateWindow("BUTTON", "&Ok",
|
lpmb->hWndYes = CreateWindow("BUTTON", "&Ok",
|
||||||
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
||||||
rect.right / 2 - 70, rect.bottom - 25,
|
rect.right / 2 - 30, rect.bottom - 25,
|
||||||
60, 18, hWnd, 1, wndPtr->hInstance, 0L);
|
60, 18, hWnd, 1, wndPtr->hInstance, 0L);
|
||||||
break;
|
break;
|
||||||
case MB_OKCANCEL :
|
case MB_OKCANCEL :
|
||||||
lpmb->hWndYes = CreateWindow("BUTTON", "&Ok",
|
lpmb->hWndYes = CreateWindow("BUTTON", "&Ok",
|
||||||
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
||||||
rect.right / 2 - 70, rect.bottom - 25,
|
rect.right / 2 - 65, rect.bottom - 25,
|
||||||
60, 18, hWnd, 1, wndPtr->hInstance, 0L);
|
60, 18, hWnd, 1, wndPtr->hInstance, 0L);
|
||||||
lpmb->hWndCancel = CreateWindow("BUTTON", "&Cancel",
|
lpmb->hWndCancel = CreateWindow("BUTTON", "&Cancel",
|
||||||
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
||||||
rect.right / 2 + 10, rect.bottom - 25,
|
rect.right / 2 + 5, rect.bottom - 25,
|
||||||
60, 18, hWnd, 2, wndPtr->hInstance, 0L);
|
60, 18, hWnd, 2, wndPtr->hInstance, 0L);
|
||||||
break;
|
break;
|
||||||
case MB_ABORTRETRYIGNORE :
|
case MB_ABORTRETRYIGNORE :
|
||||||
lpmb->hWndYes = CreateWindow("BUTTON", "&Retry",
|
lpmb->hWndYes = CreateWindow("BUTTON", "&Retry",
|
||||||
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
||||||
rect.right / 2 - 70, rect.bottom - 25,
|
rect.right / 2 - 100, rect.bottom - 25,
|
||||||
60, 18, hWnd, 1, wndPtr->hInstance, 0L);
|
60, 18, hWnd, 1, wndPtr->hInstance, 0L);
|
||||||
lpmb->hWndNo = CreateWindow("BUTTON", "&Ignore",
|
lpmb->hWndNo = CreateWindow("BUTTON", "&Ignore",
|
||||||
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
||||||
rect.right / 2 + 10, rect.bottom - 25,
|
rect.right / 2 - 30, rect.bottom - 25,
|
||||||
60, 18, hWnd, 2, wndPtr->hInstance, 0L);
|
60, 18, hWnd, 2, wndPtr->hInstance, 0L);
|
||||||
lpmb->hWndCancel = CreateWindow("BUTTON", "&Abort",
|
lpmb->hWndCancel = CreateWindow("BUTTON", "&Abort",
|
||||||
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
||||||
rect.right / 2 + 80, rect.bottom - 25,
|
rect.right / 2 + 40, rect.bottom - 25,
|
||||||
60, 18, hWnd, 3, wndPtr->hInstance, 0L);
|
60, 18, hWnd, 3, wndPtr->hInstance, 0L);
|
||||||
break;
|
break;
|
||||||
case MB_YESNO :
|
case MB_YESNO :
|
||||||
lpmb->hWndYes = CreateWindow("BUTTON", "&Yes",
|
lpmb->hWndYes = CreateWindow("BUTTON", "&Yes",
|
||||||
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
||||||
rect.right / 2 - 70, rect.bottom - 25,
|
rect.right / 2 - 65, rect.bottom - 25,
|
||||||
60, 18, hWnd, 1, wndPtr->hInstance, 0L);
|
60, 18, hWnd, 1, wndPtr->hInstance, 0L);
|
||||||
lpmb->hWndNo = CreateWindow("BUTTON", "&No",
|
lpmb->hWndNo = CreateWindow("BUTTON", "&No",
|
||||||
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
||||||
rect.right / 2 + 10, rect.bottom - 25,
|
rect.right / 2 + 5, rect.bottom - 25,
|
||||||
60, 18, hWnd, 2, wndPtr->hInstance, 0L);
|
60, 18, hWnd, 2, wndPtr->hInstance, 0L);
|
||||||
break;
|
break;
|
||||||
|
case MB_YESNOCANCEL :
|
||||||
|
lpmb->hWndYes = CreateWindow("BUTTON", "&Yes",
|
||||||
|
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
||||||
|
rect.right / 2 - 100, rect.bottom - 25,
|
||||||
|
60, 18, hWnd, 1, wndPtr->hInstance, 0L);
|
||||||
|
lpmb->hWndNo = CreateWindow("BUTTON", "&No",
|
||||||
|
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
||||||
|
rect.right / 2 - 30, rect.bottom - 25,
|
||||||
|
60, 18, hWnd, 2, wndPtr->hInstance, 0L);
|
||||||
|
lpmb->hWndCancel = CreateWindow("BUTTON", "&Cancel",
|
||||||
|
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
|
||||||
|
rect.right / 2 + 40, rect.bottom - 25,
|
||||||
|
60, 18, hWnd, 3, wndPtr->hInstance, 0L);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
switch(lpmb->wType & MB_ICONMASK) {
|
switch(lpmb->wType & MB_ICONMASK) {
|
||||||
case MB_ICONEXCLAMATION:
|
case MB_ICONEXCLAMATION:
|
||||||
|
@ -173,16 +191,25 @@ LONG SystemMessageBoxProc(HWND hWnd, WORD message, WORD wParam, LONG lParam)
|
||||||
lpmb->hIcon = LoadIcon((HINSTANCE)NULL, IDI_HAND);
|
lpmb->hIcon = LoadIcon((HINSTANCE)NULL, IDI_HAND);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (lpmb->hIcon != (HICON)NULL) {
|
||||||
|
SetRect(&lpmb->rectIcon, 16,
|
||||||
|
lpmb->rectStr.bottom / 2 - 16, 48,
|
||||||
|
lpmb->rectStr.bottom / 2 + 16);
|
||||||
|
lpmb->rectStr.left += 64;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case WM_PAINT:
|
case WM_PAINT:
|
||||||
lpmb = MsgBoxGetStorageHeader(hWnd);
|
lpmb = MsgBoxGetStorageHeader(hWnd);
|
||||||
GetClientRect(hWnd, &rect);
|
CopyRect(&rect, &lpmb->rectStr);
|
||||||
hDC = BeginPaint(hWnd, &ps);
|
hDC = BeginPaint(hWnd, &ps);
|
||||||
if (lpmb->hIcon) DrawIcon(hDC, 30, 20, lpmb->hIcon);
|
if (lpmb->hIcon)
|
||||||
TextOut(hDC, rect.right / 2, 15,
|
DrawIcon(hDC, lpmb->rectIcon.left,
|
||||||
lpmb->Title, strlen(lpmb->Title));
|
lpmb->rectIcon.top, lpmb->hIcon);
|
||||||
TextOut(hDC, rect.right / 2, 30,
|
DrawText(hDC, lpmb->Str, -1, &rect,
|
||||||
lpmb->Str, strlen(lpmb->Str));
|
DT_CALCRECT | DT_CENTER | DT_WORDBREAK);
|
||||||
|
rect.top = lpmb->rectStr.bottom / 2 - rect.bottom / 2;
|
||||||
|
rect.bottom = lpmb->rectStr.bottom / 2 + rect.bottom / 2;
|
||||||
|
DrawText(hDC, lpmb->Str, -1, &rect, DT_CENTER | DT_WORDBREAK);
|
||||||
EndPaint(hWnd, &ps);
|
EndPaint(hWnd, &ps);
|
||||||
break;
|
break;
|
||||||
case WM_DESTROY:
|
case WM_DESTROY:
|
||||||
|
@ -216,7 +243,7 @@ LONG SystemMessageBoxProc(HWND hWnd, WORD message, WORD wParam, LONG lParam)
|
||||||
DeleteDC(hMemDC);
|
DeleteDC(hMemDC);
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
hBitMap = LoadBitmap((HINSTANCE)NULL, "SMILE");
|
hBitMap = LoadBitmap((HINSTANCE)NULL, "WINELOGO");
|
||||||
GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
|
GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
|
||||||
printf("bm.bmWidth=%d bm.bmHeight=%d\n",
|
printf("bm.bmWidth=%d bm.bmHeight=%d\n",
|
||||||
bm.bmWidth, bm.bmHeight);
|
bm.bmWidth, bm.bmHeight);
|
||||||
|
@ -234,12 +261,15 @@ LONG SystemMessageBoxProc(HWND hWnd, WORD message, WORD wParam, LONG lParam)
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
hDC = GetDC(hWnd);
|
hDC = GetDC(hWnd);
|
||||||
hInst2 = LoadImage("ev3lite.exe", NULL);
|
hInst2 = LoadImage("ev3lite.exe");
|
||||||
|
printf("hInst2=%04X\n", hInst2);
|
||||||
hIcon = LoadIcon(hInst2, "EV3LITE");
|
hIcon = LoadIcon(hInst2, "EV3LITE");
|
||||||
DrawIcon(hDC, 20, 20, hIcon);
|
DrawIcon(hDC, 20, 20, hIcon);
|
||||||
DestroyIcon(hIcon);
|
DestroyIcon(hIcon);
|
||||||
hInst2 = LoadImage("sysres.dll", NULL);
|
hInst2 = LoadImage("moricons.dll");
|
||||||
hIcon = LoadIcon(hInst2, "WINEICON");
|
printf("hInst2=%04X\n", hInst2);
|
||||||
|
hIcon = LoadIcon(hInst2, MAKEINTRESOURCE(1));
|
||||||
|
/* hIcon = LoadIcon(hInst2, "WINEICON"); */
|
||||||
DrawIcon(hDC, 60, 20, hIcon);
|
DrawIcon(hDC, 60, 20, hIcon);
|
||||||
DestroyIcon(hIcon);
|
DestroyIcon(hIcon);
|
||||||
hIcon = LoadIcon((HINSTANCE)NULL, IDI_EXCLAMATION);
|
hIcon = LoadIcon((HINSTANCE)NULL, IDI_EXCLAMATION);
|
||||||
|
|
|
@ -3,6 +3,12 @@
|
||||||
*
|
*
|
||||||
* Copyright (c) 1993 Miguel de Icaza
|
* Copyright (c) 1993 Miguel de Icaza
|
||||||
*
|
*
|
||||||
|
* 1/Dec o Corrected return values for Get*ProfileString
|
||||||
|
*
|
||||||
|
* o Now, if AppName == NULL in Get*ProfileString it returns a list
|
||||||
|
* of the KeyNames (as documented in the MS-SDK).
|
||||||
|
*
|
||||||
|
* o if KeyValue == NULL now clears the value in Get*ProfileString
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static char Copyright [] = "Copyright (C) 1993 Miguel de Icaza";
|
static char Copyright [] = "Copyright (C) 1993 Miguel de Icaza";
|
||||||
|
@ -12,7 +18,8 @@ static char Copyright [] = "Copyright (C) 1993 Miguel de Icaza";
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
#include "wine.h"
|
#include "wine.h"
|
||||||
|
|
||||||
#define INIFILE GetSystemIniFilename()
|
/* #define DEBUG */
|
||||||
|
|
||||||
#define STRSIZE 255
|
#define STRSIZE 255
|
||||||
#define xmalloc(x) malloc(x)
|
#define xmalloc(x) malloc(x)
|
||||||
#define overflow (next == &CharBuffer [STRSIZE-1])
|
#define overflow (next == &CharBuffer [STRSIZE-1])
|
||||||
|
@ -63,9 +70,15 @@ static TSecHeader *load (char *file)
|
||||||
char *next;
|
char *next;
|
||||||
char c;
|
char c;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("Load %s\n", file);
|
||||||
|
#endif
|
||||||
if ((f = fopen (file, "r"))==NULL)
|
if ((f = fopen (file, "r"))==NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("Loading %s\n", file);
|
||||||
|
#endif
|
||||||
state = FirstBrace;
|
state = FirstBrace;
|
||||||
while ((c = getc (f)) != EOF){
|
while ((c = getc (f)) != EOF){
|
||||||
if (c == '\r') /* Ignore Carriage Return */
|
if (c == '\r') /* Ignore Carriage Return */
|
||||||
|
@ -79,6 +92,9 @@ static TSecHeader *load (char *file)
|
||||||
next = CharBuffer;
|
next = CharBuffer;
|
||||||
SecHeader->AppName = strdup (CharBuffer);
|
SecHeader->AppName = strdup (CharBuffer);
|
||||||
state = IgnoreToEOL;
|
state = IgnoreToEOL;
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("%s: section %s\n", file, CharBuffer);
|
||||||
|
#endif
|
||||||
} else
|
} else
|
||||||
*next++ = c;
|
*next++ = c;
|
||||||
break;
|
break;
|
||||||
|
@ -122,6 +138,9 @@ static TSecHeader *load (char *file)
|
||||||
SecHeader->Keys->KeyName = strdup (CharBuffer);
|
SecHeader->Keys->KeyName = strdup (CharBuffer);
|
||||||
state = KeyValue;
|
state = KeyValue;
|
||||||
next = CharBuffer;
|
next = CharBuffer;
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("%s: key %s\n", file, CharBuffer);
|
||||||
|
#endif
|
||||||
} else
|
} else
|
||||||
*next++ = c;
|
*next++ = c;
|
||||||
break;
|
break;
|
||||||
|
@ -175,17 +194,31 @@ static short GetSetProfile (int set, LPSTR AppName, LPSTR KeyName,
|
||||||
section = New->Section;
|
section = New->Section;
|
||||||
Current = New;
|
Current = New;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Start search */
|
/* Start search */
|
||||||
for (; section; section = section->link){
|
for (; section; section = section->link){
|
||||||
if (strcasecmp (section->AppName, AppName))
|
if (strcasecmp (section->AppName, AppName))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* If no key value given, then list all the keys */
|
||||||
|
if ((!AppName) && (!set)){
|
||||||
|
char *p = ReturnedString;
|
||||||
|
int left = Size - 1;
|
||||||
|
int slen;
|
||||||
|
|
||||||
|
for (key = section->Keys; key; key = key->link){
|
||||||
|
strncpy (p, key->KeyName, left);
|
||||||
|
slen = strlen (key->KeyName) + 1;
|
||||||
|
left -= slen+1;
|
||||||
|
p += slen;
|
||||||
|
}
|
||||||
|
return left;
|
||||||
|
}
|
||||||
for (key = section->Keys; key; key = key->link){
|
for (key = section->Keys; key; key = key->link){
|
||||||
if (strcasecmp (key->KeyName, KeyName))
|
if (strcasecmp (key->KeyName, KeyName))
|
||||||
continue;
|
continue;
|
||||||
if (set){
|
if (set){
|
||||||
free (key->Value);
|
free (key->Value);
|
||||||
key->Value = strdup (Default);
|
key->Value = strdup (Default ? Default : "");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
ReturnedString [Size-1] = 0;
|
ReturnedString [Size-1] = 0;
|
||||||
|
@ -222,14 +255,20 @@ short GetPrivateProfileString (LPSTR AppName, LPSTR KeyName,
|
||||||
LPSTR Default, LPSTR ReturnedString,
|
LPSTR Default, LPSTR ReturnedString,
|
||||||
short Size, LPSTR FileName)
|
short Size, LPSTR FileName)
|
||||||
{
|
{
|
||||||
return (GetSetProfile (0, AppName, KeyName, Default, ReturnedString, Size, FileName));
|
int v;
|
||||||
|
|
||||||
|
v = GetSetProfile (0,AppName,KeyName,Default,ReturnedString,Size,FileName);
|
||||||
|
if (AppName)
|
||||||
|
return strlen (ReturnedString);
|
||||||
|
else
|
||||||
|
return Size - v;
|
||||||
}
|
}
|
||||||
|
|
||||||
int GetProfileString (LPSTR AppName, LPSTR KeyName, LPSTR Default,
|
int GetProfileString (LPSTR AppName, LPSTR KeyName, LPSTR Default,
|
||||||
LPSTR ReturnedString, int Size)
|
LPSTR ReturnedString, int Size)
|
||||||
{
|
{
|
||||||
return GetPrivateProfileString (AppName, KeyName, Default,
|
return GetPrivateProfileString (AppName, KeyName, Default,
|
||||||
ReturnedString, Size, INIFILE);
|
ReturnedString, Size, WIN_INI);
|
||||||
}
|
}
|
||||||
|
|
||||||
WORD GetPrivateProfileInt (LPSTR AppName, LPSTR KeyName, short Default,
|
WORD GetPrivateProfileInt (LPSTR AppName, LPSTR KeyName, short Default,
|
||||||
|
@ -251,7 +290,7 @@ WORD GetPrivateProfileInt (LPSTR AppName, LPSTR KeyName, short Default,
|
||||||
|
|
||||||
WORD GetProfileInt (LPSTR AppName, LPSTR KeyName, int Default)
|
WORD GetProfileInt (LPSTR AppName, LPSTR KeyName, int Default)
|
||||||
{
|
{
|
||||||
return GetPrivateProfileInt (AppName, KeyName, Default, INIFILE);
|
return GetPrivateProfileInt (AppName, KeyName, Default, WIN_INI);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL WritePrivateProfileString (LPSTR AppName, LPSTR KeyName, LPSTR String,
|
BOOL WritePrivateProfileString (LPSTR AppName, LPSTR KeyName, LPSTR String,
|
||||||
|
@ -262,7 +301,7 @@ BOOL WritePrivateProfileString (LPSTR AppName, LPSTR KeyName, LPSTR String,
|
||||||
|
|
||||||
BOOL WriteProfileString (LPSTR AppName, LPSTR KeyName, LPSTR String)
|
BOOL WriteProfileString (LPSTR AppName, LPSTR KeyName, LPSTR String)
|
||||||
{
|
{
|
||||||
return (WritePrivateProfileString (AppName, KeyName, String, INIFILE));
|
return (WritePrivateProfileString (AppName, KeyName, String, WIN_INI));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dump_keys (FILE *profile, TKeys *p)
|
static void dump_keys (FILE *profile, TKeys *p)
|
||||||
|
|
19
misc/user.c
19
misc/user.c
|
@ -6,8 +6,7 @@ static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
|
||||||
#include "prototypes.h"
|
#include "prototypes.h"
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
#include "user.h"
|
#include "user.h"
|
||||||
|
#include "message.h"
|
||||||
#define DEFAULT_MSG_QUEUE_SIZE 8
|
|
||||||
|
|
||||||
#define USER_HEAP_SIZE 0x10000
|
#define USER_HEAP_SIZE 0x10000
|
||||||
|
|
||||||
|
@ -15,6 +14,9 @@ static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
|
||||||
MDESC *USER_Heap = NULL;
|
MDESC *USER_Heap = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
extern BOOL ATOM_Init();
|
||||||
|
extern BOOL GDI_Init();
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* USER_HeapInit
|
* USER_HeapInit
|
||||||
*/
|
*/
|
||||||
|
@ -24,7 +26,6 @@ static BOOL USER_HeapInit()
|
||||||
s = GetNextSegment( 0, 0x10000 );
|
s = GetNextSegment( 0, 0x10000 );
|
||||||
if (s == NULL) return FALSE;
|
if (s == NULL) return FALSE;
|
||||||
HEAP_Init( &USER_Heap, s->base_addr, USER_HEAP_SIZE );
|
HEAP_Init( &USER_Heap, s->base_addr, USER_HEAP_SIZE );
|
||||||
free(s);
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,6 +38,11 @@ static BOOL USER_HeapInit()
|
||||||
int
|
int
|
||||||
USER_InitApp(int hInstance)
|
USER_InitApp(int hInstance)
|
||||||
{
|
{
|
||||||
|
int queueSize;
|
||||||
|
|
||||||
|
/* Global atom table initialisation */
|
||||||
|
if (!ATOM_Init()) return 0;
|
||||||
|
|
||||||
/* GDI initialisation */
|
/* GDI initialisation */
|
||||||
if (!GDI_Init()) return 0;
|
if (!GDI_Init()) return 0;
|
||||||
|
|
||||||
|
@ -55,8 +61,13 @@ USER_InitApp(int hInstance)
|
||||||
/* Initialize dialog manager */
|
/* Initialize dialog manager */
|
||||||
if (!DIALOG_Init()) return 0;
|
if (!DIALOG_Init()) return 0;
|
||||||
|
|
||||||
|
/* Create system message queue */
|
||||||
|
queueSize = GetProfileInt( "windows", "TypeAhead", 120 );
|
||||||
|
if (!MSG_CreateSysMsgQueue( queueSize )) return 0;
|
||||||
|
|
||||||
/* Create task message queue */
|
/* Create task message queue */
|
||||||
if (!SetMessageQueue( DEFAULT_MSG_QUEUE_SIZE )) return 0;
|
queueSize = GetProfileInt( "windows", "DefaultQueueSize", 8 );
|
||||||
|
if (!SetMessageQueue( queueSize )) return 0;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
17
misc/xt.c
17
misc/xt.c
|
@ -41,6 +41,8 @@ void main(int argc, char **argv)
|
||||||
XT_display = XtDisplay( topLevelWidget );
|
XT_display = XtDisplay( topLevelWidget );
|
||||||
XT_screen = XtScreen( topLevelWidget );
|
XT_screen = XtScreen( topLevelWidget );
|
||||||
|
|
||||||
|
DOS_InitFS();
|
||||||
|
Comm_Init();
|
||||||
_WinMain( argc, argv );
|
_WinMain( argc, argv );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,12 +60,6 @@ void MessageBeep( WORD i )
|
||||||
XBell(XT_display, 100);
|
XBell(XT_display, 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
WORD RegisterWindowMessage( LPSTR str )
|
|
||||||
{
|
|
||||||
printf( "RegisterWindowMessage: '%s'\n", str );
|
|
||||||
return 0xc000;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* GetTickCount (USER.13)
|
* GetTickCount (USER.13)
|
||||||
*/
|
*/
|
||||||
|
@ -94,11 +90,10 @@ void AdjustWindowRect( LPRECT rect, DWORD style, BOOL menu )
|
||||||
{
|
{
|
||||||
printf( "AdjustWindowRect: (%d,%d)-(%d,%d) %d %d\n", rect->left, rect->top,
|
printf( "AdjustWindowRect: (%d,%d)-(%d,%d) %d %d\n", rect->left, rect->top,
|
||||||
rect->right, rect->bottom, style, menu );
|
rect->right, rect->bottom, style, menu );
|
||||||
|
#ifdef USE_XLIB
|
||||||
|
rect->right += 8;
|
||||||
|
rect->bottom += 34;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
HMENU CreateMenu() { return 0; }
|
|
||||||
|
|
||||||
BOOL AppendMenu( HMENU hmenu, WORD flags, WORD id, LPSTR text ) { return TRUE;}
|
|
||||||
|
|
||||||
BOOL DestroyMenu( HMENU hmenu ) { return TRUE; }
|
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
#include "../Wine.tmpl"
|
||||||
|
|
||||||
|
MODULE = objects
|
||||||
|
|
||||||
|
SRCS = \
|
||||||
|
bitmap.c \
|
||||||
|
brush.c \
|
||||||
|
font.c \
|
||||||
|
gdiobj.c \
|
||||||
|
palette.c \
|
||||||
|
pen.c \
|
||||||
|
dib.c \
|
||||||
|
region.c \
|
||||||
|
text.c \
|
||||||
|
dcvalues.c \
|
||||||
|
clipping.c \
|
||||||
|
bitblt.c \
|
||||||
|
linedda.c \
|
||||||
|
color.c
|
||||||
|
|
||||||
|
OBJS = \
|
||||||
|
bitmap.o \
|
||||||
|
brush.o \
|
||||||
|
font.o \
|
||||||
|
gdiobj.o \
|
||||||
|
palette.o \
|
||||||
|
pen.o \
|
||||||
|
dib.o \
|
||||||
|
region.o \
|
||||||
|
text.o \
|
||||||
|
dcvalues.o \
|
||||||
|
clipping.o \
|
||||||
|
bitblt.o \
|
||||||
|
linedda.o \
|
||||||
|
color.o
|
||||||
|
|
||||||
|
WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
|
||||||
|
DependTarget()
|
||||||
|
CleanTarget()
|
||||||
|
|
||||||
|
includes::
|
||||||
|
|
||||||
|
install::
|
|
@ -38,10 +38,10 @@ BOOL PatBlt( HDC hdc, short left, short top,
|
||||||
else rop = (rop & 0x03) | ((rop >> 4) & 0x0c);
|
else rop = (rop & 0x03) | ((rop >> 4) & 0x0c);
|
||||||
XSetFunction( XT_display, dc->u.x.gc, DC_XROPfunction[rop] );
|
XSetFunction( XT_display, dc->u.x.gc, DC_XROPfunction[rop] );
|
||||||
|
|
||||||
x1 = XLPTODP( dc, left );
|
x1 = dc->w.DCOrgX + XLPTODP( dc, left );
|
||||||
x2 = XLPTODP( dc, left + width );
|
x2 = dc->w.DCOrgX + XLPTODP( dc, left + width );
|
||||||
y1 = YLPTODP( dc, top );
|
y1 = dc->w.DCOrgY + YLPTODP( dc, top );
|
||||||
y2 = YLPTODP( dc, top + height );
|
y2 = dc->w.DCOrgY + YLPTODP( dc, top + height );
|
||||||
XFillRectangle( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
XFillRectangle( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
MIN(x1,x2), MIN(y1,y2), abs(x2-x1), abs(y2-y1) );
|
MIN(x1,x2), MIN(y1,y2), abs(x2-x1), abs(y2-y1) );
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -78,14 +78,14 @@ BOOL BitBlt( HDC hdcDest, short xDest, short yDest, short width, short height,
|
||||||
dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
|
dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
|
||||||
if (!dcSrc) return FALSE;
|
if (!dcSrc) return FALSE;
|
||||||
|
|
||||||
xs1 = XLPTODP( dcSrc, xSrc );
|
xs1 = dcSrc->w.DCOrgX + XLPTODP( dcSrc, xSrc );
|
||||||
xs2 = XLPTODP( dcSrc, xSrc + width );
|
xs2 = dcSrc->w.DCOrgX + XLPTODP( dcSrc, xSrc + width );
|
||||||
ys1 = YLPTODP( dcSrc, ySrc );
|
ys1 = dcSrc->w.DCOrgY + YLPTODP( dcSrc, ySrc );
|
||||||
ys2 = YLPTODP( dcSrc, ySrc + height );
|
ys2 = dcSrc->w.DCOrgY + YLPTODP( dcSrc, ySrc + height );
|
||||||
xd1 = XLPTODP( dcDest, xDest );
|
xd1 = dcDest->w.DCOrgX + XLPTODP( dcDest, xDest );
|
||||||
xd2 = XLPTODP( dcDest, xDest + width );
|
xd2 = dcDest->w.DCOrgX + XLPTODP( dcDest, xDest + width );
|
||||||
yd1 = YLPTODP( dcDest, yDest );
|
yd1 = dcDest->w.DCOrgY + YLPTODP( dcDest, yDest );
|
||||||
yd2 = YLPTODP( dcDest, yDest + height );
|
yd2 = dcDest->w.DCOrgY + YLPTODP( dcDest, yDest + height );
|
||||||
|
|
||||||
if ((abs(xs2-xs1) != abs(xd2-xd1)) || (abs(ys2-ys1) != abs(yd2-yd1)))
|
if ((abs(xs2-xs1) != abs(xd2-xd1)) || (abs(ys2-ys1) != abs(yd2-yd1)))
|
||||||
return FALSE; /* Should call StretchBlt here */
|
return FALSE; /* Should call StretchBlt here */
|
||||||
|
@ -109,3 +109,78 @@ BOOL BitBlt( HDC hdcDest, short xDest, short yDest, short width, short height,
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* StrechBlt (GDI.35)
|
||||||
|
*/
|
||||||
|
BOOL StrechBlt( HDC hdcDest, short xDest, short yDest, short widthDest, short heightDest,
|
||||||
|
HDC hdcSrc, short xSrc, short ySrc, short widthSrc, short heightSrc, DWORD rop )
|
||||||
|
{
|
||||||
|
int xs1, xs2, ys1, ys2;
|
||||||
|
int xd1, xd2, yd1, yd2;
|
||||||
|
DC *dcDest, *dcSrc;
|
||||||
|
|
||||||
|
/*#ifdef DEBUG_GDI */
|
||||||
|
|
||||||
|
printf( "StrechBlt: %d %d,%d %dx%d %d %d,%d %dx%d %08x\n",
|
||||||
|
hdcDest, xDest, yDest, widthDest, heightDest, hdcSrc, xSrc,
|
||||||
|
ySrc, widthSrc, heightSrc, rop );
|
||||||
|
/*#endif */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if ((rop & 0xcc0000) == ((rop & 0x330000) << 2))
|
||||||
|
return PatBlt( hdcDest, xDest, yDest, widthDest, heightDest, rop );
|
||||||
|
|
||||||
|
printf("here\n");
|
||||||
|
|
||||||
|
rop >>= 16;
|
||||||
|
if ((rop & 0x0f) != (rop >> 4))
|
||||||
|
{
|
||||||
|
printf( "BitBlt: Unimplemented ROP %02x\n", rop );
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("here2\n");
|
||||||
|
|
||||||
|
dcDest = (DC *) GDI_GetObjPtr( hdcDest, DC_MAGIC );
|
||||||
|
if (!dcDest) return FALSE;
|
||||||
|
dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
|
||||||
|
if (!dcSrc) return FALSE;
|
||||||
|
|
||||||
|
xs1 = XLPTODP( dcSrc, xSrc );
|
||||||
|
xs2 = XLPTODP( dcSrc, xSrc + widthSrc );
|
||||||
|
ys1 = YLPTODP( dcSrc, ySrc );
|
||||||
|
ys2 = YLPTODP( dcSrc, ySrc + heightSrc );
|
||||||
|
xd1 = XLPTODP( dcDest, xDest );
|
||||||
|
xd2 = XLPTODP( dcDest, xDest + widthDest );
|
||||||
|
yd1 = YLPTODP( dcDest, yDest );
|
||||||
|
yd2 = YLPTODP( dcDest, yDest + heightDest );
|
||||||
|
|
||||||
|
DC_SetupGCForText( dcDest );
|
||||||
|
XSetFunction( XT_display, dcDest->u.x.gc, DC_XROPfunction[rop & 0x0f] );
|
||||||
|
|
||||||
|
if (dcSrc->w.bitsPerPixel == dcDest->w.bitsPerPixel)
|
||||||
|
{
|
||||||
|
printf("XCopyArea\n");
|
||||||
|
XCopyArea( XT_display, dcSrc->u.x.drawable,
|
||||||
|
dcDest->u.x.drawable, dcDest->u.x.gc,
|
||||||
|
MIN(xs1,xs2), MIN(ys1,ys2), abs(xd2-xd1), abs(yd2-yd1),
|
||||||
|
MIN(xd1,xd2), MIN(yd1,yd2) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("XCopyPlane\n");
|
||||||
|
if (dcSrc->w.bitsPerPixel != 1) return FALSE;
|
||||||
|
XCopyPlane( XT_display, dcSrc->u.x.drawable,
|
||||||
|
dcDest->u.x.drawable, dcDest->u.x.gc,
|
||||||
|
MIN(xs1,xs2), MIN(ys1,ys2), abs(xd2-xd1), abs(yd2-yd1),
|
||||||
|
MIN(xd1,xd2), MIN(yd1,yd2), 1 );
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,7 @@ BOOL BITMAP_Init()
|
||||||
if (tmpPixmap)
|
if (tmpPixmap)
|
||||||
{
|
{
|
||||||
bitmapGC[i] = XCreateGC( XT_display, tmpPixmap, 0, NULL );
|
bitmapGC[i] = XCreateGC( XT_display, tmpPixmap, 0, NULL );
|
||||||
|
XSetGraphicsExposures( XT_display, bitmapGC[i], False );
|
||||||
XFreePixmap( XT_display, tmpPixmap );
|
XFreePixmap( XT_display, tmpPixmap );
|
||||||
}
|
}
|
||||||
else bitmapGC[i] = 0;
|
else bitmapGC[i] = 0;
|
||||||
|
@ -355,6 +356,8 @@ HBITMAP BITMAP_SelectObject( HDC hdc, DC * dc, HBITMAP hbitmap,
|
||||||
DefaultRootWindow( XT_display ),
|
DefaultRootWindow( XT_display ),
|
||||||
bmp->bmWidth, bmp->bmHeight,
|
bmp->bmWidth, bmp->bmHeight,
|
||||||
bmp->bmBitsPixel );
|
bmp->bmBitsPixel );
|
||||||
|
dc->w.DCSizeX = bmp->bmWidth;
|
||||||
|
dc->w.DCSizeY = bmp->bmHeight;
|
||||||
BITMAP_CopyToPixmap( bmp, dc->u.x.drawable,
|
BITMAP_CopyToPixmap( bmp, dc->u.x.drawable,
|
||||||
0, 0, bmp->bmWidth, bmp->bmHeight );
|
0, 0, bmp->bmWidth, bmp->bmHeight );
|
||||||
|
|
||||||
|
|
|
@ -10,10 +10,33 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
||||||
#include "gdi.h"
|
#include "gdi.h"
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* CLIPPING_SetDeviceClipping
|
||||||
|
*
|
||||||
|
* Set the clip region of the physical device.
|
||||||
|
*/
|
||||||
|
void CLIPPING_SetDeviceClipping( DC * dc )
|
||||||
|
{
|
||||||
|
if (dc->w.hGCClipRgn)
|
||||||
|
{
|
||||||
|
RGNOBJ *obj = (RGNOBJ *) GDI_GetObjPtr(dc->w.hGCClipRgn, REGION_MAGIC);
|
||||||
|
XSetClipMask( XT_display, dc->u.x.gc, obj->region.pixmap );
|
||||||
|
XSetClipOrigin( XT_display, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + obj->region.box.left,
|
||||||
|
dc->w.DCOrgY + obj->region.box.top );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
XSetClipMask( XT_display, dc->u.x.gc, None );
|
||||||
|
XSetClipOrigin( XT_display, dc->u.x.gc, dc->w.DCOrgX, dc->w.DCOrgY );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* CLIPPING_UpdateGCRegion
|
* CLIPPING_UpdateGCRegion
|
||||||
*
|
*
|
||||||
* Update the GC clip region when the ClipRgn of VisRgn have changed.
|
* Update the GC clip region when the ClipRgn or VisRgn have changed.
|
||||||
*/
|
*/
|
||||||
static void CLIPPING_UpdateGCRegion( DC * dc )
|
static void CLIPPING_UpdateGCRegion( DC * dc )
|
||||||
{
|
{
|
||||||
|
@ -36,19 +59,7 @@ static void CLIPPING_UpdateGCRegion( DC * dc )
|
||||||
else
|
else
|
||||||
CombineRgn( dc->w.hGCClipRgn, dc->w.hClipRgn, dc->w.hVisRgn, RGN_AND );
|
CombineRgn( dc->w.hGCClipRgn, dc->w.hClipRgn, dc->w.hVisRgn, RGN_AND );
|
||||||
}
|
}
|
||||||
|
CLIPPING_SetDeviceClipping( dc );
|
||||||
if (dc->w.hGCClipRgn)
|
|
||||||
{
|
|
||||||
RGNOBJ *obj = (RGNOBJ *) GDI_GetObjPtr( dc->w.hGCClipRgn, REGION_MAGIC );
|
|
||||||
XSetClipMask( XT_display, dc->u.x.gc, obj->region.pixmap );
|
|
||||||
XSetClipOrigin( XT_display, dc->u.x.gc,
|
|
||||||
obj->region.box.left, obj->region.box.top );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
XSetClipMask( XT_display, dc->u.x.gc, None );
|
|
||||||
XSetClipOrigin( XT_display, dc->u.x.gc, 0, 0 );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -157,26 +168,40 @@ int OffsetVisRgn( HDC hdc, short x, short y )
|
||||||
int CLIPPING_IntersectRect( DC * dc, HRGN * hrgn, short left, short top,
|
int CLIPPING_IntersectRect( DC * dc, HRGN * hrgn, short left, short top,
|
||||||
short right, short bottom, int exclude )
|
short right, short bottom, int exclude )
|
||||||
{
|
{
|
||||||
HRGN tempRgn, newRgn;
|
HRGN tempRgn = 0, prevRgn = 0, newRgn = 0;
|
||||||
RGNOBJ *newObj, *prevObj;
|
RGNOBJ *newObj, *prevObj;
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
if (!*hrgn) return NULLREGION;
|
if (!*hrgn)
|
||||||
if (!(newRgn = CreateRectRgn( 0, 0, 0, 0))) return ERROR;
|
|
||||||
if (!(tempRgn = CreateRectRgn( left, top, right, bottom )))
|
|
||||||
{
|
{
|
||||||
DeleteObject( newRgn );
|
if (!(*hrgn = CreateRectRgn( 0, 0, dc->w.DCSizeX, dc->w.DCSizeY )))
|
||||||
return ERROR;
|
goto Error;
|
||||||
|
prevRgn = *hrgn;
|
||||||
}
|
}
|
||||||
|
if (!(newRgn = CreateRectRgn( 0, 0, 0, 0))) goto Error;
|
||||||
|
if (!(tempRgn = CreateRectRgn( left, top, right, bottom ))) goto Error;
|
||||||
|
|
||||||
retval = CombineRgn( newRgn, *hrgn, tempRgn, exclude ? RGN_DIFF : RGN_AND);
|
retval = CombineRgn( newRgn, *hrgn, tempRgn, exclude ? RGN_DIFF : RGN_AND);
|
||||||
|
if (retval == ERROR) goto Error;
|
||||||
|
|
||||||
newObj = (RGNOBJ *) GDI_GetObjPtr( newRgn, REGION_MAGIC );
|
newObj = (RGNOBJ *) GDI_GetObjPtr( newRgn, REGION_MAGIC );
|
||||||
prevObj = (RGNOBJ *) GDI_GetObjPtr( *hrgn, REGION_MAGIC );
|
prevObj = (RGNOBJ *) GDI_GetObjPtr( *hrgn, REGION_MAGIC );
|
||||||
if (newObj && prevObj) newObj->header.hNext = prevObj->header.hNext;
|
if (newObj && prevObj) newObj->header.hNext = prevObj->header.hNext;
|
||||||
DeleteObject( tempRgn );
|
DeleteObject( tempRgn );
|
||||||
DeleteObject( *hrgn );
|
if (*hrgn) DeleteObject( *hrgn );
|
||||||
*hrgn = newRgn;
|
*hrgn = newRgn;
|
||||||
CLIPPING_UpdateGCRegion( dc );
|
CLIPPING_UpdateGCRegion( dc );
|
||||||
return retval;
|
return retval;
|
||||||
|
|
||||||
|
Error:
|
||||||
|
if (tempRgn) DeleteObject( tempRgn );
|
||||||
|
if (newRgn) DeleteObject( newRgn );
|
||||||
|
if (prevRgn)
|
||||||
|
{
|
||||||
|
DeleteObject( prevRgn );
|
||||||
|
*hrgn = 0;
|
||||||
|
}
|
||||||
|
return ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -292,13 +317,9 @@ int GetClipBox( HDC hdc, LPRECT rect )
|
||||||
if (dc->w.hGCClipRgn) return GetRgnBox( dc->w.hGCClipRgn, rect );
|
if (dc->w.hGCClipRgn) return GetRgnBox( dc->w.hGCClipRgn, rect );
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Window root;
|
|
||||||
int width, height, x, y, border, depth;
|
|
||||||
XGetGeometry( XT_display, dc->u.x.drawable, &root, &x, &y,
|
|
||||||
&width, &height, &border, &depth );
|
|
||||||
rect->top = rect->left = 0;
|
rect->top = rect->left = 0;
|
||||||
rect->right = width & 0xffff;
|
rect->right = dc->w.DCSizeX;
|
||||||
rect->bottom = height & 0xffff;
|
rect->bottom = dc->w.DCSizeY;
|
||||||
return SIMPLEREGION;
|
return SIMPLEREGION;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,6 +45,8 @@ const WIN_DC_INFO DCVAL_defaultValues =
|
||||||
MM_TEXT, /* MapMode */
|
MM_TEXT, /* MapMode */
|
||||||
0, /* DCOrgX */
|
0, /* DCOrgX */
|
||||||
0, /* DCOrgY */
|
0, /* DCOrgY */
|
||||||
|
0, /* DCSizeX */
|
||||||
|
0, /* DCSizeY */
|
||||||
0, /* CursPosX */
|
0, /* CursPosX */
|
||||||
0, /* CursPosY */
|
0, /* CursPosY */
|
||||||
0, /* WndOrgX */
|
0, /* WndOrgX */
|
||||||
|
|
|
@ -331,6 +331,36 @@ BOOL GetTextMetrics( HDC hdc, LPTEXTMETRIC metrics )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
|
||||||
|
#define CI_NONEXISTCHAR(cs) (((cs)->width == 0) && \
|
||||||
|
(((cs)->rbearing|(cs)->lbearing| \
|
||||||
|
(cs)->ascent|(cs)->descent) == 0))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* CI_GET_CHAR_INFO - return the charinfo struct for the indicated 8bit
|
||||||
|
* character. If the character is in the column and exists, then return the
|
||||||
|
* appropriate metrics (note that fonts with common per-character metrics will
|
||||||
|
* return min_bounds). If none of these hold true, try again with the default
|
||||||
|
* char.
|
||||||
|
*/
|
||||||
|
#define CI_GET_CHAR_INFO(fs,col,def,cs) \
|
||||||
|
{ \
|
||||||
|
cs = def; \
|
||||||
|
if (col >= fs->min_char_or_byte2 && col <= fs->max_char_or_byte2) { \
|
||||||
|
if (fs->per_char == NULL) { \
|
||||||
|
cs = &fs->min_bounds; \
|
||||||
|
} else { \
|
||||||
|
cs = &fs->per_char[(col - fs->min_char_or_byte2)]; \
|
||||||
|
if (CI_NONEXISTCHAR(cs)) cs = def; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define CI_GET_DEFAULT_INFO(fs,cs) \
|
||||||
|
CI_GET_CHAR_INFO(fs, fs->default_char, NULL, cs)
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* GetCharWidth (GDI.350)
|
* GetCharWidth (GDI.350)
|
||||||
*/
|
*/
|
||||||
|
@ -338,8 +368,7 @@ BOOL GetCharWidth(HDC hdc, WORD wFirstChar, WORD wLastChar, LPINT lpBuffer)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
XFontStruct *xfont;
|
XFontStruct *xfont;
|
||||||
XCharStruct *charPtr;
|
XCharStruct *cs, *def;
|
||||||
int default_width;
|
|
||||||
|
|
||||||
DC *dc = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC);
|
DC *dc = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC);
|
||||||
if (!dc) return FALSE;
|
if (!dc) return FALSE;
|
||||||
|
@ -353,15 +382,12 @@ BOOL GetCharWidth(HDC hdc, WORD wFirstChar, WORD wLastChar, LPINT lpBuffer)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
charPtr = xfont->per_char;
|
CI_GET_DEFAULT_INFO(xfont, def);
|
||||||
default_width = (charPtr + xfont->default_char)->width;
|
|
||||||
|
|
||||||
for (i = wFirstChar, j = 0; i <= wLastChar; i++, j++)
|
for (i = wFirstChar, j = 0; i <= wLastChar; i++, j++)
|
||||||
{
|
{
|
||||||
if (i < xfont->min_char_or_byte2 || i > xfont->max_char_or_byte2)
|
CI_GET_CHAR_INFO(xfont, i, def, cs);
|
||||||
*(lpBuffer + j) = default_width;
|
*(lpBuffer + j) = cs->width;
|
||||||
else
|
|
||||||
*(lpBuffer + j) = charPtr->width;
|
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -153,7 +153,6 @@ BOOL GDI_Init()
|
||||||
s = (struct segment_descriptor_s *)GetNextSegment( 0, 0x10000 );
|
s = (struct segment_descriptor_s *)GetNextSegment( 0, 0x10000 );
|
||||||
if (s == NULL) return FALSE;
|
if (s == NULL) return FALSE;
|
||||||
HEAP_Init( &GDI_Heap, s->base_addr, GDI_HEAP_SIZE );
|
HEAP_Init( &GDI_Heap, s->base_addr, GDI_HEAP_SIZE );
|
||||||
free(s);
|
|
||||||
|
|
||||||
/* Create default palette */
|
/* Create default palette */
|
||||||
|
|
||||||
|
@ -200,8 +199,11 @@ HANDLE GDI_AllocObject( WORD size, WORD magic )
|
||||||
GDIOBJHDR * obj;
|
GDIOBJHDR * obj;
|
||||||
HANDLE handle = GDI_HEAP_ALLOC( GMEM_MOVEABLE, size );
|
HANDLE handle = GDI_HEAP_ALLOC( GMEM_MOVEABLE, size );
|
||||||
if (!handle) return 0;
|
if (!handle) return 0;
|
||||||
|
|
||||||
obj = (GDIOBJHDR *) GDI_HEAP_ADDR( handle );
|
obj = (GDIOBJHDR *) GDI_HEAP_ADDR( handle );
|
||||||
|
if (obj == NULL) {
|
||||||
|
printf("GDI_AllocObject // Error trying to get GDI_HEAD_ADDR !\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
obj->hNext = 0;
|
obj->hNext = 0;
|
||||||
obj->wMagic = magic;
|
obj->wMagic = magic;
|
||||||
obj->dwCount = ++count;
|
obj->dwCount = ++count;
|
||||||
|
|
|
@ -177,3 +177,21 @@ int PALETTE_GetObject( PALETTEOBJ * palette, int count, LPSTR buffer )
|
||||||
memcpy( buffer, &palette->logpalette.palNumEntries, count );
|
memcpy( buffer, &palette->logpalette.palNumEntries, count );
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* SelectPalette (USER.282)
|
||||||
|
*/
|
||||||
|
HPALETTE SelectPalette(HDC hDC, HPALETTE hPal, BOOL bForceBackground)
|
||||||
|
{
|
||||||
|
return (HPALETTE)NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* RealizePalette (USER.283)
|
||||||
|
*/
|
||||||
|
int RealizePalette(HDC hDC)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@ BOOL REGION_Init()
|
||||||
XFreePixmap( XT_display, tmpPixmap );
|
XFreePixmap( XT_display, tmpPixmap );
|
||||||
if (!regionGC) return FALSE;
|
if (!regionGC) return FALSE;
|
||||||
XSetForeground( XT_display, regionGC, 1 );
|
XSetForeground( XT_display, regionGC, 1 );
|
||||||
|
XSetGraphicsExposures( XT_display, regionGC, False );
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
else return FALSE;
|
else return FALSE;
|
||||||
|
|
|
@ -229,7 +229,8 @@ int DrawText( HDC hdc, LPSTR str, int count, LPRECT rect, WORD flags )
|
||||||
else if (flags & DT_BOTTOM) y = rect->bottom - size.cy;
|
else if (flags & DT_BOTTOM) y = rect->bottom - size.cy;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!TextOut(hdc, x, y, line, len)) return 0;
|
if (!(flags & DT_CALCRECT))
|
||||||
|
if (!TextOut(hdc, x, y, line, len)) return 0;
|
||||||
if (prefix_offset != -1)
|
if (prefix_offset != -1)
|
||||||
{
|
{
|
||||||
MoveTo(hdc, x + prefix_x, y + size.cy);
|
MoveTo(hdc, x + prefix_x, y + size.cy);
|
||||||
|
@ -247,7 +248,7 @@ int DrawText( HDC hdc, LPSTR str, int count, LPRECT rect, WORD flags )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (strPtr);
|
while (strPtr);
|
||||||
|
if (flags & DT_CALCRECT) rect->bottom = y;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -314,10 +315,10 @@ BOOL TextOut( HDC hdc, short x, short y, LPSTR str, short count )
|
||||||
{
|
{
|
||||||
if (dc->w.backgroundMode == TRANSPARENT)
|
if (dc->w.backgroundMode == TRANSPARENT)
|
||||||
XDrawString( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
XDrawString( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
x, y, str, count );
|
dc->w.DCOrgX + x, dc->w.DCOrgY + y, str, count );
|
||||||
else
|
else
|
||||||
XDrawImageString( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
XDrawImageString( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
x, y, str, count );
|
dc->w.DCOrgX + x, dc->w.DCOrgY + y, str, count );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -340,14 +341,15 @@ BOOL TextOut( HDC hdc, short x, short y, LPSTR str, short count )
|
||||||
|
|
||||||
if (dc->w.backgroundMode == TRANSPARENT)
|
if (dc->w.backgroundMode == TRANSPARENT)
|
||||||
XDrawString( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
XDrawString( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
xchar, y, p, 1 );
|
dc->w.DCOrgX + xchar, dc->w.DCOrgY + y, p, 1 );
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
XDrawImageString( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
XDrawImageString( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
xchar, y, p, 1 );
|
dc->w.DCOrgX + xchar, dc->w.DCOrgY + y, p, 1 );
|
||||||
XSetForeground( XT_display, dc->u.x.gc, dc->w.backgroundPixel);
|
XSetForeground( XT_display, dc->u.x.gc, dc->w.backgroundPixel);
|
||||||
XFillRectangle( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
XFillRectangle( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
xchar + charStr->width, y - font->ascent,
|
dc->w.DCOrgX + xchar + charStr->width,
|
||||||
|
dc->w.DCOrgY + y - font->ascent,
|
||||||
extraWidth, font->ascent + font->descent );
|
extraWidth, font->ascent + font->descent );
|
||||||
XSetForeground( XT_display, dc->u.x.gc, dc->w.textPixel );
|
XSetForeground( XT_display, dc->u.x.gc, dc->w.textPixel );
|
||||||
}
|
}
|
||||||
|
@ -368,7 +370,8 @@ BOOL TextOut( HDC hdc, short x, short y, LPSTR str, short count )
|
||||||
XSetLineAttributes( XT_display, dc->u.x.gc, lineWidth,
|
XSetLineAttributes( XT_display, dc->u.x.gc, lineWidth,
|
||||||
LineSolid, CapRound, JoinBevel );
|
LineSolid, CapRound, JoinBevel );
|
||||||
XDrawLine( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
XDrawLine( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
x, y + linePos, x + info.width, y + linePos );
|
dc->w.DCOrgX + x, dc->w.DCOrgY + y + linePos,
|
||||||
|
dc->w.DCOrgX + x + info.width, dc->w.DCOrgY + y + linePos );
|
||||||
}
|
}
|
||||||
if (dc->u.x.font.metrics.tmStruckOut)
|
if (dc->u.x.font.metrics.tmStruckOut)
|
||||||
{
|
{
|
||||||
|
@ -380,7 +383,8 @@ BOOL TextOut( HDC hdc, short x, short y, LPSTR str, short count )
|
||||||
XSetLineAttributes( XT_display, dc->u.x.gc, lineAscent + lineDescent,
|
XSetLineAttributes( XT_display, dc->u.x.gc, lineAscent + lineDescent,
|
||||||
LineSolid, CapRound, JoinBevel );
|
LineSolid, CapRound, JoinBevel );
|
||||||
XDrawLine( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
XDrawLine( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
x, y - lineAscent, x + info.width, y - lineAscent );
|
dc->w.DCOrgX + x, dc->w.DCOrgY + y - lineAscent,
|
||||||
|
dc->w.DCOrgX + x + info.width, dc->w.DCOrgY + y - lineAscent );
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
BIN
sysres.dll
BIN
sysres.dll
Binary file not shown.
|
@ -0,0 +1,8 @@
|
||||||
|
all::
|
||||||
|
|
||||||
|
depend::
|
||||||
|
|
||||||
|
clean::
|
||||||
|
|
||||||
|
includes::
|
||||||
|
|
|
@ -0,0 +1,347 @@
|
||||||
|
# Makefile generated by imake - do not edit!
|
||||||
|
# $XConsortium: imake.c,v 1.65 91/07/25 17:50:17 rws Exp $
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# Makefile generated from "Imake.tmpl" and <Imakefile>
|
||||||
|
# $XFree86: mit/config/Imake.tmpl,v 1.17 1993/06/03 15:26:36 dawes Exp $
|
||||||
|
# $XConsortium: Imake.tmpl,v 1.139 91/09/16 08:52:48 rws Exp $
|
||||||
|
#
|
||||||
|
# Platform-specific parameters may be set in the appropriate <vendor>.cf
|
||||||
|
# configuration files. Site-specific parameters should be set in the file
|
||||||
|
# site.def. Full rebuilds are recommended if any parameters are changed.
|
||||||
|
#
|
||||||
|
# If your C preprocessor does not define any unique symbols, you will need
|
||||||
|
# to set BOOTSTRAPCFLAGS when rebuilding imake (usually when doing
|
||||||
|
# "make World" the first time).
|
||||||
|
#
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# site-specific configuration parameters that need to come before
|
||||||
|
# the platform-specific parameters - edit site.def to change
|
||||||
|
|
||||||
|
# $XFree86: mit/config/site.def,v 1.65 1993/06/04 16:02:47 dawes Exp $
|
||||||
|
# site: $XConsortium: site.def,v 1.2 91/07/30 20:26:44 rws Exp $
|
||||||
|
|
||||||
|
# obz: changes for making Linux distribution
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# platform-specific configuration parameters - edit x386.cf to change
|
||||||
|
|
||||||
|
# $XFree86: mit/config/x386.cf,v 1.90 1993/06/04 16:02:50 dawes Exp $
|
||||||
|
# platform: $XConsortium: x386.cf,v 1.7 91/08/16 19:30:10 gildea Exp $
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# XFree86 version definition
|
||||||
|
# $XFree86: mit/config/xf86_vers.def,v 1.5 1993/06/01 09:12:47 dawes Exp $
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# XFree86 version: 1300
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# $XFree86: mit/config/lnuxLib.rules,v 1.2 1993/06/02 13:48:12 dawes Exp $
|
||||||
|
|
||||||
|
DLL_BINDIR = /usr/dll/bin
|
||||||
|
|
||||||
|
# operating system: Linux
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# site-specific configuration parameters that go after
|
||||||
|
# the platform-specific parameters - edit site.def to change
|
||||||
|
|
||||||
|
# $XFree86: mit/config/site.def,v 1.65 1993/06/04 16:02:47 dawes Exp $
|
||||||
|
# site: $XConsortium: site.def,v 1.2 91/07/30 20:26:44 rws Exp $
|
||||||
|
|
||||||
|
# obz: changes for making Linux distribution
|
||||||
|
|
||||||
|
SHELL = /bin/sh
|
||||||
|
|
||||||
|
TOP = ../.
|
||||||
|
CURRENT_DIR = ./test
|
||||||
|
|
||||||
|
AR = ar clq
|
||||||
|
BOOTSTRAPCFLAGS =
|
||||||
|
CC = gcc
|
||||||
|
AS = as
|
||||||
|
|
||||||
|
LEX = flex
|
||||||
|
|
||||||
|
YACC = bison -y
|
||||||
|
|
||||||
|
COMPRESS = compress
|
||||||
|
CPP = /lib/cpp $(STD_CPP_DEFINES)
|
||||||
|
PREPROCESSCMD = /lib/cpp $(STD_CPP_DEFINES)
|
||||||
|
INSTALL = install
|
||||||
|
LD = ld
|
||||||
|
LINT = lint
|
||||||
|
LINTLIBFLAG = -C
|
||||||
|
LINTOPTS = -axz
|
||||||
|
LN = ln -s
|
||||||
|
MAKE = make
|
||||||
|
MV = mv
|
||||||
|
CP = cp
|
||||||
|
|
||||||
|
RANLIB = ranlib
|
||||||
|
RANLIBINSTFLAGS =
|
||||||
|
|
||||||
|
RM = rm -f
|
||||||
|
TROFF = psroff
|
||||||
|
MSMACROS = -ms
|
||||||
|
TBL = tbl
|
||||||
|
EQN = eqn
|
||||||
|
STD_INCLUDES =
|
||||||
|
STD_CPP_DEFINES = -traditional -D_POSIX_SOURCE -D_BSD_SOURCE -D_GNU_SOURCE -Dlinux
|
||||||
|
STD_DEFINES = -D_POSIX_SOURCE -D_BSD_SOURCE -D_GNU_SOURCE -Dlinux
|
||||||
|
EXTRA_LOAD_FLAGS =
|
||||||
|
EXTRA_LIBRARIES =
|
||||||
|
OS_LIBRARIES =
|
||||||
|
TAGS = ctags
|
||||||
|
|
||||||
|
SHAREDCODEDEF =
|
||||||
|
SHLIBDEF =
|
||||||
|
|
||||||
|
PROTO_DEFINES = -DFUNCPROTO=11 -DNARROWPROTO
|
||||||
|
|
||||||
|
INSTPGMFLAGS = -s
|
||||||
|
|
||||||
|
INSTBINFLAGS = -m 0755
|
||||||
|
INSTUIDFLAGS = -s -m 4755
|
||||||
|
INSTLIBFLAGS = -m 0644
|
||||||
|
INSTINCFLAGS = -m 0444
|
||||||
|
INSTMANFLAGS = -m 0444
|
||||||
|
INSTDATFLAGS = -m 0444
|
||||||
|
INSTKMEMFLAGS = -s -m 4755
|
||||||
|
|
||||||
|
PROJECTROOT = /usr/X386
|
||||||
|
|
||||||
|
TOP_INCLUDES = -I$(INCROOT)
|
||||||
|
|
||||||
|
CDEBUGFLAGS = -O2
|
||||||
|
CCOPTIONS = -m486 -DNO_ASM -fwritable-strings
|
||||||
|
ANSICCOPTIONS =
|
||||||
|
|
||||||
|
ALLINCLUDES = $(INCLUDES) $(EXTRA_INCLUDES) $(TOP_INCLUDES) $(STD_INCLUDES)
|
||||||
|
ALLDEFINES = $(ALLINCLUDES) $(STD_DEFINES) $(EXTRA_DEFINES) $(PROTO_DEFINES) $(DEFINES)
|
||||||
|
CFLAGS = $(ANSICCOPTIONS) $(CDEBUGFLAGS) $(CCOPTIONS) $(ALLDEFINES)
|
||||||
|
LINTFLAGS = $(LINTOPTS) -DLINT $(ALLDEFINES)
|
||||||
|
|
||||||
|
LDLIBS = $(OS_LIBRARIES) $(SYS_LIBRARIES) $(EXTRA_LIBRARIES)
|
||||||
|
|
||||||
|
LDOPTIONS = $(ANSICCOPTIONS) $(CDEBUGFLAGS) $(CCOPTIONS) $(LOCAL_LDFLAGS) -L$(USRLIBDIR)
|
||||||
|
|
||||||
|
LDCOMBINEFLAGS = -r
|
||||||
|
DEPENDFLAGS =
|
||||||
|
|
||||||
|
MACROFILE = x386.cf
|
||||||
|
RM_CMD = $(RM) *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut
|
||||||
|
|
||||||
|
IMAKE_DEFINES =
|
||||||
|
|
||||||
|
IRULESRC = $(CONFIGDIR)
|
||||||
|
IMAKE_CMD = $(IMAKE) -DUseInstalled -I$(IRULESRC) $(IMAKE_DEFINES)
|
||||||
|
|
||||||
|
ICONFIGFILES = $(IRULESRC)/Imake.tmpl $(IRULESRC)/Imake.rules $(IRULESRC)/Project.tmpl $(IRULESRC)/site.def $(IRULESRC)/$(MACROFILE) $(EXTRA_ICONFIGFILES)
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# X Window System Build Parameters
|
||||||
|
# $XFree86: mit/config/Project.tmpl,v 1.13 1993/03/27 03:32:45 dawes Exp $
|
||||||
|
# $XConsortium: Project.tmpl,v 1.138.1.1 92/11/11 09:49:19 rws Exp $
|
||||||
|
|
||||||
|
_percentC_ = %C
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# X Window System make variables; this need to be coordinated with rules
|
||||||
|
|
||||||
|
PATHSEP = /
|
||||||
|
USRLIBDIR = /usr/X386/lib
|
||||||
|
BINDIR = /usr/X386/bin
|
||||||
|
INCROOT = /usr/X386/include
|
||||||
|
BUILDINCROOT = $(TOP)
|
||||||
|
BUILDINCDIR = $(BUILDINCROOT)/X11
|
||||||
|
BUILDINCTOP = ..
|
||||||
|
INCDIR = $(INCROOT)/X11
|
||||||
|
ADMDIR = /usr/adm
|
||||||
|
LIBDIR = $(USRLIBDIR)/X11
|
||||||
|
CONFIGDIR = $(LIBDIR)/config
|
||||||
|
LINTLIBDIR = $(USRLIBDIR)/lint
|
||||||
|
|
||||||
|
FONTDIR = $(LIBDIR)/fonts
|
||||||
|
XINITDIR = $(LIBDIR)/xinit
|
||||||
|
XDMDIR = $(LIBDIR)/xdm
|
||||||
|
TWMDIR = $(LIBDIR)/twm
|
||||||
|
MANPATH = /usr/X386/man
|
||||||
|
MANSOURCEPATH = $(MANPATH)/man
|
||||||
|
MANSUFFIX = 1x
|
||||||
|
LIBMANSUFFIX = 3x
|
||||||
|
MANDIR = $(MANSOURCEPATH)1
|
||||||
|
LIBMANDIR = $(MANSOURCEPATH)3
|
||||||
|
NLSDIR = $(LIBDIR)/nls
|
||||||
|
PEXAPIDIR = $(LIBDIR)/PEX
|
||||||
|
XAPPLOADDIR = $(LIBDIR)/app-defaults
|
||||||
|
FONTCFLAGS = -t
|
||||||
|
LINKKITDIR = $(USRLIBDIR)/Server
|
||||||
|
|
||||||
|
INSTAPPFLAGS = $(INSTDATFLAGS)
|
||||||
|
|
||||||
|
IMAKE = imake
|
||||||
|
DEPEND = makedepend
|
||||||
|
RGB = rgb
|
||||||
|
|
||||||
|
FONTC = bdftopcf
|
||||||
|
|
||||||
|
MKFONTDIR = mkfontdir
|
||||||
|
MKDIRHIER = /bin/sh $(BINDIR)/mkdirhier
|
||||||
|
|
||||||
|
CONFIGSRC = $(TOP)/config
|
||||||
|
DOCUTILSRC = $(TOP)/doc/util
|
||||||
|
CLIENTSRC = $(TOP)/clients
|
||||||
|
DEMOSRC = $(TOP)/demos
|
||||||
|
LIBSRC = $(TOP)/lib
|
||||||
|
FONTSRC = $(TOP)/fonts
|
||||||
|
INCLUDESRC = $(TOP)/X11
|
||||||
|
SERVERSRC = $(TOP)/server
|
||||||
|
UTILSRC = $(TOP)/util
|
||||||
|
SCRIPTSRC = $(UTILSRC)/scripts
|
||||||
|
EXAMPLESRC = $(TOP)/examples
|
||||||
|
CONTRIBSRC = $(TOP)/../contrib
|
||||||
|
DOCSRC = $(TOP)/doc
|
||||||
|
RGBSRC = $(TOP)/rgb
|
||||||
|
DEPENDSRC = $(UTILSRC)/makedepend
|
||||||
|
IMAKESRC = $(CONFIGSRC)
|
||||||
|
XAUTHSRC = $(LIBSRC)/Xau
|
||||||
|
XLIBSRC = $(LIBSRC)/X
|
||||||
|
XMUSRC = $(LIBSRC)/Xmu
|
||||||
|
TOOLKITSRC = $(LIBSRC)/Xt
|
||||||
|
AWIDGETSRC = $(LIBSRC)/Xaw
|
||||||
|
OLDXLIBSRC = $(LIBSRC)/oldX
|
||||||
|
XDMCPLIBSRC = $(LIBSRC)/Xdmcp
|
||||||
|
BDFTOSNFSRC = $(FONTSRC)/bdftosnf
|
||||||
|
BDFTOSNFSRC = $(FONTSRC)/clients/bdftosnf
|
||||||
|
BDFTOPCFSRC = $(FONTSRC)/clients/bdftopcf
|
||||||
|
MKFONTDIRSRC = $(FONTSRC)/clients/mkfontdir
|
||||||
|
FSLIBSRC = $(FONTSRC)/lib/fs
|
||||||
|
FONTSERVERSRC = $(FONTSRC)/server
|
||||||
|
EXTENSIONSRC = $(TOP)/extensions
|
||||||
|
XILIBSRC = $(EXTENSIONSRC)/lib/xinput
|
||||||
|
PEXLIBSRC = $(EXTENSIONSRC)/lib/PEXlib
|
||||||
|
PHIGSLIBSRC = $(EXTENSIONSRC)/lib/PEX
|
||||||
|
|
||||||
|
# $XFree86: mit/config/lnuxLib.tmpl,v 1.1 1993/04/16 14:06:06 dawes Exp $
|
||||||
|
|
||||||
|
SHLIBLDFLAGS =
|
||||||
|
PICFLAGS = -B/usr/dll/jump/
|
||||||
|
|
||||||
|
DEPEXTENSIONLIB =
|
||||||
|
EXTENSIONLIB = -lXext
|
||||||
|
|
||||||
|
DEPXLIB = $(DEPEXTENSIONLIB)
|
||||||
|
XLIB = $(EXTENSIONLIB) -lX11
|
||||||
|
|
||||||
|
DEPXMULIB =
|
||||||
|
XMULIB = -lXmu
|
||||||
|
|
||||||
|
DEPXTOOLLIB =
|
||||||
|
XTOOLLIB = -lXt
|
||||||
|
|
||||||
|
DEPXAWLIB =
|
||||||
|
XAWLIB = -lXaw
|
||||||
|
|
||||||
|
DEPXILIB =
|
||||||
|
XILIB = -lXi
|
||||||
|
|
||||||
|
DEPXTESTLIB =
|
||||||
|
XTESTLIB = -lXtst
|
||||||
|
|
||||||
|
DEPPEXLIB =
|
||||||
|
PEXLIB = -lPEX5
|
||||||
|
|
||||||
|
SOXLIBREV = 3.0.1
|
||||||
|
SOXTREV = 3.0.1
|
||||||
|
SOXAWREV = 3.0.1
|
||||||
|
SOOLDXREV = 3.0.1
|
||||||
|
SOXMUREV = 3.0.1
|
||||||
|
SOXEXTREV = 3.0.1
|
||||||
|
SOXINPUTREV = 3.0.1
|
||||||
|
SOPEXREV = 1.0.1
|
||||||
|
|
||||||
|
DEPXAUTHLIB = $(USRLIBDIR)/libXau.a
|
||||||
|
XAUTHLIB = -lXau
|
||||||
|
DEPXDMCPLIB = $(USRLIBDIR)/libXdmcp.a
|
||||||
|
XDMCPLIB = -lXdmcp
|
||||||
|
|
||||||
|
DEPOLDXLIB = $(USRLIBDIR)/liboldX.a
|
||||||
|
OLDXLIB = -loldX
|
||||||
|
|
||||||
|
DEPPHIGSLIB = $(USRLIBDIR)/libphigs.a
|
||||||
|
PHIGSLIB = -lphigs
|
||||||
|
|
||||||
|
DEPXBSDLIB = $(USRLIBDIR)/libXbsd.a
|
||||||
|
XBSDLIB = -lXbsd
|
||||||
|
|
||||||
|
LINTEXTENSIONLIB = $(LINTLIBDIR)/llib-lXext.ln
|
||||||
|
LINTXLIB = $(LINTLIBDIR)/llib-lX11.ln
|
||||||
|
LINTXMU = $(LINTLIBDIR)/llib-lXmu.ln
|
||||||
|
LINTXTOOL = $(LINTLIBDIR)/llib-lXt.ln
|
||||||
|
LINTXAW = $(LINTLIBDIR)/llib-lXaw.ln
|
||||||
|
LINTXI = $(LINTLIBDIR)/llib-lXi.ln
|
||||||
|
LINTPEX = $(LINTLIBDIR)/llib-lPEX5.ln
|
||||||
|
LINTPHIGS = $(LINTLIBDIR)/llib-lphigs.ln
|
||||||
|
|
||||||
|
DEPLIBS = $(DEPXAWLIB) $(DEPXMULIB) $(DEPXTOOLLIB) $(DEPXLIB)
|
||||||
|
|
||||||
|
DEPLIBS1 = $(DEPLIBS)
|
||||||
|
DEPLIBS2 = $(DEPLIBS)
|
||||||
|
DEPLIBS3 = $(DEPLIBS)
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# Imake rules for building libraries, programs, scripts, and data files
|
||||||
|
# $XFree86: mit/config/Imake.rules,v 1.9 1993/03/23 12:56:27 dawes Exp $
|
||||||
|
# rules: $XConsortium: Imake.rules,v 1.123 91/09/16 20:12:16 rws Exp $
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# start of Imakefile
|
||||||
|
|
||||||
|
all::
|
||||||
|
|
||||||
|
depend::
|
||||||
|
|
||||||
|
clean::
|
||||||
|
|
||||||
|
includes::
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# common rules for all Makefiles - do not edit
|
||||||
|
|
||||||
|
emptyrule::
|
||||||
|
|
||||||
|
clean::
|
||||||
|
$(RM_CMD) "#"*
|
||||||
|
|
||||||
|
Makefile::
|
||||||
|
-@if [ -f Makefile ]; then set -x; \
|
||||||
|
$(RM) Makefile.bak; $(MV) Makefile Makefile.bak; \
|
||||||
|
else exit 0; fi
|
||||||
|
$(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR)
|
||||||
|
|
||||||
|
tags::
|
||||||
|
$(TAGS) -w *.[ch]
|
||||||
|
$(TAGS) -xw *.[ch] > TAGS
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# empty rules for directories that do not have SUBDIRS - do not edit
|
||||||
|
|
||||||
|
install::
|
||||||
|
@echo "install in $(CURRENT_DIR) done"
|
||||||
|
|
||||||
|
install.man::
|
||||||
|
@echo "install.man in $(CURRENT_DIR) done"
|
||||||
|
|
||||||
|
install.linkkit::
|
||||||
|
@echo "install.linkkit in $(CURRENT_DIR) done"
|
||||||
|
|
||||||
|
Makefiles::
|
||||||
|
|
||||||
|
includes::
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# dependencies generated by makedepend
|
||||||
|
|
BIN
test/widget.exe
BIN
test/widget.exe
Binary file not shown.
|
@ -0,0 +1,5 @@
|
||||||
|
#include "../Wine.tmpl"
|
||||||
|
|
||||||
|
MODULE = tools
|
||||||
|
|
||||||
|
SimpleProgramTarget(build)
|
|
@ -0,0 +1,53 @@
|
||||||
|
#include "../Wine.tmpl"
|
||||||
|
|
||||||
|
MODULE = windows
|
||||||
|
|
||||||
|
SRCS = \
|
||||||
|
class.c \
|
||||||
|
dc.c \
|
||||||
|
dce.c \
|
||||||
|
event.c \
|
||||||
|
message.c \
|
||||||
|
win.c \
|
||||||
|
timer.c \
|
||||||
|
graphics.c \
|
||||||
|
clipping.c \
|
||||||
|
mapping.c \
|
||||||
|
painting.c \
|
||||||
|
keyboard.c \
|
||||||
|
utility.c \
|
||||||
|
syscolor.c \
|
||||||
|
defwnd.c \
|
||||||
|
defdlg.c \
|
||||||
|
dialog.c \
|
||||||
|
focus.c \
|
||||||
|
scroll.c
|
||||||
|
|
||||||
|
OBJS = \
|
||||||
|
class.o \
|
||||||
|
dc.o \
|
||||||
|
dce.o \
|
||||||
|
event.o \
|
||||||
|
message.o \
|
||||||
|
win.o \
|
||||||
|
timer.o \
|
||||||
|
graphics.o \
|
||||||
|
clipping.o \
|
||||||
|
mapping.o \
|
||||||
|
painting.o \
|
||||||
|
keyboard.o \
|
||||||
|
utility.o \
|
||||||
|
syscolor.o \
|
||||||
|
defwnd.o \
|
||||||
|
defdlg.o \
|
||||||
|
dialog.o \
|
||||||
|
focus.o \
|
||||||
|
scroll.o
|
||||||
|
|
||||||
|
WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
|
||||||
|
DependTarget()
|
||||||
|
CleanTarget()
|
||||||
|
|
||||||
|
includes::
|
||||||
|
|
||||||
|
install::
|
|
@ -2,7 +2,7 @@ CFLAGS=$(COPTS) $(DEBUGOPTS) -I$(INCLUDE_DIR)
|
||||||
|
|
||||||
OBJS=class.o dc.o dce.o event.o message.o win.o timer.o graphics.o \
|
OBJS=class.o dc.o dce.o event.o message.o win.o timer.o graphics.o \
|
||||||
clipping.o mapping.o painting.o keyboard.o utility.o syscolor.o \
|
clipping.o mapping.o painting.o keyboard.o utility.o syscolor.o \
|
||||||
defwnd.o defdlg.o dialog.o focus.o scroll.o
|
defwnd.o defdlg.o dialog.o focus.o scroll.o caret.o winpos.o
|
||||||
|
|
||||||
default: windows.o
|
default: windows.o
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,250 @@
|
||||||
|
/*
|
||||||
|
* Caret functions
|
||||||
|
*
|
||||||
|
* Copyright 1993 David Metcalfe
|
||||||
|
*/
|
||||||
|
|
||||||
|
static char Copyright[] = "Copyright David Metcalfe, 1993";
|
||||||
|
|
||||||
|
#include <X11/Intrinsic.h>
|
||||||
|
|
||||||
|
#include "windows.h"
|
||||||
|
|
||||||
|
extern XtAppContext XT_app_context;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
HWND hwnd;
|
||||||
|
short hidden;
|
||||||
|
BOOL on;
|
||||||
|
short x;
|
||||||
|
short y;
|
||||||
|
short width;
|
||||||
|
short height;
|
||||||
|
COLORREF color;
|
||||||
|
WORD timeout;
|
||||||
|
XtIntervalId xtid;
|
||||||
|
} CARET;
|
||||||
|
|
||||||
|
static CARET Caret;
|
||||||
|
static BOOL LockCaret;
|
||||||
|
|
||||||
|
static void CARET_Callback(XtPointer data, XtIntervalId *xtid);
|
||||||
|
static void CARET_HideCaret(CARET *pCaret);
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************
|
||||||
|
* CARET_Callback
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void CARET_Callback(XtPointer data, XtIntervalId *xtid)
|
||||||
|
{
|
||||||
|
CARET *pCaret = (CARET *)data;
|
||||||
|
HDC hdc;
|
||||||
|
HBRUSH hBrush;
|
||||||
|
HRGN rgn;
|
||||||
|
|
||||||
|
#ifdef DEBUG_CARET
|
||||||
|
printf("CARET_Callback: LockCaret=%d, hidden=%d, on=%d\n",
|
||||||
|
LockCaret, pCaret->hidden, pCaret->on);
|
||||||
|
#endif
|
||||||
|
if (!LockCaret && (!pCaret->hidden || pCaret->on))
|
||||||
|
{
|
||||||
|
pCaret->on = (pCaret->on ? FALSE : TRUE);
|
||||||
|
hdc = GetDC(pCaret->hwnd);
|
||||||
|
hBrush = CreateSolidBrush(pCaret->color);
|
||||||
|
SelectObject(hdc, (HANDLE)hBrush);
|
||||||
|
SetROP2(hdc, R2_XORPEN);
|
||||||
|
rgn = CreateRectRgn(pCaret->x, pCaret->y,
|
||||||
|
pCaret->x + pCaret->width,
|
||||||
|
pCaret->y + pCaret->height);
|
||||||
|
FillRgn(hdc, rgn, hBrush);
|
||||||
|
DeleteObject((HANDLE)rgn);
|
||||||
|
DeleteObject((HANDLE)hBrush);
|
||||||
|
ReleaseDC(pCaret->hwnd, hdc);
|
||||||
|
}
|
||||||
|
|
||||||
|
pCaret->xtid = XtAppAddTimeOut(XT_app_context, pCaret->timeout,
|
||||||
|
CARET_Callback, pCaret);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************
|
||||||
|
* CARET_HideCaret
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void CARET_HideCaret(CARET *pCaret)
|
||||||
|
{
|
||||||
|
HDC hdc;
|
||||||
|
HBRUSH hBrush;
|
||||||
|
HRGN rgn;
|
||||||
|
|
||||||
|
pCaret->on = FALSE;
|
||||||
|
hdc = GetDC(pCaret->hwnd);
|
||||||
|
hBrush = CreateSolidBrush(pCaret->color);
|
||||||
|
SelectObject(hdc, (HANDLE)hBrush);
|
||||||
|
SetROP2(hdc, R2_XORPEN);
|
||||||
|
rgn = CreateRectRgn(pCaret->x, pCaret->y,
|
||||||
|
pCaret->x + pCaret->width,
|
||||||
|
pCaret->y + pCaret->height);
|
||||||
|
FillRgn(hdc, rgn, hBrush);
|
||||||
|
DeleteObject((HANDLE)rgn);
|
||||||
|
DeleteObject((HANDLE)hBrush);
|
||||||
|
ReleaseDC(pCaret->hwnd, hdc);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************
|
||||||
|
* CreateCaret (USER.163)
|
||||||
|
*/
|
||||||
|
|
||||||
|
void CreateCaret(HWND hwnd, HBITMAP bitmap, short width, short height)
|
||||||
|
{
|
||||||
|
if (!hwnd) return;
|
||||||
|
|
||||||
|
/* if cursor already exists, destroy it */
|
||||||
|
/* if (Caret.hwnd)
|
||||||
|
DestroyCaret();
|
||||||
|
*/
|
||||||
|
if (bitmap)
|
||||||
|
{
|
||||||
|
printf("CreateCaret: Bitmaps are currently not supported\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (width)
|
||||||
|
Caret.width = width;
|
||||||
|
else
|
||||||
|
Caret.width = 3; /* should be SM_CXBORDER */
|
||||||
|
|
||||||
|
if (height)
|
||||||
|
Caret.height = height;
|
||||||
|
else
|
||||||
|
Caret.height = 3; /* should be SM_CYBORDER */
|
||||||
|
|
||||||
|
Caret.hwnd = hwnd;
|
||||||
|
Caret.hidden = 1;
|
||||||
|
Caret.on = FALSE;
|
||||||
|
Caret.x = 0;
|
||||||
|
Caret.y = 0;
|
||||||
|
Caret.color = GetSysColor(COLOR_WINDOWTEXT);
|
||||||
|
Caret.timeout = 750;
|
||||||
|
LockCaret = FALSE;
|
||||||
|
|
||||||
|
Caret.xtid = XtAppAddTimeOut(XT_app_context, Caret.timeout,
|
||||||
|
CARET_Callback, &Caret);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************
|
||||||
|
* DestroyCaret (USER.164)
|
||||||
|
*/
|
||||||
|
|
||||||
|
void DestroyCaret()
|
||||||
|
{
|
||||||
|
/* if (!Caret.hwnd) return;
|
||||||
|
*/
|
||||||
|
XtRemoveTimeOut(Caret.xtid);
|
||||||
|
|
||||||
|
if (Caret.on)
|
||||||
|
CARET_HideCaret(&Caret);
|
||||||
|
|
||||||
|
Caret.hwnd = 0; /* cursor marked as not existing */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************
|
||||||
|
* SetCaretPos (USER.165)
|
||||||
|
*/
|
||||||
|
|
||||||
|
void SetCaretPos(short x, short y)
|
||||||
|
{
|
||||||
|
HDC hdc;
|
||||||
|
HBRUSH hBrush;
|
||||||
|
HRGN rgn;
|
||||||
|
|
||||||
|
if (!Caret.hwnd) return;
|
||||||
|
|
||||||
|
#ifdef DEBUG_CARET
|
||||||
|
printf("SetCaretPos: x=%d, y=%d\n", x, y);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
LockCaret = TRUE;
|
||||||
|
if (Caret.on)
|
||||||
|
CARET_HideCaret(&Caret);
|
||||||
|
|
||||||
|
Caret.x = x;
|
||||||
|
Caret.y = y;
|
||||||
|
LockCaret = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************
|
||||||
|
* HideCaret (USER.166)
|
||||||
|
*/
|
||||||
|
|
||||||
|
void HideCaret(HWND hwnd)
|
||||||
|
{
|
||||||
|
if (!Caret.hwnd) return;
|
||||||
|
if (hwnd && (Caret.hwnd != hwnd)) return;
|
||||||
|
|
||||||
|
LockCaret = TRUE;
|
||||||
|
if (Caret.on)
|
||||||
|
CARET_HideCaret(&Caret);
|
||||||
|
|
||||||
|
++Caret.hidden;
|
||||||
|
LockCaret = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************
|
||||||
|
* ShowCaret (USER.167)
|
||||||
|
*/
|
||||||
|
|
||||||
|
void ShowCaret(HWND hwnd)
|
||||||
|
{
|
||||||
|
if (!Caret.hwnd) return;
|
||||||
|
if (hwnd && (Caret.hwnd != hwnd)) return;
|
||||||
|
|
||||||
|
#ifdef DEBUG_CARET
|
||||||
|
printf("ShowCaret: hidden=%d\n", Caret.hidden);
|
||||||
|
#endif
|
||||||
|
if (Caret.hidden)
|
||||||
|
--Caret.hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************
|
||||||
|
* SetCaretBlinkTime (USER.168)
|
||||||
|
*/
|
||||||
|
|
||||||
|
void SetCaretBlinkTime(WORD msecs)
|
||||||
|
{
|
||||||
|
if (!Caret.hwnd) return;
|
||||||
|
|
||||||
|
Caret.timeout = msecs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************
|
||||||
|
* GetCaretBlinkTime (USER.169)
|
||||||
|
*/
|
||||||
|
|
||||||
|
WORD GetCaretBlinkTime()
|
||||||
|
{
|
||||||
|
if (!Caret.hwnd) return;
|
||||||
|
|
||||||
|
return Caret.timeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************
|
||||||
|
* GetCaretPos (USER.183)
|
||||||
|
*/
|
||||||
|
|
||||||
|
void GetCaretPos(LPPOINT pt)
|
||||||
|
{
|
||||||
|
if (!Caret.hwnd || !pt) return;
|
||||||
|
|
||||||
|
pt->x = Caret.x;
|
||||||
|
pt->y = Caret.y;
|
||||||
|
}
|
116
windows/class.c
116
windows/class.c
|
@ -9,6 +9,7 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
||||||
#include "class.h"
|
#include "class.h"
|
||||||
#include "user.h"
|
#include "user.h"
|
||||||
#include "win.h"
|
#include "win.h"
|
||||||
|
#include "dce.h"
|
||||||
|
|
||||||
|
|
||||||
static HCLASS firstClass = 0;
|
static HCLASS firstClass = 0;
|
||||||
|
@ -18,19 +19,50 @@ static HCLASS firstClass = 0;
|
||||||
* CLASS_FindClassByName
|
* CLASS_FindClassByName
|
||||||
*
|
*
|
||||||
* Return a handle and a pointer to the class.
|
* Return a handle and a pointer to the class.
|
||||||
|
* 'ptr' can be NULL if the pointer is not needed.
|
||||||
*/
|
*/
|
||||||
HCLASS CLASS_FindClassByName( char * name, CLASS **ptr )
|
HCLASS CLASS_FindClassByName( char * name, CLASS **ptr )
|
||||||
{
|
{
|
||||||
HCLASS class = firstClass;
|
ATOM atom;
|
||||||
while(class)
|
HCLASS class;
|
||||||
|
CLASS * classPtr;
|
||||||
|
|
||||||
|
/* First search task-specific classes */
|
||||||
|
|
||||||
|
if ((atom = FindAtom( name )) != 0)
|
||||||
{
|
{
|
||||||
*ptr = (CLASS *) USER_HEAP_ADDR(class);
|
for (class = firstClass; (class); class = classPtr->hNext)
|
||||||
if (!strcasecmp( (*ptr)->wc.lpszClassName, name )) return class;
|
{
|
||||||
class = (*ptr)->hNext;
|
classPtr = (CLASS *) USER_HEAP_ADDR(class);
|
||||||
|
if (classPtr->wc.style & CS_GLOBALCLASS) continue;
|
||||||
|
if (classPtr->atomName == atom)
|
||||||
|
{
|
||||||
|
if (ptr) *ptr = classPtr;
|
||||||
|
return class;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Then search global classes */
|
||||||
|
|
||||||
|
if ((atom = GlobalFindAtom( name )) != 0)
|
||||||
|
{
|
||||||
|
for (class = firstClass; (class); class = classPtr->hNext)
|
||||||
|
{
|
||||||
|
classPtr = (CLASS *) USER_HEAP_ADDR(class);
|
||||||
|
if (!(classPtr->wc.style & CS_GLOBALCLASS)) continue;
|
||||||
|
if (classPtr->atomName == atom)
|
||||||
|
{
|
||||||
|
if (ptr) *ptr = classPtr;
|
||||||
|
return class;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* CLASS_FindClassPtr
|
* CLASS_FindClassPtr
|
||||||
*
|
*
|
||||||
|
@ -52,37 +84,50 @@ CLASS * CLASS_FindClassPtr( HCLASS hclass )
|
||||||
*/
|
*/
|
||||||
ATOM RegisterClass( LPWNDCLASS class )
|
ATOM RegisterClass( LPWNDCLASS class )
|
||||||
{
|
{
|
||||||
CLASS * newClass;
|
CLASS * newClass, * prevClassPtr;
|
||||||
HCLASS handle;
|
HCLASS handle, prevClass;
|
||||||
|
|
||||||
#ifdef DEBUG_CLASS
|
#ifdef DEBUG_CLASS
|
||||||
printf( "RegisterClass: wndproc=%08x hinst=%d name='%s'\n",
|
printf( "RegisterClass: wndproc=%08x hinst=%d name='%s'\n",
|
||||||
class->lpfnWndProc, class->hInstance, class->lpszClassName );
|
class->lpfnWndProc, class->hInstance, class->lpszClassName );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Check if a class with this name already exists */
|
||||||
|
|
||||||
|
prevClass = CLASS_FindClassByName( class->lpszClassName, &prevClassPtr );
|
||||||
|
if (prevClass)
|
||||||
|
{
|
||||||
|
/* Class can be created only if it is local and */
|
||||||
|
/* if the class with the same name is global. */
|
||||||
|
|
||||||
|
if (class->style & CS_GLOBALCLASS) return 0;
|
||||||
|
if (!(prevClassPtr->wc.style & CS_GLOBALCLASS)) return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create class */
|
||||||
|
|
||||||
handle = USER_HEAP_ALLOC( GMEM_MOVEABLE, sizeof(CLASS)+class->cbClsExtra );
|
handle = USER_HEAP_ALLOC( GMEM_MOVEABLE, sizeof(CLASS)+class->cbClsExtra );
|
||||||
if (!handle) return 0;
|
if (!handle) return 0;
|
||||||
newClass = (CLASS *) USER_HEAP_ADDR( handle );
|
newClass = (CLASS *) USER_HEAP_ADDR( handle );
|
||||||
newClass->hNext = firstClass;
|
newClass->hNext = firstClass;
|
||||||
newClass->wMagic = CLASS_MAGIC;
|
newClass->wMagic = CLASS_MAGIC;
|
||||||
newClass->atomName = handle; /* Should be an atom */
|
|
||||||
newClass->cWindows = 0;
|
newClass->cWindows = 0;
|
||||||
newClass->wc = *class;
|
newClass->wc = *class;
|
||||||
|
|
||||||
if (newClass->wc.style & CS_CLASSDC)
|
if (newClass->wc.style & CS_GLOBALCLASS)
|
||||||
newClass->hdc = CreateDC( "DISPLAY", NULL, NULL, NULL );
|
newClass->atomName = GlobalAddAtom( class->lpszClassName );
|
||||||
else newClass->hdc = 0;
|
else newClass->atomName = AddAtom( class->lpszClassName );
|
||||||
|
|
||||||
/* Class name should also be set to zero. For now we need the
|
if (newClass->wc.style & CS_CLASSDC)
|
||||||
* name because we don't have atoms.
|
newClass->hdce = DCE_AllocDCE( DCE_CLASS_DC );
|
||||||
*/
|
else newClass->hdce = 0;
|
||||||
newClass->wc.lpszClassName = (char *)malloc(strlen(class->lpszClassName)+1);
|
|
||||||
strcpy( newClass->wc.lpszClassName, class->lpszClassName );
|
/* Menu name should also be set to zero. */
|
||||||
|
newClass->wc.lpszClassName = NULL;
|
||||||
|
|
||||||
if (class->cbClsExtra) memset( newClass->wExtra, 0, class->cbClsExtra );
|
if (class->cbClsExtra) memset( newClass->wExtra, 0, class->cbClsExtra );
|
||||||
|
|
||||||
firstClass = handle;
|
firstClass = handle;
|
||||||
return handle; /* Should be an atom */
|
return newClass->atomName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -118,8 +163,10 @@ BOOL UnregisterClass( LPSTR className, HANDLE instance )
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Delete the class */
|
/* Delete the class */
|
||||||
if (classPtr->hdc) DeleteDC( classPtr->hdc );
|
if (classPtr->hdce) DCE_FreeDCE( classPtr->hdce );
|
||||||
if (classPtr->wc.hbrBackground) DeleteObject( classPtr->wc.hbrBackground );
|
if (classPtr->wc.hbrBackground) DeleteObject( classPtr->wc.hbrBackground );
|
||||||
|
if (classPtr->wc.style & CS_GLOBALCLASS) GlobalDeleteAtom( classPtr->atomName );
|
||||||
|
else DeleteAtom( classPtr->atomName );
|
||||||
USER_HEAP_FREE( class );
|
USER_HEAP_FREE( class );
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -182,3 +229,34 @@ LONG SetClassLong( HWND hwnd, short offset, LONG newval )
|
||||||
*ptr = newval;
|
*ptr = newval;
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* GetClassName (USER.58)
|
||||||
|
*/
|
||||||
|
int GetClassName(HWND hwnd, LPSTR lpClassName, short maxCount)
|
||||||
|
{
|
||||||
|
WND *wndPtr;
|
||||||
|
CLASS *classPtr;
|
||||||
|
|
||||||
|
if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
|
||||||
|
if (!(classPtr = CLASS_FindClassPtr(wndPtr->hClass))) return 0;
|
||||||
|
|
||||||
|
return (GetAtomName(classPtr->atomName, lpClassName, maxCount));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* GetClassInfo (USER.404)
|
||||||
|
*/
|
||||||
|
BOOL GetClassInfo(HANDLE hInstance, LPSTR lpClassName,
|
||||||
|
LPWNDCLASS lpWndClass)
|
||||||
|
{
|
||||||
|
CLASS *classPtr;
|
||||||
|
|
||||||
|
if (!(CLASS_FindClassByName(lpClassName, &classPtr))) return FALSE;
|
||||||
|
if (hInstance && (hInstance != classPtr->wc.hInstance)) return FALSE;
|
||||||
|
|
||||||
|
memcpy(lpWndClass, &(classPtr->wc), sizeof(WNDCLASS));
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
#include "win.h"
|
#include "win.h"
|
||||||
|
#include "message.h"
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -34,6 +35,7 @@ void InvalidateRgn( HWND hwnd, HRGN hrgn, BOOL erase )
|
||||||
else CombineRgn( newRgn, wndPtr->hrgnUpdate, hrgn, RGN_OR );
|
else CombineRgn( newRgn, wndPtr->hrgnUpdate, hrgn, RGN_OR );
|
||||||
}
|
}
|
||||||
if (wndPtr->hrgnUpdate) DeleteObject( wndPtr->hrgnUpdate );
|
if (wndPtr->hrgnUpdate) DeleteObject( wndPtr->hrgnUpdate );
|
||||||
|
else MSG_IncPaintCount( wndPtr->hmemTaskQ );
|
||||||
wndPtr->hrgnUpdate = newRgn;
|
wndPtr->hrgnUpdate = newRgn;
|
||||||
if (erase) wndPtr->flags |= WIN_ERASE_UPDATERGN;
|
if (erase) wndPtr->flags |= WIN_ERASE_UPDATERGN;
|
||||||
}
|
}
|
||||||
|
@ -112,17 +114,14 @@ BOOL GetUpdateRect( HWND hwnd, LPRECT rect, BOOL erase )
|
||||||
|
|
||||||
if (rect)
|
if (rect)
|
||||||
{
|
{
|
||||||
if (wndPtr->hrgnUpdate) GetRgnBox( wndPtr->hrgnUpdate, rect );
|
if (wndPtr->hrgnUpdate)
|
||||||
else SetRectEmpty( rect );
|
|
||||||
if (erase && wndPtr->hrgnUpdate)
|
|
||||||
{
|
{
|
||||||
HDC hdc = GetDC( hwnd );
|
HRGN hrgn = CreateRectRgn( 0, 0, 0, 0 );
|
||||||
if (hdc)
|
if (GetUpdateRgn( hwnd, hrgn, erase ) == ERROR) return FALSE;
|
||||||
{
|
GetRgnBox( hrgn, rect );
|
||||||
SendMessage( hwnd, WM_ERASEBKGND, hdc, 0 );
|
DeleteObject( hrgn );
|
||||||
ReleaseDC( hwnd, hdc );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else SetRectEmpty( rect );
|
||||||
}
|
}
|
||||||
return (wndPtr->hrgnUpdate != 0);
|
return (wndPtr->hrgnUpdate != 0);
|
||||||
}
|
}
|
||||||
|
@ -133,17 +132,34 @@ BOOL GetUpdateRect( HWND hwnd, LPRECT rect, BOOL erase )
|
||||||
*/
|
*/
|
||||||
int GetUpdateRgn( HWND hwnd, HRGN hrgn, BOOL erase )
|
int GetUpdateRgn( HWND hwnd, HRGN hrgn, BOOL erase )
|
||||||
{
|
{
|
||||||
|
HRGN hrgnClip;
|
||||||
|
int retval;
|
||||||
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
||||||
if (!wndPtr) return ERROR;
|
if (!wndPtr) return ERROR;
|
||||||
|
|
||||||
if (erase && wndPtr->hrgnUpdate)
|
if (!wndPtr->hrgnUpdate)
|
||||||
{
|
{
|
||||||
HDC hdc = GetDC( hwnd );
|
if (!(hrgnClip = CreateRectRgn( 0, 0, 0, 0 ))) return ERROR;
|
||||||
if (hdc)
|
retval = CombineRgn( hrgn, hrgnClip, 0, RGN_COPY );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hrgnClip = CreateRectRgn( 0, 0,
|
||||||
|
wndPtr->rectClient.right-wndPtr->rectClient.left,
|
||||||
|
wndPtr->rectClient.bottom-wndPtr->rectClient.top );
|
||||||
|
if (!hrgnClip) return ERROR;
|
||||||
|
retval = CombineRgn( hrgn, wndPtr->hrgnUpdate, hrgnClip, RGN_AND );
|
||||||
|
if (erase)
|
||||||
{
|
{
|
||||||
SendMessage( hwnd, WM_ERASEBKGND, hdc, 0 );
|
HDC hdc = GetDCEx( hwnd, wndPtr->hrgnUpdate,
|
||||||
ReleaseDC( hwnd, hdc );
|
DCX_INTERSECTRGN | DCX_USESTYLE );
|
||||||
|
if (hdc)
|
||||||
|
{
|
||||||
|
SendMessage( hwnd, WM_ERASEBKGND, hdc, 0 );
|
||||||
|
ReleaseDC( hwnd, hdc );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return CombineRgn( hrgn, wndPtr->hrgnUpdate, 0, RGN_COPY );
|
DeleteObject( hrgnClip );
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
29
windows/dc.c
29
windows/dc.c
|
@ -7,7 +7,6 @@
|
||||||
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <X11/Intrinsic.h>
|
|
||||||
|
|
||||||
#include "gdi.h"
|
#include "gdi.h"
|
||||||
|
|
||||||
|
@ -17,6 +16,8 @@ static DeviceCaps * displayDevCaps = NULL;
|
||||||
|
|
||||||
extern const WIN_DC_INFO DCVAL_defaultValues;
|
extern const WIN_DC_INFO DCVAL_defaultValues;
|
||||||
|
|
||||||
|
extern void CLIPPING_SetDeviceClipping( DC * dc ); /* in objects/clipping.c */
|
||||||
|
|
||||||
|
|
||||||
/* ROP code to GC function conversion */
|
/* ROP code to GC function conversion */
|
||||||
const int DC_XROPfunction[16] =
|
const int DC_XROPfunction[16] =
|
||||||
|
@ -100,18 +101,8 @@ void DC_SetDeviceInfo( HDC hdc, DC * dc )
|
||||||
SelectObject( hdc, dc->w.hBrush );
|
SelectObject( hdc, dc->w.hBrush );
|
||||||
SelectObject( hdc, dc->w.hFont );
|
SelectObject( hdc, dc->w.hFont );
|
||||||
|
|
||||||
if (dc->w.hGCClipRgn)
|
XSetGraphicsExposures( XT_display, dc->u.x.gc, False );
|
||||||
{
|
CLIPPING_SetDeviceClipping( dc );
|
||||||
RGNOBJ *obj = (RGNOBJ *) GDI_GetObjPtr(dc->w.hGCClipRgn, REGION_MAGIC);
|
|
||||||
XSetClipMask( XT_display, dc->u.x.gc, obj->region.pixmap );
|
|
||||||
XSetClipOrigin( XT_display, dc->u.x.gc,
|
|
||||||
obj->region.box.left, obj->region.box.top );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
XSetClipMask( XT_display, dc->u.x.gc, None );
|
|
||||||
XSetClipOrigin( XT_display, dc->u.x.gc, 0, 0 );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -145,8 +136,11 @@ int DC_SetupGCForBrush( DC * dc )
|
||||||
XSetFillStyle( XT_display, dc->u.x.gc,
|
XSetFillStyle( XT_display, dc->u.x.gc,
|
||||||
(dc->w.backgroundMode == OPAQUE) ?
|
(dc->w.backgroundMode == OPAQUE) ?
|
||||||
FillOpaqueStippled : FillStippled );
|
FillOpaqueStippled : FillStippled );
|
||||||
XSetTSOrigin( XT_display, dc->u.x.gc, dc->w.brushOrgX, dc->w.brushOrgY );
|
XSetTSOrigin( XT_display, dc->u.x.gc, dc->w.DCOrgX + dc->w.brushOrgX,
|
||||||
|
dc->w.DCOrgY + dc->w.brushOrgY );
|
||||||
XSetFunction( XT_display, dc->u.x.gc, DC_XROPfunction[dc->w.ROPmode-1] );
|
XSetFunction( XT_display, dc->u.x.gc, DC_XROPfunction[dc->w.ROPmode-1] );
|
||||||
|
XSetFillRule( XT_display, dc->u.x.gc,
|
||||||
|
(dc->w.polyFillMode == WINDING) ? WindingRule : EvenOddRule );
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -227,7 +221,6 @@ HDC GetDCState( HDC hdc )
|
||||||
{
|
{
|
||||||
newdc->w.hVisRgn = CreateRectRgn( 0, 0, 0, 0 );
|
newdc->w.hVisRgn = CreateRectRgn( 0, 0, 0, 0 );
|
||||||
CombineRgn( newdc->w.hVisRgn, dc->w.hVisRgn, 0, RGN_COPY );
|
CombineRgn( newdc->w.hVisRgn, dc->w.hVisRgn, 0, RGN_COPY );
|
||||||
|
|
||||||
}
|
}
|
||||||
newdc->w.hGCClipRgn = 0;
|
newdc->w.hGCClipRgn = 0;
|
||||||
return handle;
|
return handle;
|
||||||
|
@ -255,7 +248,7 @@ void SetDCState( HDC hdc, HDC hdcs )
|
||||||
dc->w.flags &= ~DC_SAVED;
|
dc->w.flags &= ~DC_SAVED;
|
||||||
DC_SetDeviceInfo( hdc, dc );
|
DC_SetDeviceInfo( hdc, dc );
|
||||||
SelectClipRgn( hdc, dcs->w.hClipRgn );
|
SelectClipRgn( hdc, dcs->w.hClipRgn );
|
||||||
SelectVisRgn( hdc, dcs->w.hGCClipRgn );
|
SelectVisRgn( hdc, dcs->w.hVisRgn );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -337,6 +330,8 @@ HDC CreateDC( LPSTR driver, LPSTR device, LPSTR output, LPSTR initData )
|
||||||
dc->w.devCaps = displayDevCaps;
|
dc->w.devCaps = displayDevCaps;
|
||||||
dc->w.planes = displayDevCaps->planes;
|
dc->w.planes = displayDevCaps->planes;
|
||||||
dc->w.bitsPerPixel = displayDevCaps->bitsPixel;
|
dc->w.bitsPerPixel = displayDevCaps->bitsPixel;
|
||||||
|
dc->w.DCSizeX = displayDevCaps->horzRes;
|
||||||
|
dc->w.DCSizeY = displayDevCaps->vertRes;
|
||||||
|
|
||||||
DC_SetDeviceInfo( handle, dc );
|
DC_SetDeviceInfo( handle, dc );
|
||||||
|
|
||||||
|
@ -372,6 +367,8 @@ HDC CreateCompatibleDC( HDC hdc )
|
||||||
dc->w.planes = 1;
|
dc->w.planes = 1;
|
||||||
dc->w.bitsPerPixel = 1;
|
dc->w.bitsPerPixel = 1;
|
||||||
dc->w.devCaps = displayDevCaps;
|
dc->w.devCaps = displayDevCaps;
|
||||||
|
dc->w.DCSizeX = 1;
|
||||||
|
dc->w.DCSizeY = 1;
|
||||||
|
|
||||||
SelectObject( handle, BITMAP_hbitmapMemDC );
|
SelectObject( handle, BITMAP_hbitmapMemDC );
|
||||||
DC_SetDeviceInfo( handle, dc );
|
DC_SetDeviceInfo( handle, dc );
|
||||||
|
|
236
windows/dce.c
236
windows/dce.c
|
@ -22,6 +22,53 @@ static HANDLE firstDCE = 0;
|
||||||
static HDC defaultDCstate = 0;
|
static HDC defaultDCstate = 0;
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* DCE_AllocDCE
|
||||||
|
*
|
||||||
|
* Allocate a new DCE.
|
||||||
|
*/
|
||||||
|
HANDLE DCE_AllocDCE( DCE_TYPE type )
|
||||||
|
{
|
||||||
|
DCE * dce;
|
||||||
|
HANDLE handle = USER_HEAP_ALLOC( GMEM_MOVEABLE, sizeof(DCE) );
|
||||||
|
if (!handle) return 0;
|
||||||
|
dce = (DCE *) USER_HEAP_ADDR( handle );
|
||||||
|
if (!(dce->hdc = CreateDC( "DISPLAY", NULL, NULL, NULL )))
|
||||||
|
{
|
||||||
|
USER_HEAP_FREE( handle );
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
dce->hwndCurrent = 0;
|
||||||
|
dce->type = type;
|
||||||
|
dce->inUse = (type != DCE_CACHE_DC);
|
||||||
|
dce->xOrigin = 0;
|
||||||
|
dce->yOrigin = 0;
|
||||||
|
dce->hNext = firstDCE;
|
||||||
|
firstDCE = handle;
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* DCE_FreeDCE
|
||||||
|
*/
|
||||||
|
void DCE_FreeDCE( HANDLE hdce )
|
||||||
|
{
|
||||||
|
DCE * dce;
|
||||||
|
HANDLE *handle = &firstDCE;
|
||||||
|
|
||||||
|
if (!(dce = (DCE *) USER_HEAP_ADDR( hdce ))) return;
|
||||||
|
while (*handle && (*handle != hdce))
|
||||||
|
{
|
||||||
|
DCE * prev = (DCE *) USER_HEAP_ADDR( *handle );
|
||||||
|
handle = &prev->hNext;
|
||||||
|
}
|
||||||
|
if (*handle == hdce) *handle = dce->hNext;
|
||||||
|
DeleteDC( dce->hdc );
|
||||||
|
USER_HEAP_FREE( hdce );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* DCE_Init
|
* DCE_Init
|
||||||
*/
|
*/
|
||||||
|
@ -33,84 +80,133 @@ void DCE_Init()
|
||||||
|
|
||||||
for (i = 0; i < NB_DCE; i++)
|
for (i = 0; i < NB_DCE; i++)
|
||||||
{
|
{
|
||||||
handle = USER_HEAP_ALLOC( GMEM_MOVEABLE, sizeof(DCE) );
|
if (!(handle = DCE_AllocDCE( DCE_CACHE_DC ))) return;
|
||||||
if (!handle) return;
|
|
||||||
dce = (DCE *) USER_HEAP_ADDR( handle );
|
dce = (DCE *) USER_HEAP_ADDR( handle );
|
||||||
dce->hdc = CreateDC( "DISPLAY", NULL, NULL, NULL );
|
|
||||||
if (!dce->hdc)
|
|
||||||
{
|
|
||||||
USER_HEAP_FREE( handle );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
dce->hwndCurrent = 0;
|
|
||||||
dce->flags = 0;
|
|
||||||
dce->inUse = FALSE;
|
|
||||||
dce->xOrigin = 0;
|
|
||||||
dce->yOrigin = 0;
|
|
||||||
dce->hNext = firstDCE;
|
|
||||||
firstDCE = handle;
|
|
||||||
if (!defaultDCstate) defaultDCstate = GetDCState( dce->hdc );
|
if (!defaultDCstate) defaultDCstate = GetDCState( dce->hdc );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* GetDCEx (USER.359)
|
||||||
|
*/
|
||||||
|
/* Unimplemented flags: DCX_CLIPSIBLINGS, DCX_LOCKWINDOWUPDATE, DCX_PARENTCLIP
|
||||||
|
*/
|
||||||
|
HDC GetDCEx( HWND hwnd, HRGN hrgnClip, DWORD flags )
|
||||||
|
{
|
||||||
|
HANDLE hdce;
|
||||||
|
HDC hdc = 0;
|
||||||
|
DCE * dce;
|
||||||
|
DC * dc;
|
||||||
|
WND * wndPtr;
|
||||||
|
|
||||||
|
if (hwnd)
|
||||||
|
{
|
||||||
|
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
|
||||||
|
}
|
||||||
|
else wndPtr = NULL;
|
||||||
|
|
||||||
|
if (flags & DCX_USESTYLE)
|
||||||
|
{
|
||||||
|
/* Not sure if this is the real meaning of the DCX_USESTYLE flag... */
|
||||||
|
flags &= ~(DCX_CACHE | DCX_CLIPCHILDREN | DCX_CLIPSIBLINGS);
|
||||||
|
if (wndPtr)
|
||||||
|
{
|
||||||
|
if (!(wndPtr->flags & (WIN_CLASS_DC | WIN_OWN_DC)))
|
||||||
|
flags |= DCX_CACHE;
|
||||||
|
if (wndPtr->dwStyle & WS_CLIPCHILDREN) flags |= DCX_CLIPCHILDREN;
|
||||||
|
if (wndPtr->dwStyle & WS_CLIPSIBLINGS) flags |= DCX_CLIPSIBLINGS;
|
||||||
|
}
|
||||||
|
else flags |= DCX_CACHE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & DCX_CACHE)
|
||||||
|
{
|
||||||
|
for (hdce = firstDCE; (hdce); hdce = dce->hNext)
|
||||||
|
{
|
||||||
|
if (!(dce = (DCE *) USER_HEAP_ADDR( hdce ))) return 0;
|
||||||
|
if ((dce->type == DCE_CACHE_DC) && (!dce->inUse)) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else hdce = wndPtr->hdce;
|
||||||
|
|
||||||
|
if (!hdce) return 0;
|
||||||
|
dce = (DCE *) USER_HEAP_ADDR( hdce );
|
||||||
|
dce->hwndCurrent = hwnd;
|
||||||
|
dce->inUse = TRUE;
|
||||||
|
hdc = dce->hdc;
|
||||||
|
|
||||||
|
/* Initialize DC */
|
||||||
|
|
||||||
|
if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0;
|
||||||
|
|
||||||
|
if (wndPtr)
|
||||||
|
{
|
||||||
|
dc->u.x.drawable = wndPtr->window;
|
||||||
|
if (flags & DCX_WINDOW)
|
||||||
|
{
|
||||||
|
dc->w.DCOrgX = 0;
|
||||||
|
dc->w.DCOrgY = 0;
|
||||||
|
dc->w.DCSizeX = wndPtr->rectWindow.right - wndPtr->rectWindow.left;
|
||||||
|
dc->w.DCSizeY = wndPtr->rectWindow.bottom - wndPtr->rectWindow.top;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dc->w.DCOrgX = wndPtr->rectClient.left - wndPtr->rectWindow.left;
|
||||||
|
dc->w.DCOrgY = wndPtr->rectClient.top - wndPtr->rectWindow.top;
|
||||||
|
dc->w.DCSizeX = wndPtr->rectClient.right - wndPtr->rectClient.left;
|
||||||
|
dc->w.DCSizeY = wndPtr->rectClient.bottom - wndPtr->rectClient.top;
|
||||||
|
IntersectVisRect( hdc, 0, 0, dc->w.DCSizeX, dc->w.DCSizeY );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else dc->u.x.drawable = DefaultRootWindow( XT_display );
|
||||||
|
|
||||||
|
if (flags & DCX_CLIPCHILDREN)
|
||||||
|
XSetSubwindowMode( XT_display, dc->u.x.gc, ClipByChildren );
|
||||||
|
else XSetSubwindowMode( XT_display, dc->u.x.gc, IncludeInferiors);
|
||||||
|
|
||||||
|
if ((flags & DCX_INTERSECTRGN) || (flags & DCX_EXCLUDERGN))
|
||||||
|
{
|
||||||
|
HRGN hrgn = CreateRectRgn( 0, 0, 0, 0 );
|
||||||
|
if (hrgn)
|
||||||
|
{
|
||||||
|
if (CombineRgn( hrgn, InquireVisRgn(hdc), hrgnClip,
|
||||||
|
(flags & DCX_INTERSECTRGN) ? RGN_AND : RGN_DIFF ))
|
||||||
|
SelectVisRgn( hdc, hrgn );
|
||||||
|
DeleteObject( hrgn );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG_DC
|
||||||
|
printf( "GetDCEx(%d,%d,0x%x): returning %d\n", hwnd, hrgnClip, flags, hdc);
|
||||||
|
#endif
|
||||||
|
return hdc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* GetDC (USER.66)
|
* GetDC (USER.66)
|
||||||
*/
|
*/
|
||||||
HDC GetDC( HWND hwnd )
|
HDC GetDC( HWND hwnd )
|
||||||
{
|
{
|
||||||
HANDLE hdce;
|
return GetDCEx( hwnd, 0, DCX_USESTYLE );
|
||||||
HDC hdc = 0;
|
}
|
||||||
DCE * dce;
|
|
||||||
DC * dc;
|
|
||||||
WND * wndPtr = NULL;
|
|
||||||
CLASS * classPtr;
|
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* GetWindowDC (USER.67)
|
||||||
|
*/
|
||||||
|
HDC GetWindowDC( HWND hwnd )
|
||||||
|
{
|
||||||
|
int flags = DCX_CACHE | DCX_WINDOW;
|
||||||
if (hwnd)
|
if (hwnd)
|
||||||
{
|
{
|
||||||
|
WND * wndPtr;
|
||||||
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
|
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
|
||||||
if (!(classPtr = CLASS_FindClassPtr( wndPtr->hClass ))) return 0;
|
if (wndPtr->dwStyle & WS_CLIPCHILDREN) flags |= DCX_CLIPCHILDREN;
|
||||||
if (wndPtr->hdc) hdc = wndPtr->hdc;
|
if (wndPtr->dwStyle & WS_CLIPSIBLINGS) flags |= DCX_CLIPSIBLINGS;
|
||||||
else if (classPtr->hdc) hdc = classPtr->hdc;
|
|
||||||
}
|
}
|
||||||
|
return GetDCEx( hwnd, 0, flags );
|
||||||
if (!hdc)
|
|
||||||
{
|
|
||||||
for (hdce = firstDCE; (hdce); hdce = dce->hNext)
|
|
||||||
{
|
|
||||||
dce = (DCE *) USER_HEAP_ADDR( hdce );
|
|
||||||
if (!dce) return 0;
|
|
||||||
if (!dce->inUse) break;
|
|
||||||
}
|
|
||||||
if (!hdce) return 0;
|
|
||||||
dce->hwndCurrent = hwnd;
|
|
||||||
dce->inUse = TRUE;
|
|
||||||
hdc = dce->hdc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialize DC */
|
|
||||||
|
|
||||||
if (!(dc = (DC *) GDI_GetObjPtr( dce->hdc, DC_MAGIC ))) return 0;
|
|
||||||
|
|
||||||
if (wndPtr)
|
|
||||||
{
|
|
||||||
dc->u.x.drawable = XtWindow( wndPtr->winWidget );
|
|
||||||
dc->u.x.widget = wndPtr->winWidget;
|
|
||||||
if (wndPtr->dwStyle & WS_CLIPCHILDREN)
|
|
||||||
XSetSubwindowMode( XT_display, dc->u.x.gc, ClipByChildren );
|
|
||||||
else XSetSubwindowMode( XT_display, dc->u.x.gc, IncludeInferiors);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dc->u.x.drawable = DefaultRootWindow( XT_display );
|
|
||||||
dc->u.x.widget = 0;
|
|
||||||
XSetSubwindowMode( XT_display, dc->u.x.gc, IncludeInferiors );
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef DEBUG_WIN
|
|
||||||
printf( "GetDC(%d): returning %d\n", hwnd, hdc );
|
|
||||||
#endif
|
|
||||||
return hdc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -119,30 +215,20 @@ HDC GetDC( HWND hwnd )
|
||||||
*/
|
*/
|
||||||
int ReleaseDC( HWND hwnd, HDC hdc )
|
int ReleaseDC( HWND hwnd, HDC hdc )
|
||||||
{
|
{
|
||||||
HANDLE hdce, next;
|
HANDLE hdce;
|
||||||
DCE * dce;
|
DCE * dce;
|
||||||
WND * wndPtr = NULL;
|
|
||||||
CLASS * classPtr;
|
|
||||||
|
|
||||||
#ifdef DEBUG_WIN
|
#ifdef DEBUG_DC
|
||||||
printf( "ReleaseDC: %d %d\n", hwnd, hdc );
|
printf( "ReleaseDC: %d %d\n", hwnd, hdc );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (hwnd)
|
|
||||||
{
|
|
||||||
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
|
|
||||||
if (wndPtr->hdc && (wndPtr->hdc == hdc)) return 1;
|
|
||||||
if (!(classPtr = CLASS_FindClassPtr( wndPtr->hClass ))) return 0;
|
|
||||||
if (classPtr->hdc && (classPtr->hdc == hdc)) return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (hdce = firstDCE; (hdce); hdce = dce->hNext)
|
for (hdce = firstDCE; (hdce); hdce = dce->hNext)
|
||||||
{
|
{
|
||||||
if (!(dce = (DCE *) USER_HEAP_ADDR( hdce ))) return 0;
|
if (!(dce = (DCE *) USER_HEAP_ADDR( hdce ))) return 0;
|
||||||
if (dce->inUse && (dce->hdc == hdc)) break;
|
if (dce->inUse && (dce->hdc == hdc)) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hdce)
|
if (dce->type == DCE_CACHE_DC)
|
||||||
{
|
{
|
||||||
SetDCState( dce->hdc, defaultDCstate );
|
SetDCState( dce->hdc, defaultDCstate );
|
||||||
dce->inUse = FALSE;
|
dce->inUse = FALSE;
|
||||||
|
|
|
@ -6,24 +6,27 @@
|
||||||
|
|
||||||
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
||||||
|
|
||||||
|
#ifndef USE_XLIB
|
||||||
#include <X11/Intrinsic.h>
|
#include <X11/Intrinsic.h>
|
||||||
#include <X11/Shell.h>
|
#include <X11/Shell.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
#include "win.h"
|
#include "win.h"
|
||||||
#include "class.h"
|
#include "class.h"
|
||||||
#include "user.h"
|
#include "user.h"
|
||||||
|
|
||||||
|
extern Display * XT_display;
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* DefWindowProc (USER.107)
|
* DefWindowProc (USER.107)
|
||||||
*/
|
*/
|
||||||
LONG DefWindowProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
|
LONG DefWindowProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
|
||||||
{
|
{
|
||||||
WND * wndPtr;
|
|
||||||
CLASS * classPtr;
|
CLASS * classPtr;
|
||||||
LPSTR textPtr;
|
LPSTR textPtr;
|
||||||
int len;
|
int len;
|
||||||
|
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
||||||
|
|
||||||
#ifdef DEBUG_MESSAGE
|
#ifdef DEBUG_MESSAGE
|
||||||
printf( "DefWindowProc: %d %d %d %08x\n", hwnd, msg, wParam, lParam );
|
printf( "DefWindowProc: %d %d %d %08x\n", hwnd, msg, wParam, lParam );
|
||||||
|
@ -34,24 +37,57 @@ LONG DefWindowProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
|
||||||
case WM_NCCREATE:
|
case WM_NCCREATE:
|
||||||
{
|
{
|
||||||
CREATESTRUCT * createStruct = (CREATESTRUCT *)lParam;
|
CREATESTRUCT * createStruct = (CREATESTRUCT *)lParam;
|
||||||
wndPtr = WIN_FindWndPtr(hwnd);
|
|
||||||
if (createStruct->lpszName)
|
if (createStruct->lpszName)
|
||||||
{
|
{
|
||||||
/* Allocate space for window text */
|
/* Allocate space for window text */
|
||||||
wndPtr->hText = USER_HEAP_ALLOC(GMEM_MOVEABLE,
|
wndPtr->hText = USER_HEAP_ALLOC(GMEM_MOVEABLE,
|
||||||
strlen(createStruct->lpszName) + 1);
|
strlen(createStruct->lpszName) + 2);
|
||||||
textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
|
textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
|
||||||
strcpy(textPtr, createStruct->lpszName);
|
strcpy(textPtr, createStruct->lpszName);
|
||||||
|
*(textPtr + strlen(createStruct->lpszName) + 1) = '\0';
|
||||||
|
/* for use by edit control */
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case WM_NCCALCSIZE:
|
||||||
|
{
|
||||||
|
#ifdef USE_XLIB
|
||||||
|
NCCALCSIZE_PARAMS *params = (NCCALCSIZE_PARAMS *)lParam;
|
||||||
|
if (wndPtr->dwStyle & WS_CHILD)
|
||||||
|
{
|
||||||
|
if (wndPtr->dwStyle & WS_BORDER)
|
||||||
|
{
|
||||||
|
params->rgrc[0].left += 1; /* SM_CXBORDER */
|
||||||
|
params->rgrc[0].top += 1; /* SM_CYBORDER */
|
||||||
|
params->rgrc[0].right -= 1; /* SM_CXBORDER */
|
||||||
|
params->rgrc[0].bottom -= 1; /* SM_CYBORDER */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
params->rgrc[0].left += 4; /* SM_CXFRAME */
|
||||||
|
params->rgrc[0].top += 30; /* SM_CYFRAME+SM_CYCAPTION */
|
||||||
|
params->rgrc[0].right -= 4; /* SM_CXFRAME */
|
||||||
|
params->rgrc[0].bottom -= 4; /* SM_CYFRAME */
|
||||||
|
if (wndPtr->dwStyle & WS_VSCROLL)
|
||||||
|
{
|
||||||
|
params->rgrc[0].right -= 16; /* SM_CXVSCROLL */
|
||||||
|
}
|
||||||
|
if (wndPtr->dwStyle & WS_HSCROLL)
|
||||||
|
{
|
||||||
|
params->rgrc[0].bottom += 16; /* SM_CYHSCROLL */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
case WM_CREATE:
|
case WM_CREATE:
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case WM_NCDESTROY:
|
case WM_NCDESTROY:
|
||||||
{
|
{
|
||||||
wndPtr = WIN_FindWndPtr(hwnd);
|
|
||||||
if (wndPtr->hText) USER_HEAP_FREE(wndPtr->hText);
|
if (wndPtr->hText) USER_HEAP_FREE(wndPtr->hText);
|
||||||
wndPtr->hText = 0;
|
wndPtr->hText = 0;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -69,10 +105,23 @@ LONG DefWindowProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
|
||||||
DestroyWindow( hwnd );
|
DestroyWindow( hwnd );
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
case WM_WINDOWPOSCHANGED:
|
||||||
|
{
|
||||||
|
WINDOWPOS * winPos = (WINDOWPOS *)lParam;
|
||||||
|
if (!(winPos->flags & SWP_NOMOVE))
|
||||||
|
SendMessage( hwnd, WM_MOVE, 0,
|
||||||
|
MAKELONG( wndPtr->rectClient.left,
|
||||||
|
wndPtr->rectClient.top ));
|
||||||
|
if (!(winPos->flags & SWP_NOSIZE))
|
||||||
|
SendMessage( hwnd, WM_SIZE, SIZE_RESTORED,
|
||||||
|
MAKELONG(wndPtr->rectClient.right-wndPtr->rectClient.left,
|
||||||
|
wndPtr->rectClient.bottom-wndPtr->rectClient.top));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
case WM_ERASEBKGND:
|
case WM_ERASEBKGND:
|
||||||
case WM_ICONERASEBKGND:
|
case WM_ICONERASEBKGND:
|
||||||
{
|
{
|
||||||
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 1;
|
|
||||||
if (!(classPtr = CLASS_FindClassPtr( wndPtr->hClass ))) return 1;
|
if (!(classPtr = CLASS_FindClassPtr( wndPtr->hClass ))) return 1;
|
||||||
if (!classPtr->wc.hbrBackground) return 1;
|
if (!classPtr->wc.hbrBackground) return 1;
|
||||||
FillWindow( GetParent(hwnd), hwnd, (HDC)wParam,
|
FillWindow( GetParent(hwnd), hwnd, (HDC)wParam,
|
||||||
|
@ -106,7 +155,6 @@ LONG DefWindowProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
|
||||||
{
|
{
|
||||||
if (wParam)
|
if (wParam)
|
||||||
{
|
{
|
||||||
wndPtr = WIN_FindWndPtr(hwnd);
|
|
||||||
if (wndPtr->hText)
|
if (wndPtr->hText)
|
||||||
{
|
{
|
||||||
textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
|
textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
|
||||||
|
@ -123,7 +171,6 @@ LONG DefWindowProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
|
||||||
|
|
||||||
case WM_GETTEXTLENGTH:
|
case WM_GETTEXTLENGTH:
|
||||||
{
|
{
|
||||||
wndPtr = WIN_FindWndPtr(hwnd);
|
|
||||||
if (wndPtr->hText)
|
if (wndPtr->hText)
|
||||||
{
|
{
|
||||||
textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
|
textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
|
||||||
|
@ -134,7 +181,6 @@ LONG DefWindowProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
|
||||||
|
|
||||||
case WM_SETTEXT:
|
case WM_SETTEXT:
|
||||||
{
|
{
|
||||||
wndPtr = WIN_FindWndPtr(hwnd);
|
|
||||||
if (wndPtr->hText)
|
if (wndPtr->hText)
|
||||||
USER_HEAP_FREE(wndPtr->hText);
|
USER_HEAP_FREE(wndPtr->hText);
|
||||||
|
|
||||||
|
@ -142,10 +188,18 @@ LONG DefWindowProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
|
||||||
strlen((LPSTR)lParam) + 1);
|
strlen((LPSTR)lParam) + 1);
|
||||||
textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
|
textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
|
||||||
strcpy(textPtr, (LPSTR)lParam);
|
strcpy(textPtr, (LPSTR)lParam);
|
||||||
|
#ifdef USE_XLIB
|
||||||
|
XStoreName( XT_display, wndPtr->window, textPtr );
|
||||||
|
#else
|
||||||
if (wndPtr->shellWidget)
|
if (wndPtr->shellWidget)
|
||||||
XtVaSetValues( wndPtr->shellWidget, XtNtitle, textPtr, NULL );
|
XtVaSetValues( wndPtr->shellWidget, XtNtitle, textPtr, NULL );
|
||||||
|
#endif
|
||||||
return (0L);
|
return (0L);
|
||||||
}
|
}
|
||||||
|
case WM_SETCURSOR:
|
||||||
|
if (wndPtr->hCursor != (HCURSOR)NULL)
|
||||||
|
SetCursor(wndPtr->hCursor);
|
||||||
|
return 0L;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,6 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
#include "dialog.h"
|
#include "dialog.h"
|
||||||
#include "prototypes.h"
|
|
||||||
#include "win.h"
|
#include "win.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -149,25 +148,19 @@ HWND CreateDialogParam( HINSTANCE hInst, LPCSTR dlgTemplate,
|
||||||
HWND hwnd = 0;
|
HWND hwnd = 0;
|
||||||
HANDLE hres, hmem;
|
HANDLE hres, hmem;
|
||||||
LPCSTR data;
|
LPCSTR data;
|
||||||
int size;
|
|
||||||
|
|
||||||
#ifdef DEBUG_DIALOG
|
#ifdef DEBUG_DIALOG
|
||||||
printf( "CreateDialogParam: %d,'%s',%d,%p,%d\n",
|
printf( "CreateDialogParam: %d,'%s',%d,%p,%d\n",
|
||||||
hInst, dlgTemplate, owner, dlgProc, param );
|
hInst, dlgTemplate, owner, dlgProc, param );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 0
|
/* FIXME: MAKEINTRESOURCE should be replaced by RT_DIALOG */
|
||||||
if (!(hres = FindResource( hInst, dlgTemplate, RT_DIALOG ))) return 0;
|
if (!(hres = FindResource( hInst, dlgTemplate, MAKEINTRESOURCE(0x8005) )))
|
||||||
|
return 0;
|
||||||
if (!(hmem = LoadResource( hInst, hres ))) return 0;
|
if (!(hmem = LoadResource( hInst, hres ))) return 0;
|
||||||
if (!(data = LockResource( hmem ))) hwnd = 0;
|
if (!(data = LockResource( hmem ))) hwnd = 0;
|
||||||
else hwnd = CreateDialogIndirectParam(hInst, data, owner, dlgProc, param);
|
else hwnd = CreateDialogIndirectParam(hInst, data, owner, dlgProc, param);
|
||||||
FreeResource( hmem );
|
FreeResource( hmem );
|
||||||
#else
|
|
||||||
hmem = RSC_LoadResource( hInst, dlgTemplate, NE_RSCTYPE_DIALOG, &size );
|
|
||||||
data = (LPCSTR) GlobalLock( hmem );
|
|
||||||
hwnd = CreateDialogIndirectParam( hInst, data, owner, dlgProc, param );
|
|
||||||
GlobalFree( hmem );
|
|
||||||
#endif
|
|
||||||
return hwnd;
|
return hwnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -314,8 +307,8 @@ HWND CreateDialogIndirectParam( HINSTANCE hInst, LPCSTR dlgTemplate,
|
||||||
if (dlgInfo->hUserFont)
|
if (dlgInfo->hUserFont)
|
||||||
SendMessage( hwnd, WM_SETFONT, dlgInfo->hUserFont, 0);
|
SendMessage( hwnd, WM_SETFONT, dlgInfo->hUserFont, 0);
|
||||||
SendMessage( hwnd, WM_INITDIALOG, dlgInfo->hwndFocus, param );
|
SendMessage( hwnd, WM_INITDIALOG, dlgInfo->hwndFocus, param );
|
||||||
if (SendMessage( hwnd, WM_INITDIALOG, dlgInfo->hwndFocus, param ))
|
/* if (SendMessage( hwnd, WM_INITDIALOG, dlgInfo->hwndFocus, param ))
|
||||||
SetFocus( dlgInfo->hwndFocus );
|
SetFocus( dlgInfo->hwndFocus ); */
|
||||||
|
|
||||||
return hwnd;
|
return hwnd;
|
||||||
}
|
}
|
||||||
|
|
427
windows/event.c
427
windows/event.c
|
@ -18,6 +18,8 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
||||||
#define NB_BUTTONS 3 /* Windows can handle 3 buttons */
|
#define NB_BUTTONS 3 /* Windows can handle 3 buttons */
|
||||||
static WORD dblclick_time = 300; /* Max. time for a double click (milliseconds) */
|
static WORD dblclick_time = 300; /* Max. time for a double click (milliseconds) */
|
||||||
|
|
||||||
|
extern Display * XT_display;
|
||||||
|
|
||||||
/* Event handlers */
|
/* Event handlers */
|
||||||
static void EVENT_expose();
|
static void EVENT_expose();
|
||||||
static void EVENT_key();
|
static void EVENT_key();
|
||||||
|
@ -25,17 +27,175 @@ static void EVENT_mouse_motion();
|
||||||
static void EVENT_mouse_button();
|
static void EVENT_mouse_button();
|
||||||
static void EVENT_structure();
|
static void EVENT_structure();
|
||||||
static void EVENT_focus_change();
|
static void EVENT_focus_change();
|
||||||
|
static void EVENT_enter_notify();
|
||||||
|
|
||||||
|
/* X context to associate a hwnd to an X window */
|
||||||
|
static XContext winContext = 0;
|
||||||
|
|
||||||
/* State variables */
|
/* State variables */
|
||||||
static HWND captureWnd = 0;
|
static HWND captureWnd = 0;
|
||||||
|
Window winHasCursor = 0;
|
||||||
extern HWND hWndFocus;
|
extern HWND hWndFocus;
|
||||||
|
|
||||||
|
/* Keyboard translation tables */
|
||||||
|
static int special_key[] =
|
||||||
|
{
|
||||||
|
VK_BACK, VK_TAB, 0, VK_CLEAR, 0, VK_RETURN, 0, 0, /* FF08 */
|
||||||
|
0, 0, 0, VK_PAUSE, VK_SCROLL, 0, 0, 0, /* FF10 */
|
||||||
|
0, 0, 0, VK_ESCAPE /* FF18 */
|
||||||
|
};
|
||||||
|
|
||||||
|
static cursor_key[] =
|
||||||
|
{
|
||||||
|
VK_HOME, VK_LEFT, VK_UP, VK_RIGHT, VK_DOWN, VK_PRIOR,
|
||||||
|
VK_NEXT, VK_END /* FF50 */
|
||||||
|
};
|
||||||
|
|
||||||
|
static misc_key[] =
|
||||||
|
{
|
||||||
|
VK_SELECT, VK_SNAPSHOT, VK_EXECUTE, VK_INSERT, 0, 0, 0, 0, /* FF60 */
|
||||||
|
VK_CANCEL, VK_HELP, VK_CANCEL, VK_MENU /* FF68 */
|
||||||
|
};
|
||||||
|
|
||||||
|
static keypad_key[] =
|
||||||
|
{
|
||||||
|
VK_MENU, VK_NUMLOCK, /* FF7E */
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, /* FF80 */
|
||||||
|
0, 0, 0, 0, 0, VK_RETURN, 0, 0, /* FF88 */
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, /* FF90 */
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, /* FF98 */
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, /* FFA0 */
|
||||||
|
0, 0, VK_MULTIPLY, VK_ADD, VK_SEPARATOR, VK_SUBTRACT,
|
||||||
|
VK_DECIMAL, VK_DIVIDE, /* FFA8 */
|
||||||
|
VK_NUMPAD0, VK_NUMPAD1, VK_NUMPAD2, VK_NUMPAD3, VK_NUMPAD4,
|
||||||
|
VK_NUMPAD5, VK_NUMPAD6, VK_NUMPAD7, /* FFB0 */
|
||||||
|
VK_NUMPAD8, VK_NUMPAD9 /* FFB8 */
|
||||||
|
};
|
||||||
|
|
||||||
|
static function_key[] =
|
||||||
|
{
|
||||||
|
VK_F1, VK_F2, /* FFBE */
|
||||||
|
VK_F3, VK_F4, VK_F5, VK_F6, VK_F7, VK_F8, VK_F9, VK_F10, /* FFC0 */
|
||||||
|
VK_F11, VK_F12, VK_F13, VK_F14, VK_F15, VK_F16 /* FFC8 */
|
||||||
|
};
|
||||||
|
|
||||||
|
static modifier_key[] =
|
||||||
|
{
|
||||||
|
VK_SHIFT, VK_SHIFT, VK_CONTROL, VK_CONTROL, VK_CAPITAL,
|
||||||
|
0, 0, /* FFE1 */
|
||||||
|
0, VK_MENU, VK_MENU /* FFE8 */
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
unsigned long count : 16;
|
||||||
|
unsigned long code : 8;
|
||||||
|
unsigned long extended : 1;
|
||||||
|
unsigned long : 4;
|
||||||
|
unsigned long context : 1;
|
||||||
|
unsigned long previous : 1;
|
||||||
|
unsigned long transition : 1;
|
||||||
|
} lp1;
|
||||||
|
unsigned long lp2;
|
||||||
|
} KEYLP;
|
||||||
|
|
||||||
|
static BOOL KeyDown = FALSE;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef DEBUG_EVENT
|
||||||
|
static char *event_names[] =
|
||||||
|
{
|
||||||
|
"", "", "KeyPress", "KeyRelease", "ButtonPress", "ButtonRelease",
|
||||||
|
"MotionNotify", "EnterNotify", "LeaveNotify", "FocusIn", "FocusOut",
|
||||||
|
"KeymapNotify", "Expose", "GraphicsExpose", "NoExpose", "VisibilityNotify",
|
||||||
|
"CreateNotify", "DestroyNotify", "UnmapNotify", "MapNotify", "MapRequest",
|
||||||
|
"ReparentNotify", "ConfigureNotify", "ConfigureRequest", "GravityNotify",
|
||||||
|
"ResizeRequest", "CirculateNotify", "CirculateRequest", "PropertyNotify",
|
||||||
|
"SelectionClear", "SelectionRequest", "SelectionNotify", "ColormapNotify",
|
||||||
|
"ClientMessage", "MappingNotify"
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* EVENT_ProcessEvent
|
||||||
|
*
|
||||||
|
* Process an X event.
|
||||||
|
*/
|
||||||
|
void EVENT_ProcessEvent( XEvent *event )
|
||||||
|
{
|
||||||
|
HWND hwnd;
|
||||||
|
XPointer ptr;
|
||||||
|
Boolean cont_dispatch = TRUE;
|
||||||
|
|
||||||
|
XFindContext( XT_display, ((XAnyEvent *)event)->window, winContext, &ptr );
|
||||||
|
hwnd = (HWND)ptr & 0xffff;
|
||||||
|
|
||||||
|
#ifdef DEBUG_EVENT
|
||||||
|
printf( "Got event %s for hwnd %d\n",
|
||||||
|
event_names[event->type], hwnd );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
switch(event->type)
|
||||||
|
{
|
||||||
|
case Expose:
|
||||||
|
EVENT_expose( 0, hwnd, event, &cont_dispatch );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case KeyPress:
|
||||||
|
case KeyRelease:
|
||||||
|
EVENT_key( 0, hwnd, event, &cont_dispatch );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MotionNotify:
|
||||||
|
EVENT_mouse_motion( 0, hwnd, event, &cont_dispatch );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ButtonPress:
|
||||||
|
case ButtonRelease:
|
||||||
|
EVENT_mouse_button( 0, hwnd, event, &cont_dispatch );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CirculateNotify:
|
||||||
|
case ConfigureNotify:
|
||||||
|
case MapNotify:
|
||||||
|
case UnmapNotify:
|
||||||
|
EVENT_structure( 0, hwnd, event, &cont_dispatch );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FocusIn:
|
||||||
|
case FocusOut:
|
||||||
|
EVENT_focus_change( 0, hwnd, event, &cont_dispatch );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EnterNotify:
|
||||||
|
EVENT_enter_notify( 0, hwnd, event, &cont_dispatch );
|
||||||
|
break;
|
||||||
|
|
||||||
|
#ifdef DEBUG_EVENT
|
||||||
|
default:
|
||||||
|
printf( "Unprocessed event %s for hwnd %d\n",
|
||||||
|
event_names[event->type], hwnd );
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* EVENT_AddHandlers
|
* EVENT_AddHandlers
|
||||||
*
|
*
|
||||||
* Add the event handlers to the given window
|
* Add the event handlers to the given window
|
||||||
*/
|
*/
|
||||||
|
#ifdef USE_XLIB
|
||||||
|
void EVENT_AddHandlers( Window w, int hwnd )
|
||||||
|
{
|
||||||
|
if (!winContext) winContext = XUniqueContext();
|
||||||
|
XSaveContext( XT_display, w, winContext, (XPointer)hwnd );
|
||||||
|
}
|
||||||
|
#else
|
||||||
void EVENT_AddHandlers( Widget w, int hwnd )
|
void EVENT_AddHandlers( Widget w, int hwnd )
|
||||||
{
|
{
|
||||||
XtAddEventHandler(w, ExposureMask, FALSE,
|
XtAddEventHandler(w, ExposureMask, FALSE,
|
||||||
|
@ -50,7 +210,10 @@ void EVENT_AddHandlers( Widget w, int hwnd )
|
||||||
EVENT_structure, (XtPointer)hwnd );
|
EVENT_structure, (XtPointer)hwnd );
|
||||||
XtAddEventHandler(w, FocusChangeMask, FALSE,
|
XtAddEventHandler(w, FocusChangeMask, FALSE,
|
||||||
EVENT_focus_change, (XtPointer)hwnd );
|
EVENT_focus_change, (XtPointer)hwnd );
|
||||||
|
XtAddEventHandler(w, EnterWindowMask, FALSE,
|
||||||
|
EVENT_enter_notify, (XtPointer)hwnd );
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -60,6 +223,7 @@ void EVENT_AddHandlers( Widget w, int hwnd )
|
||||||
*/
|
*/
|
||||||
void EVENT_RemoveHandlers( Widget w, int hwnd )
|
void EVENT_RemoveHandlers( Widget w, int hwnd )
|
||||||
{
|
{
|
||||||
|
#ifndef USE_XLIB
|
||||||
XtRemoveEventHandler(w, ExposureMask, FALSE,
|
XtRemoveEventHandler(w, ExposureMask, FALSE,
|
||||||
EVENT_expose, (XtPointer)hwnd );
|
EVENT_expose, (XtPointer)hwnd );
|
||||||
XtRemoveEventHandler(w, KeyPressMask | KeyReleaseMask, FALSE,
|
XtRemoveEventHandler(w, KeyPressMask | KeyReleaseMask, FALSE,
|
||||||
|
@ -72,6 +236,9 @@ void EVENT_RemoveHandlers( Widget w, int hwnd )
|
||||||
EVENT_structure, (XtPointer)hwnd );
|
EVENT_structure, (XtPointer)hwnd );
|
||||||
XtRemoveEventHandler(w, FocusChangeMask, FALSE,
|
XtRemoveEventHandler(w, FocusChangeMask, FALSE,
|
||||||
EVENT_focus_change, (XtPointer)hwnd );
|
EVENT_focus_change, (XtPointer)hwnd );
|
||||||
|
XtRemoveEventHandler(w, EnterWindowMask, FALSE,
|
||||||
|
EVENT_enter_notify, (XtPointer)hwnd );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -103,10 +270,14 @@ static void EVENT_expose( Widget w, int hwnd, XExposeEvent *event,
|
||||||
Boolean *cont_dispatch )
|
Boolean *cont_dispatch )
|
||||||
{
|
{
|
||||||
RECT rect;
|
RECT rect;
|
||||||
rect.left = event->x;
|
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
||||||
rect.top = event->y;
|
if (!wndPtr) return;
|
||||||
rect.right = event->x + event->width;
|
/* Make position relative to client area instead of window */
|
||||||
rect.bottom = event->y + event->height;
|
rect.left = event->x - (wndPtr->rectClient.left - wndPtr->rectWindow.left);
|
||||||
|
rect.top = event->y - (wndPtr->rectClient.top - wndPtr->rectWindow.top);
|
||||||
|
rect.right = rect.left + event->width;
|
||||||
|
rect.bottom = rect.top + event->height;
|
||||||
|
winHasCursor = event->window;
|
||||||
|
|
||||||
InvalidateRect( hwnd, &rect, TRUE );
|
InvalidateRect( hwnd, &rect, TRUE );
|
||||||
}
|
}
|
||||||
|
@ -121,24 +292,128 @@ static void EVENT_key( Widget w, int hwnd, XKeyEvent *event,
|
||||||
Boolean *cont_dispatch )
|
Boolean *cont_dispatch )
|
||||||
{
|
{
|
||||||
MSG msg;
|
MSG msg;
|
||||||
|
|
||||||
char Str[24];
|
char Str[24];
|
||||||
XComposeStatus cs;
|
XComposeStatus cs;
|
||||||
KeySym key;
|
KeySym keysym;
|
||||||
int count = XLookupString(event, Str, 1, &key, &cs);
|
WORD xkey, vkey, key_type, key;
|
||||||
|
KEYLP keylp;
|
||||||
|
BOOL extended = FALSE;
|
||||||
|
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
||||||
|
int count = XLookupString(event, Str, 1, &keysym, &cs);
|
||||||
Str[count] = '\0';
|
Str[count] = '\0';
|
||||||
#ifdef DEBUG_KEY
|
#ifdef DEBUG_KEY
|
||||||
printf("WM_KEY??? : count=%u / %X / '%s'\n",count, Str[0], Str);
|
printf("WM_KEY??? : keysym=%lX, count=%u / %X / '%s'\n",
|
||||||
|
keysym, count, Str[0], Str);
|
||||||
#endif
|
#endif
|
||||||
msg.hwnd = hwnd;
|
|
||||||
msg.message = (event->type == KeyRelease) ? WM_KEYUP : WM_KEYDOWN;
|
|
||||||
msg.wParam = Str[0];
|
|
||||||
msg.lParam = (event->x & 0xffff) | (event->y << 16);
|
|
||||||
msg.time = event->time;
|
|
||||||
msg.pt.x = event->x & 0xffff;
|
|
||||||
msg.pt.y = event->y & 0xffff;
|
|
||||||
|
|
||||||
MSG_AddMsg( &msg );
|
xkey = LOWORD(keysym);
|
||||||
|
key_type = HIBYTE(xkey);
|
||||||
|
key = LOBYTE(xkey);
|
||||||
|
#ifdef DEBUG_KEY
|
||||||
|
printf(" key_type=%X, key=%X\n", key_type, key);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Position must be relative to client area */
|
||||||
|
event->x -= wndPtr->rectClient.left - wndPtr->rectWindow.left;
|
||||||
|
event->y -= wndPtr->rectClient.top - wndPtr->rectWindow.top;
|
||||||
|
|
||||||
|
if (key_type == 0xFF) /* non-character key */
|
||||||
|
{
|
||||||
|
if (key >= 0x08 && key <= 0x1B) /* special key */
|
||||||
|
vkey = special_key[key - 0x08];
|
||||||
|
else if (key >= 0x50 && key <= 0x57) /* cursor key */
|
||||||
|
vkey = cursor_key[key - 0x50];
|
||||||
|
else if (key >= 0x60 && key <= 0x6B) /* miscellaneous key */
|
||||||
|
vkey = misc_key[key - 0x60];
|
||||||
|
else if (key >= 0x7E && key <= 0xB9) /* keypad key */
|
||||||
|
{
|
||||||
|
vkey = keypad_key[key - 0x7E];
|
||||||
|
extended = TRUE;
|
||||||
|
}
|
||||||
|
else if (key >= 0xBE && key <= 0xCD) /* function key */
|
||||||
|
{
|
||||||
|
vkey = function_key[key - 0xBE];
|
||||||
|
extended = TRUE;
|
||||||
|
}
|
||||||
|
else if (key >= 0xE1 && key <= 0xEA) /* modifier key */
|
||||||
|
vkey = modifier_key[key - 0xE1];
|
||||||
|
else if (key == 0xFF) /* DEL key */
|
||||||
|
vkey = VK_DELETE;
|
||||||
|
}
|
||||||
|
else if (key_type == 0) /* character key */
|
||||||
|
{
|
||||||
|
if (key >= 0x61 && key <= 0x7A)
|
||||||
|
vkey = key - 0x20; /* convert lower to uppercase */
|
||||||
|
else
|
||||||
|
vkey = key;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event->type == KeyPress)
|
||||||
|
{
|
||||||
|
msg.hwnd = hwnd;
|
||||||
|
msg.message = WM_KEYDOWN;
|
||||||
|
msg.wParam = vkey;
|
||||||
|
keylp.lp1.count = 1;
|
||||||
|
keylp.lp1.code = LOBYTE(event->keycode);
|
||||||
|
keylp.lp1.extended = (extended ? 1 : 0);
|
||||||
|
keylp.lp1.context = (event->state & Mod1Mask ? 1 : 0);
|
||||||
|
keylp.lp1.previous = (KeyDown ? 0 : 1);
|
||||||
|
keylp.lp1.transition = 0;
|
||||||
|
msg.lParam = keylp.lp2;
|
||||||
|
#ifdef DEBUG_KEY
|
||||||
|
printf(" wParam=%X, lParam=%lX\n", msg.wParam, msg.lParam);
|
||||||
|
#endif
|
||||||
|
msg.time = event->time;
|
||||||
|
msg.pt.x = event->x & 0xffff;
|
||||||
|
msg.pt.y = event->y & 0xffff;
|
||||||
|
|
||||||
|
hardware_event( hwnd, WM_KEYDOWN, vkey, keylp.lp2,
|
||||||
|
event->x & 0xffff, event->y & 0xffff, event->time, 0 );
|
||||||
|
KeyDown = TRUE;
|
||||||
|
|
||||||
|
/* The key translation ought to take place in TranslateMessage().
|
||||||
|
* However, there is no way of passing the required information
|
||||||
|
* in a Windows message, so TranslateMessage does not currently
|
||||||
|
* do anything and the translation is done here.
|
||||||
|
*/
|
||||||
|
if (count == 1) /* key has an ASCII representation */
|
||||||
|
{
|
||||||
|
msg.hwnd = hwnd;
|
||||||
|
msg.message = WM_CHAR;
|
||||||
|
msg.wParam = (WORD)Str[0];
|
||||||
|
msg.lParam = keylp.lp2;
|
||||||
|
#ifdef DEBUG_KEY
|
||||||
|
printf("WM_CHAR : wParam=%X\n", msg.wParam);
|
||||||
|
#endif
|
||||||
|
msg.time = event->time;
|
||||||
|
msg.pt.x = event->x & 0xffff;
|
||||||
|
msg.pt.y = event->y & 0xffff;
|
||||||
|
PostMessage( hwnd, WM_CHAR, (WORD)Str[0], keylp.lp2 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
msg.hwnd = hwnd;
|
||||||
|
msg.message = WM_KEYUP;
|
||||||
|
msg.wParam = vkey;
|
||||||
|
keylp.lp1.count = 1;
|
||||||
|
keylp.lp1.code = LOBYTE(event->keycode);
|
||||||
|
keylp.lp1.extended = (extended ? 1 : 0);
|
||||||
|
keylp.lp1.context = (event->state & Mod1Mask ? 1 : 0);
|
||||||
|
keylp.lp1.previous = 1;
|
||||||
|
keylp.lp1.transition = 1;
|
||||||
|
msg.lParam = keylp.lp2;
|
||||||
|
#ifdef DEBUG_KEY
|
||||||
|
printf(" wParam=%X, lParam=%lX\n", msg.wParam, msg.lParam);
|
||||||
|
#endif
|
||||||
|
msg.time = event->time;
|
||||||
|
msg.pt.x = event->x & 0xffff;
|
||||||
|
msg.pt.y = event->y & 0xffff;
|
||||||
|
|
||||||
|
hardware_event( hwnd, WM_KEYUP, vkey, keylp.lp2,
|
||||||
|
event->x & 0xffff, event->y & 0xffff, event->time, 0 );
|
||||||
|
KeyDown = FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -150,17 +425,17 @@ static void EVENT_key( Widget w, int hwnd, XKeyEvent *event,
|
||||||
static void EVENT_mouse_motion( Widget w, int hwnd, XMotionEvent *event,
|
static void EVENT_mouse_motion( Widget w, int hwnd, XMotionEvent *event,
|
||||||
Boolean *cont_dispatch )
|
Boolean *cont_dispatch )
|
||||||
{
|
{
|
||||||
MSG msg;
|
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
||||||
|
if (!wndPtr) return;
|
||||||
|
|
||||||
msg.hwnd = hwnd;
|
/* Position must be relative to client area */
|
||||||
msg.message = WM_MOUSEMOVE;
|
event->x -= wndPtr->rectClient.left - wndPtr->rectWindow.left;
|
||||||
msg.wParam = EVENT_XStateToKeyState( event->state );
|
event->y -= wndPtr->rectClient.top - wndPtr->rectWindow.top;
|
||||||
msg.lParam = (event->x & 0xffff) | (event->y << 16);
|
|
||||||
msg.time = event->time;
|
|
||||||
msg.pt.x = event->x & 0xffff;
|
|
||||||
msg.pt.y = event->y & 0xffff;
|
|
||||||
|
|
||||||
MSG_AddMsg( &msg );
|
hardware_event( hwnd, WM_MOUSEMOVE, EVENT_XStateToKeyState( event->state ),
|
||||||
|
(event->x & 0xffff) | (event->y << 16),
|
||||||
|
event->x & 0xffff, event->y & 0xffff,
|
||||||
|
event->time, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -180,9 +455,15 @@ static void EVENT_mouse_button( Widget w, int hwnd, XButtonEvent *event,
|
||||||
};
|
};
|
||||||
static unsigned long lastClickTime[NB_BUTTONS] = { 0, 0, 0 };
|
static unsigned long lastClickTime[NB_BUTTONS] = { 0, 0, 0 };
|
||||||
|
|
||||||
MSG msg;
|
|
||||||
int buttonNum, prevTime, type;
|
int buttonNum, prevTime, type;
|
||||||
|
|
||||||
|
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
||||||
|
if (!wndPtr) return;
|
||||||
|
|
||||||
|
/* Position must be relative to client area */
|
||||||
|
event->x -= wndPtr->rectClient.left - wndPtr->rectWindow.left;
|
||||||
|
event->y -= wndPtr->rectClient.top - wndPtr->rectWindow.top;
|
||||||
|
|
||||||
buttonNum = event->button-1;
|
buttonNum = event->button-1;
|
||||||
if (buttonNum >= NB_BUTTONS) return;
|
if (buttonNum >= NB_BUTTONS) return;
|
||||||
if (event->type == ButtonRelease) type = 1;
|
if (event->type == ButtonRelease) type = 1;
|
||||||
|
@ -201,15 +482,13 @@ static void EVENT_mouse_button( Widget w, int hwnd, XButtonEvent *event,
|
||||||
else type = 0;
|
else type = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
msg.hwnd = hwnd;
|
winHasCursor = event->window;
|
||||||
msg.message = messages[type][buttonNum];
|
|
||||||
msg.wParam = EVENT_XStateToKeyState( event->state );
|
|
||||||
msg.lParam = (event->x & 0xffff) | (event->y << 16);
|
|
||||||
msg.time = event->time;
|
|
||||||
msg.pt.x = event->x & 0xffff;
|
|
||||||
msg.pt.y = event->y & 0xffff;
|
|
||||||
|
|
||||||
MSG_AddMsg( &msg );
|
hardware_event( hwnd, messages[type][buttonNum],
|
||||||
|
EVENT_XStateToKeyState( event->state ),
|
||||||
|
(event->x & 0xffff) | (event->y << 16),
|
||||||
|
event->x & 0xffff, event->y & 0xffff,
|
||||||
|
event->time, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -232,13 +511,31 @@ static void EVENT_structure( Widget w, int hwnd, XEvent *event,
|
||||||
{
|
{
|
||||||
case ConfigureNotify:
|
case ConfigureNotify:
|
||||||
{
|
{
|
||||||
|
HANDLE handle;
|
||||||
|
NCCALCSIZE_PARAMS *params;
|
||||||
XConfigureEvent * evt = (XConfigureEvent *)event;
|
XConfigureEvent * evt = (XConfigureEvent *)event;
|
||||||
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
||||||
if (!wndPtr) return;
|
if (!wndPtr) return;
|
||||||
wndPtr->rectClient.right = wndPtr->rectClient.left + evt->width;
|
wndPtr->rectWindow.left = evt->x;
|
||||||
wndPtr->rectClient.bottom = wndPtr->rectClient.top + evt->height;
|
wndPtr->rectWindow.top = evt->y;
|
||||||
|
wndPtr->rectWindow.right = evt->x + evt->width;
|
||||||
|
wndPtr->rectWindow.bottom = evt->y + evt->height;
|
||||||
|
|
||||||
|
/* Send WM_NCCALCSIZE message */
|
||||||
|
handle = GlobalAlloc( GMEM_MOVEABLE, sizeof(*params) );
|
||||||
|
params = (NCCALCSIZE_PARAMS *)GlobalLock( handle );
|
||||||
|
params->rgrc[0] = wndPtr->rectWindow;
|
||||||
|
params->lppos = NULL; /* Should be WINDOWPOS struct */
|
||||||
|
SendMessage( hwnd, WM_NCCALCSIZE, FALSE, params );
|
||||||
|
wndPtr->rectClient = params->rgrc[0];
|
||||||
|
PostMessage( hwnd, WM_MOVE, 0,
|
||||||
|
MAKELONG( wndPtr->rectClient.left,
|
||||||
|
wndPtr->rectClient.top ));
|
||||||
PostMessage( hwnd, WM_SIZE, SIZE_RESTORED,
|
PostMessage( hwnd, WM_SIZE, SIZE_RESTORED,
|
||||||
(evt->width & 0xffff) | (evt->height << 16) );
|
MAKELONG(wndPtr->rectClient.right-wndPtr->rectClient.left,
|
||||||
|
wndPtr->rectClient.bottom-wndPtr->rectClient.top));
|
||||||
|
GlobalUnlock( handle );
|
||||||
|
GlobalFree( handle );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -254,21 +551,12 @@ static void EVENT_structure( Widget w, int hwnd, XEvent *event,
|
||||||
static void EVENT_focus_change( Widget w, int hwnd, XEvent *event,
|
static void EVENT_focus_change( Widget w, int hwnd, XEvent *event,
|
||||||
Boolean *cont_dispatch )
|
Boolean *cont_dispatch )
|
||||||
{
|
{
|
||||||
MSG msg;
|
|
||||||
|
|
||||||
msg.hwnd = hwnd;
|
|
||||||
msg.time = GetTickCount();
|
|
||||||
msg.pt.x = 0;
|
|
||||||
msg.pt.y = 0;
|
|
||||||
|
|
||||||
switch(event->type)
|
switch(event->type)
|
||||||
{
|
{
|
||||||
case FocusIn:
|
case FocusIn:
|
||||||
{
|
{
|
||||||
msg.message = WM_SETFOCUS;
|
PostMessage( hwnd, WM_SETFOCUS, hwnd, 0 );
|
||||||
msg.wParam = hwnd;
|
|
||||||
hWndFocus = hwnd;
|
hWndFocus = hwnd;
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -276,13 +564,32 @@ static void EVENT_focus_change( Widget w, int hwnd, XEvent *event,
|
||||||
{
|
{
|
||||||
if (hWndFocus)
|
if (hWndFocus)
|
||||||
{
|
{
|
||||||
msg.message = WM_KILLFOCUS;
|
PostMessage( hwnd, WM_KILLFOCUS, hwnd, 0 );
|
||||||
msg.wParam = hwnd;
|
|
||||||
hWndFocus = 0;
|
hWndFocus = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MSG_AddMsg( &msg );
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* EVENT_enter_notify
|
||||||
|
*
|
||||||
|
* Handle an X EnterNotify event
|
||||||
|
*/
|
||||||
|
static void EVENT_enter_notify( Widget w, int hwnd, XCrossingEvent *event,
|
||||||
|
Boolean *cont_dispatch )
|
||||||
|
{
|
||||||
|
if (captureWnd != 0) return;
|
||||||
|
|
||||||
|
winHasCursor = event->window;
|
||||||
|
|
||||||
|
switch(event->type)
|
||||||
|
{
|
||||||
|
case EnterNotify:
|
||||||
|
PostMessage( hwnd, WM_SETCURSOR, hwnd, 0 );
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -297,9 +604,15 @@ HWND SetCapture(HWND wnd)
|
||||||
if (wnd_p == NULL)
|
if (wnd_p == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
#ifdef USE_XLIB
|
||||||
|
rv = XGrabPointer(XT_display, wnd_p->window, False,
|
||||||
|
ButtonPressMask | ButtonReleaseMask | ButtonMotionMask,
|
||||||
|
GrabModeAsync, GrabModeSync, None, None, CurrentTime);
|
||||||
|
#else
|
||||||
rv = XtGrabPointer(wnd_p->winWidget, False,
|
rv = XtGrabPointer(wnd_p->winWidget, False,
|
||||||
ButtonPressMask | ButtonReleaseMask | ButtonMotionMask,
|
ButtonPressMask | ButtonReleaseMask | ButtonMotionMask,
|
||||||
GrabModeAsync, GrabModeSync, None, None, CurrentTime);
|
GrabModeAsync, GrabModeSync, None, None, CurrentTime);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (rv == GrabSuccess)
|
if (rv == GrabSuccess)
|
||||||
{
|
{
|
||||||
|
@ -324,11 +637,23 @@ void ReleaseCapture()
|
||||||
if (wnd_p == NULL)
|
if (wnd_p == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
#ifdef USE_XLIB
|
||||||
|
XUngrabPointer( XT_display, CurrentTime );
|
||||||
|
#else
|
||||||
XtUngrabPointer(wnd_p->winWidget, CurrentTime);
|
XtUngrabPointer(wnd_p->winWidget, CurrentTime);
|
||||||
|
#endif
|
||||||
|
|
||||||
captureWnd = 0;
|
captureWnd = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* GetCapture (USER.236)
|
||||||
|
*/
|
||||||
|
HWND GetCapture()
|
||||||
|
{
|
||||||
|
return captureWnd;
|
||||||
|
}
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* SetDoubleClickTime (USER.20)
|
* SetDoubleClickTime (USER.20)
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -32,7 +32,7 @@ HWND SetFocus(HWND hwnd)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
wndPtr = WIN_FindWndPtr(hwnd);
|
wndPtr = WIN_FindWndPtr(hwnd);
|
||||||
XSetInputFocus(XT_display, XtWindow(wndPtr->winWidget),
|
XSetInputFocus(XT_display, wndPtr->window,
|
||||||
RevertToParent, CurrentTime);
|
RevertToParent, CurrentTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,8 +23,10 @@ BOOL LineTo( HDC hdc, short x, short y )
|
||||||
if (!dc) return FALSE;
|
if (!dc) return FALSE;
|
||||||
if (DC_SetupGCForPen( dc ))
|
if (DC_SetupGCForPen( dc ))
|
||||||
XDrawLine(XT_display, dc->u.x.drawable, dc->u.x.gc,
|
XDrawLine(XT_display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
XLPTODP( dc, dc->w.CursPosX ), YLPTODP( dc, dc->w.CursPosY ),
|
dc->w.DCOrgX + XLPTODP( dc, dc->w.CursPosX ),
|
||||||
XLPTODP( dc, x ), YLPTODP( dc, y ) );
|
dc->w.DCOrgY + YLPTODP( dc, dc->w.CursPosY ),
|
||||||
|
dc->w.DCOrgX + XLPTODP( dc, x ),
|
||||||
|
dc->w.DCOrgY + YLPTODP( dc, y ) );
|
||||||
dc->w.CursPosX = x;
|
dc->w.CursPosX = x;
|
||||||
dc->w.CursPosY = y;
|
dc->w.CursPosY = y;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -97,20 +99,21 @@ BOOL GRAPH_DrawArc( HDC hdc, int left, int top, int right, int bottom,
|
||||||
if (diff_angle < 0.0) diff_angle += 2*PI;
|
if (diff_angle < 0.0) diff_angle += 2*PI;
|
||||||
|
|
||||||
XDrawArc( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
XDrawArc( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
left, top, right-left-1, bottom-top-1,
|
dc->w.DCOrgX + left, dc->w.DCOrgY + top,
|
||||||
|
right-left-1, bottom-top-1,
|
||||||
(int)(start_angle * 180 * 64 / PI),
|
(int)(start_angle * 180 * 64 / PI),
|
||||||
(int)(diff_angle * 180 * 64 / PI) );
|
(int)(diff_angle * 180 * 64 / PI) );
|
||||||
if (!lines) return TRUE;
|
if (!lines) return TRUE;
|
||||||
|
|
||||||
points[0].x = xcenter + (int)(cos(start_angle) * (right-left) / 2);
|
points[0].x = dc->w.DCOrgX + xcenter + (int)(cos(start_angle) * (right-left) / 2);
|
||||||
points[0].y = ycenter - (int)(sin(start_angle) * (bottom-top) / 2);
|
points[0].y = dc->w.DCOrgY + ycenter - (int)(sin(start_angle) * (bottom-top) / 2);
|
||||||
points[1].x = xcenter + (int)(cos(end_angle) * (right-left) / 2);
|
points[1].x = dc->w.DCOrgX + xcenter + (int)(cos(end_angle) * (right-left) / 2);
|
||||||
points[1].y = ycenter - (int)(sin(end_angle) * (bottom-top) / 2);
|
points[1].y = dc->w.DCOrgY + ycenter - (int)(sin(end_angle) * (bottom-top) / 2);
|
||||||
if (lines == 2)
|
if (lines == 2)
|
||||||
{
|
{
|
||||||
points[2] = points[1];
|
points[2] = points[1];
|
||||||
points[1].x = xcenter;
|
points[1].x = dc->w.DCOrgX + xcenter;
|
||||||
points[1].y = ycenter;
|
points[1].y = dc->w.DCOrgY + ycenter;
|
||||||
}
|
}
|
||||||
XDrawLines( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
XDrawLines( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
points, lines+1, CoordModeOrigin );
|
points, lines+1, CoordModeOrigin );
|
||||||
|
@ -167,10 +170,12 @@ BOOL Ellipse( HDC hdc, int left, int top, int right, int bottom )
|
||||||
|
|
||||||
if (DC_SetupGCForBrush( dc ))
|
if (DC_SetupGCForBrush( dc ))
|
||||||
XFillArc( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
XFillArc( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
left, top, right-left-1, bottom-top-1, 0, 360*64 );
|
dc->w.DCOrgX + left, dc->w.DCOrgY + top,
|
||||||
|
right-left-1, bottom-top-1, 0, 360*64 );
|
||||||
if (DC_SetupGCForPen( dc ))
|
if (DC_SetupGCForPen( dc ))
|
||||||
XDrawArc( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
XDrawArc( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
left, top, right-left-1, bottom-top-1, 0, 360*64 );
|
dc->w.DCOrgX + left, dc->w.DCOrgY + top,
|
||||||
|
right-left-1, bottom-top-1, 0, 360*64 );
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -190,10 +195,12 @@ BOOL Rectangle( HDC hdc, int left, int top, int right, int bottom )
|
||||||
|
|
||||||
if (DC_SetupGCForBrush( dc ))
|
if (DC_SetupGCForBrush( dc ))
|
||||||
XFillRectangle( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
XFillRectangle( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
left, top, right-left-1, bottom-top-1 );
|
dc->w.DCOrgX + left, dc->w.DCOrgY + top,
|
||||||
|
right-left-1, bottom-top-1 );
|
||||||
if (DC_SetupGCForPen( dc ))
|
if (DC_SetupGCForPen( dc ))
|
||||||
XDrawRectangle( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
XDrawRectangle( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
left, top, right-left-1, bottom-top-1 );
|
dc->w.DCOrgX + left, dc->w.DCOrgY + top,
|
||||||
|
right-left-1, bottom-top-1 );
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -244,10 +251,16 @@ int FrameRect( HDC hdc, LPRECT rect, HBRUSH hbrush )
|
||||||
right = XLPTODP( dc, rect->right );
|
right = XLPTODP( dc, rect->right );
|
||||||
bottom = YLPTODP( dc, rect->bottom );
|
bottom = YLPTODP( dc, rect->bottom );
|
||||||
|
|
||||||
if (DC_SetupGCForBrush( dc ))
|
if (DC_SetupGCForBrush( dc )) {
|
||||||
XDrawRectangle( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
PatBlt( hdc, rect->left, rect->top, 1,
|
||||||
left, top, right-left-1, bottom-top-1 );
|
rect->bottom - rect->top, PATCOPY );
|
||||||
|
PatBlt( hdc, rect->right - 1, rect->top, 1,
|
||||||
|
rect->bottom - rect->top, PATCOPY );
|
||||||
|
PatBlt( hdc, rect->left, rect->top,
|
||||||
|
rect->right - rect->left, 1, PATCOPY );
|
||||||
|
PatBlt( hdc, rect->left, rect->bottom - 1,
|
||||||
|
rect->right - rect->left, 1, PATCOPY );
|
||||||
|
}
|
||||||
SelectObject( hdc, prevBrush );
|
SelectObject( hdc, prevBrush );
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -264,8 +277,8 @@ COLORREF SetPixel( HDC hdc, short x, short y, COLORREF color )
|
||||||
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
|
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
|
||||||
if (!dc) return 0;
|
if (!dc) return 0;
|
||||||
|
|
||||||
x = XLPTODP( dc, x );
|
x = dc->w.DCOrgX + XLPTODP( dc, x );
|
||||||
y = YLPTODP( dc, y );
|
y = dc->w.DCOrgY + YLPTODP( dc, y );
|
||||||
pixel = GetNearestPaletteIndex( dc->w.hPalette, color );
|
pixel = GetNearestPaletteIndex( dc->w.hPalette, color );
|
||||||
GetPaletteEntries( dc->w.hPalette, pixel, 1, &entry );
|
GetPaletteEntries( dc->w.hPalette, pixel, 1, &entry );
|
||||||
|
|
||||||
|
@ -288,15 +301,14 @@ COLORREF GetPixel( HDC hdc, short x, short y )
|
||||||
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
|
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
|
||||||
if (!dc) return 0;
|
if (!dc) return 0;
|
||||||
|
|
||||||
x = XLPTODP( dc, x );
|
x = dc->w.DCOrgX + XLPTODP( dc, x );
|
||||||
y = YLPTODP( dc, y );
|
y = dc->w.DCOrgY + YLPTODP( dc, y );
|
||||||
if ((x < 0) || (y < 0)) return 0;
|
if ((x < 0) || (y < 0)) return 0;
|
||||||
|
|
||||||
if (dc->u.x.widget)
|
if (!(dc->w.flags & DC_MEMORY))
|
||||||
{
|
{
|
||||||
XWindowAttributes win_attr;
|
XWindowAttributes win_attr;
|
||||||
|
|
||||||
if (!XtIsRealized(dc->u.x.widget)) return 0;
|
|
||||||
if (!XGetWindowAttributes( XT_display, dc->u.x.drawable, &win_attr ))
|
if (!XGetWindowAttributes( XT_display, dc->u.x.drawable, &win_attr ))
|
||||||
return 0;
|
return 0;
|
||||||
if (win_attr.map_state != IsViewable) return 0;
|
if (win_attr.map_state != IsViewable) return 0;
|
||||||
|
@ -342,7 +354,7 @@ BOOL PaintRgn( HDC hdc, HRGN hrgn )
|
||||||
GetClipBox( hdc, &box );
|
GetClipBox( hdc, &box );
|
||||||
if (DC_SetupGCForBrush( dc ))
|
if (DC_SetupGCForBrush( dc ))
|
||||||
XFillRectangle( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
XFillRectangle( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
box.left, box.top,
|
dc->w.DCOrgX + box.left, dc->w.DCOrgY + box.top,
|
||||||
box.right-box.left, box.bottom-box.top );
|
box.right-box.left, box.bottom-box.top );
|
||||||
|
|
||||||
/* Restore the visible region */
|
/* Restore the visible region */
|
||||||
|
@ -385,15 +397,16 @@ void DrawFocusRect( HDC hdc, LPRECT rc )
|
||||||
|
|
||||||
hPen = CreatePen(PS_DOT, 1, GetSysColor(COLOR_WINDOWTEXT));
|
hPen = CreatePen(PS_DOT, 1, GetSysColor(COLOR_WINDOWTEXT));
|
||||||
hOldPen = (HPEN)SelectObject(hdc, (HANDLE)hPen);
|
hOldPen = (HPEN)SelectObject(hdc, (HANDLE)hPen);
|
||||||
/* oldDrawMode = SetROP2(hdc, R2_XORPEN); */
|
oldDrawMode = SetROP2(hdc, R2_XORPEN);
|
||||||
oldBkMode = SetBkMode(hdc, TRANSPARENT);
|
oldBkMode = SetBkMode(hdc, TRANSPARENT);
|
||||||
|
|
||||||
if (DC_SetupGCForPen( dc ))
|
if (DC_SetupGCForPen( dc ))
|
||||||
XDrawRectangle( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
XDrawRectangle( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
left, top, right-left-1, bottom-top-1 );
|
dc->w.DCOrgX + left, dc->w.DCOrgY + top,
|
||||||
|
right-left-1, bottom-top-1 );
|
||||||
|
|
||||||
SetBkMode(hdc, oldBkMode);
|
SetBkMode(hdc, oldBkMode);
|
||||||
/* SetROP2(hdc, oldDrawMode); */
|
SetROP2(hdc, oldDrawMode);
|
||||||
SelectObject(hdc, (HANDLE)hOldPen);
|
SelectObject(hdc, (HANDLE)hOldPen);
|
||||||
DeleteObject((HANDLE)hPen);
|
DeleteObject((HANDLE)hPen);
|
||||||
}
|
}
|
||||||
|
@ -441,3 +454,64 @@ while(ThickNess > 0) {
|
||||||
SelectObject(hDC, hOldPen);
|
SelectObject(hDC, hOldPen);
|
||||||
DeleteObject(hDKGRAYPen);
|
DeleteObject(hDKGRAYPen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* Polyline (GDI.37)
|
||||||
|
*/
|
||||||
|
BOOL Polyline (HDC hdc, LPPOINT pt, int count)
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
|
||||||
|
|
||||||
|
if (DC_SetupGCForPen( dc ))
|
||||||
|
{
|
||||||
|
for (i = 0; i < count-1; i ++)
|
||||||
|
XDrawLine (XT_display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + XLPTODP(dc, pt [i].x),
|
||||||
|
dc->w.DCOrgY + YLPTODP(dc, pt [i].y),
|
||||||
|
dc->w.DCOrgX + XLPTODP(dc, pt [i+1].x),
|
||||||
|
dc->w.DCOrgY + YLPTODP(dc, pt [i+1].y));
|
||||||
|
XDrawLine (XT_display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + XLPTODP(dc, pt [count-1].x),
|
||||||
|
dc->w.DCOrgY + YLPTODP(dc, pt [count-1].y),
|
||||||
|
dc->w.DCOrgX + XLPTODP(dc, pt [0].x),
|
||||||
|
dc->w.DCOrgY + YLPTODP(dc, pt [0].y));
|
||||||
|
}
|
||||||
|
|
||||||
|
return (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* Polygon (GDI.36)
|
||||||
|
*/
|
||||||
|
BOOL Polygon (HDC hdc, LPPOINT pt, int count)
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
|
||||||
|
XPoint *points = (XPoint *) malloc (sizeof (XPoint) * count+1);
|
||||||
|
|
||||||
|
if (DC_SetupGCForBrush( dc ))
|
||||||
|
{
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
points [i].x = dc->w.DCOrgX + XLPTODP(dc, pt [i].x);
|
||||||
|
points [i].y = dc->w.DCOrgY + YLPTODP(dc, pt [i].y);
|
||||||
|
}
|
||||||
|
points [count] = points [0];
|
||||||
|
|
||||||
|
XFillPolygon( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
points, count, Complex, CoordModeOrigin);
|
||||||
|
|
||||||
|
if (DC_SetupGCForPen ( dc ))
|
||||||
|
{
|
||||||
|
XDrawLines( XT_display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
points, count, CoordModeOrigin );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free ((void *) points);
|
||||||
|
return (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -12,10 +12,8 @@
|
||||||
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <sys/time.h>
|
||||||
#ifdef __NetBSD__
|
#include <sys/types.h>
|
||||||
#define HZ 100
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "message.h"
|
#include "message.h"
|
||||||
#include "win.h"
|
#include "win.h"
|
||||||
|
@ -23,30 +21,72 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
||||||
|
|
||||||
#define MAX_QUEUE_SIZE 120 /* Max. size of a message queue */
|
#define MAX_QUEUE_SIZE 120 /* Max. size of a message queue */
|
||||||
|
|
||||||
extern HWND WIN_FindWinToRepaint( HWND hwnd );
|
extern BOOL TIMER_CheckTimer( DWORD *next ); /* timer.c */
|
||||||
|
|
||||||
extern Display * XT_display;
|
extern Display * XT_display;
|
||||||
extern Screen * XT_screen;
|
extern Screen * XT_screen;
|
||||||
extern XtAppContext XT_app_context;
|
extern XtAppContext XT_app_context;
|
||||||
|
|
||||||
static MESSAGEQUEUE * msgQueue = NULL;
|
/* System message queue (for hardware events) */
|
||||||
|
static HANDLE hmemSysMsgQueue = 0;
|
||||||
|
static MESSAGEQUEUE * sysMsgQueue = NULL;
|
||||||
|
|
||||||
|
/* Application message queue (should be a list, one queue per task) */
|
||||||
|
static HANDLE hmemAppMsgQueue = 0;
|
||||||
|
static MESSAGEQUEUE * appMsgQueue = NULL;
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* MSG_CreateMsgQueue
|
||||||
|
*
|
||||||
|
* Create a message queue.
|
||||||
|
*/
|
||||||
|
static HANDLE MSG_CreateMsgQueue( int size )
|
||||||
|
{
|
||||||
|
HANDLE hQueue;
|
||||||
|
MESSAGEQUEUE * msgQueue;
|
||||||
|
int queueSize;
|
||||||
|
|
||||||
|
queueSize = sizeof(MESSAGEQUEUE) + size * sizeof(QMSG);
|
||||||
|
if (!(hQueue = GlobalAlloc( GMEM_FIXED, queueSize ))) return 0;
|
||||||
|
msgQueue = (MESSAGEQUEUE *) GlobalLock( hQueue );
|
||||||
|
msgQueue->next = 0;
|
||||||
|
msgQueue->hTask = 0;
|
||||||
|
msgQueue->msgSize = sizeof(QMSG);
|
||||||
|
msgQueue->msgCount = 0;
|
||||||
|
msgQueue->nextMessage = 0;
|
||||||
|
msgQueue->nextFreeMessage = 0;
|
||||||
|
msgQueue->queueSize = size;
|
||||||
|
msgQueue->GetMessageTimeVal = 0;
|
||||||
|
msgQueue->GetMessagePosVal = 0;
|
||||||
|
msgQueue->GetMessageExtraInfoVal = 0;
|
||||||
|
msgQueue->lParam = 0;
|
||||||
|
msgQueue->wParam = 0;
|
||||||
|
msgQueue->msg = 0;
|
||||||
|
msgQueue->hWnd = 0;
|
||||||
|
msgQueue->wPostQMsg = 0;
|
||||||
|
msgQueue->wExitCode = 0;
|
||||||
|
msgQueue->InSendMessageHandle = 0;
|
||||||
|
msgQueue->wPaintCount = 0;
|
||||||
|
msgQueue->wTimerCount = 0;
|
||||||
|
msgQueue->tempStatus = 0;
|
||||||
|
msgQueue->status = 0;
|
||||||
|
GlobalUnlock( hQueue );
|
||||||
|
return hQueue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* MSG_GetMessageType
|
* MSG_CreateSysMsgQueue
|
||||||
*
|
*
|
||||||
|
* Create the system message queue. Must be called only once.
|
||||||
*/
|
*/
|
||||||
int MSG_GetMessageType( int msg )
|
BOOL MSG_CreateSysMsgQueue( int size )
|
||||||
{
|
{
|
||||||
if ((msg >= WM_KEYFIRST) && (msg <= WM_KEYLAST)) return QS_KEY;
|
if (size > MAX_QUEUE_SIZE) size = MAX_QUEUE_SIZE;
|
||||||
else if ((msg >= WM_MOUSEFIRST) && (msg <= WM_MOUSELAST))
|
else if (size <= 0) size = 1;
|
||||||
{
|
if (!(hmemSysMsgQueue = MSG_CreateMsgQueue( size ))) return FALSE;
|
||||||
if (msg == WM_MOUSEMOVE) return QS_MOUSEMOVE;
|
sysMsgQueue = (MESSAGEQUEUE *) GlobalLock( hmemSysMsgQueue );
|
||||||
else return QS_MOUSEBUTTON;
|
return TRUE;
|
||||||
}
|
|
||||||
else if (msg == WM_PAINT) return QS_PAINT;
|
|
||||||
else if (msg == WM_TIMER) return QS_TIMER;
|
|
||||||
return QS_POSTMESSAGE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -55,16 +95,13 @@ int MSG_GetMessageType( int msg )
|
||||||
*
|
*
|
||||||
* Add a message to the queue. Return FALSE if queue is full.
|
* Add a message to the queue. Return FALSE if queue is full.
|
||||||
*/
|
*/
|
||||||
int MSG_AddMsg( MSG * msg, DWORD extraInfo )
|
static int MSG_AddMsg( MESSAGEQUEUE * msgQueue, MSG * msg, DWORD extraInfo )
|
||||||
{
|
{
|
||||||
int pos, type;
|
int pos;
|
||||||
|
|
||||||
if (!msgQueue) return FALSE;
|
if (!msgQueue) return FALSE;
|
||||||
pos = msgQueue->nextFreeMessage;
|
pos = msgQueue->nextFreeMessage;
|
||||||
|
|
||||||
/* No need to store WM_PAINT messages */
|
|
||||||
if (msg->message == WM_PAINT) return TRUE;
|
|
||||||
|
|
||||||
/* Check if queue is full */
|
/* Check if queue is full */
|
||||||
if ((pos == msgQueue->nextMessage) && (msgQueue->msgCount > 0))
|
if ((pos == msgQueue->nextMessage) && (msgQueue->msgCount > 0))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -72,17 +109,12 @@ int MSG_AddMsg( MSG * msg, DWORD extraInfo )
|
||||||
/* Store message */
|
/* Store message */
|
||||||
msgQueue->messages[pos].msg = *msg;
|
msgQueue->messages[pos].msg = *msg;
|
||||||
msgQueue->messages[pos].extraInfo = extraInfo;
|
msgQueue->messages[pos].extraInfo = extraInfo;
|
||||||
|
|
||||||
/* Store message type */
|
|
||||||
type = MSG_GetMessageType( msg->message );
|
|
||||||
msgQueue->status |= type;
|
|
||||||
msgQueue->tempStatus |= type;
|
|
||||||
|
|
||||||
if (pos < msgQueue->queueSize-1) pos++;
|
if (pos < msgQueue->queueSize-1) pos++;
|
||||||
else pos = 0;
|
else pos = 0;
|
||||||
msgQueue->nextFreeMessage = pos;
|
msgQueue->nextFreeMessage = pos;
|
||||||
msgQueue->msgCount++;
|
msgQueue->msgCount++;
|
||||||
|
msgQueue->status |= QS_POSTMESSAGE;
|
||||||
|
msgQueue->tempStatus |= QS_POSTMESSAGE;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,7 +124,7 @@ int MSG_AddMsg( MSG * msg, DWORD extraInfo )
|
||||||
*
|
*
|
||||||
* Find a message matching the given parameters. Return -1 if none available.
|
* Find a message matching the given parameters. Return -1 if none available.
|
||||||
*/
|
*/
|
||||||
int MSG_FindMsg( HWND hwnd, int first, int last )
|
static int MSG_FindMsg(MESSAGEQUEUE * msgQueue, HWND hwnd, int first, int last)
|
||||||
{
|
{
|
||||||
int i, pos = msgQueue->nextMessage;
|
int i, pos = msgQueue->nextMessage;
|
||||||
|
|
||||||
|
@ -120,9 +152,8 @@ int MSG_FindMsg( HWND hwnd, int first, int last )
|
||||||
*
|
*
|
||||||
* Remove a message from the queue (pos must be a valid position).
|
* Remove a message from the queue (pos must be a valid position).
|
||||||
*/
|
*/
|
||||||
void MSG_RemoveMsg( int pos )
|
static void MSG_RemoveMsg( MESSAGEQUEUE * msgQueue, int pos )
|
||||||
{
|
{
|
||||||
int i, type;
|
|
||||||
QMSG * qmsg;
|
QMSG * qmsg;
|
||||||
|
|
||||||
if (!msgQueue) return;
|
if (!msgQueue) return;
|
||||||
|
@ -147,56 +178,118 @@ void MSG_RemoveMsg( int pos )
|
||||||
else msgQueue->nextFreeMessage = msgQueue->queueSize-1;
|
else msgQueue->nextFreeMessage = msgQueue->queueSize-1;
|
||||||
}
|
}
|
||||||
msgQueue->msgCount--;
|
msgQueue->msgCount--;
|
||||||
|
if (!msgQueue->msgCount) msgQueue->status &= ~QS_POSTMESSAGE;
|
||||||
/* Recalc status */
|
|
||||||
type = 0;
|
|
||||||
pos = msgQueue->nextMessage;
|
|
||||||
for (i = 0; i < msgQueue->msgCount; i++)
|
|
||||||
{
|
|
||||||
type |= MSG_GetMessageType( msgQueue->messages[pos].msg.message );
|
|
||||||
if (++pos >= msgQueue->queueSize-1) pos = 0;
|
|
||||||
}
|
|
||||||
msgQueue->status = (msgQueue->status & QS_SENDMESSAGE) | type;
|
|
||||||
msgQueue->tempStatus = 0;
|
msgQueue->tempStatus = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* MSG_IncPaintCount
|
||||||
|
*/
|
||||||
|
void MSG_IncPaintCount( HANDLE hQueue )
|
||||||
|
{
|
||||||
|
if (hQueue != hmemAppMsgQueue) return;
|
||||||
|
appMsgQueue->wPaintCount++;
|
||||||
|
appMsgQueue->status |= QS_PAINT;
|
||||||
|
appMsgQueue->tempStatus |= QS_PAINT;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* MSG_DecPaintCount
|
||||||
|
*/
|
||||||
|
void MSG_DecPaintCount( HANDLE hQueue )
|
||||||
|
{
|
||||||
|
if (hQueue != hmemAppMsgQueue) return;
|
||||||
|
appMsgQueue->wPaintCount--;
|
||||||
|
if (!appMsgQueue->wPaintCount) appMsgQueue->status &= ~QS_PAINT;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* MSG_IncTimerCount
|
||||||
|
*/
|
||||||
|
void MSG_IncTimerCount( HANDLE hQueue )
|
||||||
|
{
|
||||||
|
if (hQueue != hmemAppMsgQueue) return;
|
||||||
|
appMsgQueue->wTimerCount++;
|
||||||
|
appMsgQueue->status |= QS_TIMER;
|
||||||
|
appMsgQueue->tempStatus |= QS_TIMER;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* MSG_DecTimerCount
|
||||||
|
*/
|
||||||
|
void MSG_DecTimerCount( HANDLE hQueue )
|
||||||
|
{
|
||||||
|
if (hQueue != hmemAppMsgQueue) return;
|
||||||
|
appMsgQueue->wTimerCount--;
|
||||||
|
if (!appMsgQueue->wTimerCount) appMsgQueue->status &= ~QS_TIMER;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* hardware_event
|
||||||
|
*
|
||||||
|
* Add an event to the system message queue.
|
||||||
|
*/
|
||||||
|
void hardware_event( HWND hwnd, WORD message, WORD wParam, LONG lParam,
|
||||||
|
WORD xPos, WORD yPos, DWORD time, DWORD extraInfo )
|
||||||
|
{
|
||||||
|
MSG msg;
|
||||||
|
|
||||||
|
msg.hwnd = hwnd;
|
||||||
|
msg.message = message;
|
||||||
|
msg.wParam = wParam;
|
||||||
|
msg.lParam = lParam;
|
||||||
|
msg.time = time;
|
||||||
|
msg.pt.x = xPos;
|
||||||
|
msg.pt.y = yPos;
|
||||||
|
if (!MSG_AddMsg( sysMsgQueue, &msg, extraInfo ))
|
||||||
|
printf( "hardware_event: Queue is full\n" );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* SetTaskQueue (KERNEL.34)
|
||||||
|
*/
|
||||||
|
WORD SetTaskQueue( HANDLE hTask, HANDLE hQueue )
|
||||||
|
{
|
||||||
|
HANDLE prev = hmemAppMsgQueue;
|
||||||
|
hmemAppMsgQueue = hQueue;
|
||||||
|
return prev;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* GetTaskQueue (KERNEL.35)
|
||||||
|
*/
|
||||||
|
WORD GetTaskQueue( HANDLE hTask )
|
||||||
|
{
|
||||||
|
return hmemAppMsgQueue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* SetMessageQueue (USER.266)
|
* SetMessageQueue (USER.266)
|
||||||
*/
|
*/
|
||||||
BOOL SetMessageQueue( int size )
|
BOOL SetMessageQueue( int size )
|
||||||
{
|
{
|
||||||
int queueSize;
|
HANDLE hQueue;
|
||||||
|
|
||||||
|
if ((size > MAX_QUEUE_SIZE) || (size <= 0)) return TRUE;
|
||||||
|
|
||||||
/* Free the old message queue */
|
/* Free the old message queue */
|
||||||
if (msgQueue) free(msgQueue);
|
if ((hQueue = GetTaskQueue(0)) != 0)
|
||||||
|
{
|
||||||
if ((size > MAX_QUEUE_SIZE) || (size <= 0)) return FALSE;
|
GlobalUnlock( hQueue );
|
||||||
|
GlobalFree( hQueue );
|
||||||
queueSize = sizeof(MESSAGEQUEUE) + size * sizeof(QMSG);
|
}
|
||||||
msgQueue = (MESSAGEQUEUE *) malloc(queueSize);
|
|
||||||
if (!msgQueue) return FALSE;
|
|
||||||
|
|
||||||
msgQueue->next = 0;
|
|
||||||
msgQueue->hTask = 0;
|
|
||||||
msgQueue->msgSize = sizeof(QMSG);
|
|
||||||
msgQueue->msgCount = 0;
|
|
||||||
msgQueue->nextMessage = 0;
|
|
||||||
msgQueue->nextFreeMessage = 0;
|
|
||||||
msgQueue->queueSize = size;
|
|
||||||
msgQueue->GetMessageTimeVal = 0;
|
|
||||||
msgQueue->GetMessagePosVal = 0;
|
|
||||||
msgQueue->GetMessageExtraInfoVal = 0;
|
|
||||||
msgQueue->lParam = 0;
|
|
||||||
msgQueue->wParam = 0;
|
|
||||||
msgQueue->msg = 0;
|
|
||||||
msgQueue->hWnd = 0;
|
|
||||||
msgQueue->wPostQMsg = 0;
|
|
||||||
msgQueue->wExitCode = 0;
|
|
||||||
msgQueue->InSendMessageHandle = 0;
|
|
||||||
msgQueue->tempStatus = 0;
|
|
||||||
msgQueue->status = 0;
|
|
||||||
|
|
||||||
|
if (!(hQueue = MSG_CreateMsgQueue( size ))) return FALSE;
|
||||||
|
SetTaskQueue( 0, hQueue );
|
||||||
|
appMsgQueue = (MESSAGEQUEUE *)GlobalLock( hQueue );
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -206,9 +299,9 @@ BOOL SetMessageQueue( int size )
|
||||||
*/
|
*/
|
||||||
void PostQuitMessage( int exitCode )
|
void PostQuitMessage( int exitCode )
|
||||||
{
|
{
|
||||||
if (!msgQueue) return;
|
if (!appMsgQueue) return;
|
||||||
msgQueue->wPostQMsg = TRUE;
|
appMsgQueue->wPostQMsg = TRUE;
|
||||||
msgQueue->wExitCode = exitCode;
|
appMsgQueue->wExitCode = exitCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -217,12 +310,8 @@ void PostQuitMessage( int exitCode )
|
||||||
*/
|
*/
|
||||||
DWORD GetQueueStatus( int flags )
|
DWORD GetQueueStatus( int flags )
|
||||||
{
|
{
|
||||||
unsigned long ret = (msgQueue->status << 16) | msgQueue->tempStatus;
|
unsigned long ret = (appMsgQueue->status << 16) | appMsgQueue->tempStatus;
|
||||||
if (flags & QS_PAINT)
|
appMsgQueue->tempStatus = 0;
|
||||||
{
|
|
||||||
if (WIN_FindWinToRepaint(0)) ret |= QS_PAINT | (QS_PAINT << 16);
|
|
||||||
}
|
|
||||||
msgQueue->tempStatus = 0;
|
|
||||||
return ret & ((flags << 16) | flags);
|
return ret & ((flags << 16) | flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -232,70 +321,169 @@ DWORD GetQueueStatus( int flags )
|
||||||
*/
|
*/
|
||||||
BOOL GetInputState()
|
BOOL GetInputState()
|
||||||
{
|
{
|
||||||
return msgQueue->status & (QS_KEY | QS_MOUSEBUTTON);
|
return appMsgQueue->status & (QS_KEY | QS_MOUSEBUTTON);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef USE_XLIB
|
||||||
|
static XtIntervalId xt_timer = 0;
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* MSG_TimerCallback
|
||||||
|
*/
|
||||||
|
static void MSG_TimerCallback( XtPointer data, XtIntervalId * xtid )
|
||||||
|
{
|
||||||
|
DWORD nextExp;
|
||||||
|
TIMER_CheckTimer( &nextExp );
|
||||||
|
if (nextExp != (DWORD)-1)
|
||||||
|
xt_timer = XtAppAddTimeOut( XT_app_context, nextExp,
|
||||||
|
MSG_TimerCallback, NULL );
|
||||||
|
else xt_timer = 0;
|
||||||
|
}
|
||||||
|
#endif /* USE_XLIB */
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* MSG_PeekMessage
|
* MSG_PeekMessage
|
||||||
*/
|
*/
|
||||||
BOOL MSG_PeekMessage( LPMSG msg, HWND hwnd, WORD first, WORD last, WORD flags )
|
static BOOL MSG_PeekMessage( MESSAGEQUEUE * msgQueue, LPMSG msg, HWND hwnd,
|
||||||
|
WORD first, WORD last, WORD flags, BOOL peek )
|
||||||
{
|
{
|
||||||
int pos;
|
int pos, mask;
|
||||||
|
DWORD nextExp; /* Next timer expiration time */
|
||||||
|
#ifdef USE_XLIB
|
||||||
|
XEvent event;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* First handle a WM_QUIT message */
|
if (first || last)
|
||||||
if (msgQueue->wPostQMsg)
|
|
||||||
{
|
{
|
||||||
msg->hwnd = hwnd;
|
mask = QS_POSTMESSAGE; /* Always selectioned */
|
||||||
msg->message = WM_QUIT;
|
if ((first <= WM_KEYLAST) && (last >= WM_KEYFIRST)) mask |= QS_KEY;
|
||||||
msg->wParam = msgQueue->wExitCode;
|
if ((first <= WM_MOUSELAST) && (last >= WM_MOUSEFIRST)) mask |= QS_MOUSE;
|
||||||
msg->lParam = 0;
|
if ((first <= WM_TIMER) && (last >= WM_TIMER)) mask |= WM_TIMER;
|
||||||
return TRUE;
|
if ((first <= WM_SYSTIMER) && (last >= WM_SYSTIMER)) mask |= WM_TIMER;
|
||||||
|
if ((first <= WM_PAINT) && (last >= WM_PAINT)) mask |= WM_PAINT;
|
||||||
}
|
}
|
||||||
|
else mask = QS_MOUSE | QS_KEY | QS_POSTMESSAGE | QS_TIMER | QS_PAINT;
|
||||||
|
|
||||||
/* Then handle a message put by SendMessage() */
|
#ifdef USE_XLIB
|
||||||
if (msgQueue->status & QS_SENDMESSAGE)
|
while (XPending( XT_display ))
|
||||||
{
|
{
|
||||||
if (!hwnd || (msgQueue->hWnd == hwnd))
|
XNextEvent( XT_display, &event );
|
||||||
|
EVENT_ProcessEvent( &event );
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
while (XtAppPending( XT_app_context ))
|
||||||
|
XtAppProcessEvent( XT_app_context, XtIMAll );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
/* First handle a WM_QUIT message */
|
||||||
|
if (msgQueue->wPostQMsg)
|
||||||
{
|
{
|
||||||
if ((!first && !last) ||
|
msg->hwnd = hwnd;
|
||||||
((msgQueue->msg >= first) && (msgQueue->msg <= last)))
|
msg->message = WM_QUIT;
|
||||||
|
msg->wParam = msgQueue->wExitCode;
|
||||||
|
msg->lParam = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Then handle a message put by SendMessage() */
|
||||||
|
if (msgQueue->status & QS_SENDMESSAGE)
|
||||||
|
{
|
||||||
|
if (!hwnd || (msgQueue->hWnd == hwnd))
|
||||||
{
|
{
|
||||||
msg->hwnd = msgQueue->hWnd;
|
if ((!first && !last) ||
|
||||||
msg->message = msgQueue->msg;
|
((msgQueue->msg >= first) && (msgQueue->msg <= last)))
|
||||||
msg->wParam = msgQueue->wParam;
|
{
|
||||||
msg->lParam = msgQueue->lParam;
|
msg->hwnd = msgQueue->hWnd;
|
||||||
if (flags & PM_REMOVE) msgQueue->status &= ~QS_SENDMESSAGE;
|
msg->message = msgQueue->msg;
|
||||||
return TRUE;
|
msg->wParam = msgQueue->wParam;
|
||||||
|
msg->lParam = msgQueue->lParam;
|
||||||
|
if (flags & PM_REMOVE) msgQueue->status &= ~QS_SENDMESSAGE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Now find a normal message */
|
||||||
|
pos = MSG_FindMsg( msgQueue, hwnd, first, last );
|
||||||
|
if (pos != -1)
|
||||||
|
{
|
||||||
|
QMSG *qmsg = &msgQueue->messages[pos];
|
||||||
|
*msg = qmsg->msg;
|
||||||
|
msgQueue->GetMessageTimeVal = msg->time;
|
||||||
|
msgQueue->GetMessagePosVal = *(DWORD *)&msg->pt;
|
||||||
|
msgQueue->GetMessageExtraInfoVal = qmsg->extraInfo;
|
||||||
|
|
||||||
|
if (flags & PM_REMOVE) MSG_RemoveMsg( msgQueue, pos );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now find a hardware event */
|
||||||
|
pos = MSG_FindMsg( sysMsgQueue, hwnd, first, last );
|
||||||
|
if (pos != -1)
|
||||||
|
{
|
||||||
|
QMSG *qmsg = &sysMsgQueue->messages[pos];
|
||||||
|
*msg = qmsg->msg;
|
||||||
|
msgQueue->GetMessageTimeVal = msg->time;
|
||||||
|
msgQueue->GetMessagePosVal = *(DWORD *)&msg->pt;
|
||||||
|
msgQueue->GetMessageExtraInfoVal = qmsg->extraInfo;
|
||||||
|
|
||||||
|
if (flags & PM_REMOVE) MSG_RemoveMsg( sysMsgQueue, pos );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now find a WM_PAINT message */
|
||||||
|
if ((msgQueue->status & QS_PAINT) && (mask & QS_PAINT))
|
||||||
|
{
|
||||||
|
msg->hwnd = WIN_FindWinToRepaint( hwnd );
|
||||||
|
msg->message = WM_PAINT;
|
||||||
|
msg->wParam = 0;
|
||||||
|
msg->lParam = 0;
|
||||||
|
if (msg->hwnd != 0) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finally handle WM_TIMER messages */
|
||||||
|
if ((msgQueue->status & QS_TIMER) && (mask & QS_TIMER))
|
||||||
|
{
|
||||||
|
BOOL posted = TIMER_CheckTimer( &nextExp );
|
||||||
|
#ifndef USE_XLIB
|
||||||
|
if (xt_timer) XtRemoveTimeOut( xt_timer );
|
||||||
|
if (nextExp != (DWORD)-1)
|
||||||
|
xt_timer = XtAppAddTimeOut( XT_app_context, nextExp,
|
||||||
|
MSG_TimerCallback, NULL );
|
||||||
|
else xt_timer = 0;
|
||||||
|
#endif
|
||||||
|
if (posted) continue; /* Restart the whole thing */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Wait until something happens */
|
||||||
|
if (peek) return FALSE;
|
||||||
|
#ifdef USE_XLIB
|
||||||
|
if (!XPending( XT_display ) && (nextExp != -1))
|
||||||
|
{
|
||||||
|
fd_set read_set;
|
||||||
|
struct timeval timeout;
|
||||||
|
int fd = ConnectionNumber(XT_display);
|
||||||
|
FD_ZERO( &read_set );
|
||||||
|
FD_SET( fd, &read_set );
|
||||||
|
timeout.tv_sec = nextExp / 1000;
|
||||||
|
timeout.tv_usec = (nextExp % 1000) * 1000;
|
||||||
|
if (select( fd+1, &read_set, NULL, NULL, &timeout ) != 1)
|
||||||
|
continue; /* On timeout or error, restart from the start */
|
||||||
|
}
|
||||||
|
XNextEvent( XT_display, &event );
|
||||||
|
EVENT_ProcessEvent( &event );
|
||||||
|
#else
|
||||||
|
XtAppProcessEvent( XT_app_context, XtIMAll );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now find a normal message */
|
/* We got a message */
|
||||||
pos = MSG_FindMsg( hwnd, first, last );
|
if (peek) return TRUE;
|
||||||
if (pos != -1)
|
else return (msg->message != WM_QUIT);
|
||||||
{
|
|
||||||
QMSG *qmsg = &msgQueue->messages[pos];
|
|
||||||
*msg = qmsg->msg;
|
|
||||||
msgQueue->GetMessageTimeVal = msg->time;
|
|
||||||
msgQueue->GetMessagePosVal = *(DWORD *)&msg->pt;
|
|
||||||
msgQueue->GetMessageExtraInfoVal = qmsg->extraInfo;
|
|
||||||
|
|
||||||
if (flags & PM_REMOVE) MSG_RemoveMsg(pos);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If nothing else, return a WM_PAINT message */
|
|
||||||
if ((!first && !last) || ((first <= WM_PAINT) && (last >= WM_PAINT)))
|
|
||||||
{
|
|
||||||
msg->hwnd = WIN_FindWinToRepaint( hwnd );
|
|
||||||
msg->message = WM_PAINT;
|
|
||||||
msg->wParam = 0;
|
|
||||||
msg->lParam = 0;
|
|
||||||
return (msg->hwnd != 0);
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -304,10 +492,7 @@ BOOL MSG_PeekMessage( LPMSG msg, HWND hwnd, WORD first, WORD last, WORD flags )
|
||||||
*/
|
*/
|
||||||
BOOL PeekMessage( LPMSG msg, HWND hwnd, WORD first, WORD last, WORD flags )
|
BOOL PeekMessage( LPMSG msg, HWND hwnd, WORD first, WORD last, WORD flags )
|
||||||
{
|
{
|
||||||
while (XtAppPending( XT_app_context ))
|
return MSG_PeekMessage( appMsgQueue, msg, hwnd, first, last, flags, TRUE );
|
||||||
XtAppProcessEvent( XT_app_context, XtIMAll );
|
|
||||||
|
|
||||||
return MSG_PeekMessage( msg, hwnd, first, last, flags );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -316,13 +501,7 @@ BOOL PeekMessage( LPMSG msg, HWND hwnd, WORD first, WORD last, WORD flags )
|
||||||
*/
|
*/
|
||||||
BOOL GetMessage( LPMSG msg, HWND hwnd, WORD first, WORD last )
|
BOOL GetMessage( LPMSG msg, HWND hwnd, WORD first, WORD last )
|
||||||
{
|
{
|
||||||
while(1)
|
return MSG_PeekMessage( appMsgQueue, msg, hwnd, first, last, PM_REMOVE, FALSE );
|
||||||
{
|
|
||||||
if (MSG_PeekMessage( msg, hwnd, first, last, PM_REMOVE )) break;
|
|
||||||
XtAppProcessEvent( XT_app_context, XtIMAll );
|
|
||||||
}
|
|
||||||
|
|
||||||
return (msg->message != WM_QUIT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -341,7 +520,7 @@ BOOL PostMessage( HWND hwnd, WORD message, WORD wParam, LONG lParam )
|
||||||
msg.pt.x = 0;
|
msg.pt.x = 0;
|
||||||
msg.pt.y = 0;
|
msg.pt.y = 0;
|
||||||
|
|
||||||
return MSG_AddMsg( &msg, 0 );
|
return MSG_AddMsg( appMsgQueue, &msg, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -380,16 +559,39 @@ BOOL TranslateMessage( LPMSG msg )
|
||||||
*/
|
*/
|
||||||
LONG DispatchMessage( LPMSG msg )
|
LONG DispatchMessage( LPMSG msg )
|
||||||
{
|
{
|
||||||
WND * wndPtr = WIN_FindWndPtr( msg->hwnd );
|
WND * wndPtr;
|
||||||
|
LONG retval;
|
||||||
|
int painting;
|
||||||
|
|
||||||
#ifdef DEBUG_MSG
|
#ifdef DEBUG_MSG
|
||||||
printf( "Dispatch message hwnd=%08x msg=%d w=%d l=%d time=%u pt=%d,%d\n",
|
printf( "Dispatch message hwnd=%08x msg=%d w=%d l=%d time=%u pt=%d,%d\n",
|
||||||
msg->hwnd, msg->message, msg->wParam, msg->lParam,
|
msg->hwnd, msg->message, msg->wParam, msg->lParam,
|
||||||
msg->time, msg->pt.x, msg->pt.y );
|
msg->time, msg->pt.x, msg->pt.y );
|
||||||
#endif
|
#endif
|
||||||
if (!wndPtr) return 0;
|
|
||||||
return CallWindowProc( wndPtr->lpfnWndProc, msg->hwnd, msg->message,
|
/* Process timer messages */
|
||||||
msg->wParam, msg->lParam );
|
if ((msg->message == WM_TIMER) || (msg->message == WM_SYSTIMER))
|
||||||
|
{
|
||||||
|
if (msg->lParam)
|
||||||
|
return CallWindowProc( (FARPROC)msg->lParam, msg->hwnd,
|
||||||
|
msg->message, msg->wParam, GetTickCount() );
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!msg->hwnd) return 0;
|
||||||
|
if (!(wndPtr = WIN_FindWndPtr( msg->hwnd ))) return 0;
|
||||||
|
if (!wndPtr->lpfnWndProc) return 0;
|
||||||
|
painting = (msg->message == WM_PAINT);
|
||||||
|
if (painting) wndPtr->flags |= WIN_NEEDS_BEGINPAINT;
|
||||||
|
retval = CallWindowProc( wndPtr->lpfnWndProc, msg->hwnd, msg->message,
|
||||||
|
msg->wParam, msg->lParam );
|
||||||
|
if (painting && (wndPtr->flags & WIN_NEEDS_BEGINPAINT))
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_WIN
|
||||||
|
printf( "BeginPaint not called on WM_PAINT!\n" );
|
||||||
|
#endif
|
||||||
|
wndPtr->flags &= ~WIN_NEEDS_BEGINPAINT;
|
||||||
|
}
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -398,7 +600,7 @@ LONG DispatchMessage( LPMSG msg )
|
||||||
*/
|
*/
|
||||||
DWORD GetMessagePos(void)
|
DWORD GetMessagePos(void)
|
||||||
{
|
{
|
||||||
return msgQueue->GetMessagePosVal;
|
return appMsgQueue->GetMessagePosVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -407,14 +609,27 @@ DWORD GetMessagePos(void)
|
||||||
*/
|
*/
|
||||||
LONG GetMessageTime(void)
|
LONG GetMessageTime(void)
|
||||||
{
|
{
|
||||||
return msgQueue->GetMessageTimeVal;
|
return appMsgQueue->GetMessageTimeVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* GetMessageExtraInfo (USER.288)
|
* GetMessageExtraInfo (USER.288)
|
||||||
*/
|
*/
|
||||||
LONG GetMessageExtraInfo(void)
|
LONG GetMessageExtraInfo(void)
|
||||||
{
|
{
|
||||||
return msgQueue->GetMessageExtraInfoVal;
|
return appMsgQueue->GetMessageExtraInfoVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* RegisterWindowMessage (USER.118)
|
||||||
|
*/
|
||||||
|
WORD RegisterWindowMessage( LPCSTR str )
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_MSG
|
||||||
|
printf( "RegisterWindowMessage: '%s'\n", str );
|
||||||
|
#endif
|
||||||
|
return GlobalAddAtom( str );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,7 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
|
|
||||||
#include "win.h"
|
#include "win.h"
|
||||||
|
#include "message.h"
|
||||||
|
|
||||||
/* Last CTLCOLOR id */
|
/* Last CTLCOLOR id */
|
||||||
#define CTLCOLOR_MAX CTLCOLOR_STATIC
|
#define CTLCOLOR_MAX CTLCOLOR_STATIC
|
||||||
|
@ -23,23 +24,17 @@ HDC BeginPaint( HWND hwnd, LPPAINTSTRUCT lps )
|
||||||
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
||||||
if (!wndPtr) return 0;
|
if (!wndPtr) return 0;
|
||||||
|
|
||||||
lps->hdc = GetDC( hwnd );
|
if (!(lps->hdc = GetDCEx( hwnd, wndPtr->hrgnUpdate,
|
||||||
if (!lps->hdc) return 0;
|
DCX_INTERSECTRGN | DCX_USESTYLE ))) return 0;
|
||||||
|
GetRgnBox( InquireVisRgn(lps->hdc), &lps->rcPaint );
|
||||||
|
|
||||||
SelectVisRgn( lps->hdc, wndPtr->hrgnUpdate );
|
|
||||||
if (wndPtr->hrgnUpdate)
|
if (wndPtr->hrgnUpdate)
|
||||||
{
|
{
|
||||||
GetRgnBox( wndPtr->hrgnUpdate, &lps->rcPaint );
|
|
||||||
DeleteObject( wndPtr->hrgnUpdate );
|
DeleteObject( wndPtr->hrgnUpdate );
|
||||||
wndPtr->hrgnUpdate = 0;
|
wndPtr->hrgnUpdate = 0;
|
||||||
|
MSG_DecPaintCount( wndPtr->hmemTaskQ );
|
||||||
}
|
}
|
||||||
else
|
wndPtr->flags &= ~WIN_NEEDS_BEGINPAINT;
|
||||||
{
|
|
||||||
lps->rcPaint.left = 0;
|
|
||||||
lps->rcPaint.top = 0;
|
|
||||||
lps->rcPaint.right = wndPtr->rectClient.right-wndPtr->rectClient.left;
|
|
||||||
lps->rcPaint.bottom = wndPtr->rectClient.bottom-wndPtr->rectClient.top;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(wndPtr->flags & WIN_ERASE_UPDATERGN)) lps->fErase = TRUE;
|
if (!(wndPtr->flags & WIN_ERASE_UPDATERGN)) lps->fErase = TRUE;
|
||||||
else lps->fErase = !SendMessage( hwnd, WM_ERASEBKGND, lps->hdc, 0 );
|
else lps->fErase = !SendMessage( hwnd, WM_ERASEBKGND, lps->hdc, 0 );
|
||||||
|
@ -63,12 +58,7 @@ void EndPaint( HWND hwnd, LPPAINTSTRUCT lps )
|
||||||
void FillWindow( HWND hwndParent, HWND hwnd, HDC hdc, HBRUSH hbrush )
|
void FillWindow( HWND hwndParent, HWND hwnd, HDC hdc, HBRUSH hbrush )
|
||||||
{
|
{
|
||||||
RECT rect;
|
RECT rect;
|
||||||
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
GetClientRect( hwnd, &rect );
|
||||||
if (!wndPtr) return;
|
|
||||||
rect.left = 0;
|
|
||||||
rect.top = 0;
|
|
||||||
rect.right = wndPtr->rectClient.right - wndPtr->rectClient.left;
|
|
||||||
rect.bottom = wndPtr->rectClient.bottom - wndPtr->rectClient.top;
|
|
||||||
PaintRect( hwndParent, hwnd, hdc, hbrush, &rect );
|
PaintRect( hwndParent, hwnd, hdc, hbrush, &rect );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
122
windows/timer.c
122
windows/timer.c
|
@ -6,21 +6,19 @@
|
||||||
|
|
||||||
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
||||||
|
|
||||||
#include <X11/Intrinsic.h>
|
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
|
#include "message.h"
|
||||||
extern XtAppContext XT_app_context;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct tagTIMER
|
||||||
{
|
{
|
||||||
HWND hwnd;
|
HWND hwnd;
|
||||||
WORD msg; /* WM_TIMER or WM_SYSTIMER */
|
WORD msg; /* WM_TIMER or WM_SYSTIMER */
|
||||||
WORD id;
|
WORD id;
|
||||||
WORD timeout;
|
WORD timeout;
|
||||||
FARPROC proc;
|
struct tagTIMER *next;
|
||||||
XtIntervalId xtid;
|
DWORD expires;
|
||||||
|
FARPROC proc;
|
||||||
} TIMER;
|
} TIMER;
|
||||||
|
|
||||||
#define NB_TIMERS 34
|
#define NB_TIMERS 34
|
||||||
|
@ -28,35 +26,96 @@ typedef struct
|
||||||
|
|
||||||
static TIMER TimersArray[NB_TIMERS];
|
static TIMER TimersArray[NB_TIMERS];
|
||||||
|
|
||||||
|
static TIMER * pNextTimer = NULL; /* Next timer to expire */
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* TIMER_callback
|
* TIMER_InsertTimer
|
||||||
|
*
|
||||||
|
* Insert the timer at its place in the chain.
|
||||||
*/
|
*/
|
||||||
static void TIMER_callback( XtPointer data, XtIntervalId * xtid )
|
static void TIMER_InsertTimer( TIMER * pTimer )
|
||||||
{
|
{
|
||||||
TIMER * pTimer = (TIMER *) data;
|
if (!pNextTimer || (pTimer->expires < pNextTimer->expires))
|
||||||
|
|
||||||
pTimer->xtid = 0; /* In case the timer procedure calls KillTimer */
|
|
||||||
|
|
||||||
if (pTimer->proc)
|
|
||||||
{
|
{
|
||||||
CallWindowProc(pTimer->proc, pTimer->hwnd, pTimer->msg,
|
pTimer->next = pNextTimer;
|
||||||
pTimer->id, GetTickCount());
|
pNextTimer = pTimer;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
PostMessage( pTimer->hwnd, pTimer->msg, pTimer->id, 0 );
|
{
|
||||||
|
TIMER * ptr = pNextTimer;
|
||||||
|
while (ptr->next && (pTimer->expires >= ptr->next->expires))
|
||||||
|
ptr = ptr->next;
|
||||||
|
pTimer->next = ptr;
|
||||||
|
ptr->next = pTimer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* TIMER_RemoveTimer
|
||||||
|
*
|
||||||
|
* Remove the timer from the chain.
|
||||||
|
*/
|
||||||
|
static void TIMER_RemoveTimer( TIMER * pTimer )
|
||||||
|
{
|
||||||
|
if (pTimer == pNextTimer) pNextTimer = pTimer->next;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TIMER * ptr = pNextTimer;
|
||||||
|
while (ptr && (ptr->next != pTimer)) ptr = ptr->next;
|
||||||
|
if (ptr) ptr->next = pTimer->next;
|
||||||
|
}
|
||||||
|
pTimer->next = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* TIMER_NextExpire
|
||||||
|
*
|
||||||
|
* Return time until next timer expiration (-1 if none).
|
||||||
|
*/
|
||||||
|
static DWORD TIMER_NextExpire( DWORD curTime )
|
||||||
|
{
|
||||||
|
if (!pNextTimer) return -1;
|
||||||
|
if (pNextTimer->expires <= curTime) return 0;
|
||||||
|
return pNextTimer->expires - curTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* TIMER_CheckTimer
|
||||||
|
*
|
||||||
|
* Check whether a timer has expired, and post a message if necessary.
|
||||||
|
* Return TRUE if msg posted, and return time until next expiration in 'next'.
|
||||||
|
*/
|
||||||
|
BOOL TIMER_CheckTimer( DWORD *next )
|
||||||
|
{
|
||||||
|
TIMER * pTimer = pNextTimer;
|
||||||
|
DWORD curTime = GetTickCount();
|
||||||
|
|
||||||
|
if ((*next = TIMER_NextExpire( curTime )) != 0) return FALSE;
|
||||||
|
|
||||||
|
PostMessage( pTimer->hwnd, pTimer->msg, pTimer->id, (LONG)pTimer->proc );
|
||||||
|
TIMER_RemoveTimer( pTimer );
|
||||||
|
|
||||||
/* If timeout == 0, the timer has been removed by KillTimer */
|
/* If timeout == 0, the timer has been removed by KillTimer */
|
||||||
if (pTimer->timeout)
|
if (pTimer->timeout)
|
||||||
pTimer->xtid = XtAppAddTimeOut( XT_app_context, pTimer->timeout,
|
{
|
||||||
TIMER_callback, pTimer );
|
/* Restart the timer */
|
||||||
|
pTimer->expires = curTime + pTimer->timeout;
|
||||||
|
TIMER_InsertTimer( pTimer );
|
||||||
|
}
|
||||||
|
*next = TIMER_NextExpire( curTime );
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* TIMER_SetTimer
|
* TIMER_SetTimer
|
||||||
*/
|
*/
|
||||||
WORD TIMER_SetTimer( HWND hwnd, WORD id, WORD timeout, FARPROC proc, BOOL sys )
|
static WORD TIMER_SetTimer( HWND hwnd, WORD id, WORD timeout,
|
||||||
|
FARPROC proc, BOOL sys )
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
TIMER * pTimer;
|
TIMER * pTimer;
|
||||||
|
@ -79,9 +138,10 @@ WORD TIMER_SetTimer( HWND hwnd, WORD id, WORD timeout, FARPROC proc, BOOL sys )
|
||||||
pTimer->msg = sys ? WM_SYSTIMER : WM_TIMER;
|
pTimer->msg = sys ? WM_SYSTIMER : WM_TIMER;
|
||||||
pTimer->id = id;
|
pTimer->id = id;
|
||||||
pTimer->timeout = timeout;
|
pTimer->timeout = timeout;
|
||||||
|
pTimer->expires = GetTickCount() + timeout;
|
||||||
pTimer->proc = proc;
|
pTimer->proc = proc;
|
||||||
pTimer->xtid = XtAppAddTimeOut( XT_app_context, timeout,
|
TIMER_InsertTimer( pTimer );
|
||||||
TIMER_callback, pTimer );
|
MSG_IncTimerCount( GetTaskQueue(0) );
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,7 +149,7 @@ WORD TIMER_SetTimer( HWND hwnd, WORD id, WORD timeout, FARPROC proc, BOOL sys )
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* TIMER_KillTimer
|
* TIMER_KillTimer
|
||||||
*/
|
*/
|
||||||
BOOL TIMER_KillTimer( HWND hwnd, WORD id, BOOL sys )
|
static BOOL TIMER_KillTimer( HWND hwnd, WORD id, BOOL sys )
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
TIMER * pTimer;
|
TIMER * pTimer;
|
||||||
|
@ -106,13 +166,13 @@ BOOL TIMER_KillTimer( HWND hwnd, WORD id, BOOL sys )
|
||||||
|
|
||||||
/* Delete the timer */
|
/* Delete the timer */
|
||||||
|
|
||||||
if (pTimer->xtid) XtRemoveTimeOut( pTimer->xtid );
|
|
||||||
pTimer->hwnd = 0;
|
pTimer->hwnd = 0;
|
||||||
pTimer->msg = 0;
|
pTimer->msg = 0;
|
||||||
pTimer->id = 0;
|
pTimer->id = 0;
|
||||||
pTimer->timeout = 0;
|
pTimer->timeout = 0;
|
||||||
pTimer->proc = 0;
|
pTimer->proc = 0;
|
||||||
pTimer->xtid = 0;
|
TIMER_RemoveTimer( pTimer );
|
||||||
|
MSG_DecTimerCount( GetTaskQueue(0) );
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,7 +183,7 @@ BOOL TIMER_KillTimer( HWND hwnd, WORD id, BOOL sys )
|
||||||
WORD SetTimer( HWND hwnd, WORD id, WORD timeout, FARPROC proc )
|
WORD SetTimer( HWND hwnd, WORD id, WORD timeout, FARPROC proc )
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_TIMER
|
#ifdef DEBUG_TIMER
|
||||||
printf( "SetTimer: %d %d %d %08x\n", hwnd, id, timeout, proc );
|
printf( "SetTimer: %d %d %d %p\n", hwnd, id, timeout, proc );
|
||||||
#endif
|
#endif
|
||||||
return TIMER_SetTimer( hwnd, id, timeout, proc, FALSE );
|
return TIMER_SetTimer( hwnd, id, timeout, proc, FALSE );
|
||||||
}
|
}
|
||||||
|
@ -135,7 +195,7 @@ WORD SetTimer( HWND hwnd, WORD id, WORD timeout, FARPROC proc )
|
||||||
WORD SetSystemTimer( HWND hwnd, WORD id, WORD timeout, FARPROC proc )
|
WORD SetSystemTimer( HWND hwnd, WORD id, WORD timeout, FARPROC proc )
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_TIMER
|
#ifdef DEBUG_TIMER
|
||||||
printf( "SetSystemTimer: %d %d %d %08x\n", hwnd, id, timeout, proc );
|
printf( "SetSystemTimer: %d %d %d %p\n", hwnd, id, timeout, proc );
|
||||||
#endif
|
#endif
|
||||||
return TIMER_SetTimer( hwnd, id, timeout, proc, TRUE );
|
return TIMER_SetTimer( hwnd, id, timeout, proc, TRUE );
|
||||||
}
|
}
|
||||||
|
|
440
windows/win.c
440
windows/win.c
|
@ -10,11 +10,11 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
||||||
#include <X11/StringDefs.h>
|
#include <X11/StringDefs.h>
|
||||||
#include <X11/Core.h>
|
#include <X11/Core.h>
|
||||||
#include <X11/Shell.h>
|
#include <X11/Shell.h>
|
||||||
#include <X11/Xaw/Box.h>
|
|
||||||
|
|
||||||
#include "class.h"
|
#include "class.h"
|
||||||
#include "win.h"
|
#include "win.h"
|
||||||
#include "user.h"
|
#include "user.h"
|
||||||
|
#include "dce.h"
|
||||||
|
|
||||||
extern Display * XT_display;
|
extern Display * XT_display;
|
||||||
extern Screen * XT_screen;
|
extern Screen * XT_screen;
|
||||||
|
@ -22,10 +22,6 @@ extern Colormap COLOR_WinColormap;
|
||||||
|
|
||||||
static HWND firstWindow = 0;
|
static HWND firstWindow = 0;
|
||||||
|
|
||||||
void SCROLLBAR_CreateScrollBar(LPSTR className, LPSTR Label, HWND hwnd);
|
|
||||||
void LISTBOX_CreateListBox(LPSTR className, LPSTR Label, HWND hwnd);
|
|
||||||
void COMBOBOX_CreateComboBox(LPSTR className, LPSTR Label, HWND hwnd);
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* WIN_FindWndPtr
|
* WIN_FindWndPtr
|
||||||
*
|
*
|
||||||
|
@ -42,6 +38,76 @@ WND * WIN_FindWndPtr( HWND hwnd )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* WIN_UnlinkWindow
|
||||||
|
*
|
||||||
|
* Remove a window from the siblings linked list.
|
||||||
|
*/
|
||||||
|
BOOL WIN_UnlinkWindow( HWND hwnd )
|
||||||
|
{
|
||||||
|
HWND * curWndPtr;
|
||||||
|
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
||||||
|
|
||||||
|
if (!wndPtr) return FALSE;
|
||||||
|
if (wndPtr->hwndParent)
|
||||||
|
{
|
||||||
|
WND * parentPtr = WIN_FindWndPtr( wndPtr->hwndParent );
|
||||||
|
curWndPtr = &parentPtr->hwndChild;
|
||||||
|
}
|
||||||
|
else curWndPtr = &firstWindow;
|
||||||
|
|
||||||
|
while (*curWndPtr != hwnd)
|
||||||
|
{
|
||||||
|
WND * curPtr = WIN_FindWndPtr( *curWndPtr );
|
||||||
|
curWndPtr = &curPtr->hwndNext;
|
||||||
|
}
|
||||||
|
*curWndPtr = wndPtr->hwndNext;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* WIN_LinkWindow
|
||||||
|
*
|
||||||
|
* Insert a window into the siblings linked list.
|
||||||
|
* The window is inserted after the specified window, which can also
|
||||||
|
* be specified as HWND_TOP or HWND_BOTTOM.
|
||||||
|
*/
|
||||||
|
BOOL WIN_LinkWindow( HWND hwnd, HWND hwndInsertAfter )
|
||||||
|
{
|
||||||
|
HWND * hwndPtr = NULL; /* pointer to hwnd to change */
|
||||||
|
|
||||||
|
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
||||||
|
if (!wndPtr) return FALSE;
|
||||||
|
|
||||||
|
if ((hwndInsertAfter == HWND_TOP) || (hwndInsertAfter == HWND_BOTTOM))
|
||||||
|
{
|
||||||
|
/* Make hwndPtr point to the first sibling hwnd */
|
||||||
|
if (wndPtr->hwndParent)
|
||||||
|
{
|
||||||
|
WND * parentPtr = WIN_FindWndPtr( wndPtr->hwndParent );
|
||||||
|
if (parentPtr) hwndPtr = &parentPtr->hwndChild;
|
||||||
|
}
|
||||||
|
else hwndPtr = &firstWindow;
|
||||||
|
if (hwndInsertAfter == HWND_BOTTOM) /* Find last sibling hwnd */
|
||||||
|
while (*hwndPtr)
|
||||||
|
{
|
||||||
|
WND * nextPtr = WIN_FindWndPtr( *hwndPtr );
|
||||||
|
hwndPtr = &nextPtr->hwndNext;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else /* Normal case */
|
||||||
|
{
|
||||||
|
WND * afterPtr = WIN_FindWndPtr( hwndInsertAfter );
|
||||||
|
if (afterPtr) hwndPtr = &afterPtr->hwndNext;
|
||||||
|
}
|
||||||
|
if (!hwndPtr) return FALSE;
|
||||||
|
wndPtr->hwndNext = *hwndPtr;
|
||||||
|
*hwndPtr = hwnd;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* WIN_FindWinToRepaint
|
* WIN_FindWinToRepaint
|
||||||
*
|
*
|
||||||
|
@ -55,8 +121,6 @@ HWND WIN_FindWinToRepaint( HWND hwnd )
|
||||||
for ( ; hwnd != 0; hwnd = wndPtr->hwndNext )
|
for ( ; hwnd != 0; hwnd = wndPtr->hwndNext )
|
||||||
{
|
{
|
||||||
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
|
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
|
||||||
if (!wndPtr || !wndPtr->winWidget) continue;
|
|
||||||
if (!XtIsRealized( wndPtr->winWidget )) continue;
|
|
||||||
if (wndPtr->hrgnUpdate) return hwnd;
|
if (wndPtr->hrgnUpdate) return hwnd;
|
||||||
if (wndPtr->hwndChild)
|
if (wndPtr->hwndChild)
|
||||||
{
|
{
|
||||||
|
@ -114,9 +178,11 @@ HWND CreateWindowEx( DWORD exStyle, LPSTR className, LPSTR windowName,
|
||||||
CREATESTRUCT *createStruct;
|
CREATESTRUCT *createStruct;
|
||||||
HANDLE hcreateStruct;
|
HANDLE hcreateStruct;
|
||||||
int wmcreate;
|
int wmcreate;
|
||||||
|
short newwidth, newheight;
|
||||||
|
|
||||||
#ifdef DEBUG_WIN
|
#ifdef DEBUG_WIN
|
||||||
printf( "CreateWindowEx: %s %s %d,%d %dx%d\n", className, windowName, x, y, width, height );
|
printf( "CreateWindowEx: %s %s %d,%d %dx%d %08x\n",
|
||||||
|
className, windowName, x, y, width, height, style );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (x == CW_USEDEFAULT) x = 0;
|
if (x == CW_USEDEFAULT) x = 0;
|
||||||
|
@ -155,11 +221,12 @@ HWND CreateWindowEx( DWORD exStyle, LPSTR className, LPSTR windowName,
|
||||||
wndPtr->hwndOwner = parent; /* What else? */
|
wndPtr->hwndOwner = parent; /* What else? */
|
||||||
wndPtr->hClass = class;
|
wndPtr->hClass = class;
|
||||||
wndPtr->hInstance = instance;
|
wndPtr->hInstance = instance;
|
||||||
wndPtr->rectClient.left = x;
|
wndPtr->rectWindow.left = x;
|
||||||
wndPtr->rectClient.top = y;
|
wndPtr->rectWindow.top = y;
|
||||||
wndPtr->rectClient.right = x + width;
|
wndPtr->rectWindow.right = x + width;
|
||||||
wndPtr->rectClient.bottom = y + height;
|
wndPtr->rectWindow.bottom = y + height;
|
||||||
wndPtr->rectWindow = wndPtr->rectClient;
|
wndPtr->rectClient = wndPtr->rectWindow;
|
||||||
|
wndPtr->hmemTaskQ = GetTaskQueue(0);
|
||||||
wndPtr->hrgnUpdate = 0;
|
wndPtr->hrgnUpdate = 0;
|
||||||
wndPtr->hwndLastActive = 0;
|
wndPtr->hwndLastActive = 0;
|
||||||
wndPtr->lpfnWndProc = classPtr->wc.lpfnWndProc;
|
wndPtr->lpfnWndProc = classPtr->wc.lpfnWndProc;
|
||||||
|
@ -169,43 +236,70 @@ HWND CreateWindowEx( DWORD exStyle, LPSTR className, LPSTR windowName,
|
||||||
wndPtr->wIDmenu = menu;
|
wndPtr->wIDmenu = menu;
|
||||||
wndPtr->hText = 0;
|
wndPtr->hText = 0;
|
||||||
wndPtr->flags = 0;
|
wndPtr->flags = 0;
|
||||||
|
wndPtr->hCursor = 0;
|
||||||
|
wndPtr->hWndVScroll = 0;
|
||||||
|
wndPtr->hWndHScroll = 0;
|
||||||
|
|
||||||
if (classPtr->wc.cbWndExtra)
|
if (classPtr->wc.cbWndExtra)
|
||||||
memset( wndPtr->wExtra, 0, classPtr->wc.cbWndExtra );
|
memset( wndPtr->wExtra, 0, classPtr->wc.cbWndExtra );
|
||||||
if (classPtr->wc.style & CS_OWNDC)
|
|
||||||
wndPtr->hdc = CreateDC( "DISPLAY", NULL, NULL, NULL);
|
|
||||||
else wndPtr->hdc = 0;
|
|
||||||
classPtr->cWindows++;
|
classPtr->cWindows++;
|
||||||
|
|
||||||
|
/* Get class or window DC if needed */
|
||||||
|
if (classPtr->wc.style & CS_OWNDC)
|
||||||
|
{
|
||||||
|
wndPtr->flags |= WIN_OWN_DC;
|
||||||
|
wndPtr->hdce = DCE_AllocDCE( DCE_WINDOW_DC );
|
||||||
|
}
|
||||||
|
else if (classPtr->wc.style & CS_CLASSDC)
|
||||||
|
{
|
||||||
|
wndPtr->flags |= WIN_CLASS_DC;
|
||||||
|
wndPtr->hdce = classPtr->hdce;
|
||||||
|
}
|
||||||
|
else wndPtr->hdce = 0;
|
||||||
|
|
||||||
/* Insert the window in the linked list */
|
/* Insert the window in the linked list */
|
||||||
|
|
||||||
if (parent)
|
WIN_LinkWindow( hwnd, HWND_TOP );
|
||||||
{
|
|
||||||
wndPtr->hwndNext = parentPtr->hwndChild;
|
|
||||||
parentPtr->hwndChild = hwnd;
|
|
||||||
}
|
|
||||||
else /* Top-level window */
|
|
||||||
{
|
|
||||||
wndPtr->hwndNext = firstWindow;
|
|
||||||
firstWindow = hwnd;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!strcasecmp(className, "SCROLLBAR"))
|
|
||||||
{
|
|
||||||
SCROLLBAR_CreateScrollBar(className, windowName, hwnd);
|
|
||||||
goto WinCreated;
|
|
||||||
}
|
|
||||||
if (!strcasecmp(className, "LISTBOX"))
|
|
||||||
{
|
|
||||||
LISTBOX_CreateListBox(className, windowName, hwnd);
|
|
||||||
goto WinCreated;
|
|
||||||
}
|
|
||||||
if (!strcasecmp(className, "COMBOBOX"))
|
if (!strcasecmp(className, "COMBOBOX"))
|
||||||
{
|
{
|
||||||
COMBOBOX_CreateComboBox(className, windowName, hwnd);
|
height = 16;
|
||||||
goto WinCreated;
|
|
||||||
}
|
}
|
||||||
/* Create the widgets */
|
|
||||||
|
#ifdef USE_XLIB
|
||||||
|
{
|
||||||
|
XSetWindowAttributes win_attr;
|
||||||
|
Window parentWindow;
|
||||||
|
int x_rel, y_rel;
|
||||||
|
|
||||||
|
win_attr.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask |
|
||||||
|
PointerMotionMask | ButtonPressMask |
|
||||||
|
ButtonReleaseMask | StructureNotifyMask |
|
||||||
|
FocusChangeMask | EnterWindowMask;
|
||||||
|
win_attr.override_redirect = /*True*/ False;
|
||||||
|
win_attr.colormap = COLOR_WinColormap;
|
||||||
|
if (style & WS_CHILD)
|
||||||
|
{
|
||||||
|
parentWindow = parentPtr->window;
|
||||||
|
x_rel = x + parentPtr->rectClient.left-parentPtr->rectWindow.left;
|
||||||
|
y_rel = y + parentPtr->rectClient.top-parentPtr->rectWindow.top;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
parentWindow = DefaultRootWindow( XT_display );
|
||||||
|
x_rel = x;
|
||||||
|
y_rel = y;
|
||||||
|
}
|
||||||
|
wndPtr->window = XCreateWindow( XT_display, parentWindow,
|
||||||
|
x_rel, y_rel, width, height, 0,
|
||||||
|
CopyFromParent, InputOutput,
|
||||||
|
CopyFromParent,
|
||||||
|
CWEventMask | CWOverrideRedirect |
|
||||||
|
CWColormap, &win_attr );
|
||||||
|
XStoreName( XT_display, wndPtr->window, windowName );
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
/* Create the widgets */
|
||||||
|
|
||||||
if (style & WS_CHILD)
|
if (style & WS_CHILD)
|
||||||
{
|
{
|
||||||
|
@ -223,6 +317,7 @@ HWND CreateWindowEx( DWORD exStyle, LPSTR className, LPSTR windowName,
|
||||||
XtNwidth, width,
|
XtNwidth, width,
|
||||||
XtNheight, height,
|
XtNheight, height,
|
||||||
XtNborderColor, borderCol,
|
XtNborderColor, borderCol,
|
||||||
|
XtNmappedWhenManaged, FALSE,
|
||||||
NULL );
|
NULL );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -235,6 +330,7 @@ HWND CreateWindowEx( DWORD exStyle, LPSTR className, LPSTR windowName,
|
||||||
XtNwidth, width,
|
XtNwidth, width,
|
||||||
XtNheight, height,
|
XtNheight, height,
|
||||||
XtNborderWidth, 0,
|
XtNborderWidth, 0,
|
||||||
|
XtNmappedWhenManaged, FALSE,
|
||||||
NULL );
|
NULL );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -247,6 +343,7 @@ HWND CreateWindowEx( DWORD exStyle, LPSTR className, LPSTR windowName,
|
||||||
XtNx, x,
|
XtNx, x,
|
||||||
XtNy, y,
|
XtNy, y,
|
||||||
XtNcolormap, COLOR_WinColormap,
|
XtNcolormap, COLOR_WinColormap,
|
||||||
|
XtNmappedWhenManaged, FALSE,
|
||||||
NULL );
|
NULL );
|
||||||
wndPtr->compositeWidget = XtVaCreateManagedWidget(className,
|
wndPtr->compositeWidget = XtVaCreateManagedWidget(className,
|
||||||
formWidgetClass,
|
formWidgetClass,
|
||||||
|
@ -296,8 +393,24 @@ HWND CreateWindowEx( DWORD exStyle, LPSTR className, LPSTR windowName,
|
||||||
NULL );
|
NULL );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (wndPtr->shellWidget) XtRealizeWidget( wndPtr->shellWidget );
|
||||||
|
if (wndPtr->compositeWidget) XtRealizeWidget( wndPtr->compositeWidget );
|
||||||
|
XtRealizeWidget( wndPtr->winWidget );
|
||||||
|
wndPtr->window = XtWindow( wndPtr->winWidget );
|
||||||
|
#endif /* USE_XLIB */
|
||||||
|
|
||||||
WinCreated:
|
if ((style & WS_VSCROLL) == WS_VSCROLL) {
|
||||||
|
newheight = height - (((style & WS_HSCROLL) == WS_HSCROLL) ? 16 : 0);
|
||||||
|
wndPtr->hWndVScroll = CreateWindow("SCROLLBAR", "",
|
||||||
|
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_VERT,
|
||||||
|
width - 16, 0, 16, newheight, hwnd, 2, instance, 0L);
|
||||||
|
}
|
||||||
|
if ((style & WS_HSCROLL) == WS_HSCROLL) {
|
||||||
|
newwidth = width - (((style & WS_VSCROLL) == WS_VSCROLL) ? 16 : 0);
|
||||||
|
wndPtr->hWndHScroll = CreateWindow("SCROLLBAR", "",
|
||||||
|
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBS_HORZ,
|
||||||
|
0, height - 16, newwidth, 16, hwnd, 3, instance, 0L);
|
||||||
|
}
|
||||||
|
|
||||||
/* Send the WM_CREATE message */
|
/* Send the WM_CREATE message */
|
||||||
|
|
||||||
|
@ -318,7 +431,24 @@ WinCreated:
|
||||||
|
|
||||||
wmcreate = SendMessage( hwnd, WM_NCCREATE, 0, (LONG)createStruct );
|
wmcreate = SendMessage( hwnd, WM_NCCREATE, 0, (LONG)createStruct );
|
||||||
if (!wmcreate) wmcreate = -1;
|
if (!wmcreate) wmcreate = -1;
|
||||||
else wmcreate = SendMessage( hwnd, WM_CREATE, 0, (LONG)createStruct );
|
else
|
||||||
|
{
|
||||||
|
/* Send WM_NCCALCSIZE message */
|
||||||
|
NCCALCSIZE_PARAMS *params;
|
||||||
|
HANDLE hparams;
|
||||||
|
hparams = GlobalAlloc( GMEM_MOVEABLE, sizeof(*params) );
|
||||||
|
if (hparams)
|
||||||
|
{
|
||||||
|
params = (NCCALCSIZE_PARAMS *) GlobalLock( hparams );
|
||||||
|
params->rgrc[0] = wndPtr->rectWindow;
|
||||||
|
params->lppos = NULL;
|
||||||
|
SendMessage( hwnd, WM_NCCALCSIZE, FALSE, (LONG)params );
|
||||||
|
wndPtr->rectClient = params->rgrc[0];
|
||||||
|
GlobalUnlock( hparams );
|
||||||
|
GlobalFree( hparams );
|
||||||
|
}
|
||||||
|
wmcreate = SendMessage( hwnd, WM_CREATE, 0, (LONG)createStruct );
|
||||||
|
}
|
||||||
|
|
||||||
GlobalUnlock( hcreateStruct );
|
GlobalUnlock( hcreateStruct );
|
||||||
GlobalFree( hcreateStruct );
|
GlobalFree( hcreateStruct );
|
||||||
|
@ -329,18 +459,27 @@ WinCreated:
|
||||||
|
|
||||||
if (parent) parentPtr->hwndChild = wndPtr->hwndNext;
|
if (parent) parentPtr->hwndChild = wndPtr->hwndNext;
|
||||||
else firstWindow = wndPtr->hwndNext;
|
else firstWindow = wndPtr->hwndNext;
|
||||||
|
#ifdef USE_XLIB
|
||||||
|
XDestroyWindow( XT_display, wndPtr->window );
|
||||||
|
#else
|
||||||
if (wndPtr->shellWidget) XtDestroyWidget( wndPtr->shellWidget );
|
if (wndPtr->shellWidget) XtDestroyWidget( wndPtr->shellWidget );
|
||||||
else XtDestroyWidget( wndPtr->winWidget );
|
else XtDestroyWidget( wndPtr->winWidget );
|
||||||
if (wndPtr->hdc) DeleteDC( wndPtr->hdc );
|
#endif
|
||||||
|
if (wndPtr->flags & WIN_OWN_DC) DCE_FreeDCE( wndPtr->hdce );
|
||||||
classPtr->cWindows--;
|
classPtr->cWindows--;
|
||||||
USER_HEAP_FREE( hwnd );
|
USER_HEAP_FREE( hwnd );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef USE_XLIB
|
||||||
|
EVENT_AddHandlers( wndPtr->window, hwnd );
|
||||||
|
#else
|
||||||
EVENT_AddHandlers( wndPtr->winWidget, hwnd );
|
EVENT_AddHandlers( wndPtr->winWidget, hwnd );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
WIN_SendParentNotify( hwnd, wndPtr, WM_CREATE );
|
||||||
|
|
||||||
if (style & WS_VISIBLE) ShowWindow( hwnd, SW_SHOW );
|
if (style & WS_VISIBLE) ShowWindow( hwnd, SW_SHOW );
|
||||||
WIN_SendParentNotify( hwnd, wndPtr, WM_CREATE );
|
|
||||||
return hwnd;
|
return hwnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -350,7 +489,6 @@ WinCreated:
|
||||||
BOOL DestroyWindow( HWND hwnd )
|
BOOL DestroyWindow( HWND hwnd )
|
||||||
{
|
{
|
||||||
WND * wndPtr;
|
WND * wndPtr;
|
||||||
HWND * curWndPtr;
|
|
||||||
CLASS * classPtr;
|
CLASS * classPtr;
|
||||||
|
|
||||||
/* Initialisation */
|
/* Initialisation */
|
||||||
|
@ -366,130 +504,30 @@ BOOL DestroyWindow( HWND hwnd )
|
||||||
|
|
||||||
/* Destroy all children */
|
/* Destroy all children */
|
||||||
|
|
||||||
|
if (wndPtr->hWndVScroll) DestroyWindow(wndPtr->hWndVScroll);
|
||||||
|
if (wndPtr->hWndHScroll) DestroyWindow(wndPtr->hWndHScroll);
|
||||||
while (wndPtr->hwndChild) /* The child removes itself from the list */
|
while (wndPtr->hwndChild) /* The child removes itself from the list */
|
||||||
DestroyWindow( wndPtr->hwndChild );
|
DestroyWindow( wndPtr->hwndChild );
|
||||||
|
|
||||||
/* Remove the window from the linked list */
|
/* Remove the window from the linked list */
|
||||||
|
|
||||||
if (wndPtr->hwndParent)
|
WIN_UnlinkWindow( hwnd );
|
||||||
{
|
|
||||||
WND * parentPtr = WIN_FindWndPtr( wndPtr->hwndParent );
|
|
||||||
curWndPtr = &parentPtr->hwndChild;
|
|
||||||
}
|
|
||||||
else curWndPtr = &firstWindow;
|
|
||||||
|
|
||||||
while (*curWndPtr != hwnd)
|
|
||||||
{
|
|
||||||
WND * curPtr = WIN_FindWndPtr( *curWndPtr );
|
|
||||||
curWndPtr = &curPtr->hwndNext;
|
|
||||||
}
|
|
||||||
*curWndPtr = wndPtr->hwndNext;
|
|
||||||
|
|
||||||
/* Destroy the window */
|
/* Destroy the window */
|
||||||
|
|
||||||
|
#ifdef USE_XLIB
|
||||||
|
XDestroyWindow( XT_display, wndPtr->window );
|
||||||
|
#else
|
||||||
if (wndPtr->shellWidget) XtDestroyWidget( wndPtr->shellWidget );
|
if (wndPtr->shellWidget) XtDestroyWidget( wndPtr->shellWidget );
|
||||||
else XtDestroyWidget( wndPtr->winWidget );
|
else XtDestroyWidget( wndPtr->winWidget );
|
||||||
if (wndPtr->hdc) DeleteDC( wndPtr->hdc );
|
#endif
|
||||||
|
if (wndPtr->flags & WIN_OWN_DC) DCE_FreeDCE( wndPtr->hdce );
|
||||||
classPtr->cWindows--;
|
classPtr->cWindows--;
|
||||||
USER_HEAP_FREE( hwnd );
|
USER_HEAP_FREE( hwnd );
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* GetWindowRect (USER.32)
|
|
||||||
*/
|
|
||||||
void GetWindowRect( HWND hwnd, LPRECT rect )
|
|
||||||
{
|
|
||||||
int x, y, width, height;
|
|
||||||
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
|
||||||
|
|
||||||
if (wndPtr)
|
|
||||||
{
|
|
||||||
XtVaGetValues(wndPtr->winWidget,
|
|
||||||
XtNx, &x, XtNy, &y,
|
|
||||||
XtNwidth, &width,
|
|
||||||
XtNheight, &height,
|
|
||||||
NULL );
|
|
||||||
rect->left = x & 0xffff;
|
|
||||||
rect->top = y & 0xffff;
|
|
||||||
rect->right = width & 0xffff;
|
|
||||||
rect->bottom = height & 0xffff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* GetClientRect (USER.33)
|
|
||||||
*/
|
|
||||||
void GetClientRect( HWND hwnd, LPRECT rect )
|
|
||||||
{
|
|
||||||
int width, height;
|
|
||||||
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
|
||||||
|
|
||||||
rect->left = rect->top = rect->right = rect->bottom = 0;
|
|
||||||
if (wndPtr)
|
|
||||||
{
|
|
||||||
XtVaGetValues(wndPtr->winWidget,
|
|
||||||
XtNwidth, &width,
|
|
||||||
XtNheight, &height,
|
|
||||||
NULL );
|
|
||||||
rect->right = width & 0xffff;
|
|
||||||
rect->bottom = height & 0xffff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* ShowWindow (USER.42)
|
|
||||||
*/
|
|
||||||
BOOL ShowWindow( HWND hwnd, int cmd )
|
|
||||||
{
|
|
||||||
int width, height;
|
|
||||||
|
|
||||||
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
|
||||||
if (wndPtr)
|
|
||||||
{
|
|
||||||
if (wndPtr->shellWidget) XtRealizeWidget( wndPtr->shellWidget );
|
|
||||||
XtVaGetValues(wndPtr->winWidget,
|
|
||||||
XtNwidth, &width,
|
|
||||||
XtNheight, &height,
|
|
||||||
NULL );
|
|
||||||
switch(cmd)
|
|
||||||
{
|
|
||||||
case SW_HIDE:
|
|
||||||
XtSetMappedWhenManaged(wndPtr->winWidget, FALSE);
|
|
||||||
wndPtr->dwStyle &= (WS_VISIBLE ^ 0xFFFFFFFL);
|
|
||||||
SendMessage( hwnd, WM_SHOWWINDOW, FALSE, 0 );
|
|
||||||
break;
|
|
||||||
case SW_SHOWMINNOACTIVE:
|
|
||||||
case SW_SHOWMINIMIZED:
|
|
||||||
case SW_MINIMIZE:
|
|
||||||
wndPtr->dwStyle |= WS_ICONIC;
|
|
||||||
goto WINVisible;
|
|
||||||
case SW_SHOWNA:
|
|
||||||
case SW_SHOWNOACTIVATE:
|
|
||||||
case SW_MAXIMIZE:
|
|
||||||
case SW_SHOWMAXIMIZED:
|
|
||||||
case SW_SHOW:
|
|
||||||
case SW_NORMAL:
|
|
||||||
case SW_SHOWNORMAL:
|
|
||||||
wndPtr->dwStyle &= (WS_ICONIC ^ 0xFFFFFFFL);
|
|
||||||
WINVisible:
|
|
||||||
XtSetMappedWhenManaged(wndPtr->winWidget, TRUE);
|
|
||||||
wndPtr->dwStyle |= WS_VISIBLE;
|
|
||||||
SendMessage( hwnd, WM_SIZE, SIZE_RESTORED,
|
|
||||||
(width & 0xffff) | (height << 16) );
|
|
||||||
SendMessage( hwnd, WM_SHOWWINDOW, TRUE, 0 );
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* CloseWindow (USER.43)
|
* CloseWindow (USER.43)
|
||||||
*/
|
*/
|
||||||
|
@ -498,7 +536,6 @@ void CloseWindow(HWND hWnd)
|
||||||
WND * wndPtr = WIN_FindWndPtr(hWnd);
|
WND * wndPtr = WIN_FindWndPtr(hWnd);
|
||||||
if (wndPtr->dwStyle & WS_CHILD) return;
|
if (wndPtr->dwStyle & WS_CHILD) return;
|
||||||
ShowWindow(hWnd, SW_MINIMIZE);
|
ShowWindow(hWnd, SW_MINIMIZE);
|
||||||
PostMessage(hWnd, WM_CLOSE, 0, 0L);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -508,7 +545,6 @@ void CloseWindow(HWND hWnd)
|
||||||
*/
|
*/
|
||||||
BOOL OpenIcon(HWND hWnd)
|
BOOL OpenIcon(HWND hWnd)
|
||||||
{
|
{
|
||||||
WND * wndPtr = WIN_FindWndPtr(hWnd);
|
|
||||||
if (!IsIconic(hWnd)) return FALSE;
|
if (!IsIconic(hWnd)) return FALSE;
|
||||||
ShowWindow(hWnd, SW_SHOWNORMAL);
|
ShowWindow(hWnd, SW_SHOWNORMAL);
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
|
@ -525,32 +561,6 @@ HWND FindWindow(LPSTR ClassMatch, LPSTR TitleMatch)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* MoveWindow (USER.56)
|
|
||||||
*/
|
|
||||||
void MoveWindow(HWND hWnd, short x, short y, short w, short h, BOOL bRepaint)
|
|
||||||
{
|
|
||||||
WND * wndPtr = WIN_FindWndPtr( hWnd );
|
|
||||||
if (wndPtr)
|
|
||||||
{
|
|
||||||
wndPtr->rectClient.left = x;
|
|
||||||
wndPtr->rectClient.top = y;
|
|
||||||
wndPtr->rectClient.right = x + w;
|
|
||||||
wndPtr->rectClient.bottom = y + h;
|
|
||||||
XtVaSetValues(wndPtr->winWidget, XtNx, x, XtNy, y,
|
|
||||||
XtNwidth, w, XtNheight, h, NULL );
|
|
||||||
SendMessage(hWnd, WM_MOVE, 0, MAKELONG(x, y));
|
|
||||||
printf("MoveWindow(%X, %d, %d, %d, %d, %d); !\n",
|
|
||||||
hWnd, x, y, w, h, bRepaint);
|
|
||||||
if (bRepaint) {
|
|
||||||
InvalidateRect(hWnd, NULL, TRUE);
|
|
||||||
UpdateWindow(hWnd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* UpdateWindow (USER.124)
|
* UpdateWindow (USER.124)
|
||||||
*/
|
*/
|
||||||
|
@ -578,8 +588,10 @@ HMENU GetMenu( HWND hwnd )
|
||||||
*/
|
*/
|
||||||
BOOL SetMenu(HWND hwnd, HMENU hmenu)
|
BOOL SetMenu(HWND hwnd, HMENU hmenu)
|
||||||
{
|
{
|
||||||
|
#ifdef USE_XLIB
|
||||||
|
return FALSE;
|
||||||
|
#else
|
||||||
WND *wndPtr;
|
WND *wndPtr;
|
||||||
|
|
||||||
wndPtr = WIN_FindWndPtr(hwnd);
|
wndPtr = WIN_FindWndPtr(hwnd);
|
||||||
if (wndPtr == NULL)
|
if (wndPtr == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -618,44 +630,7 @@ BOOL SetMenu(HWND hwnd, HMENU hmenu)
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
#endif /* USE_XLIB */
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* SetWindowPos (USER.232)
|
|
||||||
*/
|
|
||||||
void SetWindowPos(HWND hWnd, HWND hWndInsertAfter, short x, short y, short w, short h, WORD wFlag)
|
|
||||||
{
|
|
||||||
WND * wndPtr = WIN_FindWndPtr( hWnd );
|
|
||||||
if (wndPtr)
|
|
||||||
{
|
|
||||||
if ((wFlag & SWP_NOMOVE) != SWP_NOMOVE) {
|
|
||||||
wndPtr->rectClient.left = x;
|
|
||||||
wndPtr->rectClient.top = y;
|
|
||||||
XtVaSetValues(wndPtr->winWidget, XtNx, x, XtNy, y, NULL );
|
|
||||||
}
|
|
||||||
if ((wFlag & SWP_NOSIZE) != SWP_NOSIZE) {
|
|
||||||
wndPtr->rectClient.right = x + w;
|
|
||||||
wndPtr->rectClient.bottom = y + h;
|
|
||||||
XtVaSetValues(wndPtr->winWidget, XtNwidth, w, XtNheight, h, NULL );
|
|
||||||
}
|
|
||||||
if ((wFlag & SWP_NOREDRAW) != SWP_NOREDRAW) {
|
|
||||||
InvalidateRect(hWnd, NULL, TRUE);
|
|
||||||
UpdateWindow(hWnd);
|
|
||||||
}
|
|
||||||
if ((wFlag & SWP_HIDEWINDOW) == SWP_HIDEWINDOW)
|
|
||||||
ShowWindow(hWnd, SW_HIDE);
|
|
||||||
if ((wFlag & SWP_SHOWWINDOW) == SWP_SHOWWINDOW)
|
|
||||||
ShowWindow(hWnd, SW_SHOW);
|
|
||||||
/*
|
|
||||||
if ((wFlag & SWP_NOACTIVATE) != SWP_NOACTIVATE)
|
|
||||||
SetActiveWindow(hWnd);
|
|
||||||
if ((wFlag & SWP_NOZORDER) != SWP_NOZORDER)
|
|
||||||
{ }
|
|
||||||
*/
|
|
||||||
printf("SetWindowPos(%X, %X, %d, %d, %d, %d, %X); !\n",
|
|
||||||
hWnd, hWndInsertAfter, x, y, w, h, wFlag);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -748,21 +723,6 @@ LONG SetWindowLong( HWND hwnd, short offset, LONG newval )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* IsIconic (USER.31)
|
|
||||||
*/
|
|
||||||
BOOL IsIconic(HWND hWnd)
|
|
||||||
{
|
|
||||||
WND * wndPtr;
|
|
||||||
if (hWnd == 0) return(FALSE);
|
|
||||||
wndPtr = WIN_FindWndPtr(hWnd);
|
|
||||||
if (wndPtr == 0) return(FALSE);
|
|
||||||
if (wndPtr->dwStyle & WS_ICONIC) return(TRUE);
|
|
||||||
return(FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
* GetWindowText (USER.36)
|
* GetWindowText (USER.36)
|
||||||
*/
|
*/
|
||||||
|
@ -796,7 +756,7 @@ int GetWindowTextLength(HWND hwnd)
|
||||||
BOOL IsWindow( HWND hwnd )
|
BOOL IsWindow( HWND hwnd )
|
||||||
{
|
{
|
||||||
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
||||||
return (wndPtr->dwMagic == WND_MAGIC);
|
return ((wndPtr != NULL) && (wndPtr->dwMagic == WND_MAGIC));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -806,6 +766,7 @@ BOOL IsWindow( HWND hwnd )
|
||||||
HWND GetParent(HWND hwnd)
|
HWND GetParent(HWND hwnd)
|
||||||
{
|
{
|
||||||
WND *wndPtr = WIN_FindWndPtr(hwnd);
|
WND *wndPtr = WIN_FindWndPtr(hwnd);
|
||||||
|
if (!wndPtr) return 0;
|
||||||
return wndPtr->hwndParent;
|
return wndPtr->hwndParent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -838,14 +799,9 @@ BOOL IsChild( HWND parent, HWND child )
|
||||||
*/
|
*/
|
||||||
BOOL IsWindowVisible(HWND hWnd)
|
BOOL IsWindowVisible(HWND hWnd)
|
||||||
{
|
{
|
||||||
WND * wndPtr;
|
WND * wndPtr = WIN_FindWndPtr(hWnd);
|
||||||
if (hWnd == 0) return(FALSE);
|
|
||||||
wndPtr = WIN_FindWndPtr(hWnd);
|
|
||||||
if (wndPtr == 0) return(FALSE);
|
if (wndPtr == 0) return(FALSE);
|
||||||
if (wndPtr->dwStyle & WS_VISIBLE) {
|
else return ((wndPtr->dwStyle & WS_VISIBLE) != 0);
|
||||||
if (XtIsRealized(wndPtr->winWidget)) return(TRUE);
|
|
||||||
}
|
|
||||||
return(FALSE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue