diff --git a/lcl/interfaces/gtk/gtkcallback.inc b/lcl/interfaces/gtk/gtkcallback.inc index 9413114fef..e01a2c594a 100644 --- a/lcl/interfaces/gtk/gtkcallback.inc +++ b/lcl/interfaces/gtk/gtkcallback.inc @@ -1983,51 +1983,6 @@ begin end; end; -function GtkSwitchPage(widget: PGtkWidget; page: Pgtkwidget; pagenum: integer; - data: gPointer): GBoolean; cdecl; -var - Mess: TLMNotify; - NMHdr: tagNMHDR; -begin - Result := CallBackDefaultReturn; - - EventTrace('switch-page', data); - UpdateNoteBookClientWidget(TObject(Data)); - - if PGtkNotebook(Widget)^.cur_page = nil then // for windows compatibility - Exit; - - // gtkswitchpage is called before the switch - - // send first the TCN_SELCHANGING to ask if switch is allowed - FillChar(Mess, SizeOf(Mess), 0); - Mess.Msg := LM_NOTIFY; - FillChar(NMHdr, SizeOf(NMHdr), 0); - NMHdr.code := TCN_SELCHANGING; - NMHdr.hwndFrom := PtrUInt(widget); - NMHdr.idFrom := pagenum; //use this to set pageindex to the correct page. - Mess.NMHdr := @NMHdr; - Mess.Result := 0; - DeliverMessage(Data, Mess); - if Mess.Result <> 0 then - begin - g_signal_stop_emission_by_name(PGtkObject(Widget), 'switch-page'); - Result := not CallBackDefaultReturn; - Exit; - end; - - // then send the new page - FillChar(Mess, SizeOf(Mess), 0); - Mess.Msg := LM_NOTIFY; - FillChar(NMHdr, SizeOf(NMHdr), 0); - NMHdr.code := TCN_SELCHANGE; - NMHdr.hwndFrom := PtrUInt(widget); - NMHdr.idFrom := pagenum; //use this to set pageindex to the correct page. - Mess.NMHdr := @NMHdr; - DeliverMessage(Data, Mess); -end; - - function gtkconfigureevent( widget: PGtkWidget; event : PgdkEventConfigure; data: gPointer) : GBoolean; cdecl; var diff --git a/lcl/interfaces/gtk/gtkproc.pp b/lcl/interfaces/gtk/gtkproc.pp index 4df0479581..2ec8a64fb5 100644 --- a/lcl/interfaces/gtk/gtkproc.pp +++ b/lcl/interfaces/gtk/gtkproc.pp @@ -184,8 +184,6 @@ function gtksize_allocateCB(widget: PGtkWidget; size :pGtkAllocation; data: gPointer): GBoolean; cdecl; function gtksize_allocate_client(widget: PGtkWidget; size :pGtkAllocation; data: gPointer): GBoolean; cdecl; -function gtkswitchpage(widget: PGtkWidget; page: Pgtkwidget; pagenum: integer; - data: gPointer): GBoolean; cdecl; function gtkconfigureevent( widget: PGtkWidget; event: PgdkEventConfigure; data: gPointer): GBoolean; cdecl; function gtkreleasedCB(widget: PGtkWidget; data: gPointer): GBoolean; cdecl; diff --git a/lcl/interfaces/gtk/gtkwidgetset.inc b/lcl/interfaces/gtk/gtkwidgetset.inc index 56afd9b2d4..3c2530321e 100644 --- a/lcl/interfaces/gtk/gtkwidgetset.inc +++ b/lcl/interfaces/gtk/gtkwidgetset.inc @@ -3253,9 +3253,6 @@ begin 'value_changed', @gtkvaluechanged); end else - if ALCLObject is TCustomNotebook then - ConnectSenderSignal(gObject, 'switch_page', @gtkswitchpage) - else if ALCLObject is TCustomCombobox then ConnectSenderSignal (PGtkObject( PGtkCombo(gObject)^.entry), 'changed', @gtkchangedCB) diff --git a/lcl/interfaces/gtk/gtkwsextctrls.pp b/lcl/interfaces/gtk/gtkwsextctrls.pp index ae95688cf1..2dadd17405 100644 --- a/lcl/interfaces/gtk/gtkwsextctrls.pp +++ b/lcl/interfaces/gtk/gtkwsextctrls.pp @@ -245,6 +245,8 @@ const { tpLeft } GTK_POS_LEFT, { tpRight } GTK_POS_RIGHT ); + + LCL_NotebookManualPageSwitchKey = 'lcl_manual_page_switch'; { TGtkWSCustomPage } @@ -289,11 +291,62 @@ end; { TGtkWSCustomNotebook } +function GtkWSNotebook_SwitchPage(widget: PGtkWidget; page: Pgtkwidget; pagenum: integer; data: gPointer): GBoolean; cdecl; +var + Mess: TLMNotify; + NMHdr: tagNMHDR; +begin + Result := CallBackDefaultReturn; + + EventTrace('switch-page', data); + UpdateNoteBookClientWidget(TObject(Data)); + + if PGtkNotebook(Widget)^.cur_page = nil then // for windows compatibility + Exit; + + // gtkswitchpage is called before the switch + + if g_object_get_data(PGObject(Widget), LCL_NotebookManualPageSwitchKey) = nil then + begin + // send first the TCN_SELCHANGING to ask if switch is allowed + FillChar(Mess, SizeOf(Mess), 0); + Mess.Msg := LM_NOTIFY; + FillChar(NMHdr, SizeOf(NMHdr), 0); + NMHdr.code := TCN_SELCHANGING; + NMHdr.hwndFrom := PtrUInt(widget); + NMHdr.idFrom := pagenum; //use this to set pageindex to the correct page. + Mess.NMHdr := @NMHdr; + Mess.Result := 0; + DeliverMessage(Data, Mess); + if Mess.Result <> 0 then + begin + g_signal_stop_emission_by_name(PGtkObject(Widget), 'switch-page'); + Result := not CallBackDefaultReturn; + Exit; + end; + end + else + begin + // remove flag + g_object_set_data(PGObject(Widget), LCL_NotebookManualPageSwitchKey, nil); + end; + + // then send the new page + FillChar(Mess, SizeOf(Mess), 0); + Mess.Msg := LM_NOTIFY; + FillChar(NMHdr, SizeOf(NMHdr), 0); + NMHdr.code := TCN_SELCHANGE; + NMHdr.hwndFrom := PtrUInt(widget); + NMHdr.idFrom := pagenum; //use this to set pageindex to the correct page. + Mess.NMHdr := @NMHdr; + DeliverMessage(Data, Mess); +end; + class procedure TGtkWSCustomNotebook.SetCallbacks(const AGtkWidget: PGtkWidget; const AWidgetInfo: PWidgetInfo); begin TGtkWSWinControl.SetCallbacks(PGtkObject(AGtkWidget), TComponent(AWidgetInfo^.LCLObject)); - TGTKWidgetSet(WidgetSet).SetCallback(LM_CHANGED, PGtkObject(AGtkWidget), AWidgetInfo^.LCLObject); + ConnectSignal(PGtkObject(AGtkWidget), 'switch_page', @GtkWSNotebook_SwitchPage, AWidgetInfo^.LCLObject); end; class function TGtkWSCustomNotebook.CreateHandle(const AWinControl: TWinControl; @@ -535,6 +588,7 @@ end; class procedure TGtkWSCustomNotebook.SetPageIndex( const ANotebook: TCustomNotebook; const AIndex: integer); begin + g_object_set_data(PGObject(ANotebook.Handle), LCL_NotebookManualPageSwitchKey, ANoteBook); gtk_notebook_set_page(PGtkNotebook(ANotebook.Handle), AIndex); UpdateNoteBookClientWidget(ANotebook); end;