raster pushed a commit to branch master.

http://git.enlightenment.org/apps/terminology.git/commit/?id=5ed68d82b2f147f5b365e2773ef8c2ab8e444531

commit 5ed68d82b2f147f5b365e2773ef8c2ab8e444531
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Tue Dec 9 22:32:47 2014 +0900

    terminology - add tab bar at the top that looks like normal tabs
    
    this makes the default (and solarized) themes have a tab bar at the
    top that look and behave like normal tabs. option to disable these.
    
    other themes might need some updating if they dont follow default by
     #including it.
---
 data/themes/default.edc                | 699 +++++++++++++++++++++++++++++++--
 data/themes/images/tab.xcf             | Bin 0 -> 18291 bytes
 data/themes/images/tab_base_bottom.png | Bin 0 -> 137 bytes
 data/themes/images/tab_base_l0.png     | Bin 0 -> 126 bytes
 data/themes/images/tab_base_l1.png     | Bin 0 -> 169 bytes
 data/themes/images/tab_base_m.png      | Bin 0 -> 120 bytes
 data/themes/images/tab_base_r0.png     | Bin 0 -> 85 bytes
 data/themes/images/tab_base_r1.png     | Bin 0 -> 168 bytes
 data/themes/images/tab_bg_l0.png       | Bin 0 -> 415 bytes
 data/themes/images/tab_bg_l1.png       | Bin 0 -> 410 bytes
 data/themes/images/tab_bg_r0.png       | Bin 0 -> 414 bytes
 data/themes/images/tab_bg_r1.png       | Bin 0 -> 402 bytes
 data/themes/images/tab_other_l.png     | Bin 0 -> 287 bytes
 data/themes/images/tab_other_m.png     | Bin 0 -> 671 bytes
 data/themes/images/tab_other_r.png     | Bin 0 -> 301 bytes
 data/themes/images/tab_shad_l0.png     | Bin 0 -> 107 bytes
 data/themes/images/tab_shad_l1.png     | Bin 0 -> 263 bytes
 data/themes/images/tab_shad_l2.png     | Bin 0 -> 262 bytes
 data/themes/images/tab_shad_r0.png     | Bin 0 -> 107 bytes
 data/themes/images/tab_shad_r1.png     | Bin 0 -> 278 bytes
 data/themes/images/tab_shad_r2.png     | Bin 0 -> 274 bytes
 src/bin/config.c                       |   5 +
 src/bin/config.h                       |   1 +
 src/bin/options_behavior.c             |   3 +
 src/bin/win.c                          | 335 +++++++++++++++-
 src/bin/win.h                          |   1 +
 26 files changed, 1004 insertions(+), 40 deletions(-)

diff --git a/data/themes/default.edc b/data/themes/default.edc
index 4d0cfc2..2ac68c7 100644
--- a/data/themes/default.edc
+++ b/data/themes/default.edc
@@ -173,19 +173,29 @@ collections {
             action: STATE_SET "movie" 0.0;
             target: "terminology.background";
          }
-         
+
+         part { name: "terminology.tabregion"; type: SWALLOW;
+            description { state: "default" 0.0;
+               fixed: 1 1;
+               rel2.relative: 1.0 0.0;
+               min: 1 1;
+               align: 0.0 0.0;
+            }
+         }
          ////////////////////////////////////////////////////////////////////
          // actual text grid for chars, cursors, selectiond etc. goes here
          part { name: "terminology.content"; type: SWALLOW;
             description { state: "default" 0.0;
-               rel1.offset: 1 1;
+               rel1.offset: 1 0;
+               rel1.relative: 0.0 1.0;
+               rel1.to_y: "terminology.tabregion";
                rel2.offset: -2 -2;
             }
          }
 
       }
    }
