lcl: remove LM_DEACTIVATE message. In windows and in Delphi both activation and deactivation are handled by WM_ACTIVATE message. Better to do this merge in LCL before 1.0 to prevent later problems

git-svn-id: trunk@35518 -
This commit is contained in:
paul 2012-02-21 06:59:12 +00:00
parent 27e8d29632
commit 82e9d3f4ce
12 changed files with 95 additions and 129 deletions

View File

@ -489,7 +489,6 @@ type
procedure SetWindowState(Value : TWindowState); procedure SetWindowState(Value : TWindowState);
procedure WMActivate(var Message : TLMActivate); message LM_ACTIVATE; procedure WMActivate(var Message : TLMActivate); message LM_ACTIVATE;
procedure WMCloseQuery(var message: TLMessage); message LM_CLOSEQUERY; 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 WMHelp(var Message: TLMHelp); message LM_HELP;
procedure WMShowWindow(var message: TLMShowWindow); message LM_SHOWWINDOW; procedure WMShowWindow(var message: TLMShowWindow); message LM_SHOWWINDOW;
procedure WMSize(var message: TLMSize); message LM_Size; procedure WMSize(var message: TLMSize); message LM_Size;

View File

@ -474,48 +474,39 @@ end;
Activate event handler. Activate event handler.
------------------------------------------------------------------------------} ------------------------------------------------------------------------------}
procedure TCustomForm.WMActivate(var Message : TLMActivate); procedure TCustomForm.WMActivate(var Message: TLMActivate);
begin begin
{$IFDEF VerboseFocus} {$IFDEF VerboseFocus}
DebugLn('TCustomForm.WMActivate A ',DbgSName(Self),' Msg.Active=',dbgs(Message.Active)); DebugLn('TCustomForm.WMActivate A ',DbgSName(Self),' Msg.Active=',dbgs(Message.Active));
{$ENDIF} {$ENDIF}
if (Parent = nil) and (ParentWindow = 0) and if Message.Active = WA_INACTIVE then
(FormStyle <> fsMDIForm) or (csDesigning in ComponentState) then begin
SetActive(Message.Active); 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 if Assigned(Application) then
Application.Activate; Application.Activate;
// The button reappears in some situations (e.g. when the window gets the // The button reappears in some situations (e.g. when the window gets the
//"urgency" flag) so we hide it again here. //"urgency" flag) so we hide it again here.
// This is the most important place to invoke UpdateShowInTaskBar, since // This is the most important place to invoke UpdateShowInTaskBar, since
//invoking it anywhere else seeems basically useless/frequently reversed. //invoking it anywhere else seeems basically useless/frequently reversed.
if (ShowInTaskBar = stNever) or if (ShowInTaskBar = stNever) or
( (ShowInTaskBar = stDefault) and ( (ShowInTaskBar = stDefault) and
(Application <> nil) and (Application.TaskBarBehavior = tbSingleButton) Assigned(Application) and (Application.TaskBarBehavior = tbSingleButton)
) then ) then
UpdateShowInTaskBar; UpdateShowInTaskBar;
end; 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}
end; end;
procedure TCustomForm.WMHelp(var Message: TLMHelp); procedure TCustomForm.WMHelp(var Message: TLMHelp);

View File

@ -416,17 +416,7 @@ begin
end; end;
WM_ACTIVATE: WM_ACTIVATE:
begin begin
case Lo(WParam) Of LMessage.Msg := LM_ACTIVATE;
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;
end; end;
WM_CAPTURECHANGED: WM_CAPTURECHANGED:
begin begin

View File

