ttydrv fix

Eric Laforest ecl at pet.dhs.org
Sat Dec 8 04:54:18 CST 2001


Resubmitted.

This patch adds the missing functionality in the ttydriver.
Apps like FreeSolitaire and WineMine now start and wait in their main loop.

Eric LaForest

-------------- next part --------------
? log
? dlls/avicap32
? dlls/msrle32
? dlls/netapi32
? programs/wineconsole
Index: dlls/ttydrv/ttydrv.spec
===================================================================
RCS file: /home/wine/wine/dlls/ttydrv/ttydrv.spec,v
retrieving revision 1.19
diff -u -r1.19 ttydrv.spec
--- dlls/ttydrv/ttydrv.spec	2001/11/30 23:15:32	1.19
+++ dlls/ttydrv/ttydrv.spec	2001/12/08 09:13:58
@@ -67,3 +67,4 @@
 @ cdecl IsClipboardFormatAvailable(long) TTYDRV_IsClipboardFormatAvailable
 @ cdecl RegisterClipboardFormat(str) TTYDRV_RegisterClipboardFormat
 @ cdecl IsSelectionOwner() TTYDRV_IsSelectionOwner
+@ cdecl ShowWindow(long long) TTYDRV_ShowWindow
Index: dlls/ttydrv/wnd.c
===================================================================
RCS file: /home/wine/wine/dlls/ttydrv/wnd.c,v
retrieving revision 1.18
diff -u -r1.18 wnd.c
--- dlls/ttydrv/wnd.c	2001/11/06 22:28:18	1.18
+++ dlls/ttydrv/wnd.c	2001/12/08 09:13:58
@@ -645,3 +645,164 @@
     WIN_ReleaseWndPtr(wndPtr);
     return retvalue;
 }