-         
+
    //// the background and general container for the terminal
    group { name: "terminology/background";
       images {
@@ -201,6 +211,20 @@ collections {
         image: "pm_overlay.png" COMP;
         image: "pm_fill.png" COMP;
         image: "cr_glow.png" COMP;
+        image: "tab_base_bottom.png" COMP;
+        image: "tab_base_l0.png" COMP;
+        image: "tab_base_l1.png" COMP;
+        image: "tab_base_m.png" COMP;
+        image: "tab_base_r0.png" COMP;
+        image: "tab_base_r1.png" COMP;
+        image: "tab_bg_l0.png" COMP;
+        image: "tab_bg_l1.png" COMP;
+        image: "tab_bg_r0.png" COMP;
+        image: "tab_bg_r1.png" COMP;
+        image: "tab_shad_l0.png" COMP;
+        image: "tab_shad_l1.png" COMP;
+        image: "tab_shad_r0.png" COMP;
+        image: "tab_shad_r1.png" COMP;
       }
       set { name: "bg_shadow";
         image { image: "bg_shadow.png"  COMP; size: 0 0 200 150; }
@@ -255,6 +279,11 @@ collections {
          part { name: "terminology.content"; type: SWALLOW;
             description { state: "default" 0.0;
             }
+            description { state: "tab" 0.0;
+               inherit: "default" 0.0;
+//               rel1.to_y: "tabmiddle";
+//               rel1.relative: 0.0 1.0;
+            }
          }
 
          ////////////////////////////////////////////////////////////////////
@@ -459,8 +488,10 @@ collections {
                fixed: 1 1;
                rel1.relative: 1.0 0.0;
                rel1.offset: -3 2;
+               rel1.to: "viewregion";
                rel2.relative: 1.0 0.0;
                rel2.offset: -3 2;
+               rel2.to: "viewregion";
                align: 1.0 0.0;
                min: 16 16;
             }
@@ -475,6 +506,27 @@ collections {
             }
          }
 
+         part { name: "terminology.tabregion"; type: SWALLOW;
+            description { state: "default" 0.0;
+               fixed: 1 1;
+               rel1.to: "terminology.content";
+               rel2.to: "viewregion";
+               rel2.relative: 1.0 0.0;
+            }
+         }
+         part { name: "viewregion"; type: SWALLOW;
+            description { state: "default" 0.0;
+               fixed: 1 1;
+               rel1.to: "terminology.content";
+               rel2.to: "terminology.content";
+            }
+            description { state: "tab" 0.0;
+               inherit: "default" 0.0;
+               rel1.to_y: "tabmiddle";
+               rel1.relative: 0.0 1.0;
+            }
+         }
+
          program {
             signal: "mouse,in"; source: "tabcount_ev";
             action: STATE_SET "over" 0.0;
@@ -509,14 +561,14 @@ collections {
             signal: "mouse,clicked,1"; source: "tabcount_ev";
             action: SIGNAL_EMIT "tabcount,go" "terminology";
          }
-        program {
-           signal: "mouse,wheel,0,-1"; source: "tabcount_ev";
-           action: SIGNAL_EMIT "tabcount,prev" "terminology";
-        }
-        program {
-           signal: "mouse,wheel,0,1"; source: "tabcount_ev";
-           action: SIGNAL_EMIT "tabcount,next" "terminology";
-        }
+         program {
+            signal: "mouse,wheel,0,-1"; source: "tabcount_ev";
+            action: SIGNAL_EMIT "tabcount,prev" "terminology";
+         }
+         program {
+            signal: "mouse,wheel,0,1"; source: "tabcount_ev";
+            action: SIGNAL_EMIT "tabcount,next" "terminology";
+         }
          program {
             signal: "tabcount,off"; source: "terminology";
             action: STATE_SET "default" 0.0;
@@ -553,8 +605,12 @@ collections {
          // miniview
          part { name: "terminology.miniview"; type: SWALLOW;
             description { state: "default" 0.0;
+               rel1.to_x: "terminology.content";
+               rel1.to_y: "viewregion";
+               rel2.to: "terminology.content";
                //color: 255 255 255 0;
                visible: 0;
+               fixed: 1 1;
             }
             description { state: "on" 0.0;
                inherit: "default" 0.0;
@@ -602,10 +658,34 @@ collections {
                image.middle: 0;
                fill.smooth: 0;
             }
+            description { state: "tab" 0.0;
+               inherit: "default" 0.0;
+               visible: 0;
+            }
+         }
+         part { name: "shine";
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.offset: 0 0;
+               rel2.offset: -1 -1;
+               image.normal: "bg_shine.png";
+               fill.smooth: 0;
+               align: 0.5 0.0;
+               aspect: (255/120) (255/120);
+               aspect_preference: HORIZONTAL;
+               color: 255 255 255 64;
+            }
+            description { state: "focused" 0.0;
+               inherit: "default" 0.0;
+               color: 255 255 255 255;
+            }
          }
          part { name: "glintclip"; type: RECT;
             description { state: "default" 0.0;
             }
+            description { state: "tab" 0.0;
+               inherit: "default" 0.0;
+            }
          }
          part { name: "glint";
             mouse_events: 0;
@@ -630,21 +710,260 @@ collections {
                color: 255 255 255 255;
             }
          }
-         part { name: "shine";
+
+         part { name: "tab_bevel_bottom";
             mouse_events: 0;
             description { state: "default" 0.0;
-               rel1.offset: 0 0;
-               rel2.offset: -1 -1;
-               image.normal: "bg_shine.png";
+               rel1.to_y: "tabmiddle";
+               rel1.relative: 0.0 1.0;
+               image.normal: "tab_base_bottom.png";
+               image.border: 2 2 0 2;
+               image.middle: 0;
                fill.smooth: 0;
-               align: 0.5 0.0;
-               aspect: (255/120) (255/120);
-               aspect_preference: HORIZONTAL;
-               color: 255 255 255 64;
+               visible: 0;
+               fixed: 1 1;
             }
-            description { state: "focused" 0.0;
+            description { state: "tab" 0.0;
                inherit: "default" 0.0;
-               color: 255 255 255 255;
+               visible: 1;
+            }
+         }
+         part { name: "tab_bevel_top0";
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "tableft";
+               rel2.to_y: "tableft";
+               rel2.to_x: "tab_bevel_top1";
+               rel2.relative: 0.0 1.0;
+               image.normal: "tab_base_l0.png";
+               image.border: 0 0 0 4;
+               fill.smooth: 0;
+               visible: 0;
+               fixed: 1 1;
+            }
+            description { state: "tab" 0.0;
+               inherit: "default" 0.0;
+               visible: 1;
+            }
+         }
+         part { name: "tab_bevel_top1";
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "tabmiddle";
+               rel1.offset: -4 0;
+               rel2.to: "tabmiddle";
+               align: 0.0 0.0;
+               max: 12 99999;
+               min: 12 0;
+               image.normal: "tab_base_l1.png";
+               image.border: 0 0 4 4;
+               fill.smooth: 0;
+               visible: 0;
+               fixed: 1 1;
+            }
+            description { state: "tab" 0.0;
+               inherit: "default" 0.0;
+               visible: 1;
+            }
+         }
+         part { name: "tab_bevel_top2";
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "tab_bevel_top1";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "tab_bevel_top3";
+               rel2.relative: 0.0 1.0;
+               image.normal: "tab_base_m.png";
+               image.border: 0 0 4 0;
+               fill.smooth: 0;
+               visible: 0;
+               fixed: 1 1;
+            }
+            description { state: "tab" 0.0;
+               inherit: "default" 0.0;
+               visible: 1;
+            }
+         }
+         part { name: "tab_bevel_top3";
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "tabmiddle";
+               rel2.to: "tabmiddle";
+               rel2.offset: 3 -1;
+               align: 1.0 0.0;
+               max: 12 99999;
+               min: 12 0;
+               image.normal: "tab_base_r1.png";
+               image.border: 0 0 4 4;
+               fill.smooth: 0;
+               visible: 0;
+               fixed: 1 1;
+            }
+            description { state: "tab" 0.0;
+               inherit: "default" 0.0;
+               visible: 1;
+            }
+         }
+         part { name: "tab_bevel_top4";
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to_y: "tabright";
+               rel1.to_x: "tab_bevel_top3";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "tabright";
+               image.normal: "tab_base_r0.png";
+               image.border: 0 0 0 4;
+               fill.smooth: 0;
+               visible: 0;
+               fixed: 1 1;
+            }
+            description { state: "tab" 0.0;
+               inherit: "default" 0.0;
+               visible: 1;
+            }
+         }
+         part { name: "tab_bevel_bg0";
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "tab_bevel_top0";
+               rel2.to: "tab_bevel_top0";
+               image.normal: "tab_bg_l0.png";
+               image.border: 2 0 4 4;
+               fill.smooth: 0;
+               visible: 0;
+               fixed: 1 1;
+            }
+            description { state: "tab" 0.0;
+               inherit: "default" 0.0;
+               visible: 1;
+            }
+         }
+         part { name: "tab_bevel_bg1";
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "tab_bevel_top1";
+               rel2.to: "tab_bevel_top1";
+               image.normal: "tab_bg_l1.png";
+               image.border: 0 0 4 4;
+               fill.smooth: 0;
+               visible: 0;
+               fixed: 1 1;
+            }
+            description { state: "tab" 0.0;
+               inherit: "default" 0.0;
+               visible: 1;
+            }
+         }
+         part { name: "tab_bevel_bg3";
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "tab_bevel_top3";
+               rel2.to: "tab_bevel_top3";
+               image.normal: "tab_bg_r1.png";
+               image.border: 0 0 4 4;
+               fill.smooth: 0;
+               visible: 0;
+               fixed: 1 1;
+            }
+            description { state: "tab" 0.0;
+               inherit: "default" 0.0;
+               visible: 1;
+            }
+         }
+         part { name: "tab_bevel_bg4";
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "tab_bevel_top4";
+               rel2.to: "tab_bevel_top4";
+               image.normal: "tab_bg_r0.png";
+               image.border: 0 2 4 4;
+               fill.smooth: 0;
+               visible: 0;
+               fixed: 1 1;
+            }
+            description { state: "tab" 0.0;
+               inherit: "default" 0.0;
+               visible: 1;
+            }
+         }
+
+         part { name: "terminology.tabl.content"; type: SWALLOW;
+            description { state: "default" 0.0;
+               rel1.to: "tableft";
+               rel2.to: "tableft";
+               fixed: 1 1;
+            }
+         }
+         part { name: "terminology.tabr.content"; type: SWALLOW;
+            description { state: "default" 0.0;
+               rel1.to: "tabright";
+               rel2.to: "tabright";
+               fixed: 1 1;
+            }
+         }
+
+         part { name: "tab_bevel_shad0";
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "tab_bevel_top0";
+               rel2.to: "tab_bevel_top0";
+               image.normal: "tab_shad_l0.png";
+               image.border: 0 0 0 10;
+               fill.smooth: 0;
+               visible: 0;
+               fixed: 1 1;
+            }
+            description { state: "tab" 0.0;
+               inherit: "default" 0.0;
+               visible: 1;
+            }
+         }
+         part { name: "tab_bevel_shad1";
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "tab_bevel_top1";
+               rel2.to: "tab_bevel_top1";
+               image.normal: "tab_shad_l1.png";
+               image.border: 0 0 10 10;
+               fill.smooth: 0;
+               visible: 0;
+               fixed: 1 1;
+            }
+            description { state: "tab" 0.0;
+               inherit: "default" 0.0;
+               visible: 1;
+            }
+         }
+         part { name: "tab_bevel_shad3";
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "tab_bevel_top3";
+               rel2.to: "tab_bevel_top3";
+               image.normal: "tab_shad_r1.png";
+               image.border: 0 0 10 10;
+               fill.smooth: 0;
+               visible: 0;
+               fixed: 1 1;
+            }
+            description { state: "tab" 0.0;
+               inherit: "default" 0.0;
+               visible: 1;
+            }
+         }
+         part { name: "tab_bevel_shad4";
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "tab_bevel_top4";
+               rel2.to: "tab_bevel_top4";
+               image.normal: "tab_shad_r0.png";
+               image.border: 0 0 0 10;
+               fill.smooth: 0;
+               visible: 0;
+               fixed: 1 1;
+            }
+            description { state: "tab" 0.0;
+               inherit: "default" 0.0;
+               visible: 1;
             }
          }
          program {
@@ -669,6 +988,202 @@ collections {
          }
 
          ////////////////////////////////////////////////////////////////////
+         // a swallow to hold a finger size rect for min tab size
+         program {
+            signal: "tabbar,on"; source: "terminology";
+            action: STATE_SET "tab" 0.0;
+            target: "viewregion";
+            target: "tableft";
+            target: "tabmiddle";
+            target: "tabright";
+            target: "bevel";
+            target: "glintclip";
+            target: "tab_bevel_bottom";
+            target: "tab_bevel_top0";
+            target: "tab_bevel_top1";
+            target: "tab_bevel_top2";
+            target: "tab_bevel_top3";
+            target: "tab_bevel_top4";
+            target: "tab_bevel_bg0";
+            target: "tab_bevel_bg1";
+            target: "tab_bevel_bg3";
+            target: "tab_bevel_bg4";
+            target: "tab_bevel_shad0";
+            target: "tab_bevel_shad1";
+            target: "tab_bevel_shad3";
+            target: "tab_bevel_shad4";
+            target: "tabtitle";
+         }
+         program {
+            signal: "tabbar,off"; source: "terminology";
+            action: STATE_SET "default" 0.0;
+            target: "viewregion";
+            target: "tableft";
+            target: "tabmiddle";
+            target: "tabright";
+            target: "bevel";
+            target: "glintclip";
+            target: "tab_bevel_bottom";
+            target: "tab_bevel_top0";
+            target: "tab_bevel_top1";
+            target: "tab_bevel_top2";
+            target: "tab_bevel_top3";
+            target: "tab_bevel_top4";
+            target: "tab_bevel_bg0";
+            target: "tab_bevel_bg1";
+            target: "tab_bevel_bg3";
+            target: "tab_bevel_bg4";
+            target: "tab_bevel_shad0";
+            target: "tab_bevel_shad1";
+            target: "tab_bevel_shad3";
+            target: "tab_bevel_shad4";
+            target: "tabtitle";
+         }
+
+         part { name: "terminology.tab"; type: SWALLOW;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.relative: 1.0 0.0;
+               rel1.to_x: "terminology.tabl";
+               rel2.relative: 0.0 0.0;
+               rel2.to_x: "terminology.tabr";
+               align: 0.5 0.0;
+               visible: 0;
+               fixed: 1 1;
+            }
+         }
+         // some slot for dragable parts to stayt in along top edge of bg
+         part { name: "tabdrag"; type: SPACER;
+            description { state: "default" 0.0;
+               rel2.relative: 1.0 0.0;
+               fixed: 1 1;
+            }
+         }
+         // left boundary of the active tab (ragable 0.0 -> 1.0)
+         part { name: "terminology.tabl"; type: SPACER;
+            dragable.x: 1 1 0;
+            dragable.confine: "tabdrag";
+            description { state: "default" 0.0;
+               rel2.relative: 1.0 0.0;
+               max: 1 1;
+               fixed: 1 1;
+            }
+         }
+         // right boundary of the active tab (ragable 0.0 -> 1.0)
+         part { name: "terminology.tabr"; type: SPACER;
+            dragable.x: 1 1 0;
+            dragable.confine: "tabdrag";
+            description { state: "default" 0.0;
+               rel2.relative: 1.0 0.0;
+               max: 1 1;
+               fixed: 1 1;
+            }
+         }
+
+         part { name: "terminology.tab.title"; type: TEXT; mouse_events: 0;
+            scale: 1;
+            effect: SOFT_SHADOW BOTTOM;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               color: 255 255 255 255;
+               color3: 0 0 0 18;
+               text { font: "Sans:style=Bold"; size: 10;
+                  align: 0.5 0.0;
+                  min: 0 1;
+               }
+               align: 0.5 0.0;
+               rel1.to_x: "tab_bevel_top2";
+               rel1.offset: 0 2;
+               rel2.to_x: "tab_bevel_top2";
+               rel2.offset: -1 2;
+               rel2.relative: 1.0 0.0;
+               visible: 0;
+               fixed: 1 1;
+            }
+         }
+         part { name: "tabtitle"; type: TEXT; mouse_events: 0;
+            scale: 1;
+            effect: SOFT_SHADOW BOTTOM;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               color: 255 255 255 255;
+               color3: 0 0 0 18;
+               text { font: "Sans:style=Bold"; size: 10;
+                  align: 0.5 0.5;
+                  min: 0 1;
+                  text_source: "terminology.tab.title";
+               }
+               align: 0.5 0.5;
+               rel1.to_x: "tab_bevel_top2";
+               rel1.to_y: "tabmiddle";
+               rel2.to_x: "tab_bevel_top2";
+               rel2.to_y: "tabmiddle";
+               visible: 0;
+               fixed: 1 1;
+            }
+            description { state: "tab" 0.0;
+               inherit: "default" 0.0;
+               visible: 1;
+            }
+         }
+         part { name: "tablimit0"; type: SPACER;
+            description { state: "default" 0.0;
+               rel1.to_y: "terminology.tab";
+               rel1.relative: 0.0 1.0;
+               rel2.to_y: "terminology.tab.title";
+               align: 0.0 0.0;
+               fixed: 1 1;
+            }
+         }
+
+         part { name: "tableft"; type: RECT;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel2.to_x: "terminology.tab";
+               rel2.to_y: "tabmiddle";
+               rel2.relative: 0.0 1.0;
+               color: 0 0 0 0;
+               visible: 0;
+               fixed: 1 1;
+            }
+            description { state: "tab" 0.0;
+               inherit: "default" 0.0;
+               visible: 1;
+            }
+         }
+         part { name: "tabright"; type: RECT;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               rel1.to: "terminology.tab";
+               rel1.relative: 1.0 0.0;
+               rel2.to_y: "tabmiddle";
+               color: 0 0 0 0;
+               visible: 0;
+               fixed: 1 1;
+            }
+            description { state: "tab" 0.0;
+               inherit: "default" 0.0;
+               visible: 1;
+            }
+         }
+         part { name: "tabmiddle"; type: RECT;
+            description { state: "default" 0.0;
+               rel1.to: "terminology.tab";
+               rel2.to_x: "terminology.tab";
+               rel2.to_y: "tablimit0";
+               rel2.offset: -1 0;
+               color: 0 0 0 0;
+               align: 0.0 0.0;
+               visible: 0;
+               fixed: 1 1;
+            }
+            description { state: "tab" 0.0;
+               inherit: "default" 0.0;
+               visible: 1;
+            }
+         }
+
+         ////////////////////////////////////////////////////////////////////
          // visual bell - spinning red siren light
          part { name: "bell_glow";
             mouse_events: 0;
@@ -813,7 +1328,7 @@ collections {
             transition: LINEAR 0.9;
             target: "bell_strobe";
          }
-         
+
          ////////////////////////////////////////////////////////////////////
          // popup media over the terminal (until dismissed)
          part { name: "popmedia_clip"; type: RECT;
@@ -1111,6 +1626,146 @@ collections {
       }
    }
 
+   group { name: "terminology/tabbar_back";
+      images {
+        image: "tab_base_l1.png" COMP;
+        image: "tab_base_m.png" COMP;
+        image: "tab_base_r1.png" COMP;
+        image: "tab_other_l.png" COMP;
+        image: "tab_other_m.png" COMP;
+        image: "tab_other_r.png" COMP;
+        image: "tab_shad_l2.png" COMP;
+        image: "tab_shad_r2.png" COMP;
+      }
+      parts {
+         part { name: "tab_bevel_shad1";
+            mouse_events: 0;
+            clip_to: "clip";
+            description { state: "default" 0.0;
+               rel1.to: "tab_bevel_top1";
+               rel2.to: "tab_bevel_top1";
+               image.normal: "tab_shad_l2.png";
+               image.border: 0 0 10 10;
+               fill.smooth: 0;
+            }
+         }
+         part { name: "tab_bevel_shad3";
+            mouse_events: 0;
+            clip_to: "clip";
+            description { state: "default" 0.0;
+               rel1.to: "tab_bevel_top3";
+               rel2.to: "tab_bevel_top3";
+               image.normal: "tab_shad_r2.png";
+               image.border: 0 0 10 10;
+               fill.smooth: 0;
+            }
+         }
+         part { name: "tab_base_top1";
+            mouse_events: 0;
+            clip_to: "clip";
+            description { state: "default" 0.0;
+               rel1.to: "tab_bevel_top1";
+               rel2.to: "tab_bevel_top1";
+               image.normal: "tab_other_l.png";
+               image.border: 0 0 4 4;
+               fill.smooth: 0;
+            }
+         }
+         part { name: "tab_base_top2";
+            mouse_events: 0;
+            clip_to: "clip";
+            description { state: "default" 0.0;
+               rel1.to: "tab_bevel_top2";
+               rel2.to: "tab_bevel_top2";
+               image.normal: "tab_other_m.png";
+               image.border: 0 0 4 4;
+               fill.smooth: 0;
+            }
+         }
+         part { name: "tab_base_top3";
+            mouse_events: 0;
+            clip_to: "clip";
+            description { state: "default" 0.0;
+               rel1.to: "tab_bevel_top3";
+               rel2.to: "tab_bevel_top3";
+               image.normal: "tab_other_r.png";
+               image.border: 0 0 4 4;
+               fill.smooth: 0;
+            }
+         }
+         part { name: "tab_bevel_top1";
+            mouse_events: 0;
+            clip_to: "clip";
+            description { state: "default" 0.0;
+               align: 0.0 0.0;
+               rel1.offset: -4 0;
+               max: 12 99999;
+               min: 12 0;
+               image.normal: "tab_base_l1.png";
+               image.border: 0 0 4 4;
+               fill.smooth: 0;
+               fixed: 1 0;
+            }
+         }
+         part { name: "tab_bevel_top2";
+            mouse_events: 0;
+            clip_to: "clip";
+            description { state: "default" 0.0;
+               rel1.to: "tab_bevel_top1";
+               rel1.relative: 1.0 0.0;
+               rel2.to: "tab_bevel_top3";
+               rel2.relative: 0.0 1.0;
+               image.normal: "tab_base_m.png";
+               image.border: 0 0 4 4;
+               fill.smooth: 0;
+            }
+         }
+         part { name: "tab_bevel_top3";
+            mouse_events: 0;
+            clip_to: "clip";
+            description { state: "default" 0.0;
+               align: 1.0 0.0;
+               rel2.offset: 3 -1;
+               max: 12 99999;
+               min: 12 0;
+               image.normal: "tab_base_r1.png";
+               image.border: 0 0 4 4;
+               fill.smooth: 0;
+               fixed: 1 0;
+            }
+         }
+         part { name: "terminology.title"; type: TEXT; mouse_events: 0;
+            scale: 1;
+            effect: SHADOW BOTTOM;
+            description { state: "default" 0.0;
+               text { font: "Sans:style=Bold"; size: 10;
+                  align: 0.5 0.5;
+                  min: 0 1;
+               }
+               align: 0.5 0.5;
+               color: 0 0 0 255;
+               color3: 255 255 255 25;
+               rel1.to: "tab_bevel_top2";
+               rel2.to: "tab_bevel_top2";
+            }
+         }
+         part { name: "clip"; type: RECT;
+            description { state: "default" 0.0;
+               rel2.offset: -1 -2;
+            }
+         }
+         part { name: "event"; type: RECT;
+            description { state: "default" 0.0;
+               color: 0 0 0 0;
+            }
+         }
+         program {
+            signal: "mouse,clicked,1"; source: "event";
+            action: SIGNAL_EMIT "tab,activate" "terminology";
+         }
+      }
+   }
+
    group { name: "terminology/base";
       images.image: "pm_shadow.png" COMP;
       images.image: "bg_bevel.png" COMP;
diff --git a/data/themes/images/tab.xcf b/data/themes/images/tab.xcf
new file mode 100644
index 0000000..e4de69b
Binary files /dev/null and b/data/themes/images/tab.xcf differ
diff --git a/data/themes/images/tab_base_bottom.png 
b/data/themes/images/tab_base_bottom.png
new file mode 100644
index 0000000..96ded37
Binary files /dev/null and b/data/themes/images/tab_base_bottom.png differ
diff --git a/data/themes/images/tab_base_l0.png 
b/data/themes/images/tab_base_l0.png
new file mode 100644
index 0000000..0e4398f
Binary files /dev/null and b/data/themes/images/tab_base_l0.png differ
diff --git a/data/themes/images/tab_base_l1.png 
b/data/themes/images/tab_base_l1.png
new file mode 100644
index 0000000..19f633c
Binary files /dev/null and b/data/themes/images/tab_base_l1.png differ
diff --git a/data/themes/images/tab_base_m.png 
b/data/themes/images/tab_base_m.png
new file mode 100644
index 0000000..8329c85
Binary files /dev/null and b/data/themes/images/tab_base_m.png differ
diff --git a/data/themes/images/tab_base_r0.png 
b/data/themes/images/tab_base_r0.png
new file mode 100644
index 0000000..f37a933
Binary files /dev/null and b/data/themes/images/tab_base_r0.png differ
diff --git a/data/themes/images/tab_base_r1.png 
b/data/themes/images/tab_base_r1.png
new file mode 100644
index 0000000..74ab7c2
Binary files /dev/null and b/data/themes/images/tab_base_r1.png differ
diff --git a/data/themes/images/tab_bg_l0.png b/data/themes/images/tab_bg_l0.png
new file mode 100644
index 0000000..9c05cad
Binary files /dev/null and b/data/themes/images/tab_bg_l0.png differ
diff --git a/data/themes/images/tab_bg_l1.png b/data/themes/images/tab_bg_l1.png
new file mode 100644
index 0000000..594b533
Binary files /dev/null and b/data/themes/images/tab_bg_l1.png differ
diff --git a/data/themes/images/tab_bg_r0.png b/data/themes/images/tab_bg_r0.png
new file mode 100644
index 0000000..cdeaf40
Binary files /dev/null and b/data/themes/images/tab_bg_r0.png differ
diff --git a/data/themes/images/tab_bg_r1.png b/data/themes/images/tab_bg_r1.png
new file mode 100644
index 0000000..c5f6fc6
Binary files /dev/null and b/data/themes/images/tab_bg_r1.png differ
diff --git a/data/themes/images/tab_other_l.png 
b/data/themes/images/tab_other_l.png
new file mode 100644
index 0000000..b02388a
Binary files /dev/null and b/data/themes/images/tab_other_l.png differ
diff --git a/data/themes/images/tab_other_m.png 
b/data/themes/images/tab_other_m.png
new file mode 100644
index 0000000..87141cb
Binary files /dev/null and b/data/themes/images/tab_other_m.png differ
diff --git a/data/themes/images/tab_other_r.png 
b/data/themes/images/tab_other_r.png
new file mode 100644
index 0000000..80fd216
Binary files /dev/null and b/data/themes/images/tab_other_r.png differ
diff --git a/data/themes/images/tab_shad_l0.png 
b/data/themes/images/tab_shad_l0.png
new file mode 100644
index 0000000..689ec45
Binary files /dev/null and b/data/themes/images/tab_shad_l0.png differ
diff --git a/data/themes/images/tab_shad_l1.png 
b/data/themes/images/tab_shad_l1.png
new file mode 100644
index 0000000..9fd642a
Binary files /dev/null and b/data/themes/images/tab_shad_l1.png differ
diff --git a/data/themes/images/tab_shad_l2.png 
b/data/themes/images/tab_shad_l2.png
new file mode 100644
index 0000000..0311782
Binary files /dev/null and b/data/themes/images/tab_shad_l2.png differ
diff --git a/data/themes/images/tab_shad_r0.png 
b/data/themes/images/tab_shad_r0.png
new file mode 100644
index 0000000..689ec45
Binary files /dev/null and b/data/themes/images/tab_shad_r0.png differ
diff --git a/data/themes/images/tab_shad_r1.png 
b/data/themes/images/tab_shad_r1.png
new file mode 100644
index 0000000..06952a8
Binary files /dev/null and b/data/themes/images/tab_shad_r1.png differ
diff --git a/data/themes/images/tab_shad_r2.png 
b/data/themes/images/tab_shad_r2.png
new file mode 100644
index 0000000..5c51f45
Binary files /dev/null and b/data/themes/images/tab_shad_r2.png differ
diff --git a/src/bin/config.c b/src/bin/config.c
index 8f3d432..3713db8 100644
--- a/src/bin/config.c
+++ b/src/bin/config.c
@@ -160,6 +160,8 @@ config_init(void)
      (edd_base, Config, "keys", keys, edd_keys);
    EET_DATA_DESCRIPTOR_ADD_BASIC
      (edd_base, Config, "gravatar", gravatar, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC
+     (edd_base, Config, "notabs", notabs, EET_T_UCHAR);
 }
 
 void
@@ -259,6 +261,7 @@ config_sync(const Config *config_src, Config *config)
    config->mouse_over_focus = config_src->mouse_over_focus;
    /* TODO: config->keys */
    config->gravatar = config_src->gravatar;
+   config->notabs = config_src->notabs;
 }
 
 static void
@@ -527,6 +530,7 @@ config_load(const char *key)
              config->mouse_over_focus = EINA_TRUE;
              config->colors_use = EINA_FALSE;
              config->gravatar = EINA_TRUE;
+             config->notabs = EINA_FALSE;
              for (j = 0; j < 4; j++)
                {
                   for (i = 0; i < 12; i++)
@@ -616,6 +620,7 @@ config_fork(Config *config)
    SCPY(config_key);
    CPY(font_set);
    CPY(gravatar);
+   CPY(notabs);
 
    EINA_LIST_FOREACH(config->keys, l, key)
      {
diff --git a/src/bin/config.h b/src/bin/config.h
index f933b28..963ce15 100644
--- a/src/bin/config.h
+++ b/src/bin/config.h
@@ -73,6 +73,7 @@ struct _Config
    Eina_Bool         mouse_over_focus;
    Eina_Bool         colors_use;
    Eina_Bool         gravatar;
+   Eina_Bool         notabs;
    Config_Color      colors[(4 * 12)];
    Eina_List        *keys;
 
diff --git a/src/bin/options_behavior.c b/src/bin/options_behavior.c
index 48f05a7..7af3200 100644
--- a/src/bin/options_behavior.c
+++ b/src/bin/options_behavior.c
@@ -21,6 +21,7 @@ _cb_op_behavior_##_cfg_name(void *data, Evas_Object *obj,     
  \
    else                                                         \
      config->_cfg_name = elm_check_state_get(obj);              \
    termio_config_update(term);                                  \
+   windows_update();                                            \
    config_save(config, NULL);                                   \
 }
 
@@ -39,6 +40,7 @@ CB(drag_links, 0);
 CB(login_shell, 0);
 CB(mouse_over_focus, 0);
 CB(gravatar,  0);
+CB(notabs,  1);
 
 #undef CB
 
@@ -247,6 +249,7 @@ options_behavior(Evas_Object *opbox, Evas_Object *term)
    CX(_("Start as login shell"), login_shell, 0);
    CX(_("Focus split under the Mouse"), mouse_over_focus, 0);
    CX(_("Gravatar integration"), gravatar, 0);
+   CX(_("Show tabs"), notabs, 1);
 
 /*
    CX(_("Enable application server"), application_server, 0);
diff --git a/src/bin/win.c b/src/bin/win.c
index b7257a5..7afb6a2 100644
--- a/src/bin/win.c
+++ b/src/bin/win.c
@@ -25,6 +25,15 @@
 /* {{{ Structs */
 
 typedef struct _Split Split;
+typedef struct _Tabbar Tabbar;
+
+struct _Tabbar
+{
+   struct {
+      Evas_Object *box;
+      Eina_List *tabs;
+   } l, r;
+};
 
 struct _Term
 {
@@ -38,8 +47,12 @@ struct _Term
    Evas_Object *miniview;
    Evas_Object *sel;
    Evas_Object *tabcount_spacer;
+   Evas_Object *tab_spacer;
+   Evas_Object *tab_region_base;
+   Evas_Object *tab_region_bg;
    Eina_List   *popmedia_queue;
    Media_Type   poptype, mediatype;
+   Tabbar       tabbar;
    int          step_x, step_y, min_w, min_h, req_w, req_h;
    struct {
       int       x, y;
@@ -570,6 +583,7 @@ main_close(Evas_Object *win, Evas_Object *term)
                     }
                   _term_focus(tm);
                   _term_focus_show(sp, tm);
+                  _split_tabcount_update(sp, tm);
                }
           }
         else
@@ -583,6 +597,7 @@ main_close(Evas_Object *win, Evas_Object *term)
                {
                   _term_focus(sp->term);
                   _term_focus_show(sp, sp->term);
+                  _split_tabcount_update(sp, sp->term);
                }
           }
         if (sp) _split_tabcount_update(sp, sp->term);
