Date: Mon, 20 Sep 1999 19:31:06 +0000 From: Eric Pouech <Eric.Pouech@wanadoo.fr> To: "Wine annouce (WWN publish)" <wine-announce@winehq.com> Subject: Wine Weekly News #9 (1999-week 39) This is a multi-part message in MIME format. --------------0AA1200517D536877FE64B4A Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Please find enclosed the 9th WWN issue. Have a nice reading ! -- --------------- Eric Pouech (http://perso.wanadoo.fr/eric.pouech/) "The future will be better tomorrow", Vice President Dan Quayle --------------0AA1200517D536877FE64B4A Content-Type: text/plain; charset=iso-8859-1; name="a.txt" Content-Transfer-Encoding: 8bit Content-Disposition: inline; filename="a.txt" All the News that Fits, we print. Events, progress, and happenings in the Wine community for September, 20th 1999. _________________________________________________________________ __________________________________________________________________________ Headlines __________________________________________________________________________ __________________________________________________________________________ Wine in the News __________________________________________________________________________ * Ian Schmidt pointed out to an [1]article related to future of Microsoft regarding Wine. This article predicts some Microsoft Wine-like products for pretty soon. I can only add another URL here: [2]Microsoft's WISE initiative. * Paul E. Merrell informed about a [3]Windows Common Controls Replacement Project, which goal is to provide a (better) alternive to comctl32, comdlg32 DLLs. * There's also some article linked to Corel/Linux and some positive feedback on Wine [4]here __________________________________________________________________________ Keeping Track of Wine __________________________________________________________________________ Patrik Stridvall provided support for anonymous union (when supported by compiler). Karl Lessard, Huw Davies and Ulrich Weigand fixed some issues in GetDIBits(). Jürgend Schmied fixed a bug while loading .ani file. Richard Cohen made the handling of menus more robuts, while Dennis Björklund fixed some message handling upon closure. Dennis Björklund fixed Win9x look on radio-buttons and checkboxes. Thanks Francis Beaudet, combo boxes now support the disable state. Karl Lessard better implemented menus for Win 3.1. David Luyer fixed some error in the tab control. Thuy Nguyen added support for Wizard sheets in common controls. Stephane Lussier fixed some drawing problems in image lists. Jürgend Schmiedt kept on improving shell32 (more pidls definitions) Eric Pouech fixed a crash in PlaySound(). Thanks Luc Tourangeau, invisible pens are now supported by the Postscript driver (which Huw Davies kept improving, notably in the 16/32 mapping). Marcus Meissner added the SC_GET_TYPE function to the SCSI interface. Ulrich Weigand fixed a bug in the debugger dissassembler, and kept on going with modules layout (mainly ole). __________________________________________________________________________ Discussions on wine-devel __________________________________________________________________________ Winsock (cont'd) The discussion regarding implementation of Winsock continued (see last week's WWN article for more information). Several issues have been addressed: 1. How to split functions between the wineserver and the client side ? 2. How to handle the asynchronous operations ? 3. Where to store the data (client side, server side, mixed) ? 4. How to detect when a socket has been closed ? Alexandre Juillard proposed to store the handle to the socket in the server, but to retrieve the attached Unix fd each time it's needed on the client side (mainly because other threads may have changed its state, or even deleted it). The tricky part lies in how the client side will be notified ofthe changes on the unix sockets fd. A first track was to let the socket handles be selectable in WaitFor... functions. Ove Kåven reported that Winsock 2 doesn't allow it, but Ulrich Weigand said "on Win95 at least WSOCK32 uses a trick to be able to wait on sockets using WaitForMultipleObjects: there's an undocumented KERNEL32 routine CreateSocketHandle which returns a handle to a K32OBJ of type K32OBJ_SOCKET (== 17)." This solution had some drawbacks: bad behavior when several threads asynchronously wait on the same socket handle; the client (or the service thread) cannot determine when to clean-up the allocated data (they are not aware of handle deletion). Ove, Alexandre and Ulrich tried some other solutions, and ended with this one: the wine-server will be enhanced so that it can associate an event to a unix (socket) fd. When, in the select() loop on the wine-server, the fd receives an action, it will trigger the event; the service thread, on the client side, will then be able to do its job. This allows both to solve the issue "can socket handles be WaitFor...:ed", and also to clearly define which actions the fd must wait on. Is this case, the socket handles will have the same behavior as file handles with respect to WaitFor... functions. Most of the operations (recv/send...) shall be done on the client side, but a new wine server command will be introduced to both re-enable the sockets in the select loop, but also to detect which ones may have been deleted, so that the correct deallocation can occur. Ove estimates that one week is the needed time to get something working: you can watch progess on his [5]project page. Future of Window Manager Dennis Björklund sent out some bits reguarding the evolution of X11 Window Managers, along with some issues he had with current Wine windows managing features:"Couldn't we tell the window manager that we don't want any decorations and paint our own window (look at xmms for example). If we run wine without -managed the look is correct, but not the behaviour." Ulrich Weigand said this could be done with "modifying the unmanaged mode (or maybe add a new mode) so it doesn't set override-redirect on top-level windows, but instead lets the WM manage those windows just like in managed mode, except it uses some (yet to be defined) hints to tell the WM to remove all frame decorations. Except for that, all painting would be done exactly like in the unmanaged case..." Ulrich was sure that not all window managers would correctly support the needed hints, and this would lead to bad behavior: "of course, we could always rely on the user to select that mode only if supported by the WM, but some kind of automatic fall-back would still be nice... " Dennis then reported the undergoing work for KDE, Gnome and other window managers to better specify what the WMs are supposed to provide (in other words an improved version of the ICCCM). Undergoing work can be found [6]here (some of the links there seem to be broken: but you can browse the directory content ;-) ). From the list of participants (or willing to participate or "being willed" to participate), this is something Wine developpers should follow up. Fonts One of the favourite Wine discussion issues popped up once again: Fonts !! Gavriel State posted: We've been looking at the font issue quite closely for the last few weeks, and we have explored a couple of possibilities. First of all, here are the primary problems we see with fonts on WINE: 1. Can't get at the outline data to support GetGlyphOutline call 2. Various font sizing and metrics issues 3. No support for antialiasing 4. X font system is very confusing and hard to set up for the average user. Gav' then introduced several options to tackle the issues he brought up: A/ Link directly to FreeType (note that FreeType 2.0 supports Type1 fonts in addition to TrueType). We've already done some experimentation along these lines and we have a preliminary implementation of GetGlyphOutline that works using direct calls to FreeType. FreeType would solve (1) and (2) quite easily - we would just get the info directly from FreeType. It would introduce another problem though: if we use FreeType to get metrics and outlines, but X to render the fonts (through something like xfsft), subtle differences crop up between the X-rendered font and the numbers we get back from FreeType. We could solve this by using FreeType for rendering as well, which would also solve issue (3), but at the expense of making remote display much slower than it has to be. If we did that, we would also solve issue (4) since all the TT fonts would be in a standard place such as /usr/share/fonts/truetype. If we didn't, the user is still stuck with configuring an X server. Finally, there's the TrueType patent issue which has yet to be resolved. (Please put up your hand if you hate software patents) B/ Encourage development of extensions to the X Font Server protocol that would enable us to get access to the font outlines. This would solve (1) and (2), while leaving (3) and (4) unresolved. Note that there was some work done on the 'XAnti' extension for XFree 4.0, but I believe that it was abandoned. We've actually had some contact with a vendor that has a font server that implements these kind of extensions along with an SDK for getting at the outlines. The code would not be free though. Their work also solves issue (4) in a different way. How do people feel about adding optional support for a non-free library that provides this functionality? Alexandre, if we did work to support such a library (ifdefed, of course), would you allow that work into CVS, or would we have to keep a seperate branch ourselves? My hope is that the vendor would be willing to release the information about the protocol they're using so that XFree and other X server developers could support the extension protocol themselves in the future.... Patrik Stridvall proposed, for option B/, to put all the related material inside a driver (instead of using #ifdef), because it makes Alexandre Juillard happier (Patrik reported some bad adventures he had with patches full of #ifdef:s being rejected by Alexandre), but also it's easier to setup (and also enable and disable) and can even allow to hook up another driver to support a (specific) protocol to another TrueType enabled font server. Later on, Patrik also sent the URL for a [7]mini-HOWTO dedicated to TrueType server setup for the Debian distribution. Douglas Ridgway also commented option B/: " As far as getting font outlines and doing font management, there's an alternative to building the added functionality into an XFS protocol extension. You can talk to the font server via a side channel. When I last looked at this, I thought there was enough flexibility in an unmodified xfs (with tt support) for our purposes, managing fonts by changing the config file and directing xfs to reread it, and maintaining a table of font file to Windows font correspondances, to allow things like outlines. I never got to a proof of concept however. My understanding of the commercial offerings was that they use a side channel as well, rather than building an extension to the XFS protocol, but I could be wrong. " Clipboard (cont'd) Noel Borthwick reported he's almost done with the clipboard server and 1) sent out a quick overview of the server implementation: The server is a standalone pure XLib application. The makefile builds a target called "wineclipsrv". wineclipsrv takes one command line argument which is a bit mask of the selection types to be acquired. Currently we just support two selections PRIMARY (internal mask value 1) and CLIPBOARD (internal mask value 2). If no argument is supplied the server aquires all selections. (mask value 3) When the server is started it first queries the current selection owner of the specified selections for the TARGETS selection target. It then proceeds to cache all the formats exposed by TARGETS. If the selection does not support the TARGETS target, or if no target formats are exposed, the server simply exits. Once the cache has been filled, the server then actually acquires ownership of the respective selection and begins fielding selection requests. Selection requests are serviced from the cache. If a selection is lost the server flushes its internal cache, destroying all data previously saved. Once ALL selections have been lost the server terminates. Now when Wine terminates, we check if Wine owns any selections. If it does we spawn the server with the appropriate selection masks. This captures the selection data from Wine and takes over the selection. 2) and asked for help in order to integrate his development into the Wine tree (especially the needed Makefiles for a good cross platform support). Patrik Stridvall then discussed some details of the implementation with Noel. Patrik main concerns were around the fact that the clipboard server is spawn when a Wine process exits: Noel implementation lets the process, when running, handle all the X11 and Windows clipboard operations; but, when the process exits, if it owns some clipboard selection, it then spawns this very server, in order to let this selection being available (either to X11 or to Windows clipboard) after the process has exited. Patrik didn't like the idea of spawning the server, and would better see a server running all the time; Patrik and Noel agreed that, if this proposal had to be implemented, this server should hold the selection all the time, which would led the windows clipboard implementation to grasp data from it (current implementation caches the clipboard content inside the process). In order to provide an efficient implementation, shared memory shall be used between the Wine processes and this server. Both agreed that Noel's work was a very acceptable short term solution, and that this discussion was the long term roadmap the clipboard implementation shall follow. DGA 2.0 and Wine Lionel Ulmer started integrating DGA 2.0 into Wine. Nevertheless, there were some issues to solve: I started some days ago to add DGA 2.0 support to DirectDraw (to use the new possibilities like depth / resolution switching and hardware blits with and without transparencies). By doing a small test program, I found out that, whatever I do, when I start using DGA, all mouse movements reported by XMotionEvents are relative movements. The game I am testing with (Baldur's Gate) uses DirectDraw for its graphics but standard USER calls for its mouse input (to be more precise, USER.17 GetCursorPos16). When I test the game with DGA, the mouse does not move at all. This is because as long as DGA is enabled, XQueryPointer always returns the position of the mouse before entering DGA. As GetCursorPos16 calls EVENT_QueryPointer, I concluded that I need to add a new driver specific to this case that would use all the XMotionEvents to compute the absolute mouse position by adding all the relative events and clip to the screen size. Ulrich Weigand proposed: to fix this in our USER itself, instead of hacking the driver: on real Windows, USER must cope with whatever it gets passed to its mouse_event routine. In particular, USER must cope if the mouse_event routine is called only with relative events. In this case it is the task of USER to add up the relative events so as to track the absolute position! So, what would you say to this solution: throw out completely the EVENT_QueryPointer routine. Instead, create USER-global variables holding the current mouse position; at all places where QueryPointer is currently called, use those variables instead. The variables are filled in the mouse_event routine, which is furthermore changed to cope with both absolute and relative mouse events. In the case of absolute events, it simply sets the global variables to the given values, while in the case of relative events, it keeps adding them up. Next, modify the X11DRV_EVENT driver to send relative mouse events if DGA is active (it should know that ...), and absolute mouse events whenever possible (just like now). Lionel noted that some remaining points needed to be solved: + " we will have to do some screen-clipping when adding the relative coordinates. And I did not find any solution to change the current monitor width / height. What will happen : Wine is started with 1024x768 (for example), the game calls DDraw::SetDisplayMode() to change the resolution to 640x480. There is no way that I can see to let USER know that the screen width / height has changed and that it should clip the absolute coordinates with other values than the one at start-up. " + how to synchronize at DGA startup between the existing mouse handler and the DGA one (there's some race condition about queued X11 events). Patrik Stridvall and Lionel also discussed some other issues related to hot-swap drivers in Wine for keyboard, mouse, screen. Credits: [8]Doug Ridgway, [9]Eric Pouech, and [10]Ove Kåven. References 1. http://www.gbdirect.co.uk/studies/msstrat.htm 2. http://msdn.microsoft.com/library/backgrnd/html/wise.htm 3. http://www.mvps.org/ccrp/ 4. http://www.futurenet.com/pcplus/article.asp?id=11732 5. http://www.arcticnet.no/~ovek/wine/winsock.html 6. http://developer.gnome.org/doc/standards/extwmhints/book1.html 7. http://www.dimensional.com/~bgiles/debian-tt.html 8. mailto:ridgway@winehq.com 9. mailto:pouech@winehq.com 10. mailto:ovek@winehq.com --------------0AA1200517D536877FE64B4A--