Hi all, Right now when using the MDI TAB navigation just doesn't works, as a test just change the MDI.pl sample by adding a second Textfield control, make them singleline (to keep it simple), add the proper tabstop => 1 and try adding a dialogui=>1 either to the MDIChild or to the MDIFrame. (Complete test case at request) The first case (dialogui=>1 in MDIChild) simply doesn't works because in the main loop of Dialog in GUI.xs, fIsDialog is tested only on the top window. In the second case (dialogui=>1 in MDIFrame) a first TAB seems to work, but the focus doesn't move past the first control. Worse, when I try adding a -controlparent => 1 to the MDIChild, a few TABs results in all the application freezing. The attached patch cures that, allowing dialogui=>1 in the MDIChild and calling IsDialogMessage in the context of that window. Comments? Regards. -- Salvador Ortiz <[EMAIL PROTECTED]>
--- GUI.xs 2007-01-20 11:09:22.000000000 -0600 +++ /home/sog/dosdir/work/Win32-GUI-1.05_01/GUI.xs 2007-07-15 02:18:17.000000000 -0500 @@ -1049,6 +1049,7 @@ BOOL fIsMDI; HACCEL acc; LPPERLWIN32GUI_USERDATA perlud; + LPPERLWIN32GUI_USERDATA tperlud; CODE: stayhere = 1; fIsDialog = FALSE; @@ -1080,10 +1081,22 @@ fIsMDI = perlud->dwPlStyle & (PERLWIN32GUI_MDIFRAME | PERLWIN32GUI_HAVECHILDWINDOW); acc = perlud->hAcc; } + // ### If the parent window is a MDIFrame the active MDIChild + // ### can be THE DialogBox + if(fIsMDI && + (thwnd = (HWND)SendMessage((HWND)perlud->dwData, + WM_MDIGETACTIVE, (WPARAM) 0, (LPARAM) NULL)) && + (tperlud = (LPPERLWIN32GUI_USERDATA) GetWindowLong(thwnd, + GWL_USERDATA)) && + ValidUserData(tperlud)) { + fIsDialog = tperlud->dwPlStyle & PERLWIN32GUI_DIALOGUI; + } else { + thwnd = phwnd; + } if( !( (fIsMDI && TranslateMDISysAccel((HWND)perlud->dwData, &msg)) || (acc && TranslateAccelerator(phwnd, acc, &msg)) || - (fIsDialog && IsDialogMessage(phwnd, &msg)) ) + (fIsDialog && IsDialogMessage(thwnd, &msg)) ) ){ TranslateMessage(&msg); DispatchMessage(&msg); @@ -1124,6 +1137,7 @@ BOOL fIsMDI; HACCEL acc; LPPERLWIN32GUI_USERDATA perlud; + LPPERLWIN32GUI_USERDATA tperlud; CODE: stayhere = 1; fIsDialog = FALSE; @@ -1151,10 +1165,20 @@ fIsMDI = perlud->dwPlStyle & (PERLWIN32GUI_MDIFRAME | PERLWIN32GUI_HAVECHILDWINDOW); acc = perlud->hAcc; } + if(fIsMDI && + (thwnd = (HWND)SendMessage((HWND)perlud->dwData, + WM_MDIGETACTIVE, (WPARAM) 0, (LPARAM) NULL)) && + (tperlud = (LPPERLWIN32GUI_USERDATA) GetWindowLong(thwnd, + GWL_USERDATA)) && + ValidUserData(tperlud)) { + fIsDialog = tperlud->dwPlStyle & PERLWIN32GUI_DIALOGUI; + } else { + thwnd = phwnd; + } if( !( (fIsMDI && TranslateMDISysAccel((HWND)perlud->dwData, &msg)) || (acc && TranslateAccelerator(phwnd, acc, &msg)) || - (fIsDialog && IsDialogMessage(phwnd, &msg)) ) + (fIsDialog && IsDialogMessage(thwnd, &msg)) ) ){ TranslateMessage(&msg); DispatchMessage(&msg);