@@ -615,6 +630,7 @@ main_close(Evas_Object *win, Evas_Object *term)
              evas_object_show(sp->term->bg);
              _term_focus(sp->term);
              _term_focus_show(sp, sp->term);
+             _split_tabcount_update(sp, sp->term);
           }
         if (!sp->wn->terms) evas_object_del(sp->wn->win);
         else _split_tabcount_update(sp, sp->term);
@@ -834,12 +850,114 @@ _split_free(Split *sp)
 }
 
 static void
+_tabbar_clear(Term *tm)
+{
+   Evas_Object *o;
+
+   if (tm->tabbar.l.box)
+     {
+        EINA_LIST_FREE(tm->tabbar.l.tabs, o) evas_object_del(o);
+        evas_object_del(tm->tabbar.l.box);
+        tm->tabbar.l.box = NULL;
+     }
+   if (tm->tabbar.r.box)
+     {
+        EINA_LIST_FREE(tm->tabbar.r.tabs, o) evas_object_del(o);
+        evas_object_del(tm->tabbar.r.box);
+        tm->tabbar.r.box = NULL;
+     }
+}
+
+static void
+_cb_tab_activate(void *data, Evas_Object *obj, const char *sig EINA_UNUSED, 
const char *src EINA_UNUSED)
+{
+   Split *sp = data;
+   Term *term = evas_object_data_get(obj, "term");
+   if (term)
+     {
+        _term_focus(term);
+        if (sp)
+          {
+             _term_focus_show(sp, term);
+             _split_tabcount_update(sp, term);
+          }
+     }
+}
+
+static void
+_split_tabbar_fill(Split *sp, Term *tm)
+{
+   Eina_List *l;
+   Term *term;
+   Evas_Object *o;
+   int n = eina_list_count(sp->terms);
+   int i = 0, j = 0;
+
+   EINA_LIST_FOREACH(sp->terms, l, term)
+     {
+        if (term == tm) break;
+        i++;
+     }
+   if (i > 0)
+     {
+        tm->tabbar.l.box = o = elm_box_add(sp->wn->win);
+        elm_box_horizontal_set(o, EINA_TRUE);
+        elm_box_homogeneous_set(o, EINA_TRUE);
+        evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 
EVAS_HINT_EXPAND);
+        evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+        edje_object_part_swallow(term->bg, "terminology.tabl.content", o);
+        evas_object_show(o);
+     }
+   if (i < (n - 1))
+     {
+        tm->tabbar.r.box = o = elm_box_add(sp->wn->win);
+        elm_box_horizontal_set(o, EINA_TRUE);
+        elm_box_homogeneous_set(o, EINA_TRUE);
+        evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 
EVAS_HINT_EXPAND);
+        evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+        edje_object_part_swallow(term->bg, "terminology.tabr.content", o);
+        evas_object_show(o);
+     }
+   EINA_LIST_FOREACH(sp->terms, l, term)
+     {
+        if (term != tm)
+          {
+             Evas_Coord w, h;
+
+             o = edje_object_add(evas_object_evas_get(sp->wn->win));
+             theme_apply(o, term->config, "terminology/tabbar_back");
+             evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 
EVAS_HINT_EXPAND);
+             evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+             edje_object_part_text_set(o, "terminology.title", 
termio_title_get(term->term));
+             edje_object_size_min_calc(o, &w, &h);
+             evas_object_size_hint_min_set(o, w, h);
+             if (j < i)
+               {
+                  tm->tabbar.l.tabs = eina_list_append(tm->tabbar.l.tabs, o);
+                  elm_box_pack_end(tm->tabbar.l.box, o);
+               }
+             else if (j > i)
+               {
+                  tm->tabbar.r.tabs = eina_list_append(tm->tabbar.r.tabs, o);
+                  elm_box_pack_end(tm->tabbar.r.box, o);
+               }
+             evas_object_data_set(o, "term", term);
+             evas_object_show(o);
+             edje_object_signal_callback_add(o, "tab,activate", "terminology",
+                                             _cb_tab_activate, sp);
+          }
+        j++;
+     }
+}
+
+static void
 _split_tabcount_update(Split *sp, Term *tm)
 {
    char buf[32], bufm[32];
    int n = eina_list_count(sp->terms);
    int missed = 0;
    int cnt = 0, term_cnt = 0;
+   int i = 0;
    Eina_List *l;
    Term *term;
 
@@ -870,13 +988,64 @@ _split_tabcount_update(Split *sp, Term *tm)
              edje_object_part_text_set(term->bg, "terminology.tabcount.label", 
buf);
              edje_object_part_text_set(term->bg, 
"terminology.tabmissed.label", bufm);
              edje_object_signal_emit(term->bg, "tabcount,on", "terminology");
+             // this is all below just for tab bar at the top
+             if (!term->config->notabs)
+               {
+                  double v1, v2;
+
+                  v1 = (double)i / (double)n;
+                  v2 = (double)(i + 1) / (double)n;
+                  if (!term->tab_spacer)
+                    {
+                       term->tab_spacer = 
evas_object_rectangle_add(evas_object_evas_get(term->bg));
+                       evas_object_color_set(term->tab_spacer, 0, 0, 0, 0);
+                       elm_coords_finger_size_adjust(1, &w, 1, &h);
+                       evas_object_size_hint_min_set(term->tab_spacer, w, h);
+                       edje_object_part_swallow(term->bg, "terminology.tab", 
term->tab_spacer);
+                       edje_object_part_drag_value_set(term->bg, 
"terminology.tabl", v1, 0.0);
+                       edje_object_part_drag_value_set(term->bg, 
"terminology.tabr", v2, 0.0);
+                       edje_object_part_text_set(term->bg, 
"terminology.tab.title", termio_title_get(term->term));
+                       edje_object_signal_emit(term->bg, "tabbar,on", 
"terminology");
+                       edje_object_message_signal_process(term->bg);
+                    }
+                  else
+                    {
+                       edje_object_part_drag_value_set(term->bg, 
"terminology.tabl", v1, 0.0);
+                       edje_object_part_drag_value_set(term->bg, 
"terminology.tabr", v2, 0.0);
+                       edje_object_message_signal_process(term->bg);
+                    }
+                  _tabbar_clear(term);
+                  if (sp->term == term) _split_tabbar_fill(sp, term);
+               }
+             else
+               {
+                  _tabbar_clear(term);
+                  if (term->tab_spacer)
+                    {
+                       edje_object_signal_emit(term->bg, "tabbar,off", 
"terminology");
+                       evas_object_del(term->tab_spacer);
+                       term->tab_spacer = NULL;
+                       edje_object_message_signal_process(term->bg);
+                    }
+               }
           }
         else
