diff --git a/data/themes/default.edc b/data/themes/default.edc index 4d0cfc26..2ac68c7b 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 { @@ -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; diff --git a/data/themes/images/tab.xcf b/data/themes/images/tab.xcf new file mode 100644 index 00000000..e4de69b1 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 00000000..96ded379 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 00000000..0e4398f9 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 00000000..19f633c0 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 00000000..8329c853 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 00000000..f37a9337 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 00000000..74ab7c24 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 00000000..9c05cad0 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 00000000..594b5339 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 00000000..cdeaf402 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 00000000..c5f6fc60 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 00000000..b02388ac 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 00000000..87141cb7 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 00000000..80fd2165 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 00000000..689ec453 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 00000000..9fd642ab 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 00000000..0311782a 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 00000000..689ec453 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 00000000..06952a84 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 00000000..5c51f45e 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 8f3d432d..3713db80 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 f933b280..963ce15e 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 48f05a77..7af3200e 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 b7257a51..7afb6a2a 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); @@ -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; } + 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 5ae1b35a..a25c739d 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);