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