-          edje_object_signal_emit(term->bg, "tabcount,off", "terminology");
+          {
+             _tabbar_clear(term);
+             edje_object_signal_emit(term->bg, "tabcount,off", "terminology");
+             if (term->tab_spacer)
+               {
+                  edje_object_signal_emit(term->bg, "tabbar,off", 
"terminology");
+                  evas_object_del(term->tab_spacer);
+                  term->tab_spacer = NULL;
+                  edje_object_message_signal_process(term->bg);
+               }
+          }
         if (missed > 0)
           edje_object_signal_emit(term->bg, "tabmissed,on", "terminology");
         else
           edje_object_signal_emit(term->bg, "tabmissed,off", "terminology");
+        i++;
      }
 }
 
@@ -1279,7 +1448,8 @@ _term_focus(Term *term)
    if (sp) _split_tabcount_update(sp, term);
 }
 
-void term_prev(Term *term)
+void
+term_prev(Term *term)
 {
    Term *term2 = NULL;
    Config *config = termio_config_get(term->term);
@@ -1291,18 +1461,23 @@ void term_prev(Term *term)
 
         sp0 = _split_find(term->wn->win, term->term, NULL);
         sp = _split_find(term2->wn->win, term2->term, NULL);
-        if (sp == sp0 && config->tab_zoom >= 0.01)
+        if ((sp == sp0) && (config->tab_zoom >= 0.01) && (config->notabs))
           _sel_go(sp, term2);
         else
           {
              _term_focus(term2);
-             if (sp) _term_focus_show(sp, term2);
+             if (sp)
+               {
+                  _term_focus_show(sp, term2);
+                  _split_tabcount_update(sp, term2);
+               }
           }
      }
    _term_miniview_check(term);
 }
 
