mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-21 09:59:32 +02:00
fixed gtk2 intf checking if signal already connected
git-svn-id: trunk@6790 -
This commit is contained in:
parent
925cc87469
commit
0882395f3e
@ -1191,7 +1191,7 @@ begin
|
||||
if (not (TControl(Data) is TCustomNoteBook))
|
||||
or (event^.Button<>1) then begin
|
||||
g_signal_stop_emission_by_name(PGTKObject(Widget),'button-press-event');
|
||||
result := false;
|
||||
result := false;
|
||||
end;
|
||||
end;
|
||||
//debugln('[gtkMouseBtnPress] calling DeliverMouseDownMessage');
|
||||
@ -1329,11 +1329,10 @@ begin
|
||||
|
||||
{$IFDEF VerboseMouseBugfix}
|
||||
DesignOnlySignal:=GetDesignOnlySignalFlag(Widget,dstMouseRelease);
|
||||
DebugLn('[gtkMouseBtnRelease] A ',
|
||||
TComponent(Data).Name,':',TObject(Data).ClassName,' ',
|
||||
DebugLn('[gtkMouseBtnRelease] A ',DbgSName(TObject(Data)),' ',
|
||||
' Widget=',HexStr(Cardinal(Widget),8),
|
||||
' DSO=',DesignOnlySignal,
|
||||
' ',TruncToInt(Event^.X),',',TruncToInt(Event^.Y),' Btn=',event^.Button);
|
||||
' DSO=',dbgs(DesignOnlySignal),
|
||||
' ',dbgs(TruncToInt(Event^.X)),',',dbgs(TruncToInt(Event^.Y)),' Btn=',dbgs(event^.Button));
|
||||
{$ENDIF}
|
||||
|
||||
//DebugLn('EEE1 MouseRelease Widget=',HexStr(Cardinal(Widget),8),
|
||||
@ -1372,11 +1371,11 @@ function gtkMouseBtnReleaseAfter(widget: PGtkWidget; event : pgdkEventButton;
|
||||
begin
|
||||
Result := CallBackDefaultReturn;
|
||||
|
||||
{$IFDEF VerboseMouseBugfix}
|
||||
{DebugLn('[gtkMouseBtnReleaseAfter] ',
|
||||
TControl(Data).Name,':',TObject(Data).ClassName,' ',
|
||||
TruncToInt(Event^.X),',',TruncToInt(Event^.Y));}
|
||||
{$ENDIF}
|
||||
{ $IFDEF VerboseMouseBugfix}
|
||||
DebugLn('[gtkMouseBtnReleaseAfter] ',DbgSName(TObject(Data)),' ',
|
||||
' Widget=',HexStr(Cardinal(Widget),8),
|
||||
' ',dbgs(TruncToInt(Event^.X)),',',dbgs(TruncToInt(Event^.Y)),' Btn=',dbgs(event^.Button));
|
||||
{ $ENDIF}
|
||||
|
||||
// stop the signal, so that it is not sent to the parent widgets
|
||||
g_signal_stop_emission_by_name(PGTKObject(Widget),'button-release-event');
|
||||
@ -2935,15 +2934,15 @@ begin
|
||||
//ReleaseAllStyles;
|
||||
end;
|
||||
|
||||
function gtkListBoxSelectionChangedCB(widget: PGtkWidget; data: gPointer
|
||||
function gtkListBoxSelectionChangedAfter(widget: PGtkWidget; data: gPointer
|
||||
): GBoolean; cdecl;
|
||||
var
|
||||
Mess: TLMessage;
|
||||
begin
|
||||
//debugln('gtkListBoxSelectionChangedCB ',GetWidgetDebugReport(Widget));
|
||||
//debugln('gtkListBoxSelectionChangedAfter ',GetWidgetDebugReport(Widget));
|
||||
Result := CallBackDefaultReturn;
|
||||
|
||||
EventTrace('selection_changed', data);
|
||||
EventTrace('gtkListBoxSelectionChangedAfter', data);
|
||||
FillChar(Mess,SizeOf(Mess),0);
|
||||
Mess.msg := LM_SelChange;
|
||||
DeliverMessage(Data, Mess);
|
||||
@ -2964,6 +2963,9 @@ end;
|
||||
{ =============================================================================
|
||||
|
||||
$Log$
|
||||
Revision 1.267 2005/02/17 02:10:52 mattias
|
||||
fixed gtk2 intf checking if signal already connected
|
||||
|
||||
Revision 1.266 2005/02/17 00:05:25 mattias
|
||||
fixed some gtk2 intf warnings
|
||||
|
||||
|
@ -15,12 +15,12 @@
|
||||
*****************************************************************************
|
||||
}
|
||||
|
||||
function gtkComboBoxShowCB(widget: PGtkWidget; data: gPointer): GBoolean; cdecl;
|
||||
function gtkComboBoxShowAfter(widget: PGtkWidget; data: gPointer): GBoolean; cdecl;
|
||||
var
|
||||
Mess : TLMCommand;
|
||||
begin
|
||||
Result := True;
|
||||
EventTrace('ComboBoxShow', data);
|
||||
EventTrace('ComboBoxShowAfter', data);
|
||||
|
||||
if (Widget=nil) then ;
|
||||
FillChar(Mess,SizeOf(Mess),0);
|
||||
@ -30,13 +30,13 @@ begin
|
||||
Result := DeliverMessage(Data, Mess) = 0;
|
||||
end;
|
||||
|
||||
function gtkComboBoxHideCB(widget: PGtkWidget; data: gPointer): GBoolean; cdecl;
|
||||
function gtkComboBoxHideAfter(widget: PGtkWidget; data: gPointer): GBoolean; cdecl;
|
||||
var
|
||||
Mess : TLMCommand;
|
||||
begin
|
||||
Result := True;
|
||||
if (Widget=nil) then ;
|
||||
EventTrace('ComboBoxHide', data);
|
||||
EventTrace('ComboBoxHideAfter', data);
|
||||
FillChar(Mess,SizeOf(Mess),0);
|
||||
Mess.Msg := CN_Command;
|
||||
Mess.NotifyCode := CBN_CLOSEUP;
|
||||
|
@ -3575,9 +3575,9 @@ begin
|
||||
begin
|
||||
if ALCLObject is TCustomComboBox then begin
|
||||
ConnectSenderSignalAfter(PgtkObject(PgtkCombo(gObject)^.popwin),
|
||||
'show', @gtkComboBoxShowCB);
|
||||
'show', @gtkComboBoxShowAfter);
|
||||
ConnectSenderSignalAfter(PgtkObject(PgtkCombo(gObject)^.popwin),
|
||||
'hide', @gtkComboBoxHideCB);
|
||||
'hide', @gtkComboBoxHideAfter);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -3585,7 +3585,7 @@ begin
|
||||
begin
|
||||
if ALCLObject is TCustomListBox then begin
|
||||
ConnectSenderSignalAfter(PgtkObject(gCore),
|
||||
'selection_changed', @gtkListBoxSelectionChangedCB);
|
||||
'selection_changed', @gtkListBoxSelectionChangedAfter);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -7010,6 +7010,9 @@ end;
|
||||
{ =============================================================================
|
||||
|
||||
$Log$
|
||||
Revision 1.628 2005/02/17 02:10:52 mattias
|
||||
fixed gtk2 intf checking if signal already connected
|
||||
|
||||
Revision 1.627 2005/02/17 00:05:25 mattias
|
||||
fixed some gtk2 intf warnings
|
||||
|
||||
|
@ -4427,74 +4427,85 @@ begin
|
||||
and DesignSignalMasks[DesignSignalType])<>0;
|
||||
end;
|
||||
|
||||
procedure ConnectSignal(const AnObject:PGTKObject; const ASignal: PChar;
|
||||
function SignalConnected(const AnObject:PGTKObject; const ASignal: PChar;
|
||||
const ACallBackProc: Pointer; const ALCLObject: TObject;
|
||||
const AReqSignalMask: TGdkEventMask; const ASFlags: TConnectSignalFlags);
|
||||
const ASFlags: TConnectSignalFlags): boolean;
|
||||
{$IFDEF Gtk1}
|
||||
var
|
||||
RealizeHandler, Handler: PGTKHandler;
|
||||
RealizeID, SignalID: guint;
|
||||
WinWidgetInfo: PWinWidgetInfo;
|
||||
MainWidget: PGtkWidget;
|
||||
OldDesignMask, NewDesignMask: TDesignSignalMask;
|
||||
DesignSignalType: TDesignSignalType;
|
||||
Handler: PGTKHandler;
|
||||
SignalID: guint;
|
||||
begin
|
||||
if ACallBackProc = nil then exit;
|
||||
|
||||
// first loop through the handlers to:
|
||||
// - check if a handler already exists
|
||||
// - Find the realize handler to change data
|
||||
Handler := gtk_object_get_data_by_id (AnObject, gtk_handler_quark);
|
||||
SignalID := g_signal_lookup(ASignal, GTK_OBJECT_TYPE(AnObject));
|
||||
if SignalID<0 then
|
||||
RaiseGDBException('ConnectSignal');
|
||||
if csfConnectRealize in ASFlags then
|
||||
RealizeID := g_signal_lookup('realize', GTK_OBJECT_TYPE(AnObject))
|
||||
else
|
||||
RealizeID := 0;
|
||||
RealizeHandler := nil;
|
||||
DesignSignalType:=DesignSignalNameToType(ASignal,csfAfter in ASFlags);
|
||||
RaiseGDBException('SignalConnected');
|
||||
|
||||
while (Handler <> nil) do begin
|
||||
with Handler^ do
|
||||
begin
|
||||
// check if signal is already connected
|
||||
//debugln('ConnectSignal Id=',dbgs(Id));
|
||||
if (Id > 0)
|
||||
and (Signal_ID = SignalID)
|
||||
and (Func = TGTKSignalFunc(ACallBackProc))
|
||||
and (func_data = Pointer(ALCLObject))
|
||||
and (((flags and bmSignalAfter)<>0)=(csfAfter in ASFlags))
|
||||
then begin
|
||||
Assert(False, Format('Trace:WARNING: [ConnectSignal] %s signal <%s> set twice', [ALCLObject.ClassName, ASignal]));
|
||||
// signal is already connected
|
||||
// update the DesignSignalMask
|
||||
if (DesignSignalType <> dstUnknown)
|
||||
and (not (csfDesignOnly in ASFlags))
|
||||
then begin
|
||||
OldDesignMask := GetDesignSignalMask(PGtkWidget(AnObject));
|
||||
NewDesignMask :=
|
||||
OldDesignMask and not DesignSignalMasks[DesignSignalType];
|
||||
if OldDesignMask <> NewDesignMask
|
||||
then SetDesignSignalMask(PGtkWidget(AnObject),NewDesignMask);
|
||||
end;
|
||||
Result:=true;
|
||||
Exit;
|
||||
end;
|
||||
|
||||
// look for realize handler
|
||||
if (csfConnectRealize in ASFlags)
|
||||
and (Id > 0)
|
||||
and (Signal_ID = RealizeID)
|
||||
and (Func = TGTKSignalFunc(@GTKRealizeCB))
|
||||
and (func_data = Pointer(ALCLObject))
|
||||
and ((flags and bmSignalAfter)=0) // test if not after
|
||||
then RealizeHandler := Handler;
|
||||
|
||||
Handler := Next;
|
||||
end;
|
||||
end;
|
||||
Result:=false;
|
||||
end;
|
||||
{$ELSE}
|
||||
begin
|
||||
Result:= g_signal_handler_find(AnObject,
|
||||
G_SIGNAL_MATCH_FUNC or G_SIGNAL_MATCH_DATA,
|
||||
0,0,nil,ACallBackProc,ALCLObject)<>0;
|
||||
end;
|
||||
{$ENDIF}
|
||||
|
||||
procedure ConnectSignal(const AnObject:PGTKObject; const ASignal: PChar;
|
||||
const ACallBackProc: Pointer; const ALCLObject: TObject;
|
||||
const AReqSignalMask: TGdkEventMask; const ASFlags: TConnectSignalFlags);
|
||||
var
|
||||
WinWidgetInfo: PWinWidgetInfo;
|
||||
MainWidget: PGtkWidget;
|
||||
OldDesignMask, NewDesignMask: TDesignSignalMask;
|
||||
DesignSignalType: TDesignSignalType;
|
||||
RealizeConnected: Boolean;
|
||||
HasRealizeSignal: Boolean;
|
||||
begin
|
||||
if ACallBackProc = nil then exit;
|
||||
|
||||
// first loop through the handlers to:
|
||||
// - check if a handler already exists
|
||||
// - Find the realize handler to change data
|
||||
DesignSignalType:=DesignSignalNameToType(ASignal,csfAfter in ASFlags);
|
||||
if SignalConnected(AnObject,ASignal,ACallBackProc,ALCLObject,ASFlags) then
|
||||
begin
|
||||
// signal is already connected
|
||||
// update the DesignSignalMask
|
||||
if (DesignSignalType <> dstUnknown)
|
||||
and (not (csfDesignOnly in ASFlags))
|
||||
then begin
|
||||
OldDesignMask := GetDesignSignalMask(PGtkWidget(AnObject));
|
||||
NewDesignMask :=
|
||||
OldDesignMask and not DesignSignalMasks[DesignSignalType];
|
||||
if OldDesignMask <> NewDesignMask
|
||||
then SetDesignSignalMask(PGtkWidget(AnObject),NewDesignMask);
|
||||
end;
|
||||
Exit;
|
||||
end;
|
||||
|
||||
// if we are here, then no handler was defined yet
|
||||
// -> register handler
|
||||
//if (Msg=LM_LBUTTONUP) then DebugLn('CONNECT ',ReqSignalMask,' Widget=',HexStr(Cardinal(AnObject),8));
|
||||
//debugln('ConnectSignal ',DbgSName(ALCLObject),' ',ASignal,' After=',dbgs(csfAfter in ASFlags));
|
||||
if csfAfter in ASFlags then
|
||||
g_signal_connect_after(AnObject, ASignal,
|
||||
TGTKSignalFunc(ACallBackProc), ALCLObject)
|
||||
@ -4511,15 +4522,20 @@ begin
|
||||
WinWidgetInfo := GetWidgetInfo(MainWidget,true);
|
||||
WinWidgetInfo^.EventMask := WinWidgetInfo^.EventMask or AReqSignalMask;
|
||||
end;
|
||||
|
||||
// -> register realize handler
|
||||
if (csfConnectRealize in ASFlags)
|
||||
and (RealizeHandler = nil) and (RealizeID<>0)
|
||||
then begin
|
||||
//DebugLn('REALIZE CONNECT Widget=',HexStr(Cardinal(AnObject),8));
|
||||
g_signal_connect(AnObject, 'realize',
|
||||
TGTKSignalFunc(@GTKRealizeCB), ALCLObject);
|
||||
g_signal_connect_after(AnObject, 'realize',
|
||||
TGTKSignalFunc(@GTKRealizeAfterCB), ALCLObject);
|
||||
if (csfConnectRealize in ASFlags) then begin
|
||||
HasRealizeSignal:=g_signal_lookup('realize', GTK_OBJECT_TYPE(AnObject))>0;
|
||||
if HasRealizeSignal then begin
|
||||
RealizeConnected:=SignalConnected(AnObject,'realize',@GTKRealizeCB,
|
||||
ALCLObject,[]);
|
||||
if not RealizeConnected then begin
|
||||
g_signal_connect(AnObject, 'realize',
|
||||
TGTKSignalFunc(@GTKRealizeCB), ALCLObject);
|
||||
g_signal_connect_after(AnObject, 'realize',
|
||||
TGTKSignalFunc(@GTKRealizeAfterCB), ALCLObject);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
// update the DesignSignalMask
|
||||
@ -7995,6 +8011,9 @@ end;
|
||||
{ =============================================================================
|
||||
|
||||
$Log$
|
||||
Revision 1.335 2005/02/17 02:10:53 mattias
|
||||
fixed gtk2 intf checking if signal already connected
|
||||
|
||||
Revision 1.334 2005/02/16 23:31:16 mattias
|
||||
fixed define templates quotes
|
||||
|
||||
|
@ -233,7 +233,7 @@ function ClipboardSelectionLostOwnershipHandler(TargetWidget: PGtkWidget;
|
||||
|
||||
procedure GTKStyleChanged(Widget: PGtkWidget; previous_style :
|
||||
PGTKStyle; Data: Pointer); cdecl;
|
||||
function gtkListBoxSelectionChangedCB(widget: PGtkWidget;
|
||||
function gtkListBoxSelectionChangedAfter(widget: PGtkWidget;
|
||||
data: gPointer): GBoolean; cdecl;
|
||||
|
||||
// gtkDragCallback.inc headers
|
||||
@ -275,8 +275,8 @@ function gtkLVUnSelectAll(AList: PGTKCList; AData: gPointer): GBoolean; cdecl;
|
||||
function gtkLVEndSelection(AList: PGTKCList; AData: gPointer): GBoolean; cdecl;
|
||||
|
||||
// gtkcomboboxcallbacks.inc headers
|
||||
function gtkComboBoxShowCB(widget: PGtkWidget; data: gPointer): GBoolean; cdecl;
|
||||
function gtkComboBoxHideCB(widget: PGtkWidget; data: gPointer): GBoolean; cdecl;
|
||||
function gtkComboBoxShowAfter(widget: PGtkWidget; data: gPointer): GBoolean; cdecl;
|
||||
function gtkComboBoxHideAfter(widget: PGtkWidget; data: gPointer): GBoolean; cdecl;
|
||||
|
||||
// gtkpagecallbacks.inc headers
|
||||
function PageIconWidgetExposeAfter(Widget: PGtkWidget; Event: PGDKEventExpose;
|
||||
|
@ -157,6 +157,7 @@ function dbgMemStream(MemStream: TCustomMemoryStream; Count: integer): string;
|
||||
function dbgObjMem(AnObject: TObject): string;
|
||||
|
||||
function DbgS(const i1,i2,i3,i4: integer): string;
|
||||
function DbgS(const Shift: TShiftState): string;
|
||||
|
||||
// UTF utility functions
|
||||
// MG: Should be moved to the RTL
|
||||
@ -1112,6 +1113,35 @@ begin
|
||||
Result:=dbgs(i1)+','+dbgs(i2)+','+dbgs(i3)+','+dbgs(i4);
|
||||
end;
|
||||
|
||||
function DbgS(const Shift: TShiftState): string;
|
||||
|
||||
procedure Add(const s: string);
|
||||
begin
|
||||
if Result<>'' then Result:=Result+',';
|
||||
Result:=Result+s;
|
||||
end;
|
||||
|
||||
begin
|
||||
Result:='';
|
||||
if ssShift in Shift then Add('ssShift');
|
||||
if ssAlt in Shift then Add('ssAlt');
|
||||
if ssCtrl in Shift then Add('ssCtrl');
|
||||
if ssLeft in Shift then Add('ssLeft');
|
||||
if ssRight in Shift then Add('ssRight');
|
||||
if ssMiddle in Shift then Add('ssMiddle');
|
||||
if ssDouble in Shift then Add('ssDouble');
|
||||
if ssMeta in Shift then Add('ssMeta');
|
||||
if ssSuper in Shift then Add('ssSuper');
|
||||
if ssHyper in Shift then Add('ssHyper');
|
||||
if ssAltGr in Shift then Add('ssAltGr');
|
||||
if ssCaps in Shift then Add('ssCaps');
|
||||
if ssNum in Shift then Add('ssNum');
|
||||
if ssScroll in Shift then Add('ssScroll');
|
||||
if ssTriple in Shift then Add('ssTriple');
|
||||
if ssQuad in Shift then Add('ssQuad');
|
||||
Result:='['+Result+']';
|
||||
end;
|
||||
|
||||
function UTF8CharacterLength(p: PChar): integer;
|
||||
begin
|
||||
if p<>nil then begin
|
||||
|
Loading…
Reference in New Issue
Block a user