diff --git a/doc/xschem_man/commands.html b/doc/xschem_man/commands.html
index cb71f037..ff0bd546 100644
--- a/doc/xschem_man/commands.html
+++ b/doc/xschem_man/commands.html
@@ -92,12 +92,14 @@ LeftButton Double click Terminate Polygon placement
- BackSpace Back to parent schematic
- Delete Delete selected objects
- Insert Insert element from library
-- Down Move down
-ctrl Enter Confirm closing dialog boxes
- Escape Abort, redraw, unselect
+ctrl Enter Confirm closing dialog boxes
+- Down Move down
- Left Move right
- Right Move left
- Up Move up
+ctrl Left Previous tab (if tabbed interface enabled)
+ctrl Right Next tab (if tabbed interface enabled)
- '\' Toggle fullscreen
- '!' Break selected wires at any wire or component pin
connection
diff --git a/src/callback.c b/src/callback.c
index 9370ee64..441a530f 100644
--- a/src/callback.c
+++ b/src/callback.c
@@ -1321,7 +1321,15 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key,
if(xctx->semaphore >= 2) break;
delete(1/* to_push_undo */);break;
}
- if(key==XK_Right) /* left */
+ if(key==XK_Left && state == ControlMask) /* previous tab */
+ {
+ tcleval("prev_tab");
+ }
+ if(key==XK_Right && state == ControlMask) /* next tab */
+ {
+ tcleval("next_tab");
+ }
+ if(key==XK_Right && state == 0) /* left */
{
if(waves_selected(event, key, state, button)) {
waves_callback(event, mx, my, key, button, aux, state);
@@ -1332,7 +1340,7 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key,
redraw_w_a_l_r_p_rubbers();
break;
}
- if(key==XK_Left) /* right */
+ if(key==XK_Left && state == 0) /* right */
{
if(waves_selected(event, key, state, button)) {
waves_callback(event, mx, my, key, button, aux, state);
diff --git a/src/keys.help b/src/keys.help
index f60e6da8..441e39b5 100644
--- a/src/keys.help
+++ b/src/keys.help
@@ -51,12 +51,14 @@ LeftButton Double click Terminate Polygon placement
- BackSpace Back to parent schematic
- Delete Delete selected objects
- Insert Insert element from library
-- Down Move down
-ctrl Enter Confirm closing dialog boxes
- Escape Abort, redraw, unselect
+ctrl Enter Confirm closing dialog boxes
+- Down Move down
- Left Move right
- Right Move left
- Up Move up
+ctrl Left Previous tab (if tabbed interface enabled)
+ctrl Right Next tab (if tabbed interface enabled)
- '\' Toggle fullscreen
- '!' Break selected wires at any wire or component pin
connection
diff --git a/src/xschem.tcl b/src/xschem.tcl
index e6bae9ea..94f48525 100644
--- a/src/xschem.tcl
+++ b/src/xschem.tcl
@@ -3749,7 +3749,57 @@ proc delete_tab {path} {
destroy $top_path.tabs$path
}
+proc prev_tab {} {
+ global tabbed_interface
+ if { !$tabbed_interface} { return}
+ set top_path [xschem get top_path]
+ set currwin [xschem get current_win_path]
+ regsub {\.drw} $currwin {} tabname
+ if {$tabname eq {}} { set tabname .x0}
+ regsub {\.x} $tabname {} number
+ set next_tab $number
+ set highest -10000000
+ set xcoord [winfo rootx $top_path.tabs$tabname]
+ for {set i 0} {$i < $tctx::max_new_windows} { incr i} {
+ if { $i == $number} { continue}
+ if { [winfo exists ${top_path}.tabs.x$i] } {
+ set tab_coord [winfo rootx $top_path.tabs.x$i]
+ if {$tab_coord < $xcoord && $tab_coord > $highest} {
+ set next_tab $i
+ set highest $tab_coord
+ }
+ }
+ }
+ $top_path.tabs.x$next_tab invoke
+}
+
+proc next_tab {} {
+ global tabbed_interface
+ if { !$tabbed_interface} {return}
+ set top_path [xschem get top_path]
+ set currwin [xschem get current_win_path]
+ regsub {\.drw} $currwin {} tabname
+ if {$tabname eq {}} { set tabname .x0}
+ regsub {\.x} $tabname {} number
+ set next_tab $number
+ set lowest 10000000
+ set xcoord [winfo rootx $top_path.tabs$tabname]
+ for {set i 0} {$i < $tctx::max_new_windows} { incr i} {
+ if { $i == $number} { continue}
+ if { [winfo exists ${top_path}.tabs.x$i] } {
+ set tab_coord [winfo rootx $top_path.tabs.x$i]
+ if {$tab_coord > $xcoord && $tab_coord < $lowest} {
+ set next_tab $i
+ set lowest $tab_coord
+ }
+ }
+ }
+ $top_path.tabs.x$next_tab invoke
+}
+
proc create_new_tab {} {
+ global tabbed_interface
+ if { !$tabbed_interface} {return}
set top_path [xschem get top_path]
set found 0
for { set i 1} { $i < $tctx::max_new_windows} { incr i} {
@@ -3783,6 +3833,31 @@ proc set_tab_names {} {
}
}
+
+proc test1 {} {
+ global tabbed_interface
+
+ set tabbed_interface 1
+ setup_tabbed_interface
+ xschem load [abs_sym_path rom8k.sch]
+ create_new_tab
+ xschem load [abs_sym_path poweramp.sch]
+ create_new_tab
+ xschem load [abs_sym_path mos_power_ampli.sch]
+ create_new_tab
+ xschem load [abs_sym_path rom8k.sch]
+ create_new_tab
+ xschem load [abs_sym_path autozero_comp.sch]
+ create_new_tab
+ xschem load [abs_sym_path LCC_instances.sch]
+ create_new_tab
+ xschem load [abs_sym_path simulate_ff.sch]
+ create_new_tab
+ xschem load [abs_sym_path led_driver.sch]
+ create_new_tab
+ xschem load [abs_sym_path solar_panel.sch]
+}
+
proc raise_dialog {parent window_path } {
if {[winfo exists .dialog] && [winfo ismapped .dialog] && [winfo ismapped $parent] &&
[wm stackorder .dialog isbelow $parent ]} {