-void term_next(Term *term)
+void
+term_next(Term *term)
 {
    Term *term2 = NULL;
    Config *config = termio_config_get(term->term);
@@ -1314,12 +1489,16 @@ void term_next(Term *term)
 
         sp0 = _split_find(term->wn->win, term->term, NULL);
         sp = _split_find(term2->wn->win, term2->term, NULL);
-        if (sp == sp0 && config->tab_zoom >= 0.01)
+        if ((sp == sp0) && (config->tab_zoom >= 0.01) && (config->notabs))
           _sel_go(sp, term2);
         else
           {
              _term_focus(term2);
-             if (sp) _term_focus_show(sp, term2);
+             if (sp)
+               {
+                  _term_focus_show(sp, term2);
+                  _split_tabcount_update(sp, term2);
+               }
           }
      }
    _term_miniview_check(term);
@@ -1682,6 +1861,33 @@ _cb_title(void *data, Evas_Object *obj EINA_UNUSED, void 
*event EINA_UNUSED)
    Term *term = data;
    if (term->focused)
      elm_win_title_set(term->wn->win, termio_title_get(term->term));
+   edje_object_part_text_set(term->bg, "terminology.tab.title", 
termio_title_get(term->term));
+   if (term->config->notabs)
+     {
+        Split *sp = _split_find(term->wn->win, term->term, NULL);
+        if (sp)
+          {
+             Eina_List *l, *ll;
+             Evas_Object *o;
+             Term *term2;
+
+             EINA_LIST_FOREACH(sp->terms, l, term)
+               {
+                  EINA_LIST_FOREACH(term->tabbar.l.tabs, ll, o)
+                    {
+                       term2 = evas_object_data_get(o, "term");
+                       if (term2)
+                         edje_object_part_text_set(o, "terminology.title", 
termio_title_get(term2->term));
+                    }
+                  EINA_LIST_FOREACH(term->tabbar.r.tabs, ll, o)
+                    {
+                       term2 = evas_object_data_get(o, "term");
+                       if (term2)
+                         edje_object_part_text_set(o, "terminology.title", 
termio_title_get(term2->term));
+                    }
+               }
+          }
+     }
 }
 
 static void