@ -381,13 +381,14 @@ begin
if LockOnChange(PgtkObject(Widget),0) > 0 then Exit; if LockOnChange(PgtkObject(Widget),0) > 0 then Exit;
FillChar(Mess,SizeOf(Mess),#0); FillChar(Mess, SizeOf(Mess), #0);
Mess.Msg := LM_ACTIVATE; Mess.Msg := LM_ACTIVATE;
Mess.Active:=true; Mess.Active := WA_ACTIVE;
Mess.Minimized:=false; Mess.Minimized := False;
Mess.ActiveWindow:=0;
if GtkWidgetIsA(Widget, gtk_window_get_type) then 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; Mess.Result := 0;
//DebugLn('gtkactivateCB ',DbgSName(TObject(Data))); //DebugLn('gtkactivateCB ',DbgSName(TObject(Data)));
DeliverMessage(Data, Mess); DeliverMessage(Data, Mess);
@ -811,12 +812,14 @@ begin
try try
if (Info <> nil) then if (Info <> nil) then
Include(Info^.Flags, wwiActivating); Include(Info^.Flags, wwiActivating);
FillChar(Mess, SizeOf(Mess), #0);
Mess.Msg := LM_ACTIVATE; Mess.Msg := LM_ACTIVATE;
Mess.Active := True; Mess.Active := WA_ACTIVE;
Mess.Minimized := False; Mess.Minimized := False;
Mess.ActiveWindow := 0;
if GtkWidgetIsA(Widget, gtk_window_get_type) then 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; Mess.Result := 0;
DeliverMessage(Data, Mess); // send message directly (not Post) DeliverMessage(Data, Mess); // send message directly (not Post)
finally finally
@ -856,7 +859,12 @@ begin
try try
if (Info<>nil) then if (Info<>nil) then
Include(Info^.Flags,wwiDeactivating); 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); DeliverMessage(Data, Mess);
finally finally
if Info<>nil then if Info<>nil then

View File

@ -338,13 +338,14 @@ begin
if LockOnChange(PgtkObject(Widget),0) > 0 then Exit; if LockOnChange(PgtkObject(Widget),0) > 0 then Exit;
FillChar(Mess,SizeOf(Mess),#0); FillChar(Mess, SizeOf(Mess), #0);
Mess.Msg := LM_ACTIVATE; Mess.Msg := LM_ACTIVATE;
Mess.Active:=true; Mess.Active := WA_ACTIVE;
Mess.Minimized:=false; Mess.Minimized := False;
Mess.ActiveWindow:=0;
if GtkWidgetIsA(Widget, gtk_window_get_type) then 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; Mess.Result := 0;
//DebugLn('gtkactivateCB ',DbgSName(TObject(Data))); //DebugLn('gtkactivateCB ',DbgSName(TObject(Data)));
DeliverMessage(Data, Mess); DeliverMessage(Data, Mess);
@ -673,11 +674,12 @@ begin
if (Info <> nil) then if (Info <> nil) then
Include(Info^.Flags, wwiActivating); Include(Info^.Flags, wwiActivating);
Mess.Msg := LM_ACTIVATE; Mess.Msg := LM_ACTIVATE;
Mess.Active := True; Mess.Active := WA_ACTIVE;
Mess.Minimized := False; Mess.Minimized := False;
Mess.ActiveWindow := 0;
if GtkWidgetIsA(Widget, gtk_window_get_type) then 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; Mess.Result := 0;
DeliverMessage(Data, Mess); // send message directly (not Post) DeliverMessage(Data, Mess); // send message directly (not Post)
finally finally
@ -713,15 +715,20 @@ begin
ResetDefaultIMContext; ResetDefaultIMContext;
UpdateMouseCaptureControl; UpdateMouseCaptureControl;
Info:=GetWidgetInfo(Widget,false); Info := GetWidgetInfo(Widget,false);
try try
if (Info<>nil) then if (Info<>nil) then
Include(Info^.Flags,wwiDeactivating); 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); DeliverMessage(Data, Mess);
finally finally
if Info<>nil then if Info<>nil then
Exclude(Info^.Flags,wwiDeactivating); Exclude(Info^.Flags, wwiDeactivating);
end; end;
Result := CallBackDefaultReturn; Result := CallBackDefaultReturn;

View File

@ -129,11 +129,11 @@ begin
and GtkWidgetIsA(PGtkWidget(Widget), GTK_TYPE_CHECK_MENU_ITEM) and GtkWidgetIsA(PGtkWidget(Widget), GTK_TYPE_CHECK_MENU_ITEM)
and (not gtk_check_menu_item_get_active(PGTKCheckMenuItem(Widget))) then Exit; 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.Msg := LM_ACTIVATE;
Mess.Active:=true; Mess.Active := WA_ACTIVE;
Mess.Minimized:=false; Mess.Minimized := False;
Mess.ActiveWindow:=0; Mess.ActiveWindow := 0;
Mess.Result := 0; Mess.Result := 0;
DeliverMessage(Data, Mess); DeliverMessage(Data, Mess);

View File

@ -6235,13 +6235,12 @@ begin
if (vActivate = FIsActivated) or (LCLObject.Parent <> nil) then if (vActivate = FIsActivated) or (LCLObject.Parent <> nil) then
exit; exit;
Msg.Active := vActivate; Msg.Msg := LM_ACTIVATE;
Msg.ActiveWindow := LCLObject.Handle;
if vActivate then if vActivate then
Msg.Msg := LM_ACTIVATE Msg.Active := WA_ACTIVE
else else
Msg.Msg := LM_DEACTIVATE; Msg.Active := WA_INACTIVE;
Msg.ActiveWindow := LCLObject.Handle;
DeliverMessage(Msg); DeliverMessage(Msg);
end; end;

View File

@ -1087,20 +1087,9 @@ begin
WM_ENTERIDLE: Application.Idle(False); WM_ENTERIDLE: Application.Idle(False);
WM_ACTIVATE: WM_ACTIVATE:
begin begin
case LOWORD(WParam) of LMessage.Msg := LM_ACTIVATE;
WA_ACTIVE, WA_CLICKACTIVE: LMessage.WParam := WParam;
begin LMessage.LParam := LParam;
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;
end; end;
WM_IME_ENDCOMPOSITION: WM_IME_ENDCOMPOSITION:
begin begin

View File

@ -844,7 +844,7 @@ begin
@EnumStayOnTopRemove, LPARAM(StayOnTopWindowsInfo)); @EnumStayOnTopRemove, LPARAM(StayOnTopWindowsInfo));
for I := 0 to WindowInfo^.StayOnTopList.Count - 1 do for I := 0 to WindowInfo^.StayOnTopList.Count - 1 do
SetWindowPos(HWND(WindowInfo^.StayOnTopList[I]), HWND_NOTOPMOST, 0, 0, 0, 0, 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); Dispose(StayOnTopWindowsInfo);
end; end;
inc(InRemoveStayOnTopFlags); inc(InRemoveStayOnTopFlags);

