diff --git a/lcl/forms.pp b/lcl/forms.pp index 9aa31aa91d..6b1ae85fc7 100644 --- a/lcl/forms.pp +++ b/lcl/forms.pp @@ -489,7 +489,6 @@ type procedure SetWindowState(Value : TWindowState); procedure WMActivate(var Message : TLMActivate); message LM_ACTIVATE; procedure WMCloseQuery(var message: TLMessage); message LM_CLOSEQUERY; - procedure WMDeactivate(var Message : TLMActivate); message LM_DEACTIVATE; procedure WMHelp(var Message: TLMHelp); message LM_HELP; procedure WMShowWindow(var message: TLMShowWindow); message LM_SHOWWINDOW; procedure WMSize(var message: TLMSize); message LM_Size; diff --git a/lcl/include/customform.inc b/lcl/include/customform.inc index dbbf560ee4..96690b5d0c 100644 --- a/lcl/include/customform.inc +++ b/lcl/include/customform.inc @@ -474,48 +474,39 @@ end; Activate event handler. ------------------------------------------------------------------------------} -procedure TCustomForm.WMActivate(var Message : TLMActivate); +procedure TCustomForm.WMActivate(var Message: TLMActivate); begin {$IFDEF VerboseFocus} DebugLn('TCustomForm.WMActivate A ',DbgSName(Self),' Msg.Active=',dbgs(Message.Active)); {$ENDIF} - if (Parent = nil) and (ParentWindow = 0) and - (FormStyle <> fsMDIForm) or (csDesigning in ComponentState) then - SetActive(Message.Active); + if Message.Active = WA_INACTIVE then + begin + SetActive(False); + if Assigned(Application) then + {$IFDEF EnableAsyncDeactivate} + Application.QueueAsyncCall(@Application.Deactivate,0); + {$ELSE} + Application.Deactivate; + {$ENDIF} + end + else + begin + if (Parent = nil) and (ParentWindow = 0) and + (FormStyle <> fsMDIForm) or (csDesigning in ComponentState) then + SetActive(True); - if Application <> nil then - Application.Activate; - // The button reappears in some situations (e.g. when the window gets the - //"urgency" flag) so we hide it again here. - // This is the most important place to invoke UpdateShowInTaskBar, since - //invoking it anywhere else seeems basically useless/frequently reversed. - if (ShowInTaskBar = stNever) or - ( (ShowInTaskBar = stDefault) and - (Application <> nil) and (Application.TaskBarBehavior = tbSingleButton) - ) then - UpdateShowInTaskBar; -end; - -{------------------------------------------------------------------------------ - Method: TCustomForm.WMDeactivate - Params: Msg: When the form is deactivated (loses focus within application) - Returns: nothing - - Form deactivation (losing focus within application) event handler. - ------------------------------------------------------------------------------} -procedure TCustomForm.WMDeactivate(var Message : TLMActivate); -begin - {$IFDEF VerboseFocus} - DebugLn('TCustomForm.WMDeactivate ',DbgSName(Self)); - {$ENDIF} - SetActive(False); - {$IFDEF EnableAsyncDeactivate} - if Application<>nil then - Application.QueueAsyncCall(@Application.Deactivate,0); - {$ELSE} - if Application<>nil then - Application.Deactivate; - {$ENDIF} + if Assigned(Application) then + Application.Activate; + // The button reappears in some situations (e.g. when the window gets the + //"urgency" flag) so we hide it again here. + // This is the most important place to invoke UpdateShowInTaskBar, since + //invoking it anywhere else seeems basically useless/frequently reversed. + if (ShowInTaskBar = stNever) or + ( (ShowInTaskBar = stDefault) and + Assigned(Application) and (Application.TaskBarBehavior = tbSingleButton) + ) then + UpdateShowInTaskBar; + end; end; procedure TCustomForm.WMHelp(var Message: TLMHelp); diff --git a/lcl/interfaces/customdrawn/wincallback.inc b/lcl/interfaces/customdrawn/wincallback.inc index c8ba396437..8c527c2db4 100644 --- a/lcl/interfaces/customdrawn/wincallback.inc +++ b/lcl/interfaces/customdrawn/wincallback.inc @@ -416,17 +416,7 @@ begin end; WM_ACTIVATE: begin - case Lo(WParam) Of - WA_ACTIVE, WA_CLICKACTIVE: - begin - LMessage.Msg := LM_ACTIVATE; - end; - WA_INACTIVE: - begin - LMessage.Msg := LM_DEACTIVATE; - // Wince => maybe cast to WM_CLOSE? - end; - end; + LMessage.Msg := LM_ACTIVATE; end; WM_CAPTURECHANGED: begin diff --git a/lcl/interfaces/gtk/gtkcallback.inc b/lcl/interfaces/gtk/gtkcallback.inc index d6bee45cbc..66007a24fe 100644 --- a/lcl/interfaces/gtk/gtkcallback.inc +++ b/lcl/interfaces/gtk/gtkcallback.inc @@ -381,13 +381,14 @@ begin if LockOnChange(PgtkObject(Widget),0) > 0 then Exit; - FillChar(Mess,SizeOf(Mess),#0); + FillChar(Mess, SizeOf(Mess), #0); Mess.Msg := LM_ACTIVATE; - Mess.Active:=true; - Mess.Minimized:=false; - Mess.ActiveWindow:=0; + Mess.Active := WA_ACTIVE; + Mess.Minimized := False; if GtkWidgetIsA(Widget, gtk_window_get_type) then - Mess.ActiveWindow:=HWnd(PtrUInt(PGTKWindow(Widget)^.focus_widget)); + Mess.ActiveWindow:=HWnd(PtrUInt(PGTKWindow(Widget)^.focus_widget)) + else + Mess.ActiveWindow := 0; Mess.Result := 0; //DebugLn('gtkactivateCB ',DbgSName(TObject(Data))); DeliverMessage(Data, Mess); @@ -811,12 +812,14 @@ begin try if (Info <> nil) then Include(Info^.Flags, wwiActivating); + FillChar(Mess, SizeOf(Mess), #0); Mess.Msg := LM_ACTIVATE; - Mess.Active := True; + Mess.Active := WA_ACTIVE; Mess.Minimized := False; - Mess.ActiveWindow := 0; if GtkWidgetIsA(Widget, gtk_window_get_type) then - Mess.ActiveWindow := HWnd(PtrUInt(PGTKWindow(Widget)^.focus_widget)); + Mess.ActiveWindow := HWnd(PtrUInt(PGTKWindow(Widget)^.focus_widget)) + else + Mess.ActiveWindow := 0; Mess.Result := 0; DeliverMessage(Data, Mess); // send message directly (not Post) finally @@ -856,7 +859,12 @@ begin try if (Info<>nil) then Include(Info^.Flags,wwiDeactivating); - Mess.Msg := LM_DEACTIVATE; + FillChar(Mess, SizeOf(Mess), #0); + Mess.Msg := LM_ACTIVATE; + Mess.Active := WA_INACTIVE; + Mess.Minimized := False; + Mess.ActiveWindow := 0; + Mess.Result := 0; DeliverMessage(Data, Mess); finally if Info<>nil then diff --git a/lcl/interfaces/gtk2/gtk2callback.inc b/lcl/interfaces/gtk2/gtk2callback.inc index 62a9c6aebd..0e099ff0b7 100644 --- a/lcl/interfaces/gtk2/gtk2callback.inc +++ b/lcl/interfaces/gtk2/gtk2callback.inc @@ -338,13 +338,14 @@ begin if LockOnChange(PgtkObject(Widget),0) > 0 then Exit; - FillChar(Mess,SizeOf(Mess),#0); + FillChar(Mess, SizeOf(Mess), #0); Mess.Msg := LM_ACTIVATE; - Mess.Active:=true; - Mess.Minimized:=false; - Mess.ActiveWindow:=0; + Mess.Active := WA_ACTIVE; + Mess.Minimized := False; if GtkWidgetIsA(Widget, gtk_window_get_type) then - Mess.ActiveWindow:=HWnd(PtrUInt(PGTKWindow(Widget)^.focus_widget)); + Mess.ActiveWindow := HWnd(PtrUInt(PGTKWindow(Widget)^.focus_widget)) + else + Mess.ActiveWindow := 0; Mess.Result := 0; //DebugLn('gtkactivateCB ',DbgSName(TObject(Data))); DeliverMessage(Data, Mess); @@ -673,11 +674,12 @@ begin if (Info <> nil) then Include(Info^.Flags, wwiActivating); Mess.Msg := LM_ACTIVATE; - Mess.Active := True; + Mess.Active := WA_ACTIVE; Mess.Minimized := False; - Mess.ActiveWindow := 0; if GtkWidgetIsA(Widget, gtk_window_get_type) then - Mess.ActiveWindow := HWnd(PtrUInt(PGTKWindow(Widget)^.focus_widget)); + Mess.ActiveWindow := HWnd(PtrUInt(PGTKWindow(Widget)^.focus_widget)) + else + Mess.ActiveWindow := 0; Mess.Result := 0; DeliverMessage(Data, Mess); // send message directly (not Post) finally @@ -713,15 +715,20 @@ begin ResetDefaultIMContext; UpdateMouseCaptureControl; - Info:=GetWidgetInfo(Widget,false); + Info := GetWidgetInfo(Widget,false); try if (Info<>nil) then - Include(Info^.Flags,wwiDeactivating); - Mess.Msg := LM_DEACTIVATE; + Include(Info^.Flags, wwiDeactivating); + FillChar(Mess, SizeOf(Mess), #0); + Mess.Msg := LM_ACTIVATE; + Mess.Active := WA_INACTIVE; + Mess.Minimized := False; + Mess.ActiveWindow := 0; + Mess.Result := 0; DeliverMessage(Data, Mess); finally if Info<>nil then - Exclude(Info^.Flags,wwiDeactivating); + Exclude(Info^.Flags, wwiDeactivating); end; Result := CallBackDefaultReturn; diff --git a/lcl/interfaces/gtk2/gtk2wsmenus.pp b/lcl/interfaces/gtk2/gtk2wsmenus.pp index a424e1750a..233052697d 100644 --- a/lcl/interfaces/gtk2/gtk2wsmenus.pp +++ b/lcl/interfaces/gtk2/gtk2wsmenus.pp @@ -129,11 +129,11 @@ begin and GtkWidgetIsA(PGtkWidget(Widget), GTK_TYPE_CHECK_MENU_ITEM) and (not gtk_check_menu_item_get_active(PGTKCheckMenuItem(Widget))) then Exit; - FillChar(Mess,SizeOf(Mess),#0); + FillChar(Mess, SizeOf(Mess), #0); Mess.Msg := LM_ACTIVATE; - Mess.Active:=true; - Mess.Minimized:=false; - Mess.ActiveWindow:=0; + Mess.Active := WA_ACTIVE; + Mess.Minimized := False; + Mess.ActiveWindow := 0; Mess.Result := 0; DeliverMessage(Data, Mess); diff --git a/lcl/interfaces/qt/qtwidgets.pas b/lcl/interfaces/qt/qtwidgets.pas index cf97d4568e..69bbb0786b 100644 --- a/lcl/interfaces/qt/qtwidgets.pas +++ b/lcl/interfaces/qt/qtwidgets.pas @@ -6235,13 +6235,12 @@ begin if (vActivate = FIsActivated) or (LCLObject.Parent <> nil) then exit; - Msg.Active := vActivate; - Msg.ActiveWindow := LCLObject.Handle; - + Msg.Msg := LM_ACTIVATE; if vActivate then - Msg.Msg := LM_ACTIVATE + Msg.Active := WA_ACTIVE else - Msg.Msg := LM_DEACTIVATE; + Msg.Active := WA_INACTIVE; + Msg.ActiveWindow := LCLObject.Handle; DeliverMessage(Msg); end; diff --git a/lcl/interfaces/win32/win32callback.inc b/lcl/interfaces/win32/win32callback.inc index cb8ca3c88a..3710aca874 100644 --- a/lcl/interfaces/win32/win32callback.inc +++ b/lcl/interfaces/win32/win32callback.inc @@ -1087,20 +1087,9 @@ begin WM_ENTERIDLE: Application.Idle(False); WM_ACTIVATE: begin - case LOWORD(WParam) of - WA_ACTIVE, WA_CLICKACTIVE: - begin - LMessage.Msg := LM_ACTIVATE; - LMessage.WParam := WParam; - LMessage.LParam := LParam; - end; - WA_INACTIVE: - begin - LMessage.Msg := LM_DEACTIVATE; - LMessage.WParam := WParam; - LMessage.LParam := LParam; - end; - end; + LMessage.Msg := LM_ACTIVATE; + LMessage.WParam := WParam; + LMessage.LParam := LParam; end; WM_IME_ENDCOMPOSITION: begin diff --git a/lcl/interfaces/win32/win32proc.pp b/lcl/interfaces/win32/win32proc.pp index 6654a16f2d..5bf090ef14 100644 --- a/lcl/interfaces/win32/win32proc.pp +++ b/lcl/interfaces/win32/win32proc.pp @@ -844,7 +844,7 @@ begin @EnumStayOnTopRemove, LPARAM(StayOnTopWindowsInfo)); for I := 0 to WindowInfo^.StayOnTopList.Count - 1 do SetWindowPos(HWND(WindowInfo^.StayOnTopList[I]), HWND_NOTOPMOST, 0, 0, 0, 0, - SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE or SWP_NOOWNERZORDER or SWP_DRAWFRAME); + SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE or SWP_NOOWNERZORDER {or SWP_DRAWFRAME}); Dispose(StayOnTopWindowsInfo); end; inc(InRemoveStayOnTopFlags); diff --git a/lcl/interfaces/wince/wincecallback.inc b/lcl/interfaces/wince/wincecallback.inc index 608898434b..ed3c5b98d5 100644 --- a/lcl/interfaces/wince/wincecallback.inc +++ b/lcl/interfaces/wince/wincecallback.inc @@ -1034,11 +1034,12 @@ begin end; WM_ACTIVATE: begin + LMessage.Msg := LM_ACTIVATE; + LMessage.WParam := WParam; + LMessage.LParam := LParam; case Lo(WParam) Of WA_ACTIVE, WA_CLICKACTIVE: begin - LMessage.Msg := LM_ACTIVATE; - // Upon activation of a form, rebuild it's menu if lWinControl is TCustomForm then begin @@ -1056,11 +1057,6 @@ begin end; end; end; - WA_INACTIVE: - begin - LMessage.Msg := LM_DEACTIVATE; - // Wince => maybe cast to WM_CLOSE? - end; end; end; WM_CAPTURECHANGED: diff --git a/lcl/lclmessageglue.pas b/lcl/lclmessageglue.pas index 7ac6837545..6710fb327c 100644 --- a/lcl/lclmessageglue.pas +++ b/lcl/lclmessageglue.pas @@ -37,7 +37,7 @@ uses function DeliverMessage(const Target: TObject; var AMessage): PtrInt; function SendSimpleMessage(const Target: TControl; Msg: Cardinal): PtrInt; -function LCLSendActivateMsg(const Target: TControl; Active: Boolean; Minimized: Boolean; ActiveWindow: HWND = 0): PtrInt; +function LCLSendActivateMsg(const Target: TControl; Active: Word; Minimized: Boolean; ActiveWindow: HWND = 0): PtrInt; function LCLSendSetFocusMsg(const Target: TControl): PtrInt; function LCLSendKillFocusMsg(const Target: TControl): PtrInt; function LCLSendShowWindowMsg(const Target: TControl; Show: Boolean; Status: LPARAM = 0): PtrInt; @@ -75,7 +75,6 @@ function LCLSendTimerMsg(const Target: TControl; TimerID: WParam; TimerProc: LPa function LCLSendExitMsg(const Target: TControl): PtrInt; function LCLSendCloseQueryMsg(const Target: TControl): PtrInt; function LCLSendDragStartMsg(const Target: TControl): PtrInt; -function LCLSendDeactivateStartMsg(const Target: TControl): PtrInt; function LCLSendMonthChangedMsg(const Target: TControl): PtrInt; function LCLSendYearChangedMsg(const Target: TControl): PtrInt; function LCLSendDayChangedMsg(const Target: TControl): PtrInt; @@ -160,17 +159,16 @@ end; * active window * * * ******************************************************************************} -function LCLSendActivateMsg(const Target: TControl; Active: Boolean; Minimized: Boolean; ActiveWindow: HWND = 0): PtrInt; +function LCLSendActivateMsg(const Target: TControl; Active: Word; Minimized: Boolean; ActiveWindow: HWND = 0): PtrInt; var Mess: TLMActivate; begin Result := 0; - - FillChar(Mess,SizeOf(Mess),0); + FillChar(Mess, SizeOf(Mess), 0); Mess.Msg := LM_ACTIVATE; - Mess.Active:=Active; - Mess.Minimized:=Minimized; - Mess.ActiveWindow:=ActiveWindow; + Mess.Active := Active; + Mess.Minimized := Minimized; + Mess.ActiveWindow := ActiveWindow; Mess.Result := 0; DeliverMessage(Target, Mess); Result := Mess.Result; @@ -979,22 +977,6 @@ begin Result := SendSimpleMessage(Target, LM_DRAGSTART); end; -{****************************************************************************** - * * - * LCLSendDeactivateStartMsg * - * * - * Returns : 0 to accept the message, non-zero to reject the message * - * * - * Params * - * * - * Target : The Control that will recieve the message LM_DEACTIVATE * - * * - ******************************************************************************} -function LCLSendDeactivateStartMsg(const Target: TControl): PtrInt; -begin - Result := SendSimpleMessage(Target, LM_DEACTIVATE); -end; - {****************************************************************************** * * * LCLSendMonthChangedMsg * diff --git a/lcl/lmessages.pp b/lcl/lmessages.pp index 2ac4b51ed7..290dc9a954 100644 --- a/lcl/lmessages.pp +++ b/lcl/lmessages.pp @@ -72,7 +72,6 @@ const LM_EXIT = LM_LCL + 60; LM_CLOSEQUERY = LM_LCL + 62; LM_DRAGSTART = LM_LCL + 63; - LM_DEACTIVATE = LM_LCL + 64; //used when a form is no longer in front LM_QUIT = LM_LCL + 65; LM_MONTHCHANGED = LM_LCL + 66; LM_YEARCHANGED = LM_LCL + 67; @@ -510,17 +509,24 @@ type Result: LRESULT); end; +// Active state +const + WA_INACTIVE = 0; + WA_ACTIVE = 1; + WA_CLICKACTIVE = 2; + +type TLMActivate = record Msg: Cardinal; {$ifdef cpu64} UnusedMsg: Cardinal; {$endif} {$IFDEF FPC_LITTLE_ENDIAN} - Active: WordBool; + Active: Word; Minimized: WordBool; {$ELSE} Minimized: WordBool; - Active: WordBool; + Active: Word; {$ENDIF} {$ifdef cpu64} Unused : Longint; @@ -1011,7 +1017,6 @@ begin LM_EXIT :Result:='LM_EXIT'; LM_CLOSEQUERY :Result:='LM_CLOSEQUERY'; LM_DRAGSTART :Result:='LM_DRAGSTART'; - LM_DEACTIVATE :Result:='LM_DEACTIVATE'; LM_MONTHCHANGED :Result:='LM_MONTHCHANGED'; LM_YEARCHANGED :Result:='LM_YEARCHANGED';