@@ -2060,33 +2266,52 @@ term_free(Term *term)
      {
         eina_stringshare_del(s);
      }
+   _tabbar_clear(term);
    if (term->media)
      {
         evas_object_event_callback_del(term->media,
                                        EVAS_CALLBACK_DEL,
                                        _cb_media_del);
         evas_object_del(term->media);
+        term->media = NULL;
      }
-   term->media = NULL;
-   if (term->popmedia) evas_object_del(term->popmedia);
+   if (term->popmedia)
+     {
+        evas_object_del(term->popmedia);
+        term->popmedia = NULL;
+     }
+        term->popmedia_deleted = EINA_FALSE;
    if (term->miniview)
      {
         evas_object_del(term->miniview);
         term->miniview = NULL;
      }
-   term->popmedia = NULL;
-   term->popmedia_deleted = EINA_FALSE;
+   if (term->tabcount_spacer)
+     {
+        evas_object_del(term->tabcount_spacer);
+        term->tabcount_spacer = NULL;
+     }
+   if (term->tab_spacer)
+     {
+        evas_object_del(term->tab_spacer);
+        term->tab_spacer = NULL;
+     }
+   if (term->tab_region_bg)
+     {
+        evas_object_del(term->tab_region_bg);
+        term->tab_region_bg = NULL;
+     }
+   if (term->tab_region_base)
+     {
+        evas_object_del(term->tab_region_base);
+        term->tab_region_base = NULL;
+     }
    evas_object_del(term->term);
    term->term = NULL;
    evas_object_del(term->base);
    term->base = NULL;
    evas_object_del(term->bg);
    term->bg = NULL;