View File

@ -1034,11 +1034,12 @@ begin
end; end;
WM_ACTIVATE: WM_ACTIVATE:
begin begin
LMessage.Msg := LM_ACTIVATE;
LMessage.WParam := WParam;
LMessage.LParam := LParam;
case Lo(WParam) Of case Lo(WParam) Of
WA_ACTIVE, WA_CLICKACTIVE: WA_ACTIVE, WA_CLICKACTIVE:
begin begin
LMessage.Msg := LM_ACTIVATE;
// Upon activation of a form, rebuild it's menu // Upon activation of a form, rebuild it's menu
if lWinControl is TCustomForm then if lWinControl is TCustomForm then
begin begin
@ -1056,11 +1057,6 @@ begin
end; end;
end; end;
end; end;
WA_INACTIVE:
begin
LMessage.Msg := LM_DEACTIVATE;
// Wince => maybe cast to WM_CLOSE?
end;
end; end;
end; end;
WM_CAPTURECHANGED: WM_CAPTURECHANGED:

View File

@ -37,7 +37,7 @@ uses
function DeliverMessage(const Target: TObject; var AMessage): PtrInt; function DeliverMessage(const Target: TObject; var AMessage): PtrInt;
function SendSimpleMessage(const Target: TControl; Msg: Cardinal): 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 LCLSendSetFocusMsg(const Target: TControl): PtrInt;
function LCLSendKillFocusMsg(const Target: TControl): PtrInt; function LCLSendKillFocusMsg(const Target: TControl): PtrInt;
function LCLSendShowWindowMsg(const Target: TControl; Show: Boolean; Status: LPARAM = 0): 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 LCLSendExitMsg(const Target: TControl): PtrInt;
function LCLSendCloseQueryMsg(const Target: TControl): PtrInt; function LCLSendCloseQueryMsg(const Target: TControl): PtrInt;
function LCLSendDragStartMsg(const Target: TControl): PtrInt; function LCLSendDragStartMsg(const Target: TControl): PtrInt;
function LCLSendDeactivateStartMsg(const Target: TControl): PtrInt;
function LCLSendMonthChangedMsg(const Target: TControl): PtrInt; function LCLSendMonthChangedMsg(const Target: TControl): PtrInt;
function LCLSendYearChangedMsg(const Target: TControl): PtrInt; function LCLSendYearChangedMsg(const Target: TControl): PtrInt;
function LCLSendDayChangedMsg(const Target: TControl): PtrInt; function LCLSendDayChangedMsg(const Target: TControl): PtrInt;
@ -160,17 +159,16 @@ end;
* active window * * 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 var
Mess: TLMActivate; Mess: TLMActivate;
begin begin
Result := 0; Result := 0;
FillChar(Mess, SizeOf(Mess), 0);
FillChar(Mess,SizeOf(Mess),0);
Mess.Msg := LM_ACTIVATE; Mess.Msg := LM_ACTIVATE;
Mess.Active:=Active; Mess.Active := Active;
Mess.Minimized:=Minimized; Mess.Minimized := Minimized;
Mess.ActiveWindow:=ActiveWindow; Mess.ActiveWindow := ActiveWindow;
Mess.Result := 0; Mess.Result := 0;
DeliverMessage(Target, Mess); DeliverMessage(Target, Mess);
Result := Mess.Result; Result := Mess.Result;
@ -979,22 +977,6 @@ begin
Result := SendSimpleMessage(Target, LM_DRAGSTART); Result := SendSimpleMessage(Target, LM_DRAGSTART);
end; 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 * * LCLSendMonthChangedMsg *

