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.
devs/discomfitor/cc
Carsten Haitzler 8 years ago
parent eb80949921
commit 5ed68d82b2
  1. 699
      data/themes/default.edc
  2. BIN
      data/themes/images/tab.xcf
  3. BIN
      data/themes/images/tab_base_bottom.png
  4. BIN
      data/themes/images/tab_base_l0.png
  5. BIN
      data/themes/images/tab_base_l1.png
  6. BIN
      data/themes/images/tab_base_m.png
  7. BIN
      data/themes/images/tab_base_r0.png
  8. BIN
      data/themes/images/tab_base_r1.png
  9. BIN
      data/themes/images/tab_bg_l0.png
  10. BIN
      data/themes/images/tab_bg_l1.png
  11. BIN
      data/themes/images/tab_bg_r0.png
  12. BIN
      data/themes/images/tab_bg_r1.png
  13. BIN
      data/themes/images/tab_other_l.png
  14. BIN
      data/themes/images/tab_other_m.png
  15. BIN
      data/themes/images/tab_other_r.png
  16. BIN
      data/themes/images/tab_shad_l0.png
  17. BIN
      data/themes/images/tab_shad_l1.png
  18. BIN
      data/themes/images/tab_shad_l2.png
  19. BIN
      data/themes/images/tab_shad_r0.png
  20. BIN
      data/themes/images/tab_shad_r1.png
  21. BIN
      data/themes/images/tab_shad_r2.png
  22. 5
      src/bin/config.c
  23. 1
      src/bin/config.h
  24. 3
      src/bin/options_behavior.c
  25. 335
      src/bin/win.c
  26. 1
      src/bin/win.h

@ -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 {
@ -668,6 +987,202 @@ collections {
target: "shine";
}
////////////////////////////////////////////////////////////////////
// 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";
@ -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;

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 410 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 414 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 402 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 287 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 671 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 301 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 B

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

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

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

@ -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);
@ -833,6 +849,107 @@ _split_free(Split *sp)
free(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)
{
@ -840,6 +957,7 @@ _split_tabcount_update(Split *sp, Term *tm)
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);
}
@ -2187,16 +2412,60 @@ main_term_bg_config(Term *term)
edje_object_signal_emit(term->bg, "miniview,on", "terminology");
}
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;
}