246 lines
4.6 KiB
C
246 lines
4.6 KiB
C
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1997.
|
|
//
|
|
// File: moveui.c
|
|
//
|
|
// Contents:
|
|
//
|
|
// Classes:
|
|
//
|
|
// Functions:
|
|
//
|
|
// History: 5-21-97 RichardW Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
|
|
#include "moveme.h"
|
|
#include "dialogs.h"
|
|
|
|
typedef enum _UI_THREAD_STATE {
|
|
ThreadBlock,
|
|
ThreadRunUi,
|
|
ThreadExit
|
|
} UI_THREAD_STATE ;
|
|
|
|
typedef struct _UI_THREAD_INFO {
|
|
HWND hWnd ;
|
|
HANDLE UiWait ;
|
|
HANDLE CallerWait ;
|
|
UI_THREAD_STATE State ;
|
|
ULONG CurrentString ;
|
|
ULONG Flags ;
|
|
ULONG Percentage ;
|
|
PWSTR Title ;
|
|
} UI_THREAD_INFO ;
|
|
|
|
#define WM_READSTATE WM_USER + 1
|
|
|
|
UI_THREAD_INFO UiThreadInfo ;
|
|
HINSTANCE Module ;
|
|
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
FeedbackDlg(
|
|
HWND hDlg,
|
|
UINT Message,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
WCHAR Text[ MAX_PATH ];
|
|
|
|
switch ( Message )
|
|
{
|
|
case WM_COMMAND:
|
|
break;
|
|
|
|
case WM_INITDIALOG:
|
|
|
|
UiThreadInfo.hWnd = hDlg ;
|
|
|
|
SetWindowText( hDlg, UiThreadInfo.Title );
|
|
|
|
SetDlgItemText( hDlg, IDD_MIGRATING_TEXT, L"" );
|
|
|
|
SendMessage( GetDlgItem( hDlg, IDD_MIGRATING_PROGRESS ),
|
|
PBM_SETSTEP, (WPARAM) 1, 0 );
|
|
|
|
SetEvent( UiThreadInfo.CallerWait );
|
|
|
|
return TRUE ;
|
|
|
|
case WM_READSTATE:
|
|
LoadString( Module, UiThreadInfo.CurrentString, Text, MAX_PATH );
|
|
SetDlgItemText( hDlg, IDD_MIGRATING_TEXT, Text );
|
|
|
|
SendMessage( GetDlgItem( hDlg, IDD_MIGRATING_PROGRESS ),
|
|
PBM_SETPOS, (WPARAM) UiThreadInfo.Percentage, 0 );
|
|
|
|
UpdateWindow( GetDlgItem( hDlg, IDD_MIGRATING_PROGRESS ) );
|
|
UpdateWindow( hDlg );
|
|
|
|
return TRUE ;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return FALSE ;
|
|
}
|
|
|
|
|
|
DWORD
|
|
UiThread(
|
|
PVOID Ignored
|
|
)
|
|
{
|
|
DebugLog(( DEB_TRACE_UI, "UI Thread starting\n" ));
|
|
|
|
SetEvent( UiThreadInfo.CallerWait );
|
|
|
|
while ( 1 )
|
|
{
|
|
DebugLog(( DEB_TRACE_UI, "State = %d\n", UiThreadInfo.State ));
|
|
|
|
if ( UiThreadInfo.State == ThreadBlock )
|
|
{
|
|
WaitForSingleObjectEx( UiThreadInfo.UiWait, INFINITE, FALSE );
|
|
continue;
|
|
}
|
|
|
|
if ( UiThreadInfo.State == ThreadExit )
|
|
{
|
|
ExitThread( 0 );
|
|
}
|
|
|
|
if ( UiThreadInfo.State == ThreadRunUi )
|
|
{
|
|
DialogBox( Module,
|
|
MAKEINTRESOURCE( IDD_MIGRATING ),
|
|
NULL,
|
|
FeedbackDlg );
|
|
|
|
ResetEvent( UiThreadInfo.UiWait );
|
|
|
|
UiThreadInfo.State = ThreadBlock ;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
CreateUiThread(
|
|
VOID
|
|
)
|
|
{
|
|
HANDLE hThread ;
|
|
DWORD Tid ;
|
|
|
|
if ( MoveOptions & MOVE_NO_UI )
|
|
{
|
|
return TRUE ;
|
|
}
|
|
|
|
Module = GetModuleHandle( NULL );
|
|
|
|
ZeroMemory( &UiThreadInfo, sizeof( UiThreadInfo ) );
|
|
|
|
UiThreadInfo.UiWait = CreateEvent( NULL, FALSE, FALSE, NULL );
|
|
UiThreadInfo.CallerWait = CreateEvent( NULL, FALSE, FALSE, NULL );
|
|
|
|
UiThreadInfo.State = ThreadBlock ;
|
|
|
|
hThread = CreateThread( NULL, 0,
|
|
UiThread, 0,
|
|
0, &Tid );
|
|
|
|
if ( hThread )
|
|
{
|
|
CloseHandle( hThread );
|
|
|
|
WaitForSingleObjectEx( UiThreadInfo.CallerWait, INFINITE, FALSE );
|
|
|
|
return TRUE ;
|
|
}
|
|
|
|
return FALSE ;
|
|
|
|
}
|
|
|
|
VOID
|
|
StopUiThread(
|
|
VOID
|
|
)
|
|
{
|
|
if ( MoveOptions & MOVE_NO_UI )
|
|
{
|
|
return ;
|
|
}
|
|
|
|
if ( UiThreadInfo.State == ThreadRunUi )
|
|
{
|
|
SendMessage( UiThreadInfo.hWnd, WM_CLOSE, 0, 0 );
|
|
}
|
|
|
|
UiThreadInfo.State = ThreadExit ;
|
|
|
|
SetEvent( UiThreadInfo.UiWait );
|
|
}
|
|
|
|
VOID
|
|
RaiseUi(
|
|
HWND Parent,
|
|
LPWSTR Title
|
|
)
|
|
{
|
|
if ( MoveOptions & MOVE_NO_UI )
|
|
{
|
|
return;
|
|
}
|
|
UiThreadInfo.State = ThreadRunUi ;
|
|
UiThreadInfo.Title = Title ;
|
|
|
|
DebugLog(( DEB_TRACE_UI, "Raise: State = %d, pulsing event\n",
|
|
UiThreadInfo.State ));
|
|
|
|
ResetEvent( UiThreadInfo.CallerWait );
|
|
SetEvent( UiThreadInfo.UiWait );
|
|
|
|
WaitForSingleObjectEx( UiThreadInfo.CallerWait, INFINITE, FALSE );
|
|
|
|
}
|
|
|
|
VOID
|
|
UpdateUi(
|
|
DWORD StringId,
|
|
DWORD Percentage
|
|
)
|
|
{
|
|
if ( MoveOptions & MOVE_NO_UI )
|
|
{
|
|
return;
|
|
}
|
|
if ( UiThreadInfo.State == ThreadRunUi )
|
|
{
|
|
UiThreadInfo.CurrentString = StringId ;
|
|
UiThreadInfo.Percentage = Percentage ;
|
|
|
|
SendMessage( UiThreadInfo.hWnd, WM_READSTATE, 0, 0 );
|
|
|
|
}
|
|
|
|
if ( Percentage == 100 )
|
|
{
|
|
EndDialog( UiThreadInfo.hWnd, IDOK );
|
|
|
|
}
|
|
|
|
}
|