Module: wine Branch: master Commit: 3d812659e87c472a81a152f2ddfe27bd18801deb URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=3d812659e87c472a81a152f2...
Author: James Hawkins truiken@gmail.com Date: Thu Sep 28 16:20:40 2006 -0700
msi: Return to the parent dialog when the argument to the EndDialog event is Return.
---
dlls/msi/dialog.c | 17 +++++++++++++++-- dlls/msi/events.c | 15 ++++++++++----- dlls/msi/msipriv.h | 4 +++- dlls/msi/preview.c | 2 +- 4 files changed, 29 insertions(+), 9 deletions(-)
diff --git a/dlls/msi/dialog.c b/dlls/msi/dialog.c index 958d63a..74eefe5 100644 --- a/dlls/msi/dialog.c +++ b/dlls/msi/dialog.c @@ -82,6 +82,7 @@ typedef struct msi_font_tag struct msi_dialog_tag { MSIPACKAGE *package; + msi_dialog *parent; msi_dialog_event_handler event_handler; BOOL finished; INT scale; @@ -222,6 +223,16 @@ static LPWSTR msi_dialog_dup_property( m return strdupW( property ); }
+msi_dialog *msi_dialog_get_parent( msi_dialog *dialog ) +{ + return dialog->parent; +} + +LPWSTR msi_dialog_get_name( msi_dialog *dialog ) +{ + return dialog->name; +} + /* * msi_dialog_get_style * @@ -3060,8 +3071,9 @@ static LRESULT WINAPI MSIHiddenWindowPro
/* functions that interface to other modules within MSI */
-msi_dialog *msi_dialog_create( MSIPACKAGE* package, LPCWSTR szDialogName, - msi_dialog_event_handler event_handler ) +msi_dialog *msi_dialog_create( MSIPACKAGE* package, + LPCWSTR szDialogName, msi_dialog *parent, + msi_dialog_event_handler event_handler ) { MSIRECORD *rec = NULL; msi_dialog *dialog; @@ -3073,6 +3085,7 @@ msi_dialog *msi_dialog_create( MSIPACKAG if( !dialog ) return NULL; strcpyW( dialog->name, szDialogName ); + dialog->parent = parent; msiobj_addref( &package->hdr ); dialog->package = package; dialog->event_handler = event_handler; diff --git a/dlls/msi/events.c b/dlls/msi/events.c index 72e5217..e9b7d55 100644 --- a/dlls/msi/events.c +++ b/dlls/msi/events.c @@ -58,13 +58,13 @@ UINT ControlEvent_HandleControlEvent(MSI /* * Create a dialog box and run it if it's modal */ -static UINT event_do_dialog( MSIPACKAGE *package, LPCWSTR name, BOOL destroy_modeless ) +static UINT event_do_dialog( MSIPACKAGE *package, LPCWSTR name, msi_dialog *parent, BOOL destroy_modeless ) { msi_dialog *dialog; UINT r;
/* create a new dialog */ - dialog = msi_dialog_create( package, name, + dialog = msi_dialog_create( package, name, parent, ControlEvent_HandleControlEvent ); if( dialog ) { @@ -111,7 +111,12 @@ static UINT ControlEvent_EndDialog(MSIPA else if (lstrcmpW(argument, szIgnore) == 0) package->CurrentInstallState = -1; else if (lstrcmpW(argument, szReturn) == 0) + { + msi_dialog *parent = msi_dialog_get_parent(dialog); + msi_free(package->next_dialog); + package->next_dialog = (parent) ? strdupW(msi_dialog_get_name(parent)) : NULL; package->CurrentInstallState = ERROR_SUCCESS; + } else { ERR("Unknown argument string %s\n",debugstr_w(argument)); @@ -143,7 +148,7 @@ static UINT ControlEvent_SpawnDialog(MSI msi_dialog *dialog) { /* don't destroy a modeless dialogs that might be our parent */ - event_do_dialog( package, argument, FALSE ); + event_do_dialog( package, argument, dialog, FALSE ); if( package->CurrentInstallState != ERROR_SUCCESS ) msi_dialog_end_dialog( dialog ); return ERROR_SUCCESS; @@ -353,13 +358,13 @@ UINT ACTION_DialogBox( MSIPACKAGE* packa * dialog, as it returns ERROR_IO_PENDING when we try to run * its message loop. */ - r = event_do_dialog( package, szDialogName, TRUE ); + r = event_do_dialog( package, szDialogName, NULL, TRUE ); while( r == ERROR_SUCCESS && package->next_dialog ) { LPWSTR name = package->next_dialog;
package->next_dialog = NULL; - r = event_do_dialog( package, name, TRUE ); + r = event_do_dialog( package, name, NULL, TRUE ); msi_free( name ); }
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h index 0d27ec8..cc3b88b 100644 --- a/dlls/msi/msipriv.h +++ b/dlls/msi/msipriv.h @@ -451,7 +451,7 @@ extern LONG msi_reg_set_subkey_val( HKEY
/* msi dialog interface */ typedef UINT (*msi_dialog_event_handler)( MSIPACKAGE*, LPCWSTR, LPCWSTR, msi_dialog* ); -extern msi_dialog *msi_dialog_create( MSIPACKAGE*, LPCWSTR, msi_dialog_event_handler ); +extern msi_dialog *msi_dialog_create( MSIPACKAGE*, LPCWSTR, msi_dialog*, msi_dialog_event_handler ); extern UINT msi_dialog_run_message_loop( msi_dialog* ); extern void msi_dialog_end_dialog( msi_dialog* ); extern void msi_dialog_check_messages( HANDLE ); @@ -462,6 +462,8 @@ extern void msi_dialog_unregister_class( extern void msi_dialog_handle_event( msi_dialog*, LPCWSTR, LPCWSTR, MSIRECORD * ); extern UINT msi_dialog_reset( msi_dialog *dialog ); extern UINT msi_dialog_directorylist_up( msi_dialog *dialog ); +extern msi_dialog *msi_dialog_get_parent( msi_dialog *dialog ); +extern LPWSTR msi_dialog_get_name( msi_dialog *dialog );
/* preview */ extern MSIPREVIEW *MSI_EnableUIPreview( MSIDATABASE * ); diff --git a/dlls/msi/preview.c b/dlls/msi/preview.c index 161bcc7..4f4cc5c 100644 --- a/dlls/msi/preview.c +++ b/dlls/msi/preview.c @@ -103,7 +103,7 @@ UINT MSI_PreviewDialogW( MSIPREVIEW *pre /* an empty name means we should just destroy the current preview dialog */ if( szDialogName ) { - dialog = msi_dialog_create( preview->package, szDialogName, + dialog = msi_dialog_create( preview->package, szDialogName, NULL, preview_event_handler ); if( dialog ) msi_dialog_do_preview( dialog );