Alexandre Julliard : msi: Build a proper tab chain by walking through the controls list.
Alexandre Julliard
julliard at winehq.org
Wed Jul 15 09:47:16 CDT 2009
Module: wine
Branch: master
Commit: 2c5bd49297f79d9941a256d8ec61e0eb2bf9bf9c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2c5bd49297f79d9941a256d8ec61e0eb2bf9bf9c
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Jul 15 14:22:14 2009 +0200
msi: Build a proper tab chain by walking through the controls list.
Simply changing Z-order as we encounter windows is not sufficient to
ensure correct ordering, we have to rebuild the list from scratch.
---
dlls/msi/dialog.c | 50 +++++++++++++++++++++++---------------------------
1 files changed, 23 insertions(+), 27 deletions(-)
diff --git a/dlls/msi/dialog.c b/dlls/msi/dialog.c
index 025a227..88416e3 100644
--- a/dlls/msi/dialog.c
+++ b/dlls/msi/dialog.c
@@ -417,7 +417,7 @@ static msi_control *msi_dialog_create_window( msi_dialog *dialog,
return NULL;
strcpyW( control->name, name );
- list_add_head( &dialog->controls, &control->entry );
+ list_add_tail( &dialog->controls, &control->entry );
control->handler = NULL;
control->update = NULL;
control->property = NULL;
@@ -3002,37 +3002,34 @@ static void msi_dialog_adjust_dialog_pos( msi_dialog *dialog, MSIRECORD *rec, LP
AdjustWindowRect( pos, style, FALSE );
}
-static BOOL msi_control_set_next( msi_control *control, msi_control *next )
+static void msi_dialog_set_tab_order( msi_dialog *dialog, LPCWSTR first )
{
- return SetWindowPos( next->hwnd, control->hwnd, 0, 0, 0, 0,
- SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOREDRAW |
- SWP_NOREPOSITION | SWP_NOSENDCHANGING | SWP_NOSIZE );
-}
+ struct list tab_chain;
+ msi_control *control;
+ HWND prev = HWND_TOP;
-static UINT msi_dialog_set_tab_order( msi_dialog *dialog )
-{
- msi_control *control, *tab_next;
+ list_init( &tab_chain );
+ if (!(control = msi_dialog_find_control( dialog, first ))) return;
- LIST_FOR_EACH_ENTRY( control, &dialog->controls, msi_control, entry )
+ dialog->hWndFocus = control->hwnd;
+ while (control)
{
- tab_next = msi_dialog_find_control( dialog, control->tabnext );
- if( !tab_next )
- continue;
- msi_control_set_next( control, tab_next );
+ list_remove( &control->entry );
+ list_add_tail( &tab_chain, &control->entry );
+ if (!control->tabnext) break;
+ control = msi_dialog_find_control( dialog, control->tabnext );
}
- return ERROR_SUCCESS;
-}
-
-static void msi_dialog_set_first_control( msi_dialog* dialog, LPCWSTR name )
-{
- msi_control *control;
+ LIST_FOR_EACH_ENTRY( control, &tab_chain, msi_control, entry )
+ {
+ SetWindowPos( control->hwnd, prev, 0, 0, 0, 0,
+ SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOREDRAW |
+ SWP_NOREPOSITION | SWP_NOSENDCHANGING | SWP_NOSIZE );
+ prev = control->hwnd;
+ }
- control = msi_dialog_find_control( dialog, name );
- if( control )
- dialog->hWndFocus = control->hwnd;
- else
- dialog->hWndFocus = NULL;
+ /* put them back on the main list */
+ list_move_head( &dialog->controls, &tab_chain );
}
static LRESULT msi_dialog_oncreate( HWND hwnd, LPCREATESTRUCTW cs )
@@ -3082,8 +3079,7 @@ static LRESULT msi_dialog_oncreate( HWND hwnd, LPCREATESTRUCTW cs )
msi_dialog_build_font_list( dialog );
msi_dialog_fill_controls( dialog );
msi_dialog_evaluate_control_conditions( dialog );
- msi_dialog_set_tab_order( dialog );
- msi_dialog_set_first_control( dialog, MSI_RecordGetString( rec, 8 ) );
+ msi_dialog_set_tab_order( dialog, MSI_RecordGetString( rec, 8 ) );
msiobj_release( &rec->hdr );
return 0;
More information about the wine-cvs
mailing list