summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomas Bzatek <tbzatek@redhat.com>2026-01-23 23:13:06 +0100
committerTomas Bzatek <tbzatek@redhat.com>2026-01-23 23:13:06 +0100
commit0a108a051c98c90d400da9ae025e4a32a8c6861f (patch)
tree646c70044c45d0fe005fffc2ef6a9113399afd2c
parent1f66d0a599568971adc708d70ee9777259669fa9 (diff)
downloadtuxcmd-0a108a051c98c90d400da9ae025e4a32a8c6861f.tar.xz
WIP: EphyNotebookgtk3_port
-rw-r--r--UGnome.pas342
-rw-r--r--UMain.pas60
-rw-r--r--libgtk_kylix/GTKExtCtrls.pas13
3 files changed, 308 insertions, 107 deletions
diff --git a/UGnome.pas b/UGnome.pas
index 532301d..c0b92eb 100644
--- a/UGnome.pas
+++ b/UGnome.pas
@@ -52,28 +52,52 @@ type
property Time: time_t read GetTime write SetTime;
end;
- TEphyNotebook = class;
- TEphyNotebookReorderedEvent = procedure (Sender: TObject; const Source, Dest: integer) of object;
+
TEphyNotebookTabCloseEvent = procedure (Sender: TObject; const TabNum: integer; var CanClose: boolean) of object;
- TEphyNotebookTabDoubleClickEvent = procedure (Sender: TObject; const TabNum: integer) of object;
- TEphyNotebookFindNotebookAtPointerEvent = function (Sender: TObject; const AbsX, AbsY: integer): TEphyNotebook of object;
- TEphyNotebookMoveTabToAnotherNotebookEvent = function (Sender: TObject; Destination: TEphyNotebook; const SourceTabNo, DestTabNo: integer): boolean of object;
- TEphyNotebookTabSwitchedEvent = procedure (Sender: TObject; const NewTabNum: integer; const ShouldFocus: boolean) of object;
- TEphyNotebookTabFocusOnlyEvent = procedure (Sender: TObject; const NewTabNum: integer) of object;
- // Extended capatibilities notebook (icons, close buttons, reordering by drag&drop)
+
TEphyNotebook = class(TGTKNotebook)
private
FShowCloseButtons: boolean;
+ FOnTabClose: TEphyNotebookTabCloseEvent;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ function AppendPage(Child: TGTKControl; Caption: string): integer;
+ function InsertPage(Position: integer; Child: TGTKControl; Caption: string): integer;
+ function GetTabCaption(PageNo: integer): string;
+ procedure SetTabCaption(PageNo: integer; Caption: string);
+ procedure SetTabTooltip(PageNo: integer; ATooltip: string);
+ procedure SetShowCloseButtons(Value: boolean);
+ published
+ property ShowCloseButtons: boolean read FShowCloseButtons write SetShowCloseButtons default False;
+ property OnTabClose: TEphyNotebookTabCloseEvent read FOnTabClose write FOnTabClose;
+ end;
+
+
+
+ TEphyNotebookx = class;
+
+ TEphyNotebookxReorderedEvent = procedure (Sender: TObject; const Source, Dest: integer) of object;
+ TEphyNotebookxTabCloseEvent = procedure (Sender: TObject; const TabNum: integer; var CanClose: boolean) of object;
+ TEphyNotebookxTabDoubleClickEvent = procedure (Sender: TObject; const TabNum: integer) of object;
+ TEphyNotebookxFindNotebookAtPointerEvent = function (Sender: TObject; const AbsX, AbsY: integer): TEphyNotebookx of object;
+ TEphyNotebookxMoveTabToAnotherNotebookEvent = function (Sender: TObject; Destination: TEphyNotebookx; const SourceTabNo, DestTabNo: integer): boolean of object;
+ TEphyNotebookxTabSwitchedEvent = procedure (Sender: TObject; const NewTabNum: integer; const ShouldFocus: boolean) of object;
+ TEphyNotebookxTabFocusOnlyEvent = procedure (Sender: TObject; const NewTabNum: integer) of object;
+ // Extended capatibilities notebook (icons, close buttons, reordering by drag&drop)
+ TEphyNotebookx = class(TGTKNotebook)
+ private
+ FShowCloseButtons: boolean;
FAllowDragDrop: boolean;
FAllowDragOutside: boolean;
- FOnNotebookReordered: TEphyNotebookReorderedEvent;
+ FOnNotebookReordered: TEphyNotebookxReorderedEvent;
FOnTabClose: TEphyNotebookTabCloseEvent;
- FOnTabDoubleClick: TEphyNotebookTabDoubleClickEvent;
- FOnFindNotebookAtPointer: TEphyNotebookFindNotebookAtPointerEvent;
- FOnMoveTabToAnotherNotebook: TEphyNotebookMoveTabToAnotherNotebookEvent;
- FOnTabSwitchedEvent: TEphyNotebookTabSwitchedEvent;
- FOnTabFocusOnlyEvent: TEphyNotebookTabFocusOnlyEvent;
+ FOnTabDoubleClick: TEphyNotebookxTabDoubleClickEvent;
+ FOnFindNotebookAtPointer: TEphyNotebookxFindNotebookAtPointerEvent;
+ FOnMoveTabToAnotherNotebook: TEphyNotebookxMoveTabToAnotherNotebookEvent;
+ FOnTabSwitchedEvent: TEphyNotebookxTabSwitchedEvent;
+ FOnTabFocusOnlyEvent: TEphyNotebookxTabFocusOnlyEvent;
// Notebook private
motion_notify_handler_id, grab_notify_handler_id, toplevel_grab_broken_handler_id, toplevel_motion_notify_handler_id,
@@ -89,12 +113,12 @@ type
procedure SetAllowDragOutside(Value: boolean);
function find_tab_num_at_pos(abs_x, abs_y: integer): integer;
- function find_notebook_at_pointer(abs_x, abs_y: integer): TEphyNotebook;
- function is_in_notebook_window(notebook: TEphyNotebook; abs_x, abs_y: integer): boolean;
+ function find_notebook_at_pointer(abs_x, abs_y: integer): TEphyNotebookx;
+ function is_in_notebook_window(notebook: TEphyNotebookx; abs_x, abs_y: integer): boolean;
function drag_start(time: guint32): gboolean;
procedure drag_stop(time: guint32);
procedure move_tab(dest_position: integer);
- procedure move_tab_to_another_notebook(dest: TEphyNotebook; event: PGdkEventMotion);
+ procedure move_tab_to_another_notebook(dest: TEphyNotebookx; event: PGdkEventMotion);
function GetPageIndex: integer;
procedure SetPageIndex(Value: integer);
@@ -112,13 +136,13 @@ type
property ShowCloseButtons: boolean read FShowCloseButtons write SetShowCloseButtons default False;
property AllowDragDrop: boolean read FAllowDragDrop write SetAllowDragDrop default False;
property AllowDragOutside: boolean read FAllowDragOutside write SetAllowDragOutside default False;
- property OnNotebookReordered: TEphyNotebookReorderedEvent read FOnNotebookReordered write FOnNotebookReordered;
- property OnTabClose: TEphyNotebookTabCloseEvent read FOnTabClose write FOnTabClose;
- property OnTabDoubleClick: TEphyNotebookTabDoubleClickEvent read FOnTabDoubleClick write FOnTabDoubleClick;
- property OnFindNotebookAtPointer: TEphyNotebookFindNotebookAtPointerEvent read FOnFindNotebookAtPointer write FOnFindNotebookAtPointer;
- property OnMoveTabToAnotherNotebook: TEphyNotebookMoveTabToAnotherNotebookEvent read FOnMoveTabToAnotherNotebook write FOnMoveTabToAnotherNotebook;
- property OnTabSwitched: TEphyNotebookTabSwitchedEvent read FOnTabSwitchedEvent write FOnTabSwitchedEvent;
- property OnTabFocusOnlyEvent: TEphyNotebookTabFocusOnlyEvent read FOnTabFocusOnlyEvent write FOnTabFocusOnlyEvent;
+ property OnNotebookReordered: TEphyNotebookxReorderedEvent read FOnNotebookReordered write FOnNotebookReordered;
+ property OnTabClose: TEphyNotebookxTabCloseEvent read FOnTabClose write FOnTabClose;
+ property OnTabDoubleClick: TEphyNotebookxTabDoubleClickEvent read FOnTabDoubleClick write FOnTabDoubleClick;
+ property OnFindNotebookAtPointer: TEphyNotebookxFindNotebookAtPointerEvent read FOnFindNotebookAtPointer write FOnFindNotebookAtPointer;
+ property OnMoveTabToAnotherNotebook: TEphyNotebookxMoveTabToAnotherNotebookEvent read FOnMoveTabToAnotherNotebook write FOnMoveTabToAnotherNotebook;
+ property OnTabSwitched: TEphyNotebookxTabSwitchedEvent read FOnTabSwitchedEvent write FOnTabSwitchedEvent;
+ property OnTabFocusOnlyEvent: TEphyNotebookxTabFocusOnlyEvent read FOnTabFocusOnlyEvent write FOnTabFocusOnlyEvent;
end;
@@ -237,12 +261,184 @@ end;
(********************************************************************************************************************************)
(********************************************************************************************************************************)
+
+constructor TEphyNotebook.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+{ cursor := nil; }
+ FShowCloseButtons := False;
+{ FAllowDragDrop := False;
+ FAllowDragOutside := False;
+ FOnNotebookReordered := nil; }
+ FOnTabClose := nil;
+{ FOnTabDoubleClick := nil;
+ FOnFindNotebookAtPointer := nil;
+ FOnMoveTabToAnotherNotebook := nil;
+ FOnTabFocusOnlyEvent := nil;
+ FBusy := False; }
+
+ // Set up drag-and-drop
+{ g_signal_connect_data(PGObject(FWidget), 'button-press-event', TGCallback(@button_press_cb), Self, nil, G_CONNECT_DEFAULT);
+ g_signal_connect_data(PGObject(FWidget), 'button-release-event', TGCallback(@button_release_cb), Self, nil, G_CONNECT_DEFAULT);
+ g_signal_connect_data(PGObject(FWidget), 'scroll-event', TGCallback(@scroll_event_callback), Self, nil, G_CONNECT_DEFAULT);
+ gtk_widget_add_events(FWidget, guint(GDK_BUTTON1_MOTION_MASK));
+}
+// Show;
+end;
+
+destructor TEphyNotebook.Destroy;
+begin
+ inherited Destroy;
+end;
+
+
+
+
+procedure close_button_clicked_cb(widget: PGtkWidget; data: pointer); cdecl;
+var tab: PGtkWidget;
+ ntb: TEphyNotebook;
+ position: integer;
+ CanClose: boolean;
+begin
+ tab := g_object_get_data(PGObject(widget), 'child');
+ ntb := TEphyNotebook(data);
+
+ position := gtk_notebook_page_num(PGtkNotebook(ntb.FWidget), PGtkWidget(tab));
+// DebugMsg(['@******* close_button_clicked_cb: Position = ', position, ', data = 0x', IntToHex(Integer(data), 8), ', widget = 0x', IntToHex(Integer(widget), 8)]);
+
+ CanClose := True;
+
+ if @ntb.FOnTabClose <> nil then ntb.FOnTabClose(ntb, position, CanClose);
+
+ if CanClose then gtk_notebook_remove_page(PGtkNotebook(ntb.FWidget), position);
+end;
+
+function TEphyNotebook.AppendPage(Child: TGTKControl; Caption: string): integer;
+begin
+ Result := InsertPage(ChildrenCount, Child, Caption);
+end;
+
+function TEphyNotebook.InsertPage(Position: integer; Child: TGTKControl; Caption: string): integer;
+var hbox, label_hbox, label_ebox, _label, close_button, image, icon: PGtkWidget;
+begin
+ // set hbox spacing and label padding (see below) so that there's an equal amount of space around the label
+ hbox := gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+
+ label_ebox := gtk_event_box_new();
+ gtk_event_box_set_visible_window(PGtkEventBox (label_ebox), FALSE);
+ gtk_box_pack_start(PGtkBox (hbox), label_ebox, TRUE, TRUE, 0);
+// g_signal_connect_data(PGObject(label_ebox), 'button-press-event', TGCallback(@label_ebox_button_pressed), Self, nil, G_CONNECT_DEFAULT);
+ g_object_set_data(PGObject(label_ebox), 'child', Child.FWidget);
+
+ label_hbox := gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_container_add(PGtkContainer (label_ebox), label_hbox);
+
+ // setup close button
+ close_button := gtk_button_new ();
+ gtk_button_set_relief (PGtkButton (close_button), GTK_RELIEF_NONE);
+ // don't allow focus on the close button
+ g_object_set(PGObject(close_button), 'can-focus', [gboolean(FALSE), nil]);
+ gtk_button_set_relief (PGtkButton (close_button), GTK_RELIEF_NONE);
+
+ // TODO
+{ rcstyle := gtk_rc_style_new ();
+ rcstyle^.xthickness := Ord(rcstyle^.ythickness = 0);
+ gtk_widget_modify_style (close_button, rcstyle);
+ gtk_rc_style_unref (rcstyle);
+}
+ image := gtk_image_new_from_icon_name('gtk-close', GTK_ICON_SIZE_MENU);
+ gtk_container_add(PGtkContainer(close_button), image);
+ gtk_box_pack_start(PGtkBox(hbox), close_button, FALSE, FALSE, 0);
+
+ gtk_widget_set_tooltip_text(close_button, PChar(LANGEphyNotebookCloseTab));
+ g_object_set_data(PGObject(close_button), 'tab', hbox);
+ g_object_set_data(PGObject(close_button), 'child', Child.FWidget);
+ g_signal_connect_data(PGObject(close_button), 'clicked', TGCallback(@close_button_clicked_cb), Self, nil, G_CONNECT_DEFAULT);
+
+ // setup site icon, empty by default
+ icon := gtk_image_new ();
+ gtk_box_pack_start (PGtkBox (label_hbox), icon, FALSE, FALSE, 0);
+
+ // setup label
+ _label := gtk_label_new(PChar(Caption));
+// gtk_label_set_ellipsize (PGtkLabel (label), PANGO_ELLIPSIZE_END);
+// gtk_label_set_single_line_mode (PGtkLabel (label), TRUE);
+ gtk_label_set_yalign(PGtkLabel(_label), 0.5);
+ gtk_widget_set_margin_start(_label, 2);
+ gtk_widget_set_margin_end(_label, 2);
+ gtk_box_pack_start (PGtkBox(label_hbox), _label, TRUE, TRUE, 0);
+
+ // Set minimal size
+ // TODO
+// g_signal_connect_data(PGObject(hbox), 'style-set', TGCallback(@tab_label_style_set_cb), nil, nil, G_CONNECT_DEFAULT);
+
+ gtk_widget_show (hbox);
+ gtk_widget_show (label_ebox);
+ gtk_widget_show (label_hbox);
+ gtk_widget_show (_label);
+ gtk_widget_show (image);
+ if FShowCloseButtons then gtk_widget_show (close_button);
+
+ g_object_set_data(PGObject(hbox), 'label', _label);
+ g_object_set_data(PGObject(hbox), 'label-ebox', label_ebox);
+ g_object_set_data(PGObject(hbox), 'icon', icon);
+ g_object_set_data(PGObject(hbox), 'close-button', close_button);
+
+ Result := gtk_notebook_insert_page(PGtkNotebook(FWidget), Child.FWidget, hbox, Position);
+end;
+
+function TEphyNotebook.GetTabCaption(PageNo: integer): string;
+var wid, lab: PGtkWidget;
+begin
+ wid := gtk_notebook_get_tab_label(PGtkNotebook(FWidget), gtk_notebook_get_nth_page(PGtkNotebook(FWidget), PageNo));
+ lab := g_object_get_data (PGObject(wid), 'label');
+ Result := String(gtk_label_get_text(PGtkLabel(lab)));
+end;
+
+procedure TEphyNotebook.SetTabCaption(PageNo: integer; Caption: string);
+var wid, lab: PGtkWidget;
+begin
+ wid := gtk_notebook_get_tab_label(PGtkNotebook(FWidget), gtk_notebook_get_nth_page(PGtkNotebook(FWidget), PageNo));
+ lab := g_object_get_data (PGObject(wid), 'label');
+ gtk_label_set_text(PGtkLabel(lab), PChar(Caption));
+end;
+
+procedure TEphyNotebook.SetTabTooltip(PageNo: integer; ATooltip: string);
+var wid, lab: PGtkWidget;
+begin
+ wid := gtk_notebook_get_tab_label(PGtkNotebook(FWidget), gtk_notebook_get_nth_page(PGtkNotebook(FWidget), PageNo));
+ lab := g_object_get_data (PGObject(wid), 'label-ebox');
+ gtk_widget_set_tooltip_text(lab, PChar(ATooltip));
+end;
+
+procedure TEphyNotebook.SetShowCloseButtons(Value: boolean);
+begin
+ FShowCloseButtons := Value;
+
+ // Apply settings here
+end;
+
+
+
+
+
+
+
+
+
+
+
+
+
+(********************************************************************************************************************************)
+(********************************************************************************************************************************)
+
+function label_ebox_button_pressed(widget: PGtkWidget; event: PGdkEventButton; data: pointer): gboolean; cdecl; forward;
function button_press_cb(notebook: PGtkWidget; event: PGdkEventButton; data: gpointer): gboolean; cdecl; forward;
function button_release_cb(notebook: PGtkWidget; event: PGdkEventButton; data: gpointer): gboolean; cdecl; forward;
function scroll_event_callback(widget: PGtkWidget; event: PGdkEventScroll; user_data: gpointer): gboolean; cdecl; forward;
-function label_ebox_button_pressed(widget: PGtkWidget; event: PGdkEventButton; data: pointer): gboolean; cdecl; forward;
-constructor TEphyNotebook.Create(AOwner: TComponent);
+constructor TEphyNotebookx.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
cursor := nil;
@@ -266,25 +462,25 @@ begin
Show;
end;
-destructor TEphyNotebook.Destroy;
+destructor TEphyNotebookx.Destroy;
begin
inherited Destroy;
end;
-procedure TEphyNotebook.SetShowCloseButtons(Value: boolean);
+procedure TEphyNotebookx.SetShowCloseButtons(Value: boolean);
begin
FShowCloseButtons := Value;
// Apply settings here
end;
-procedure TEphyNotebook.SetAllowDragDrop(Value: boolean);
+procedure TEphyNotebookx.SetAllowDragDrop(Value: boolean);
begin
FAllowDragDrop := Value;
if (not Value) and drag_in_progress then drag_stop(GDK_CURRENT_TIME (* FIXME? *));
end;
-procedure TEphyNotebook.SetAllowDragOutside(Value: boolean);
+procedure TEphyNotebookx.SetAllowDragOutside(Value: boolean);
begin
FAllowDragOutside := Value;
if (not Value) and drag_in_progress then drag_stop(GDK_CURRENT_TIME (* FIXME? *));
@@ -313,31 +509,13 @@ begin
gtk_widget_set_size_request(button, w + 2, h + 2);
end;
-procedure close_button_clicked_cb(widget: PGtkWidget; data: pointer); cdecl;
-var tab: PGtkWidget;
- ntb: TEphyNotebook;
- position: integer;
- CanClose: boolean;
-begin
- tab := g_object_get_data(PGObject(widget), 'child');
- ntb := TEphyNotebook(data);
-
- position := gtk_notebook_page_num(PGtkNotebook(ntb.FWidget), PGtkWidget(tab));
-// DebugMsg(['@******* close_button_clicked_cb: Position = ', position, ', data = 0x', IntToHex(Integer(data), 8), ', widget = 0x', IntToHex(Integer(widget), 8)]);
-
- CanClose := True;
- if @ntb.FOnTabClose <> nil then ntb.FOnTabClose(ntb, position, CanClose);
-
- if CanClose then gtk_notebook_remove_page(PGtkNotebook(ntb.FWidget), position);
-end;
-
-function TEphyNotebook.AppendPage(Child: TGTKControl; Caption: string): integer;
+function TEphyNotebookx.AppendPage(Child: TGTKControl; Caption: string): integer;
begin
Result := InsertPage(ChildrenCount, Child, Caption);
end;
-function TEphyNotebook.InsertPage(Position: integer; Child: TGTKControl; Caption: string): integer;
+function TEphyNotebookx.InsertPage(Position: integer; Child: TGTKControl; Caption: string): integer;
var hbox, label_hbox, label_ebox, _label, close_button, image, icon: PGtkWidget;
// rcstyle: PGtkRcStyle;
begin
@@ -407,12 +585,12 @@ begin
Result := gtk_notebook_insert_page(PGtkNotebook(FWidget), Child.FWidget, hbox, Position);
end;
-procedure TEphyNotebook.RemovePage(PageNo: integer);
+procedure TEphyNotebookx.RemovePage(PageNo: integer);
begin
gtk_notebook_remove_page(PGtkNotebook(FWidget), PageNo);
end;
-function TEphyNotebook.GetTabCaption(PageNo: integer): string;
+function TEphyNotebookx.GetTabCaption(PageNo: integer): string;
var wid, lab: PGtkWidget;
begin
wid := gtk_notebook_get_tab_label(PGtkNotebook(FWidget), gtk_notebook_get_nth_page(PGtkNotebook(FWidget), PageNo));
@@ -420,7 +598,7 @@ begin
Result := String(gtk_label_get_text(PGtkLabel(lab)));
end;
-procedure TEphyNotebook.SetTabCaption(PageNo: integer; Caption: string);
+procedure TEphyNotebookx.SetTabCaption(PageNo: integer; Caption: string);
var wid, lab: PGtkWidget;
begin
wid := gtk_notebook_get_tab_label(PGtkNotebook(FWidget), gtk_notebook_get_nth_page(PGtkNotebook(FWidget), PageNo));
@@ -428,7 +606,7 @@ begin
gtk_label_set_text(PGtkLabel(lab), PChar(Caption));
end;
-procedure TEphyNotebook.SetTabTooltip(PageNo: integer; ATooltip: string);
+procedure TEphyNotebookx.SetTabTooltip(PageNo: integer; ATooltip: string);
var wid, lab: PGtkWidget;
begin
wid := gtk_notebook_get_tab_label(PGtkNotebook(FWidget), gtk_notebook_get_nth_page(PGtkNotebook(FWidget), PageNo));
@@ -436,12 +614,12 @@ begin
gtk_widget_set_tooltip_text(lab, PChar(ATooltip));
end;
-function TEphyNotebook.GetPageIndex: integer;
+function TEphyNotebookx.GetPageIndex: integer;
begin
Result := gtk_notebook_get_current_page(PGtkNotebook(FWidget));
end;
-procedure TEphyNotebook.SetPageIndex(Value: integer);
+procedure TEphyNotebookx.SetPageIndex(Value: integer);
begin
DebugMsg(['SetPageIndex(Value = ', Value, ')']);
if (GetPageIndex <> Value) and (Value >= 0) then begin
@@ -451,7 +629,7 @@ begin
end;
-function TEphyNotebook.find_tab_num_at_pos(abs_x, abs_y: integer): integer;
+function TEphyNotebookx.find_tab_num_at_pos(abs_x, abs_y: integer): integer;
var tab_pos: TGtkPositionType;
page_num: integer;
page, tab: PGtkWidget;
@@ -510,7 +688,7 @@ begin
// DebugMsg(['@******* find_tab_num_at_pos(abs_x = ', abs_x, ', abs_y = ', abs_y, ', Result = ', Result, ')']);
end;
-function TEphyNotebook.find_notebook_at_pointer(abs_x, abs_y: integer): TEphyNotebook;
+function TEphyNotebookx.find_notebook_at_pointer(abs_x, abs_y: integer): TEphyNotebookx;
(* var win_at_pointer{, toplevel_win}: PGdkWindow;
x, y: integer;
// toplevel: pointer; *)
@@ -545,7 +723,7 @@ begin
{ Result := nil;}
end;
-function TEphyNotebook.is_in_notebook_window(notebook: TEphyNotebook; abs_x, abs_y: integer): boolean;
+function TEphyNotebookx.is_in_notebook_window(notebook: TEphyNotebookx; abs_x, abs_y: integer): boolean;
begin
Result := find_notebook_at_pointer(abs_x, abs_y) <> nil;
// Result := notebook = find_notebook_at_pointer(abs_x, abs_y);
@@ -596,7 +774,7 @@ terminal_notebook_move_tab (TerminalNotebook *src,
}
} *)
-procedure TEphyNotebook.drag_stop(time: guint32);
+procedure TEphyNotebookx.drag_stop(time: guint32);
var toplevel{, child}: PGtkWidget;
drag_stop_idx: integer;
begin
@@ -661,22 +839,22 @@ end;
function grab_broken_event_cb(widget: PGtkWidget; event: PGdkEvent; data: gpointer): gboolean; cdecl;
begin
- if data <> nil then TEphyNotebook(data).drag_stop(GDK_CURRENT_TIME (* FIXME? *));
+ if data <> nil then TEphyNotebookx(data).drag_stop(GDK_CURRENT_TIME (* FIXME? *));
Result := False;
end;
procedure grab_notify_cb(widget: PGtkWidget; was_grabbed: gboolean; data: gpointer); cdecl;
begin
- if data <> nil then TEphyNotebook(data).drag_stop(GDK_CURRENT_TIME (* FIXME? *));
+ if data <> nil then TEphyNotebookx(data).drag_stop(GDK_CURRENT_TIME (* FIXME? *));
end;
function toplevel_motion_notify_cb(widget: PGtkWidget; event: PGdkEventMotion; data: gpointer): gboolean; cdecl;
-var ntb, dest: TEphyNotebook;
+var ntb, dest: TEphyNotebookx;
page_num: integer;
begin
// DebugMsg(['@######## toplevel_motion_notify_cb(..., data = 0x', IntToHex(Integer(data), 8), ')']);
Result := False;
- ntb := TEphyNotebook(data);
+ ntb := TEphyNotebookx(data);
if ntb.FBusy then Exit;
page_num := ntb.find_tab_num_at_pos(Trunc(event^.x_root), Trunc(event^.y_root));
@@ -716,12 +894,12 @@ begin
end;
function toplevel_button_release_cb(widget: PGtkWidget; event: PGdkEventButton; data: gpointer): gboolean; cdecl;
-var ntb: TEphyNotebook;
+var ntb: TEphyNotebookx;
// cur_page_num: integer;
// cur_page: PGtkWidget;
begin
DebugMsg(['@######## toplevel_button_release_cb(..., data = 0x', IntToHex(Integer(data), 8), ')']);
- ntb := TEphyNotebook(data);
+ ntb := TEphyNotebookx(data);
if ntb.drag_in_progress then begin
// cur_page_num := gtk_notebook_get_current_page(PGtkNotebook(ntb.FWidget));
@@ -741,7 +919,7 @@ begin
Result := False;
end;
-function TEphyNotebook.drag_start(time: guint32): gboolean;
+function TEphyNotebookx.drag_start(time: guint32): gboolean;
var toplevel, child: PGtkWidget;
begin
DebugMsg(['@######## drag_start']);
@@ -791,7 +969,7 @@ begin
toplevel_motion_notify_handler_id := g_signal_connect_data(PGObject(toplevel), 'motion-notify-event', TGCallback(@toplevel_motion_notify_cb), Self, nil, G_CONNECT_DEFAULT);
toplevel_button_release_handler_id := g_signal_connect_data(PGObject(toplevel), 'button-release-event', TGCallback(@toplevel_button_release_cb), Self, nil, G_CONNECT_DEFAULT);
grab_notify_handler_id := g_signal_connect_data(PGObject(FWidget), 'grab-notify', TGCallback(@grab_notify_cb), Self, nil, G_CONNECT_DEFAULT);
-
+
drag_start_idx := gtk_notebook_get_current_page(PGtkNotebook(FWidget));
Result := True;
end else begin
@@ -801,7 +979,7 @@ begin
end;
// this function is only called during dnd, we don't need to emit TABS_REORDERED here, instead we do it on drag_stop
-procedure TEphyNotebook.move_tab(dest_position: integer);
+procedure TEphyNotebookx.move_tab(dest_position: integer);
var cur_page_num: integer;
cur_tab: PGtkWidget;
begin
@@ -818,10 +996,10 @@ begin
end;
function motion_notify_cb(notebook: PGtkWidget; event: PGdkEventMotion; data: gpointer): gboolean; cdecl;
-var ntb: TEphyNotebook;
+var ntb: TEphyNotebookx;
begin
// DebugMsg(['@######## motion_notify_cb(..., data = 0x', IntToHex(Integer(data), 8), ')']);
- ntb := TEphyNotebook(data);
+ ntb := TEphyNotebookx(data);
Result := False;
if (not ntb.drag_in_progress) and (ntb.x_start >= 0) and (ntb.y_start >= 0) and
@@ -830,15 +1008,15 @@ begin
then Result := ntb.drag_start(event^.time);
end;
-procedure TEphyNotebook.move_tab_to_another_notebook(dest: TEphyNotebook; event: PGdkEventMotion);
+procedure TEphyNotebookx.move_tab_to_another_notebook(dest: TEphyNotebookx; event: PGdkEventMotion);
var cur_page, dest_page_num: integer;
begin
// This is getting tricky, the screen was dragged in a notebook in another window of the same app, we move the screen
// to that new notebook, and let this notebook handle the drag
DebugMsg(['@######## move_tab_to_another_notebook(dest = 0x', IntToHex(Integer(pointer(dest)), 8), ')']);
- if not (dest is TEphyNotebook) then begin
- DebugMsg(['@######## move_tab_to_another_notebook: dest(', dest.ClassName, ') is not TEphyNotebook']);
+ if not (dest is TEphyNotebookx) then begin
+ DebugMsg(['@######## move_tab_to_another_notebook: dest(', dest.ClassName, ') is not TEphyNotebookx']);
Exit;
end;
@@ -909,9 +1087,9 @@ begin
end;
function button_release_cb(notebook: PGtkWidget; event: PGdkEventButton; data: gpointer): gboolean; cdecl;
-var ntb: TEphyNotebook;
+var ntb: TEphyNotebookx;
begin
- ntb := TEphyNotebook(data);
+ ntb := TEphyNotebookx(data);
DebugMsg(['@######## button_release_cb(..., data = 0x', IntToHex(Integer(data), 8), ')']);
// This must be called even if a drag isn't happening
@@ -921,11 +1099,11 @@ end;
function label_ebox_button_pressed(widget: PGtkWidget; event: PGdkEventButton; data: pointer): gboolean; cdecl;
var tab: PGtkWidget;
- ntb: TEphyNotebook;
+ ntb: TEphyNotebookx;
position: integer;
begin
Result := False;
- ntb := TEphyNotebook(data);
+ ntb := TEphyNotebookx(data);
tab := g_object_get_data(PGObject(widget), 'child');
position := gtk_notebook_page_num(PGtkNotebook(ntb.FWidget), PGtkWidget(tab));
// DebugMsg(['@******* label_ebox_button_pressed, button = ', event^.button, ', Position = ', position, ', data = 0x', IntToHex(Integer(data), 8), ', widget = 0x', IntToHex(Integer(widget), 8)]);
@@ -943,10 +1121,10 @@ end;
function button_press_cb(notebook: PGtkWidget; event: PGdkEventButton; data: gpointer): gboolean; cdecl;
var tab_clicked: integer;
- ntb: TEphyNotebook;
+ ntb: TEphyNotebookx;
begin
Result := False;
- ntb := TEphyNotebook(data);
+ ntb := TEphyNotebookx(data);
if ntb.FBusy then Exit;
DebugMsg(['@######## button_press_cb(..., data = 0x', IntToHex(Integer(data), 8), ')']);
@@ -994,13 +1172,13 @@ begin
end;
function scroll_event_callback(widget: PGtkWidget; event: PGdkEventScroll; user_data: gpointer): gboolean; cdecl;
-var ntb: TEphyNotebook;
+var ntb: TEphyNotebookx;
page: integer;
child: PGtkWidget;
px, py: gint;
begin
Result := True;
- ntb := TEphyNotebook(user_data);
+ ntb := TEphyNotebookx(user_data);
if ntb.FBusy then Exit;
child := gtk_notebook_get_nth_page(PGtkNotebook(ntb.FWidget), gtk_notebook_get_current_page(PGtkNotebook(ntb.FWidget)));
diff --git a/UMain.pas b/UMain.pas
index 3b83ff9..21e4658 100644
--- a/UMain.pas
+++ b/UMain.pas
@@ -169,7 +169,7 @@ type
procedure NotebookReordered(Sender: TObject; const Source, Dest: integer);
procedure NotebookTabClosed(Sender: TObject; const TabNum: integer; var CanClose: boolean);
procedure NotebookTabDoubleClick(Sender: TObject; const TabNum: integer);
- function NotebookFindNotebookAtPointerEvent(Sender: TObject; const AbsX, AbsY: integer): TEphyNotebook;
+// function NotebookFindNotebookAtPointerEvent(Sender: TObject; const AbsX, AbsY: integer): TEphyNotebook;
function NotebookMoveTabToAnotherNotebook(Sender: TObject; Destination: TEphyNotebook; const SourceTabNo, DestTabNo: integer): boolean;
procedure NotebookTabFocusOnlyEvent(Sender: TObject; const TabNum: integer);
procedure PasswordButtonClick(Sender: TObject);
@@ -436,8 +436,8 @@ begin
RightListView.OnMouseMove := @ListViewMouseMove;
LeftQuickFindEntry.OnEnter := @QuickFindEntryEnter;
RightQuickFindEntry.OnEnter := @QuickFindEntryEnter;
- LeftPanelNotebook.OnTabSwitched := @TabNotebookSwitchPage;
- RightPanelNotebook.OnTabSwitched := @TabNotebookSwitchPage;
+{ LeftPanelNotebook.OnTabSwitched := @TabNotebookSwitchPage;
+ RightPanelNotebook.OnTabSwitched := @TabNotebookSwitchPage; }
LeftPanelNotebook.PopupMenu := TabPopupMenu;
RightPanelNotebook.PopupMenu := TabPopupMenu;
AfterStart;
@@ -556,35 +556,37 @@ begin
LeftPathLabelEventBox.AddControl(LeftPathLabel);
RightPathLabelEventBox.AddControl(RightPathLabel);
LeftPanelNotebook := TEphyNotebook.Create(Self);
+ LeftPanelNotebook.GroupName := 'PanelNotebook';
LeftPanelNotebook.Visible := False;
// LeftPanelNotebook.SetSizeRequest(10, -1);
LeftPanelNotebook.Scrollable := True;
LeftPanelNotebook.ShowBorder := False;
LeftPanelNotebook.CanFocus := False; // Notebook should be focusable to allow scrolling when many tabs -- temporarily disabled
LeftPanelNotebook.ShowCloseButtons := True;
- LeftPanelNotebook.AllowDragDrop := True;
- LeftPanelNotebook.AllowDragOutside := True;
- LeftPanelNotebook.OnNotebookReordered := @NotebookReordered;
+{ LeftPanelNotebook.AllowDragDrop := True;
+ LeftPanelNotebook.AllowDragOutside := True; }
+// LeftPanelNotebook.OnNotebookReordered := @NotebookReordered;
LeftPanelNotebook.OnTabClose := @NotebookTabClosed;
- LeftPanelNotebook.OnTabDoubleClick := @NotebookTabDoubleClick;
- LeftPanelNotebook.OnFindNotebookAtPointer := @NotebookFindNotebookAtPointerEvent;
- LeftPanelNotebook.OnMoveTabToAnotherNotebook := @NotebookMoveTabToAnotherNotebook;
- LeftPanelNotebook.OnTabFocusOnlyEvent := @NotebookTabFocusOnlyEvent;
+// LeftPanelNotebook.OnTabDoubleClick := @NotebookTabDoubleClick;
+{ LeftPanelNotebook.OnFindNotebookAtPointer := @NotebookFindNotebookAtPointerEvent;
+ LeftPanelNotebook.OnMoveTabToAnotherNotebook := @NotebookMoveTabToAnotherNotebook; }
+// LeftPanelNotebook.OnTabFocusOnlyEvent := @NotebookTabFocusOnlyEvent;
RightPanelNotebook := TEphyNotebook.Create(Self);
+ RightPanelNotebook.GroupName := LeftPanelNotebook.GroupName;
RightPanelNotebook.Visible := False;
// RightPanelNotebook.SetSizeRequest(10, -1);
- RightPanelNotebook.Scrollable := True;
+{ RightPanelNotebook.Scrollable := True;
RightPanelNotebook.ShowBorder := False;
- RightPanelNotebook.CanFocus := False;
+ RightPanelNotebook.CanFocus := False; }
RightPanelNotebook.ShowCloseButtons := True;
- RightPanelNotebook.AllowDragDrop := True;
- RightPanelNotebook.AllowDragOutside := True;
- RightPanelNotebook.OnNotebookReordered := @NotebookReordered;
+{ RightPanelNotebook.AllowDragDrop := True;
+ RightPanelNotebook.AllowDragOutside := True; }
+// RightPanelNotebook.OnNotebookReordered := @NotebookReordered;
RightPanelNotebook.OnTabClose := @NotebookTabClosed;
- RightPanelNotebook.OnTabDoubleClick := @NotebookTabDoubleClick;
- RightPanelNotebook.OnFindNotebookAtPointer := @NotebookFindNotebookAtPointerEvent;
- RightPanelNotebook.OnMoveTabToAnotherNotebook := @NotebookMoveTabToAnotherNotebook;
- RightPanelNotebook.OnTabFocusOnlyEvent := @NotebookTabFocusOnlyEvent;
+// RightPanelNotebook.OnTabDoubleClick := @NotebookTabDoubleClick;
+{ RightPanelNotebook.OnFindNotebookAtPointer := @NotebookFindNotebookAtPointerEvent;
+ RightPanelNotebook.OnMoveTabToAnotherNotebook := @NotebookMoveTabToAnotherNotebook; }
+// RightPanelNotebook.OnTabFocusOnlyEvent := @NotebookTabFocusOnlyEvent;
LeftListBox := TGTKVBox.Create(Self);
LeftListBox.AddControlEx(LeftScrolledWindow, True, True, 0);
RightListBox := TGTKVBox.Create(Self);
@@ -5504,7 +5506,7 @@ var ANotebook: TEphyNotebook;
i: integer;
ATabSortIDs: TList;
ATabSortTypes: TList;
- OldEvent: TEphyNotebookTabSwitchedEvent;
+ OldEvent: TNotifyEvent;
begin
if LeftPanel then begin
ANotebook := LeftPanelNotebook;
@@ -5543,10 +5545,10 @@ begin
end;
if not ANotebook.Visible then ANotebook.Visible := True;
- OldEvent := ANotebook.OnTabSwitched;
- ANotebook.OnTabSwitched := nil;
+ OldEvent := ANotebook.OnSwitchPage;
+ ANotebook.OnSwitchPage := nil;
ANotebook.PageIndex := SetTabActive;
- ANotebook.OnTabSwitched := OldEvent;
+ ANotebook.OnSwitchPage := OldEvent;
TabNotebookSwitchPage(ANotebook, SetTabActive, True);
end;
@@ -5608,15 +5610,22 @@ begin
CloseTab(TabNum, Sender = LeftPanelNotebook, True);
end;
+(*
function TFMain.NotebookFindNotebookAtPointerEvent(Sender: TObject; const AbsX, AbsY: integer): TEphyNotebook;
var wx, wy: Integer;
allocation: TGtkAllocation;
+ seat: PGdkSeat;
begin
-// DebugMsg([' *** NotebookFindNotebookAtPointerEvent(AbsX = ', AbsX, ', AbsY = ', AbsY, ')']);
+ DebugMsg([' *** NotebookFindNotebookAtPointerEvent(AbsX = ', AbsX, ', AbsY = ', AbsY, ')']);
Result := nil;
- // TODO
if LeftPanelNotebook.Visible then begin
+ seat := gdk_display_get_default_seat(gtk_widget_get_display(LeftPanelNotebook.FWidget));
+ gdk_window_get_device_position (priv->window,
+ gdk_seat_get_pointer (seat),
+ x, y, NULL);
+
+
gdk_window_get_device_position(gtk_widget_get_window(LeftPanelNotebook.FWidget), nil, @wx, @wy, nil);
// gtk_widget_get_pointer(LeftPanelNotebook.FWidget, @wx, @wy);
gtk_widget_get_allocation(LeftPanelNotebook.FWidget, @allocation);
@@ -5651,6 +5660,7 @@ begin
if Result = RightPanelNotebook then DebugMsg([' *** NotebookFindNotebookAtPointerEvent: inside RightPanelNotebook']);
}
end;
+*)
function TFMain.NotebookMoveTabToAnotherNotebook(Sender: TObject; Destination: TEphyNotebook; const SourceTabNo, DestTabNo: integer): boolean;
var LeftPanel: boolean;
diff --git a/libgtk_kylix/GTKExtCtrls.pas b/libgtk_kylix/GTKExtCtrls.pas
index 0adfc1a..f288a18 100644
--- a/libgtk_kylix/GTKExtCtrls.pas
+++ b/libgtk_kylix/GTKExtCtrls.pas
@@ -117,11 +117,13 @@ type
function GetShowTabs: boolean;
function GetShowBorder: boolean;
function GetScrollable: boolean;
+ function GetGroupName: String;
procedure SetPageIndex(Value: integer);
procedure SetTabPosition(Value: TGTKPosition);
procedure SetShowTabs(Value: boolean);
procedure SetShowBorder(Value: boolean);
procedure SetScrollable(Value: boolean);
+ procedure SetGroupName(Value: String);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
@@ -138,6 +140,7 @@ type
property ShowTabs: boolean read GetShowTabs write SetShowTabs;
property ShowBorder: boolean read GetShowBorder write SetShowBorder;
property Scrollable: boolean read GetScrollable write SetScrollable;
+ property GroupName: String read GetGroupName write SetGroupName;
property OnSwitchPage: TNotifyEvent read FOnSwitchPage write FOnSwitchPage;
end;
@@ -537,6 +540,16 @@ begin
Result := TGTKLabel.CreateFromWidget(Self, gtk_notebook_get_tab_label(PGtkNotebook(FWidget), gtk_notebook_get_nth_page(PGtkNotebook(FWidget), PageNo)));
end;
+function TGTKNotebook.GetGroupName: String;
+begin
+ Result := String(gtk_notebook_get_group_name(PGtkNotebook(FWidget)));
+end;
+
+procedure TGTKNotebook.SetGroupName(Value: String);
+begin
+ gtk_notebook_set_group_name(PGtkNotebook(FWidget), PChar(Value));
+end;
+
(********************************************************************************************************************************)
(********************************************************************************************************************************)
procedure TGTKComboBox_changed(widget: PGtkComboBox; user_data: pgpointer); cdecl;