-   if (term->tabcount_spacer)
-     {
-        evas_object_del(term->tabcount_spacer);
-        term->tabcount_spacer = NULL;
-     }
    free(term);
 }
 
@@ -2188,15 +2413,59 @@ main_term_bg_config(Term *term)
 }
 
 static void
+_cb_tabregion_change(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void 
*info EINA_UNUSED)
+{
+   Term *term = data;
+   Evas_Coord w, h;
+
+   evas_object_geometry_get(obj, NULL, NULL, &w, &h);
+   evas_object_size_hint_min_set(term->tab_region_base, w, h);
+   edje_object_part_swallow(term->base, "terminology.tabregion", 
term->tab_region_base);
+}
+
+static void
+_term_tabregion_setup(Term *term)
+{
+   Evas_Object *o;
+
+   if (term->tab_region_bg) return;
+   term->tab_region_bg = o = 
evas_object_rectangle_add(evas_object_evas_get(term->bg));
+   evas_object_color_set(o, 0, 0, 0, 0);
+   evas_object_event_callback_add(o, EVAS_CALLBACK_MOVE, _cb_tabregion_change, 
term);
+   evas_object_event_callback_add(o, EVAS_CALLBACK_RESIZE, 
_cb_tabregion_change, term);
+   edje_object_part_swallow(term->bg, "terminology.tabregion", o);
+
+   term->tab_region_base = o = 
evas_object_rectangle_add(evas_object_evas_get(term->bg));
+   evas_object_color_set(o, 0, 0, 0, 0);
+   edje_object_part_swallow(term->base, "terminology.tabregion", o);
+}
+
+static void
 _main_term_bg_redo(Term *term)
 {
    Evas_Object *o;
 
+   _tabbar_clear(term);
    if (term->tabcount_spacer)
      {
         evas_object_del(term->tabcount_spacer);
         term->tabcount_spacer = NULL;
      }
+   if (term->tab_spacer)
+     {
+        evas_object_del(term->tab_spacer);
+        term->tab_spacer = NULL;
+     }
+   if (term->tab_region_bg)
+     {
+        evas_object_del(term->tab_region_bg);
+        term->tab_region_bg = NULL;
+     }
+   if (term->tab_region_base)
+     {
+        evas_object_del(term->tab_region_base);
+        term->tab_region_base = NULL;
+     }
    if (term->miniview)
      {
         edje_object_part_unswallow(term->bg, term->miniview);
@@ -2205,7 +2474,7 @@ _main_term_bg_redo(Term *term)
      }
    evas_object_del(term->base);
    evas_object_del(term->bg);
-   
+
    term->base = o = edje_object_add(evas_object_evas_get(term->wn->win));
    theme_apply(o, term->config, "terminology/core");
 
@@ -2219,6 +2488,8 @@ _main_term_bg_redo(Term *term)
    evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
    theme_apply(o, term->config, "terminology/background");
 
+   _term_tabregion_setup(term);
+
    term->miniview = o = miniview_add(term->wn->win, term->term);
    evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
@@ -2231,7 +2502,7 @@ _main_term_bg_redo(Term *term)
    evas_object_show(o);
    main_term_bg_config(term);
    if (term->miniview_shown)
-        edje_object_signal_emit(term->bg, "miniview,on", "terminology");
+     edje_object_signal_emit(term->bg, "miniview,on", "terminology");
 }
 
 Eina_Bool
