Release 980927
Sun Sep 27 14:25:38 1998 Petter Reinholdtsen <pere@td.org.uit.no>
* [files/drive.c]
Make sure GetDriveType32A() handles param NULL. Added some
doc on function.
Sun Sep 27 14:07:26 1998 Huw D M Davies <daviesh@abacus.physics.ox.ac.uk>
* [controls/edit.c] [windows/win.c]
Don't call SetWindowLong() in EDIT_WM_NCREATE.
Fix SetWindowLong(GWL_[EX]STYLE) to work for 16bit windows. Remove
UpdateWindow() call.
Sun Sep 27 13:41:22 1998 Alexandre Julliard <julliard@lrc.epfl.ch>
* [scheduler/*.c] [server/event.c] [server/mutex.c]
[server/semaphore.c]
Implemented server-side synchronisation objects.
Sun Sep 27 01:13:35 1998 Alex Priem <alexp@sci.kun.nl>
* [dlls/comctl32/treeview.c] [include/treeview.h] [include/comctl.h]
Treeview implementation.
* [dlls/comctl32/trackbar.c] [include/trackbar.h]
Trackbar implementation.
Sat Sep 26 20:49:13 1998 Ulrich Weigand <weigand@informatik.uni-erlangen.de>
* [if1632/thunk.c] [tools/build.c] [win32/kernel32.c]
Bugfix: several problems with flat thunks fixed.
* [memory/selector.c]
Bugfix: IsBad...Ptr16 didn't work for limit_in_pages segments.
* [scheduler/thread.c]
Bugfix: CreateThread: Allow id parameter == NULL.
* [objects/gdiobj.c]
Bugfix: IsGDIObject: Return correct object type for stock objects.
* [msdos/dpmi.c]
Bugfix: fixed typo in INT_DoRealModeInt.
* [msdos/int21.c]
Bugfix: int21 READ *must* use WIN16_hread, not _hread16.
* [if1632/kernel.spec] [if1632/dummy.c] [if1632/thunk.c]
[loader/ne/module.c] [scheduler/event.c] [scheduler/synchro.c]
[scheduler/thread.c] [win32/kernel32.c] [win32/ordinals.c]
Added names/stubs for all undocumented KERNEL routines (Win95).
Added the following undoc. 16-bit equivalents to Win32 routines:
KERNEL.441-443,449-453,456-462,471-476,479-486,488.
Added stubs for some other KERNEL routines.
* [memory/heap.c] [memory/global.c] [include/global.h]
Implemented Local32... 32-bit local heap routines (KERNEL.208-215, 229).
* [miscemu/instr.c] [loader/module.c] [include/module.h]
Implemented __GP fault handling and HasGPHandler (KERNEL.338).
* [misc/error.c]
Implemented LogParamErrorRegs (KERNEL.327).
* [loader/task.c] [include/windows.h]
Implemented GetCodeInfo (KERNEL.104).
* [loader/task.c] [scheduler/thread.c] [include/thread.h]
Implemented [GS]etThreadQueue and [GS]etFastQueue (KERNEL.463/4, 624/5).
* [if1632/gdi.spec] [objects/dc.c] [objects/dib.c]
[objects/bitmap.c] [include/windows.h]
Bugfix: fixed wrong parameter for CreateDIBSection16.
Added [GS]etDIBColorTable16, stub for GetBoundsRect16.
Partially implemented BITMAP_GetObject16 for DIBs.
* [if1632/gdi.spec] [relay32/gdi32.spec] [objects/palette.c]
Added some GDI stubs.
* [if1632/Makefile.in] [if1632/display.spec] [if1632/mouse.spec]
[if1632/keyboard.spec] [if1632/builtin.c] [windows/keyboard.c]
Added some stubs for Win16 drivers: KEYBOARD, MOUSE, DISPLAY.
* [if1632/wprocs.spec] [msdos/vxd.c]
Added some stubs for VxDs: VMM, ConfigMG, TimerAPI.
* [msdos/int2f.c]
Added some stubs for real-mode network drivers.
Sat Sep 26 18:18:18 1998 Marcus Meissner <marcus@jet.franken.de>
* [configure.in]
Merged in some more of the FreeBSD ports/emulators/wine patches.
(Maintainer(s) of this port: You can just submit these
patches to Alexandre directly.)
* [loader/pe_image.c]
Check filesize of image against size derived from header
to spot truncated executeables without crashing.
* [files/directory.c]
Set envvar "COMSPEC". One win32(!!) program crashes without it.
* [multimedia/mmio.c]
Added mmioSetInfo32.
* [include/file.h]
Return STD_ERROR_HANDLE for AUX and PRT dos handles.
* [loader/module.c]
Handle executeables with spaces in their names a bit better in
CreateProcess.
* [relay32/msvfw32.spec][if1632/msvideo.spec][multimedia/msvideo.c][include/vfw.h]
Started on MS Video support (can load Win32 ICMs).
* [tools/testrun]
A bit smarter use of ps.
* [memory/virtual.c]
Report PAGE_GUARDed pages as PAGE_PROTECTED (AutoCAD LT R17 fails
without that check (since Win95 doesn't know about PAGE_GUARD)).
Sat Sep 26 15:04:05 1998 Ove Kaaven <ovek@arcticnet.no>
* [include/miscemu.h] [if1632/builtin.c] [loader/task.c]
[miscemu/instr.c] [msdos/dpmi.c] [msdos/int21.c]
[msdos/interrupts.c] [windows/user.c]
INT_[S|G]etHandler was renamed to INT_[S|G]etPMHandler.
Added handlers to deal with real-mode interrupts; DOS
programs are now able to hook real-mode interrupts.
* [loader/dos/module.c] [msdos/dosmem.c] [msdos/int21.c]
Moved real-mode interrupt table initialization to
msdos/dosmem.c, and made new V86 tasks get a full copy
of the existing "system memory" instead of almost empty
space. Misc fixes.
* [include/dosexe.h] [loader/dos/module.c] [msdos/dpmi.c]
[msdos/int2f.c]
First shot at letting DOS programs start up DPMI (but DPMI
is still disabled for DOS programs, for pkunzip's sake).
* [include/debugger.h] [debugger/break.c] [debugger/dbg.y]
[debugger/registers.c] [debugger/memory.c] [debugger/info.c]
[loader/dos/dosvm.c]
First shot at making Wine's debugger work for DOS programs.
The -debug flag works, as do "nexti" and "stepi".
Sat Sep 26 13:13:13 1998 Juergen Schmied <juergen.schmied@metronet.de>
* [dlls/shell32/dataobject.c]
New classes IEnumFORMATETC implemented, IDataObject stubs.
* [dlls/shell32/*.*][relay32/shell32.spec]
Bugfixes.
New: ICM_InsertItem(), ILCreateFromPath().
Implemented: ILCloneFirst().
Stubs: ILIsEqual(), ILFindChild(), SHLogILFromFSIL(),
PathMatchSpec(), PathIsExe().
Changed: ILGetSize(), _ILIsDesktop(), PathCombine().
* [include/shlobj.h]
New SHLGUID's
New structures: DVTARGETDEVICE32, STGMEDIUM32, FORMATETC32,
CLIPFORMAT32.
New interfaces: IEnumFORMATETC, IDataObject, ICommDlgBrowser
IDockingWindowFrame, IServiceProvider.
* [dlls/shell32/folders.c]
Stubs for IShellLink.
* [loader/resource.c]
Small fixes.
* [misc/crtdll.c][relay32/crtdll.spec]
New __dllonexit().
* [windows/message.c]
SendNotifyMessageA, SendMessageCallBack32A half implemented.
* [controls/edit.c]
EDIT_WM_SetText set EF_UPDATE flag not for ES_MULTILINE.
* [files/file.c]
Handling of fileposition fixed.
Fri Sep 25 18:13:30 1998 Patrik Stridvall <ps@leissner.se>
* [include/windows.h] [include/wintypes.h]
[ole/ole2nls.h] [relay32/kernel32.spec]
Implemented EnumDateFormats and EnumTimeFormats.
Only adds US English support.
* [Makefile.in] [configure.in]
[dlls/Makefile.in] [dlls/psapi/Makefile.in]
[dlls/psapi/psapi_main.c]
New files to implement stubs for PSAPI.DLL (NT only).
* [relay32/Makefile.in] [relay32/builtin32.c]
[relay32/psapi.spec]
New spec file for PSAPI.DLL (NT only).
* [scheduler/handle.c]
HANDLE_GetObjPtr should only interpret the pseudo handles as the
current thread or the current process if a thread or a process is
requested.
* [include/winversion.h] [misc/version.c]
Adds the global function VERSION_GetVersion() so functions can
have different behavior depending on the -winver flag.
* [include/oledlg.h] [ole/oledlg.c]
Minor fixes.
* [windows/winproc.c]
Minor changes.
* [include/imm.h] [misc/imm.c]
Now returns correct values under both Windows 95 and NT 4.0.
Thu Sep 24 22:11:44 1998 Kristian Nielsen <kristian.nielsen@risoe.dk>
* [configure.in] [include/acconfig.h] [include/thread.h]
[scheduler/sysdeps.c]
Autoconfig test for non-reentrant libc.
Wed Sep 23 19:52:12 1998 Matthew Becker <mbecker@glasscity.net>
* [*/*.c]
Miscellaneous documentation updates and debugging output
standardizations.
* [objects/clipping.c]
Added ExtSelectClipRgn.
Wed Sep 23 00:03:28 EDT 1998 Pete Ratzlaff <pratzlaff@cfa.harvard.edu>
* [include/windows.h] [if1632/user.spec] [relay32/user32.spec]
[windows/keyboard.c]
Added, marginally implemented, GetKeyboardLayoutName().
Only returns US English keyboard name.
Tue Sep 22 16:32:41 1998 Marcel Baur <mbaur@iiic.ethz.ch>
* [programs/control/*]
New Winelib application.
Mon Sep 21 00:29:18 1998 Peter Hunnisett <hunnise@nortel.ca>
* [include/dplay.h][multimedia/dplay.c][ole/compobj.c]
Added all DirectPlayLobby interfaces and enhanced DirectPlay
and DirectPlayLobby support. Still not all that much. Useful
enough if you just need to start a program, don't try any
real dplay/lobby stuff.
* [documentation/status/directplay]
Added a very little bit.
* [graphics/ddraw.c]
- Call to SetWindowLong32A wasn't working because there was no
memory set aside when the window class was registered.
- Fixed some xlib reference counting and change the behaviour
of DirectDrawSurface3_SetPalette to mimic observed behaviour
(palette is associated will all backbuffers)
- Also stored all palette colour fields and spit back our saved
colour fields rather than query X for them.
- Added plenty of AddRef and Release traces.
- Added Xlib support for using -desktop option.
- Fixed Xlib message handling. Messages weren't being passed to
the application. Fixes mouse movements in some xlib DDraw games.
- Added a few stubs.
* [windows/win.c][include/winerror.h]
Fixed up some error handling in WIN_SetWindowLong. SetLastError
wasn't being used. Could cause problems with 0 return codes.
Added new error in winerror (1400).
* [AUTHORS] [include/authors.h]
Added myself as a Wine author.
Sun Sep 20 21:22:44 1998 Alexander Larsson <alla@lysator.liu.se>
* [loader/module.c]
Changed GetModuleFileName32A so that is returns the
long version of the filename. Note that just the name
is long, not the directories.
Sat Sep 19 20:05:30 1998 Per Ångström <pang@mind.nu>
* [controls/menu.c]
Made a couple of fixes to make life easier for applications that alter
their menus at runtime.
* [windows/defdlg.c]
Removed the cast of the return value from dialog procedures to a 16-bit
bool. The return value needs to retain all its 32 bits, since it is not
always a bool, such as when responding to the WM_NCHITTEST message.
Fri Sep 18 11:30:38 1998 Sergey Turchanov <turchanov@usa.net>
* [loader/resource.c]
Fixed very funny bug (though gravely affecting further excecution)
with FindResource[Ex]32 functions.
* [include/multimon.h] [windows/multimon.c] [relay32/user32.spec]
[include/windows.h] [windows/sysmetrics.c]
Default implementation for Multimonitor API.
* [include/windows.h] [windows/winpos.c]
Fixed incorrect declaration (and behaviour) of GetWindowRect32.
Wed Sep 16 10:21:15 1998 Gerard Patel <G.Patel@Wanadoo.fr>
* [controls/edit.c]
Fixed EDIT_EM_GetLine to use correctly length of lines.
Tue Sep 15 20:40:16 1998 Eric Kohl <ekohl@abo.rhein-zeitung.de>
* [misc/tweak.c][include/tweak.h][controls/menu.c]
Replaced the tweak graphic routines by calls to DrawEdge32().
* [misc/tweak.c][include/tweak.h][documentation/win95look]
[wine.ini][*/*]
Changed "look and feel" selection. Allows Win3.1, Win95 and
Win98 (no GUI code implemented) look and feel.
* [dlls/comctl32/header.c][include/header.h][include/commctrl.h]
Started callback item support and did some minor improvements.
* [dlls/comctl32/imagelist.c]
Fixed bug in transparent image display.
ImageList_GetIcon is still buggy :-(
* [dlls/comctl32/toolbar.c]
Fixed button drawing (partial hack).
* [dlls/comctl32/commctrl.c]
Fixed MenuHelp().
* [controls/button.c]
Added 3d effect for groupbox.
* [windows/msgbox.c]
Added font support for message boxes.
* [windows/nonclient.c]
Fixed window moving bug.
* [dlls/comctl32/*.c]
Various improvements.
* [dlls/comctl32/listview.c][dlls/comctl32/rebar.c]
[include/commctrl.h]
More messages.
* [windows/syscolor.c][include/windows.h]
Introduced new Win98 system colors.
Tue Sep 15 18:29:45 1998 Wesley Filardo <eightknots@aol.com>
* [files/profile.c]
Added support in PROFILE_LoadWineIni for -config option
* [misc/main.c] [include/options.h]
Added -config option.
Tue Sep 15 18:22:26 1998 Petter Reinholdtsen <pere@td.org.uit.no>
* [documentation/Makefile.in]
Make sure directory exists before installing into it.
Tue Sep 15 01:47:33 1998 Pablo Saratxaga <pablo.sarachaga@ping.be>
* [ole/nls/*] [ole/ole2nls.c] [include/winnls.h]
Fixed a few errors and completed some NLS files.
Mon Sep 14 01:23:45 1998 Joseph Pranevich <knight@baltimore.wwaves.com>
* [include/miscemu.h] [msdos/interrupts.c]
Removed a compilation warning, added INT 25 to the list of interrupts
callable from DOS applications, added a debug message when unsupported
interrupts are used.
Sun Sep 13 19:55:22 1998 Lawson Whitney <lawson_whitney@juno.com>
* [if1632/relay.c]
CallProcEx32W should not reverse arguments.
Sun Aug 17 21:18:12 1998 Eric Pouech <eric.pouech@lemel.fr>
* [multimedia/midi.c] [multimedia/init.c] [multimedia/mmsys.c]
[include/multimedia.h] [include/mmsystem.h]
[multimedia/Makefile.in] [multimedia/midipatch.c]
[if1632/multimedia.spec]
Made MIDI input and output functional on OSS capable systems.
* [multimedia/timer.c]
Changes to trigger callbacks at the accurate pace even when
fake timers are used.
diff --git a/graphics/ddraw.c b/graphics/ddraw.c
index 3e00742..7670832 100644
--- a/graphics/ddraw.c
+++ b/graphics/ddraw.c
@@ -18,6 +18,9 @@
* running X clients, even though I am polling X events and answering
* them. But you can switch to another console (ctrl-alt-fx) and
* "killall wine" processes. Any help on this one appreciated. -Marcus
+ * NOTE: The hanging only seems to happen with -managed. I have
+ * implemented support for the -desktop option. This seems
+ * to not have the hanging problems. - Peter Hunnisett
*/
#include "config.h"
@@ -359,8 +362,12 @@
Xlib_MessagePump(this->s.ddraw->e.xlib.window);
TRACE(ddraw,"(%p)->Unlock(%p)\n",this,surface);
+
if (!this->s.ddraw->e.xlib.paintable)
- return 0;
+ {
+ return DD_OK;
+ }
+
TSXPutImage( display,
this->s.ddraw->e.xlib.drawable,
DefaultGCOfScreen(screen),
@@ -370,7 +377,8 @@
this->t.xlib.image->height
);
TSXSetWindowColormap(display,this->s.ddraw->e.xlib.drawable,this->s.palette->cm);
- return 0;
+
+ return DD_OK;
}
static HRESULT WINAPI DGA_IDirectDrawSurface3_Flip(
@@ -423,6 +431,7 @@
else
flipto = this;
}
+
TSXPutImage(display,
this->s.ddraw->e.xlib.drawable,
DefaultGCOfScreen(screen),
@@ -444,11 +453,49 @@
return 0;
}
+/* The IDirectDrawSurface3::SetPalette method attaches the specified
+ * DirectDrawPalette object to a surface. The surface uses this palette for all
+ * subsequent operations. The palette change takes place immediately.
+ */
static HRESULT WINAPI IDirectDrawSurface3_SetPalette(
LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWPALETTE pal
) {
TRACE(ddraw,"(%p)->SetPalette(%p)\n",this,pal);
- this->s.palette = pal; /* probably addref it too */
+
+ /* According to spec, we are only supposed to
+ * AddRef if this is not the same palette.
+ */
+ if( this->s.palette != pal )
+ {
+ if( pal != NULL )
+ {
+ pal->lpvtbl->fnAddRef( pal );
+ }
+ if( this->s.palette != NULL )
+ {
+ this->s.palette->lpvtbl->fnRelease( this->s.palette );
+ }
+ this->s.palette = pal;
+
+ /* I think that we need to attach it to all backbuffers...*/
+ if( this->s.backbuffer )
+ {
+ if( this->s.backbuffer->s.palette )
+ {
+ this->s.backbuffer->s.palette->lpvtbl->fnRelease(
+ this->s.backbuffer->s.palette );
+ }
+ this->s.backbuffer->s.palette = pal;
+ if( pal )
+ {
+ pal->lpvtbl->fnAddRef( pal );
+ }
+ }
+
+ /* Perform the refresh */
+ TSXSetWindowColormap(display,this->s.ddraw->e.xlib.drawable,this->s.palette->cm);
+ }
+
return 0;
}
@@ -583,12 +630,14 @@
}
static ULONG WINAPI IDirectDrawSurface3_AddRef(LPDIRECTDRAWSURFACE3 this) {
- TRACE(ddraw,"(%p)->AddRef()\n",this);
+ TRACE( ddraw, "(%p)->() incrementing from %lu.\n", this, this->ref );
+
return ++(this->ref);
}
static ULONG WINAPI DGA_IDirectDrawSurface3_Release(LPDIRECTDRAWSURFACE3 this) {
- TRACE(ddraw,"(%p)->Release()\n",this);
+ TRACE( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref );
+
#ifdef HAVE_LIBXXF86DGA
if (!--(this->ref)) {
this->s.ddraw->lpvtbl->fnRelease(this->s.ddraw);
@@ -606,13 +655,23 @@
}
static ULONG WINAPI Xlib_IDirectDrawSurface3_Release(LPDIRECTDRAWSURFACE3 this) {
- TRACE(ddraw,"(%p)->Release()\n",this);
+ TRACE( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref );
+
if (!--(this->ref)) {
this->s.ddraw->lpvtbl->fnRelease(this->s.ddraw);
HeapFree(GetProcessHeap(),0,this->s.surface);
+
+ if( this->s.backbuffer )
+ {
+ this->s.backbuffer->lpvtbl->fnRelease(this->s.backbuffer);
+ }
+
this->t.xlib.image->data = NULL;
TSXDestroyImage(this->t.xlib.image);
this->t.xlib.image = 0;
+
+ this->s.palette->lpvtbl->fnRelease(this->s.palette);
+
HeapFree(GetProcessHeap(),0,this);
return 0;
}
@@ -624,16 +683,25 @@
) {
TRACE(ddraw, "(%p)->GetAttachedSurface(%p,%p)\n",
this, lpddsd, lpdsf);
+
if (TRACE_ON(ddraw)) {
TRACE(ddraw," caps ");
_dump_DDSCAPS(lpddsd->dwCaps);
}
+
if (!(lpddsd->dwCaps & DDSCAPS_BACKBUFFER)) {
FIXME(ddraw,"whoops, can only handle backbuffers for now\n");
return E_FAIL;
}
+
/* FIXME: should handle more than one backbuffer */
*lpdsf = this->s.backbuffer;
+
+ if( this->s.backbuffer )
+ {
+ this->s.backbuffer->lpvtbl->fnAddRef( this->s.backbuffer );
+ }
+
return 0;
}
@@ -727,10 +795,21 @@
}
static HRESULT WINAPI IDirectDrawSurface3_SetColorKey(
- LPDIRECTDRAWSURFACE3 this,DWORD x,LPDDCOLORKEY ckey
+ LPDIRECTDRAWSURFACE3 this, DWORD dwFlags, LPDDCOLORKEY ckey
) {
- FIXME(ddraw,"(%p)->(0x%08lx,%p),stub!\n",this,x,ckey);
- return 0;
+ FIXME(ddraw,"(%p)->(0x%08lx,%p),stub!\n",this,dwFlags,ckey);
+
+ if( dwFlags & DDCKEY_SRCBLT )
+ {
+ dwFlags &= ~DDCKEY_SRCBLT;
+ }
+
+ if( dwFlags )
+ {
+ TRACE( ddraw, "unhandled dwFlags: %08lx\n", dwFlags );
+ }
+
+ return DD_OK;
}
static struct IDirectDrawSurface3_VTable dga_dds3vt = {
@@ -830,6 +909,8 @@
}
static ULONG WINAPI IDirectDrawClipper_Release(LPDIRECTDRAWCLIPPER this) {
+ TRACE( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref );
+
this->ref--;
if (this->ref)
return this->ref;
@@ -878,11 +959,20 @@
return DDERR_GENERIC;
}
for (i=0;i<count;i++) {
+#if 0
+PH
xc.pixel = i+start;
TSXQueryColor(display,this->cm,&xc);
palent[i].peRed = xc.red>>8;
palent[i].peGreen = xc.green>>8;
palent[i].peBlue = xc.blue>>8;
+#endif
+
+ palent[i].peRed = this->palents[start+i].peRed;
+ palent[i].peBlue = this->palents[start+i].peBlue;
+ palent[i].peGreen = this->palents[start+i].peGreen;
+ palent[i].peFlags = this->palents[start+i].peFlags;
+
}
return 0;
}
@@ -908,10 +998,13 @@
xc.green = palent[i].peGreen<<8;
xc.flags = DoRed|DoBlue|DoGreen;
xc.pixel = start+i;
+
TSXStoreColor(display,this->cm,&xc);
+
this->palents[start+i].peRed = palent[i].peRed;
this->palents[start+i].peBlue = palent[i].peBlue;
this->palents[start+i].peGreen = palent[i].peGreen;
+ this->palents[start+i].peFlags = palent[i].peFlags;
}
return 0;
}
@@ -942,10 +1035,13 @@
xc.green = palent[i].peGreen<<8;
xc.flags = DoRed|DoBlue|DoGreen;
xc.pixel = i+start;
+
TSXStoreColor(display,this->cm,&xc);
+
this->palents[start+i].peRed = palent[i].peRed;
this->palents[start+i].peBlue = palent[i].peBlue;
this->palents[start+i].peGreen = palent[i].peGreen;
+ this->palents[start+i].peFlags = palent[i].peFlags;
}
TSXF86DGAInstallColormap(display,DefaultScreen(display),this->cm);
return 0;
@@ -955,6 +1051,7 @@
}
static ULONG WINAPI IDirectDrawPalette_Release(LPDIRECTDRAWPALETTE this) {
+ TRACE( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref );
if (!--(this->ref)) {
if (this->cm) {
TSXFreeColormap(display,this->cm);
@@ -967,6 +1064,8 @@
}
static ULONG WINAPI IDirectDrawPalette_AddRef(LPDIRECTDRAWPALETTE this) {
+
+ TRACE( ddraw, "(%p)->() incrementing from %lu.\n", this, this->ref );
return ++(this->ref);
}
@@ -976,21 +1075,39 @@
return DDERR_ALREADYINITIALIZED;
}
+static HRESULT WINAPI IDirectDrawPalette_GetCaps(
+ LPDIRECTDRAWPALETTE this, LPDWORD lpdwCaps )
+{
+ FIXME( ddraw, "(%p)->(%p) stub.\n", this, lpdwCaps );
+ return DD_OK;
+}
+
+static HRESULT WINAPI IDirectDrawPalette_QueryInterface(
+ LPDIRECTDRAWPALETTE this,REFIID refiid,LPVOID *obj )
+{
+ char xrefiid[50];
+
+ WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
+ FIXME(ddraw,"(%p)->(%s,%p) stub.\n",this,xrefiid,obj);
+
+ return S_OK;
+}
+
static struct IDirectDrawPalette_VTable dga_ddpalvt = {
- (void*)1,
+ IDirectDrawPalette_QueryInterface,
IDirectDrawPalette_AddRef,
IDirectDrawPalette_Release,
- (void*)4,
+ IDirectDrawPalette_GetCaps,
IDirectDrawPalette_GetEntries,
IDirectDrawPalette_Initialize,
DGA_IDirectDrawPalette_SetEntries
};
static struct IDirectDrawPalette_VTable xlib_ddpalvt = {
- (void*)1,
+ IDirectDrawPalette_QueryInterface,
IDirectDrawPalette_AddRef,
IDirectDrawPalette_Release,
- (void*)4,
+ IDirectDrawPalette_GetCaps,
IDirectDrawPalette_GetEntries,
IDirectDrawPalette_Initialize,
Xlib_IDirectDrawPalette_SetEntries
@@ -1036,12 +1153,15 @@
}
static ULONG WINAPI IDirect3D_AddRef(LPDIRECT3D this) {
+ TRACE( ddraw, "(%p)->() incrementing from %lu.\n", this, this->ref );
+
return ++(this->ref);
}
static ULONG WINAPI IDirect3D_Release(LPDIRECT3D this)
{
- TRACE(ddraw,"(%p)->Release()\n",this);
+ TRACE( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref );
+
if (!--(this->ref)) {
this->ddraw->lpvtbl->fnRelease(this->ddraw);
HeapFree(GetProcessHeap(),0,this);
@@ -1050,6 +1170,18 @@
return this->ref;
}
+static HRESULT WINAPI IDirect3D_Initialize(
+ LPDIRECT3D this, REFIID refiid )
+{
+ /* FIXME: Not sure if this is correct */
+ char xrefiid[50];
+
+ WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
+ FIXME(ddraw,"(%p)->(%s):stub.\n",this,xrefiid);
+
+ return DDERR_ALREADYINITIALIZED;
+}
+
/*******************************************************************************
* IDirect3D
*/
@@ -1057,7 +1189,7 @@
(void*)IDirect3D_QueryInterface,
(void*)IDirect3D_AddRef,
(void*)IDirect3D_Release,
- (void*)4,
+ IDirect3D_Initialize,
(void*)5,
(void*)6,
(void*)7,
@@ -1069,6 +1201,8 @@
* IDirect3D2
*/
static ULONG WINAPI IDirect3D2_Release(LPDIRECT3D2 this) {
+ TRACE( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref );
+
if (!--(this->ref)) {
this->ddraw->lpvtbl->fnRelease(this->ddraw);
HeapFree(GetProcessHeap(),0,this);
@@ -1107,6 +1241,12 @@
/*******************************************************************************
* IDirectDraw
*/
+
+/* Used in conjunction with cbWndExtra for storage of the this ptr for the window.
+ * Please adjust allocation in Xlib_DirectDrawCreate if you store more data here.
+ */
+static INT32 ddrawXlibThisOffset = 0;
+
static HRESULT WINAPI DGA_IDirectDraw2_CreateSurface(
LPDIRECTDRAW2 this,LPDDSURFACEDESC lpddsd,LPDIRECTDRAWSURFACE *lpdsf,IUnknown *lpunk
) {
@@ -1191,8 +1331,10 @@
LPDIRECTDRAW2 this,LPDDSURFACEDESC lpddsd,LPDIRECTDRAWSURFACE *lpdsf,IUnknown *lpunk
) {
XImage *img;
+
TRACE(ddraw, "(%p)->CreateSurface(%p,%p,%p)\n",
this,lpddsd,lpdsf,lpunk);
+
if (TRACE_ON(ddraw)) {
fprintf(stderr,"[w=%ld,h=%ld,flags ",lpddsd->dwWidth,lpddsd->dwHeight);
_dump_DDSD(lpddsd->dwFlags);
@@ -1202,9 +1344,12 @@
}
*lpdsf = (LPDIRECTDRAWSURFACE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface));
+
this->lpvtbl->fnAddRef(this);
- (*lpdsf)->ref = 1;
- (*lpdsf)->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&xlib_dds3vt;
+ (*lpdsf)->s.ddraw = this;
+ (*lpdsf)->ref = 1;
+ (*lpdsf)->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&xlib_dds3vt;
+
if ( (lpddsd->dwFlags & DDSD_CAPS) &&
(lpddsd->ddsCaps.dwCaps & DDSCAPS_OFFSCREENPLAIN)
) {
@@ -1225,7 +1370,6 @@
(*lpdsf)->s.width = lpddsd->dwWidth;
(*lpdsf)->s.height = lpddsd->dwHeight;
}
- (*lpdsf)->s.ddraw = this;
{
(*lpdsf)->t.xlib.image = img =
@@ -1251,7 +1395,10 @@
FIXME(ddraw,"urks, wants to have more than one backbuffer (%ld)!\n",lpddsd->dwBackBufferCount);
(*lpdsf)->s.backbuffer = back = (LPDIRECTDRAWSURFACE3)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface3));
+
this->lpvtbl->fnAddRef(this);
+ back->s.ddraw = this;
+
back->ref = 1;
back->lpvtbl = (LPDIRECTDRAWSURFACE3_VTABLE)&xlib_dds3vt;
/* FIXME: !8 bit images */
@@ -1273,7 +1420,6 @@
);
back->s.width = this->d.width;
back->s.height = this->d.height;
- back->s.ddraw = this;
back->s.lpitch = back->t.xlib.image->bytes_per_line;
back->s.backbuffer = NULL; /* does not have a backbuffer, it is
* one! */
@@ -1316,7 +1462,7 @@
dsprintf(ddraw, "%s ", flagmap[i].name);
TRACE(ddraw," cooperative level %s\n", dbg_str(ddraw));
}
-/* this->d.mainwindow = hwnd;*/
+ this->d.mainWindow = hwnd;
return 0;
}
@@ -1404,12 +1550,25 @@
0,
NULL
);
- SetWindowLong32A(this->e.xlib.window,0,(LONG)this);
+
+ /* Store this with the window. We'll use it for the window procedure */
+ SetWindowLong32A(this->e.xlib.window,ddrawXlibThisOffset,(LONG)this);
+
this->e.xlib.paintable = 1;
+
ShowWindow32(this->e.xlib.window,TRUE);
UpdateWindow32(this->e.xlib.window);
+
assert(this->e.xlib.window);
- this->e.xlib.drawable = WIN_FindWndPtr(this->e.xlib.window)->window;
+
+ this->e.xlib.drawable = WIN_FindWndPtr(this->e.xlib.window)->window;
+
+ /* We don't have a context for this window. Host off the desktop */
+ if( !this->e.xlib.drawable )
+ {
+ this->e.xlib.drawable = WIN_GetDesktop()->window;
+ }
+
this->d.width = width;
this->d.height = height;
/* adjust fb_height, so we don't overlap */
@@ -1503,16 +1662,23 @@
if (*lpddpal == NULL) return E_OUTOFMEMORY;
(*lpddpal)->ref = 1;
(*lpddpal)->installed = 0;
+
(*lpddpal)->ddraw = (LPDIRECTDRAW)this;
+ this->lpvtbl->fnAddRef(this);
+
if (this->d.depth<=8) {
(*lpddpal)->cm = TSXCreateColormap(display,this->e.xlib.drawable,DefaultVisualOfScreen(screen),AllocAll);
/* later installed ...
* TSXInstallColormap(display,(*lpddpal)->cm);
* TSXSetWindowColormap(display,this->e.xlib.drawable,(*lpddpal)->cm);
*/
- } else
+ }
+ else
+ {
/* we don't want palettes in hicolor or truecolor */
(*lpddpal)->cm = 0;
+ }
+
(*lpddpal)->lpvtbl = &xlib_ddpalvt;
return 0;
}
@@ -1545,10 +1711,14 @@
}
static ULONG WINAPI IDirectDraw2_AddRef(LPDIRECTDRAW2 this) {
+ TRACE( ddraw, "(%p)->() incrementing from %lu.\n", this, this->ref );
+
return ++(this->ref);
}
static ULONG WINAPI DGA_IDirectDraw2_Release(LPDIRECTDRAW2 this) {
+ TRACE( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref );
+
#ifdef HAVE_LIBXXF86DGA
if (!--(this->ref)) {
TSXF86DGADirectVideo(display,DefaultScreen(display),0);
@@ -1563,6 +1733,8 @@
}
static ULONG WINAPI Xlib_IDirectDraw2_Release(LPDIRECTDRAW2 this) {
+ TRACE( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref );
+
if (!--(this->ref)) {
HeapFree(GetProcessHeap(),0,this);
return 0;
@@ -1779,6 +1951,15 @@
return 0;
}
+static HRESULT WINAPI IDirectDraw2_Compact(
+ LPDIRECTDRAW2 this )
+{
+ FIXME(ddraw,"(%p)->()\n", this );
+
+ return DD_OK;
+}
+
+
/* Note: Hack so we can reuse the old functions without compiler warnings */
#ifdef __GNUC__
# define XCAST(fun) (typeof(dga_ddvt.fn##fun))
@@ -1790,7 +1971,7 @@
XCAST(QueryInterface)DGA_IDirectDraw2_QueryInterface,
XCAST(AddRef)IDirectDraw2_AddRef,
XCAST(Release)DGA_IDirectDraw2_Release,
- XCAST(Compact)4,
+ XCAST(Compact)IDirectDraw2_Compact,
XCAST(CreateClipper)IDirectDraw2_CreateClipper,
XCAST(CreatePalette)DGA_IDirectDraw2_CreatePalette,
XCAST(CreateSurface)DGA_IDirectDraw2_CreateSurface,
@@ -1816,7 +1997,7 @@
XCAST(QueryInterface)Xlib_IDirectDraw2_QueryInterface,
XCAST(AddRef)IDirectDraw2_AddRef,
XCAST(Release)Xlib_IDirectDraw2_Release,
- XCAST(Compact)4,
+ XCAST(Compact)IDirectDraw2_Compact,
XCAST(CreateClipper)IDirectDraw2_CreateClipper,
XCAST(CreatePalette)Xlib_IDirectDraw2_CreatePalette,
XCAST(CreateSurface)Xlib_IDirectDraw2_CreateSurface,
@@ -1843,6 +2024,7 @@
*
*/
+
static HRESULT WINAPI DGA_IDirectDraw2_SetDisplayMode(
LPDIRECTDRAW2 this,DWORD width,DWORD height,DWORD depth,DWORD xx,DWORD yy
) {
@@ -1881,7 +2063,7 @@
DGA_IDirectDraw2_QueryInterface,
IDirectDraw2_AddRef,
DGA_IDirectDraw2_Release,
- (void*)4,
+ IDirectDraw2_Compact,
IDirectDraw2_CreateClipper,
DGA_IDirectDraw2_CreatePalette,
DGA_IDirectDraw2_CreateSurface,
@@ -1908,7 +2090,7 @@
Xlib_IDirectDraw2_QueryInterface,
IDirectDraw2_AddRef,
Xlib_IDirectDraw2_Release,
- (void*)4,
+ IDirectDraw2_Compact,
IDirectDraw2_CreateClipper,
Xlib_IDirectDraw2_CreatePalette,
Xlib_IDirectDraw2_CreateSurface,
@@ -1987,22 +2169,65 @@
#endif /* defined(HAVE_LIBXXF86DGA) */
}
-LRESULT WINAPI Xlib_DDWndProc(HWND32 hwnd,UINT32 msg,WPARAM32 wParam,LPARAM lParam) {
- LRESULT ret;
- /*FIXME(ddraw,"(0x%04x,%s,0x%08lx,0x%08lx),stub!\n",(int)hwnd,SPY_GetMsgName(msg),(long)wParam,(long)lParam); */
- if (msg==WM_PAINT){
- LPDIRECTDRAW ddraw = (LPDIRECTDRAW)GetWindowLong32A(hwnd,0);
+LRESULT WINAPI Xlib_DDWndProc(HWND32 hwnd,UINT32 msg,WPARAM32 wParam,LPARAM lParam)
+{
+ LRESULT ret;
+ LPDIRECTDRAW ddraw = NULL;
+ DWORD lastError;
- if (ddraw)
- ddraw->e.xlib.paintable = 1;
- }
+ /*FIXME(ddraw,"(0x%04x,%s,0x%08lx,0x%08lx),stub!\n",(int)hwnd,SPY_GetMsgName(msg),(long)wParam,(long)lParam); */
+
+ SetLastError( ERROR_SUCCESS );
+ ddraw = (LPDIRECTDRAW)GetWindowLong32A( hwnd, ddrawXlibThisOffset );
+ if( (!ddraw) &&
+ ( ( lastError = GetLastError() ) != ERROR_SUCCESS )
+ )
+ {
+ ERR( ddraw, "Unable to retrieve this ptr from window. Error %08lx\n", lastError );
+ }
+
+ if( ddraw )
+ {
+ /* Perform any special direct draw functions */
+ if (msg==WM_PAINT)
+ {
+ ddraw->e.xlib.paintable = 1;
+ }
+
+ /* Now let the application deal with the rest of this */
+ if( ddraw->d.mainWindow )
+ {
+
+ /* Don't think that we actually need to call this but...
+ might as well be on the safe side of things... */
+ ret = DefWindowProc32A( hwnd, msg, wParam, lParam );
+
+ if( !ret )
+ {
+ /* We didn't handle the message - give it to the application */
+ ret = CallWindowProc32A( WIN_FindWndPtr( ddraw->d.mainWindow )->winproc,
+ ddraw->d.mainWindow, msg, wParam, lParam );
+ }
+
+ }
+ else
+ {
+ ret = DefWindowProc32A( ddraw->d.mainWindow, msg, wParam, lParam );
+ }
+
+ }
+ else
+ {
ret = DefWindowProc32A(hwnd,msg,wParam,lParam);
- return ret;
+ }
+
+ return ret;
}
HRESULT WINAPI Xlib_DirectDrawCreate( LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnkOuter) {
WNDCLASS32A wc;
int have_xshm = 0;
+ WND* pParentWindow;
*lplpDD = (LPDIRECTDRAW)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDraw));
(*lplpDD)->lpvtbl = &xlib_ddvt;
@@ -2012,8 +2237,14 @@
wc.style = CS_GLOBALCLASS;
wc.lpfnWndProc = Xlib_DDWndProc;
wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- wc.hInstance = 0;
+ wc.cbWndExtra = /* Defines extra mem for window. This is used for storing this */
+ sizeof( LPDIRECTDRAW ); /* ddrawXlibThisOffset */
+
+ /* We can be a child of the desktop since we're really important */
+ pParentWindow = WIN_GetDesktop();
+ wc.hInstance = pParentWindow ? pParentWindow->hwndSelf : 0;
+ wc.hInstance = 0;
+
wc.hIcon = 0;
wc.hCursor = (HCURSOR32)IDC_ARROW32A;
wc.hbrBackground= NULL_BRUSH;
diff --git a/graphics/escape.c b/graphics/escape.c
index c7bac2c..d3f54f2 100644
--- a/graphics/escape.c
+++ b/graphics/escape.c
@@ -116,9 +116,27 @@
return ret;
}
-INT32 WINAPI ExtEscape32(HDC32 hdc,INT32 nEscape,INT32 cbInput,LPCSTR x,INT32 cbOutput,LPSTR out) {
- FIXME(driver,"(0x%04x,0x%x,%d,%s,%d,%p),stub!\n",
- hdc,nEscape,cbInput,x,cbOutput,out
- );
- return 1;
+/******************************************************************************
+ * ExtEscape32 [GDI32.95]
+ *
+ * PARAMS
+ * hdc [I] Handle to device context
+ * nEscape [I] Escape function
+ * cbInput [I] Number of bytes in input structure
+ * lpszInData [I] Pointer to input structure
+ * cbOutput [I] Number of bytes in output structure
+ * lpszOutData [O] Pointer to output structure
+ *
+ * RETURNS
+ * Success: >0
+ * Not implemented: 0
+ * Failure: <0
+ */
+INT32 WINAPI ExtEscape32( HDC32 hdc, INT32 nEscape, INT32 cbInput,
+ LPCSTR lpszInData, INT32 cbOutput, LPSTR lpszOutData )
+{
+ FIXME(driver,"(0x%04x,0x%x,%d,%s,%d,%p):stub\n",
+ hdc,nEscape,cbInput,debugstr_a(lpszInData),cbOutput,lpszOutData);
+ return 0;
}
+
diff --git a/graphics/painting.c b/graphics/painting.c
index 57b3316..0c7d3a9 100644
--- a/graphics/painting.c
+++ b/graphics/painting.c
@@ -812,8 +812,7 @@
const LPRECT32 lprcFrom,
const LPRECT32 lprcTo )
{
- FIXME(gdi,"(%x,%d,%p,%p): empty stub!\n",
- hwnd, idAni, lprcFrom, lprcTo );
+ FIXME(gdi,"(0x%x,%d,%p,%p): stub\n",hwnd,idAni,lprcFrom,lprcTo);
return TRUE;
}
diff --git a/graphics/path.c b/graphics/path.c
index 9fd23ca..bd5dffd 100644
--- a/graphics/path.c
+++ b/graphics/path.c
@@ -239,7 +239,7 @@
INT16 WINAPI GetPath16(HDC16 hdc, LPPOINT16 pPoints, LPBYTE pTypes,
INT16 nSize)
{
- FIXME(gdi, "Unimplemented stub\n");
+ FIXME(gdi, "(%d,%p,%p): stub\n",hdc,pPoints,pTypes);
return 0;
}
diff --git a/graphics/x11drv/xfont.c b/graphics/x11drv/xfont.c
index 27c5009..ac86022 100644
--- a/graphics/x11drv/xfont.c
+++ b/graphics/x11drv/xfont.c
@@ -73,18 +73,18 @@
{ "-adobe-helvetica-", "Arial" }
};
-/* Charset translation table, cp125-.. encoded fonts are produced by
- * the fnt2bdf */
+/* Charset translation table, microsoft-cp125.. encoded fonts are produced by
+ * the fnt2bdf or the True Type X11 font servers */
static int numCPTranslation = 8;
-static BYTE CPTranslation[] = { EE_CHARSET, /* cp125-0 */
- RUSSIAN_CHARSET, /* cp125-1 */
- ANSI_CHARSET, /* cp125-2 */
- GREEK_CHARSET, /* cp125-3 */
- TURKISH_CHARSET, /* cp125-4 */
- HEBREW_CHARSET, /* cp125-5 */
- ARABIC_CHARSET, /* cp125-6 */
- BALTIC_CHARSET /* cp125-7 */
+static BYTE CPTranslation[] = { EE_CHARSET, /* cp1250 */
+ RUSSIAN_CHARSET, /* cp1251 */
+ ANSI_CHARSET, /* cp1252 */
+ GREEK_CHARSET, /* cp1253 */
+ TURKISH_CHARSET, /* cp1254 */
+ HEBREW_CHARSET, /* cp1255 */
+ ARABIC_CHARSET, /* cp1256 */
+ BALTIC_CHARSET /* cp1257 */
};
UINT16 XTextCaps = TC_OP_CHARACTER | TC_OP_STROKE |
@@ -104,7 +104,7 @@
static const char* INIGlobalMetrics = "FontMetrics";
static const char* LFDSeparator = "*-";
-static const char* localMSEncoding = "cp125-";
+static const char* localMSEncoding = "microsoft-cp125";
static const char* iso8859Encoding = "iso8859-";
static const char* iso646Encoding = "iso646.1991-";
static const char* ansiEncoding = "ansi-";
@@ -372,7 +372,7 @@
fi->fi_flags |= FI_ENC_ISO646;
else if( strstr(lpch, ansiEncoding) ) /* fnt2bdf produces -ansi-0 LFD */
fi->fi_flags |= FI_ENC_ANSI;
- else /* ... and -cp125-x */
+ else /* ... and -microsoft-cp125x */
{
fi->df.dfCharSet = OEM_CHARSET;
if( !strncasecmp(lpch, localMSEncoding, 6) )
@@ -384,7 +384,8 @@
fi->df.dfCharSet = CPTranslation[i];
}
}
- else if( strstr(lpch, "fontspecific") )
+ else if( strstr(lpch, "fontspecific") ||
+ strstr(lpch, "microsoft-symbol") )
fi->df.dfCharSet = SYMBOL_CHARSET;
}
return TRUE;
@@ -1993,14 +1994,14 @@
int i;
char *cp, *start;
- XGetFontProperty( pfo->fs, XA_FONT, &nameAtom );
- fontName = XGetAtomName( display, nameAtom );
+ TSXGetFontProperty( pfo->fs, XA_FONT, &nameAtom );
+ fontName = TSXGetAtomName( display, nameAtom );
for(i = 0, cp = fontName; i < 7; i++) {
cp = strchr(cp, '-');
cp++;
}
if(*cp != '[') {
- XFree(fontName);
+ TSXFree(fontName);
return FALSE;
}
start = cp;
@@ -2010,10 +2011,10 @@
#define PX pfo->lpX11Trans
sscanf(start, "[%f%f%f%f]", &PX->a, &PX->b, &PX->c, &PX->d);
- XFree(fontName);
+ TSXFree(fontName);
- XGetFontProperty( pfo->fs, RAW_ASCENT, &PX->RAW_ASCENT );
- XGetFontProperty( pfo->fs, RAW_DESCENT, &PX->RAW_DESCENT );
+ TSXGetFontProperty( pfo->fs, RAW_ASCENT, &PX->RAW_ASCENT );
+ TSXGetFontProperty( pfo->fs, RAW_DESCENT, &PX->RAW_DESCENT );
PX->pixelsize = hypot(PX->a, PX->b);
PX->ascent = PX->pixelsize / 1000.0 * PX->RAW_ASCENT;