mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-08 11:36:05 +02:00
MG: reduced paint messages and DC getting/releasing
git-svn-id: trunk@863 -
This commit is contained in:
parent
90adaffa46
commit
533f898524
@ -26,6 +26,20 @@
|
|||||||
// {$DEFINE ASSERT_IS_ON}
|
// {$DEFINE ASSERT_IS_ON}
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
|
|
||||||
|
{------------------------------------------------------------------------------
|
||||||
|
function GtkPaintMessageToPaintMessage(GtkPaintMsg: TLMGtkPaint): TLMPaint;
|
||||||
|
|
||||||
|
Converts a LM_GtkPaint message to a LM_PAINT message
|
||||||
|
------------------------------------------------------------------------------}
|
||||||
|
function GtkPaintMessageToPaintMessage(GtkPaintMsg: TLMGtkPaint): TLMPaint;
|
||||||
|
begin
|
||||||
|
Result.Msg:=LM_PAINT;
|
||||||
|
Result.DC:=GetDC(THandle(GtkPaintMsg.Widget));
|
||||||
|
Result.Unused:=0;
|
||||||
|
Result.Result:=0;
|
||||||
|
end;
|
||||||
|
|
||||||
{------------------------------------------------------------------------------
|
{------------------------------------------------------------------------------
|
||||||
Function: FindChar
|
Function: FindChar
|
||||||
Params: Width, Height: Size of the image
|
Params: Width, Height: Size of the image
|
||||||
@ -648,22 +662,22 @@ end;
|
|||||||
Params: Message: the message to process
|
Params: Message: the message to process
|
||||||
Returns: True if handled
|
Returns: True if handled
|
||||||
|
|
||||||
Generic function whih calls the WindowProc if defined, otherwise the
|
Generic function which calls the WindowProc if defined, otherwise the
|
||||||
dispatcher
|
dispatcher
|
||||||
------------------------------------------------------------------------------}
|
------------------------------------------------------------------------------}
|
||||||
function DeliverMessage(const Target: Pointer; var Message): Integer;
|
function DeliverMessage(const Target: Pointer; var AMessage): Integer;
|
||||||
begin
|
begin
|
||||||
if Target=nil then writeln('[DeliverMessage] Target = nil');
|
if Target=nil then writeln('[DeliverMessage] Target = nil');
|
||||||
if TObject(Target) is TControl then
|
if TObject(Target) is TControl then
|
||||||
begin
|
begin
|
||||||
TControl(Target).WindowProc(TLMessage(Message));
|
TControl(Target).WindowProc(TLMessage(AMessage));
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
TObject(Target).Dispatch(TLMessage(Message));
|
TObject(Target).Dispatch(TLMessage(AMessage));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Result := TLMessage(Message).Result;
|
Result := TLMessage(AMessage).Result;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -1107,29 +1121,47 @@ type
|
|||||||
dstUnknown,
|
dstUnknown,
|
||||||
dstMousePress,
|
dstMousePress,
|
||||||
dstMouseMotion,
|
dstMouseMotion,
|
||||||
dstMouseRelease
|
dstMouseRelease,
|
||||||
|
dstDrawAfter,
|
||||||
|
dstExposeAfter
|
||||||
);
|
);
|
||||||
TDesignSignalTypes = set of TDesignSignalType;
|
TDesignSignalTypes = set of TDesignSignalType;
|
||||||
|
|
||||||
TDesignSignalMask = longint;
|
TDesignSignalMask = longint;
|
||||||
|
|
||||||
const
|
const
|
||||||
DesignSignalAfter: array[TDesignSignalType] of boolean =
|
|
||||||
(false,false,false,false);
|
|
||||||
DesignSignalNames: array[TDesignSignalType] of PChar = (
|
DesignSignalNames: array[TDesignSignalType] of PChar = (
|
||||||
'',
|
'',
|
||||||
'button-press-event',
|
'button-press-event',
|
||||||
'motion-notify-event',
|
'motion-notify-event',
|
||||||
'button-release-event'
|
'button-release-event',
|
||||||
|
'draw',
|
||||||
|
'expose-event'
|
||||||
);
|
);
|
||||||
|
|
||||||
|
DesignSignalAfter: array[TDesignSignalType] of boolean =
|
||||||
|
(false,false,false,false,true,true);
|
||||||
|
|
||||||
DesignSignalFuncs: array[TDesignSignalType] of Pointer = (
|
DesignSignalFuncs: array[TDesignSignalType] of Pointer = (
|
||||||
nil,
|
nil,
|
||||||
@gtkMouseBtnPress,
|
@gtkMouseBtnPress,
|
||||||
@GTKMotionNotify,
|
@gtkMotionNotify,
|
||||||
@gtkMouseBtnRelease
|
@gtkMouseBtnRelease,
|
||||||
|
@gtkDrawAfter,
|
||||||
|
@gtkExposeEventAfter
|
||||||
);
|
);
|
||||||
DesignSignalMasks: array[TDesignSignalType] of TDesignSignalMask =
|
|
||||||
(0,1,2,4);
|
var
|
||||||
|
DesignSignalMasks: array[TDesignSignalType] of TDesignSignalMask;
|
||||||
|
|
||||||
|
procedure InitDesignSignalMasks;
|
||||||
|
var
|
||||||
|
SignalType: TDesignSignalType;
|
||||||
|
begin
|
||||||
|
DesignSignalMasks[dstUnknown]:=0;
|
||||||
|
for SignalType:=Low(TDesignSignalType) to High(TDesignSignalType) do
|
||||||
|
DesignSignalMasks[SignalType]:=1 shl ord(SignalType);
|
||||||
|
end;
|
||||||
|
|
||||||
function DesignSignalNameToType(Name: PChar; After: boolean): TDesignSignalType;
|
function DesignSignalNameToType(Name: PChar; After: boolean): TDesignSignalType;
|
||||||
begin
|
begin
|
||||||
@ -1383,111 +1415,6 @@ begin
|
|||||||
ConnectSignals(AWidget);
|
ConnectSignals(AWidget);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{-------------------------------------------------------------------------------
|
|
||||||
procedure SetEventMaskForDesigning(MainWidget: PGtkWidget);
|
|
||||||
|
|
||||||
Sets the event mask for all gtk internal gdkwindows to prevent gtk automatic
|
|
||||||
reaction to mouse and keyboard events.
|
|
||||||
-------------------------------------------------------------------------------}
|
|
||||||
procedure SetEventMaskForDesigning(MainWidget: PGtkWidget);
|
|
||||||
var
|
|
||||||
TheWinControl: TWinControl;
|
|
||||||
PreparedWindows: TList;
|
|
||||||
|
|
||||||
function WindowIsPrepared(AWindow: PGdkWindow): boolean;
|
|
||||||
begin
|
|
||||||
Result:=(AWindow<>nil)
|
|
||||||
and (PreparedWindows<>nil) and (PreparedWindows.IndexOf(AWindow)>=0);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure AddWindow(AWindow: PGdkWindow);
|
|
||||||
begin
|
|
||||||
if AWindow=nil then exit;
|
|
||||||
if WindowIsPrepared(AWindow) then exit;
|
|
||||||
if PreparedWindows=nil then
|
|
||||||
PreparedWindows:=TList.Create;
|
|
||||||
PreparedWindows.Add(AWindow);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure AddWidgetWindow(AWidget: PGtkWidget);
|
|
||||||
begin
|
|
||||||
if (AWidget<>nil) then AddWindow(AWidget^.Window);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure AddStandardWindows;
|
|
||||||
var
|
|
||||||
i: integer;
|
|
||||||
AWinControl: TWinControl;
|
|
||||||
ClientWidget, CoreChildWidget: PGtkWidget;
|
|
||||||
begin
|
|
||||||
AddWidgetWindow(MainWidget);
|
|
||||||
ClientWidget:=GetFixedWidget(MainWidget);
|
|
||||||
AddWidgetWindow(ClientWidget);
|
|
||||||
CoreChildWidget:=GetCoreChildWidget(MainWidget);
|
|
||||||
AddWidgetWindow(CoreChildWidget);
|
|
||||||
for i:=0 to TheWinControl.ComponentCount-1 do begin
|
|
||||||
if TheWinControl.Components[i] is TWinControl then begin
|
|
||||||
AWinControl:=TWinControl(TheWinControl.Components[i]);
|
|
||||||
if AWinControl.HandleAllocated then begin
|
|
||||||
AddWidgetWindow(PGtkWidget(AWinControl.Handle));
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure PrepareWindow(AWindow: PGdkWindow);
|
|
||||||
var
|
|
||||||
NewEventMask: TGdkEventMask;
|
|
||||||
begin
|
|
||||||
if AWindow=nil then exit;
|
|
||||||
if WindowIsPrepared(AWindow) then exit;
|
|
||||||
writeln('AAA1 SetEventMaskForDesigning ',TheWinControl.Name,':',TheWinControl.ClassName,
|
|
||||||
' Window=',HexStr(Cardinal(AWindow),8));
|
|
||||||
NewEventMask:=gdk_window_get_events(AWindow)
|
|
||||||
-GDK_BUTTON_PRESS_MASK
|
|
||||||
-GDK_POINTER_MOTION_MASK
|
|
||||||
-GDK_BUTTON_RELEASE_MASK;
|
|
||||||
gdk_window_set_events(AWindow,NewEventMask);
|
|
||||||
AddWindow(AWindow);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure PrepareChildWindows(AWindow: PGdkWindow);
|
|
||||||
var
|
|
||||||
ChildWindows, ListEntry: PGList;
|
|
||||||
begin
|
|
||||||
if AWindow=nil then exit;
|
|
||||||
PrepareWindow(AWindow);
|
|
||||||
|
|
||||||
ChildWindows:=gdk_window_get_children(AWindow);
|
|
||||||
ListEntry:=ChildWindows;
|
|
||||||
while ListEntry<>nil do begin
|
|
||||||
PrepareChildWindows(PGdkWindow(ListEntry^.Data));
|
|
||||||
ListEntry:=ListEntry^.Next;
|
|
||||||
end;
|
|
||||||
g_list_free(ChildWindows);
|
|
||||||
end;
|
|
||||||
|
|
||||||
var
|
|
||||||
AWidget: PGtkWidget;
|
|
||||||
begin
|
|
||||||
TheWinControl:=TWinControl(GetLCLObject(MainWidget));
|
|
||||||
AWidget:=GetMainWidget(MainWidget);
|
|
||||||
if (AWidget<>nil) and (AWidget<>MainWidget) then
|
|
||||||
raise Exception.Create(
|
|
||||||
'SetEventMaskForDesigning Widget '+HexStr(Cardinal(MainWidget),8)
|
|
||||||
+' is not the MainWidget '+HexStr(Cardinal(AWidget),8));
|
|
||||||
if (TheWinControl=nil) then
|
|
||||||
raise Exception.Create(
|
|
||||||
'SetEventMaskForDesigning MainWidget has no LCL Object');
|
|
||||||
{if not (csDesigning in TheWinControl.ComponentState) then
|
|
||||||
raise Exception.Create(
|
|
||||||
'SetEventMaskForDesigning MainWidget is not in Design mode');}
|
|
||||||
PreparedWindows:=nil;
|
|
||||||
AddStandardWindows;
|
|
||||||
PrepareChildWindows(MainWidget^.Window);
|
|
||||||
PreparedWindows.Free;
|
|
||||||
end;
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
// The Accelgroup and AccelKey is needed by menus
|
// The Accelgroup and AccelKey is needed by menus
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
@ -2630,6 +2557,9 @@ end;
|
|||||||
{ =============================================================================
|
{ =============================================================================
|
||||||
|
|
||||||
$Log$
|
$Log$
|
||||||
|
Revision 1.78 2002/08/28 09:40:50 lazarus
|
||||||
|
MG: reduced paint messages and DC getting/releasing
|
||||||
|
|
||||||
Revision 1.77 2002/08/27 18:45:14 lazarus
|
Revision 1.77 2002/08/27 18:45:14 lazarus
|
||||||
MG: propedits text improvements from Andrew, uncapturing, improved comobobox
|
MG: propedits text improvements from Andrew, uncapturing, improved comobobox
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user