+
+
+/***********************************************************************
+ *              WINPOS_MinMaximize   (internal)
+ *
+ *Lifted from x11 driver	
+ */
+UINT WINPOS_MinMaximize( HWND hwnd, UINT cmd, LPRECT rect )
+{
+    WND *wndPtr;
+    UINT swpFlags = 0;
+    POINT size;
+    LONG old_style;
+    WINDOWPLACEMENT wpl;
+
+    TRACE("0x%04x %u\n", hwnd, cmd );
+    FIXME("(%x): stub\n", hwnd);
+
+    wpl.length = sizeof(wpl);
+    GetWindowPlacement( hwnd, &wpl );
+
+    /* If I glark this right, yields an immutable window*/
+    swpFlags = SWP_NOSIZE | SWP_NOMOVE;
+
+    if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
+
+    /*cmd handling goes here.  see dlls/x1drv/winpos.c*/
+
+    WIN_ReleaseWndPtr( wndPtr );
+    return swpFlags;
+}
+
+/***********************************************************************
+ *              ShowWindow   (TTYDRV.@)
+ *
+ *Lifted from x11 driver
+ *Sets the specified windows' show state.	
+ */
+BOOL TTYDRV_ShowWindow( HWND hwnd, INT cmd )
+{
+    WND* 	wndPtr = WIN_FindWndPtr( hwnd );
+    BOOL 	wasVisible, showFlag;
+    RECT 	newPos = {0, 0, 0, 0};
+    UINT 	swp = 0;
+
+    if (!wndPtr) return FALSE;
+    hwnd = wndPtr->hwndSelf;  /* make it a full handle */
+
+    TRACE("hwnd=%04x, cmd=%d\n", hwnd, cmd);
+
+    wasVisible = (wndPtr->dwStyle & WS_VISIBLE) != 0;
+
+    switch(cmd)
+    {
+        case SW_HIDE:
+            if (!wasVisible) goto END;;
+	    swp |= SWP_HIDEWINDOW | SWP_NOSIZE | SWP_NOMOVE |
+		        SWP_NOACTIVATE | SWP_NOZORDER;
+	    break;
+
+	case SW_SHOWMINNOACTIVE:
+            swp |= SWP_NOACTIVATE | SWP_NOZORDER;
+            /* fall through */
+	case SW_SHOWMINIMIZED:
+            swp |= SWP_SHOWWINDOW;
+            /* fall through */
+	case SW_MINIMIZE:
+            swp |= SWP_FRAMECHANGED;
+            if( !(wndPtr->dwStyle & WS_MINIMIZE) )
+		 swp |= WINPOS_MinMaximize( hwnd, SW_MINIMIZE, &newPos );
+            else swp |= SWP_NOSIZE | SWP_NOMOVE;
+	    break;
+
+	case SW_SHOWMAXIMIZED: /* same as SW_MAXIMIZE */
+            swp |= SWP_SHOWWINDOW | SWP_FRAMECHANGED;
+            if( !(wndPtr->dwStyle & WS_MAXIMIZE) )
+		 swp |= WINPOS_MinMaximize( hwnd, SW_MAXIMIZE, &newPos );
+            else swp |= SWP_NOSIZE | SWP_NOMOVE;
+            break;
+
+	case SW_SHOWNA:
+            swp |= SWP_NOACTIVATE | SWP_NOZORDER;
+            /* fall through */
+	case SW_SHOW:
+	    swp |= SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE;
+
+	    /*
+	     * ShowWindow has a little peculiar behavior that if the
+	     * window is already the topmost window, it will not
+	     * activate it.
+	     */
+	    if (GetTopWindow((HWND)0)==hwnd && (wasVisible || GetActiveWindow() == hwnd))
+	      swp |= SWP_NOACTIVATE;
+
+	    break;
+
+	case SW_SHOWNOACTIVATE:
+            swp |= SWP_NOZORDER;
+            if (GetActiveWindow()) swp |= SWP_NOACTIVATE;
+            /* fall through */
+	case SW_SHOWNORMAL:  /* same as SW_NORMAL: */
+	case SW_SHOWDEFAULT: /* FIXME: should have its own handler */
+	case SW_RESTORE:
+	    swp |= SWP_SHOWWINDOW | SWP_FRAMECHANGED;
+
+            if( wndPtr->dwStyle & (WS_MINIMIZE | WS_MAXIMIZE) )
+		 swp |= WINPOS_MinMaximize( hwnd, SW_RESTORE, &newPos );
+            else swp |= SWP_NOSIZE | SWP_NOMOVE;
+	    break;
+    }
+
+    showFlag = (cmd != SW_HIDE);
+    if (showFlag != wasVisible)
+    {
+        SendMessageA( hwnd, WM_SHOWWINDOW, showFlag, 0 );
+        if (!IsWindow( hwnd )) goto END;
+    }
+
+    /* We can't activate a child window */
+    if ((wndPtr->dwStyle & WS_CHILD) &&
+        !(wndPtr->dwExStyle & WS_EX_MDICHILD))
+        swp |= SWP_NOACTIVATE | SWP_NOZORDER;
+
+    SetWindowPos( hwnd, HWND_TOP, newPos.left, newPos.top,
+                  newPos.right, newPos.bottom, LOWORD(swp) );
+    if (cmd == SW_HIDE)
+    {
+        /* FIXME: This will cause the window to be activated irrespective
+         * of whether it is owned by the same thread. Has to be done
+         * asynchronously.
+         */
+
+        if (hwnd == GetActiveWindow())
+            WINPOS_ActivateOtherWindow(hwnd);
+
+        /* Revert focus to parent */
+        if (hwnd == GetFocus() || IsChild(hwnd, GetFocus()))
+            SetFocus( GetParent(hwnd) );
+    }
+    if (!IsWindow( hwnd )) goto END;
+    else if( wndPtr->dwStyle & WS_MINIMIZE ) WINPOS_ShowIconTitle( hwnd, TRUE );
+
+    if (wndPtr->flags & WIN_NEED_SIZE)
+    {
+        /* should happen only in CreateWindowEx() */
+	int wParam = SIZE_RESTORED;
+
+	wndPtr->flags &= ~WIN_NEED_SIZE;
+	if (wndPtr->dwStyle & WS_MAXIMIZE) wParam = SIZE_MAXIMIZED;
+	else if (wndPtr->dwStyle & WS_MINIMIZE) wParam = SIZE_MINIMIZED;
+	SendMessageA( hwnd, WM_SIZE, wParam,
+		     MAKELONG(wndPtr->rectClient.right-wndPtr->rectClient.left,
+			    wndPtr->rectClient.bottom-wndPtr->rectClient.top));
+	SendMessageA( hwnd, WM_MOVE, 0,
+		   MAKELONG(wndPtr->rectClient.left, wndPtr->rectClient.top) );
+    }
+
+END:
+    WIN_ReleaseWndPtr(wndPtr);
+    return wasVisible;
+}


More information about the wine-patches mailing list