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 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;

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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

View File

@ -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);

View File

@ -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:

View File

@ -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 *

View File

@ -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';