View File

@ -72,7 +72,6 @@ const
LM_EXIT = LM_LCL + 60; LM_EXIT = LM_LCL + 60;
LM_CLOSEQUERY = LM_LCL + 62; LM_CLOSEQUERY = LM_LCL + 62;
LM_DRAGSTART = LM_LCL + 63; 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_QUIT = LM_LCL + 65;
LM_MONTHCHANGED = LM_LCL + 66; LM_MONTHCHANGED = LM_LCL + 66;
LM_YEARCHANGED = LM_LCL + 67; LM_YEARCHANGED = LM_LCL + 67;
@ -510,17 +509,24 @@ type
Result: LRESULT); Result: LRESULT);
end; end;
// Active state
const
WA_INACTIVE = 0;
WA_ACTIVE = 1;
WA_CLICKACTIVE = 2;
type
TLMActivate = record TLMActivate = record
Msg: Cardinal; Msg: Cardinal;
{$ifdef cpu64} {$ifdef cpu64}
UnusedMsg: Cardinal; UnusedMsg: Cardinal;
{$endif} {$endif}
{$IFDEF FPC_LITTLE_ENDIAN} {$IFDEF FPC_LITTLE_ENDIAN}
Active: WordBool; Active: Word;
Minimized: WordBool; Minimized: WordBool;
{$ELSE} {$ELSE}
Minimized: WordBool; Minimized: WordBool;
Active: WordBool; Active: Word;
{$ENDIF} {$ENDIF}
{$ifdef cpu64} {$ifdef cpu64}
Unused : Longint; Unused : Longint;
@ -1011,7 +1017,6 @@ begin
LM_EXIT :Result:='LM_EXIT'; LM_EXIT :Result:='LM_EXIT';
LM_CLOSEQUERY :Result:='LM_CLOSEQUERY'; LM_CLOSEQUERY :Result:='LM_CLOSEQUERY';
LM_DRAGSTART :Result:='LM_DRAGSTART'; LM_DRAGSTART :Result:='LM_DRAGSTART';
LM_DEACTIVATE :Result:='LM_DEACTIVATE';
LM_MONTHCHANGED :Result:='LM_MONTHCHANGED'; LM_MONTHCHANGED :Result:='LM_MONTHCHANGED';
LM_YEARCHANGED :Result:='LM_YEARCHANGED'; LM_YEARCHANGED :Result:='LM_YEARCHANGED';