@@ -2294,6 +2565,7 @@ _cb_bell(void *data, Evas_Object *obj EINA_UNUSED, void 
*event EINA_UNUSED)
      {
         if (!term->wn->focused) elm_win_urgent_set(term->wn->win, EINA_TRUE);
      }
+   // XXX: update tabbars to have bell status in them
 }
 
 
@@ -2384,6 +2656,8 @@ term_new(Win *wn, Config *config, const char *cmd,
    evas_object_data_set(o, "theme_reload_func_data", term);
    evas_object_show(o);
 
+   _term_tabregion_setup(term);
+
    if (term->config->translucent)
      msg.val = term->config->opacity;
    else
@@ -2505,6 +2779,7 @@ _sel_cb_selected(void *data,
           {
              _term_focus(tm);
              _term_focus_show(sp, tm);
+             _split_tabcount_update(sp, tm);
              _sel_restore(sp);
              _term_miniview_check(tm);
              return;
@@ -2513,6 +2788,7 @@ _sel_cb_selected(void *data,
    _sel_restore(sp);
    _term_focus(sp->term);
    _term_focus_show(sp, sp->term);
+   _split_tabcount_update(sp, sp->term);
    _term_miniview_check(tm);
 }
 
@@ -2525,6 +2801,7 @@ _sel_cb_exit(void *data,
    _sel_restore(sp);
    _term_focus(sp->term);
    _term_focus_show(sp, sp->term);
+   _split_tabcount_update(sp, sp->term);
 }
 
 static void
@@ -2628,3 +2905,25 @@ windows_free(void)
      }
 }
 
+static void
+_split_update(Split *sp)
+{
+   Eina_List *l;
+   Term *tm;
+
+   EINA_LIST_FOREACH(sp->terms, l, tm)
+     {
+        _split_tabcount_update(sp, tm);
+     }
+   if (sp->s1) _split_update(sp->s1);
+   if (sp->s2) _split_update(sp->s2);
+}
+
+void
+windows_update(void)
+{
+   Eina_List *l;
+   Win *wn;
+
+   EINA_LIST_FOREACH(wins, l, wn) _split_update(wn->split);
+}
diff --git a/src/bin/win.h b/src/bin/win.h
index 5ae1b35..a25c739 100644
--- a/src/bin/win.h
+++ b/src/bin/win.h
@@ -25,6 +25,7 @@ win_new(const char *name, const char *role, const char *title,
              Eina_Bool maximized);
 void win_free(Win *wn);
 void windows_free(void);
+void windows_update(void);
 
 Term *term_new(Win *wn, Config *config, const char *cmd, Eina_Bool 
login_shell, const char *cd, int size_w, int size_h, Eina_Bool hold);
 

-- 


Reply via email to