fixed gtk2 intf checking if signal already connected

git-svn-id: trunk@6790 -
This commit is contained in:
mattias 2005-02-17 02:10:53 +00:00
parent 925cc87469
commit 0882395f3e
6 changed files with 125 additions and 71 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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