tAdd format string for bottom bar - ledit - Text editor (WIP) | |
git clone git://lumidify.org/ledit.git (fast, but not encrypted) | |
git clone https://lumidify.org/git/ledit.git (encrypted, but very slow) | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit d8b6431785a46807eca08c11b4c79ac540e0e718 | |
parent af728a8b3107fc9c18562adc9ed7dbca46dbda4d | |
Author: lumidify <[email protected]> | |
Date: Fri, 2 Sep 2022 14:50:24 +0200 | |
Add format string for bottom bar | |
Diffstat: | |
M buffer.c | 10 ---------- | |
M configparser.c | 1 + | |
M configparser.h | 1 + | |
M leditrc.5 | 300 ++++++++++++++++-------------… | |
M leditrc.example | 1 + | |
M theme_config.h | 2 ++ | |
M view.c | 7 +++++-- | |
M window.c | 308 ++++++++++++++++++++++++-----… | |
M window.h | 17 +++-------------- | |
9 files changed, 411 insertions(+), 236 deletions(-) | |
--- | |
diff --git a/buffer.c b/buffer.c | |
t@@ -269,18 +269,9 @@ buffer_unlock_all_views(ledit_buffer *buffer) { | |
} | |
} | |
-static void | |
-set_view_hard_line_text(ledit_buffer *buffer, ledit_view *view) { | |
- char *text = buffer->hard_line_based ? "|HL" : "|SL"; | |
- window_set_mode_extra_text(view->window, text); | |
-} | |
- | |
void | |
buffer_set_hard_line_based(ledit_buffer *buffer, int hl) { | |
buffer->hard_line_based = hl; | |
- for (size_t i = 0; i < buffer->views_num; i++) { | |
- set_view_hard_line_text(buffer, buffer->views[i]); | |
- } | |
} | |
void | |
t@@ -288,7 +279,6 @@ buffer_add_view(ledit_buffer *buffer, ledit_mode mode, siz… | |
size_t new_num = add_sz(buffer->views_num, 1); | |
buffer->views = ledit_reallocarray(buffer->views, new_num, sizeof(ledi… | |
buffer->views[buffer->views_num] = view_create(buffer, mode, line, pos… | |
- set_view_hard_line_text(buffer, buffer->views[buffer->views_num]); | |
view_scroll(buffer->views[buffer->views_num], scroll_offset); | |
buffer->views_num = new_num; | |
} | |
diff --git a/configparser.c b/configparser.c | |
t@@ -557,6 +557,7 @@ load_destroy_theme(ledit_common *common, ast_list *theme_l… | |
{"bar-fg", &theme->bar_fg, &parse_theme_color, &destroy_theme_… | |
{"bar-bg", &theme->bar_bg, &parse_theme_color, &destroy_theme_… | |
{"bar-cursor", &theme->bar_cursor, &parse_theme_color, &destro… | |
+ {"bar-fmt", &theme->bar_fmt, &parse_theme_string, &destroy_the… | |
{"scrollbar-fg", &theme->scrollbar_fg, &parse_theme_color, &de… | |
{"scrollbar-bg", &theme->scrollbar_bg, &parse_theme_color, &de… | |
}; | |
diff --git a/configparser.h b/configparser.h | |
t@@ -22,6 +22,7 @@ typedef struct { | |
XftColor scrollbar_fg; | |
XftColor scrollbar_bg; | |
const char *text_font; | |
+ const char *bar_fmt; | |
} ledit_theme; | |
typedef struct { | |
diff --git a/leditrc.5 b/leditrc.5 | |
t@@ -1,4 +1,4 @@ | |
-.Dd May 27, 2022 | |
+.Dd September 2, 2022 | |
.Dt LEDITRC 5 | |
.Os | |
.Sh NAME | |
t@@ -131,6 +131,30 @@ Default: #CCCCCC | |
.It Ar bar-cursor | |
Color of text cursor in line editor. | |
Default: #000000 | |
+.It Ar bar-fmt | |
+Format string for the bottom bar. | |
+The following substitutions are performed: | |
+.Bl -tag -width Ds | |
+.It %% | |
+The character | |
+.Ql % | |
+itself. | |
+.It %l | |
+The current line position of the cursor. | |
+.It %b | |
+The current byte position of the cursor. | |
+Note that this is really only the raw byte position. | |
+There currently is no way to get the unicode character position in the format … | |
+.It %m | |
+The current mode. | |
+.It %h | |
+The current hardline/softline mode. | |
+.It %s | |
+A separator. | |
+The remaining space is divided equally between all separators. | |
+.El | |
+.Pp | |
+Default: %l,%b%s%m|%h | |
.It Ar scrollbar-width | |
Width of scrollbar in pixels. | |
Default: 10 | |
t@@ -938,153 +962,145 @@ Let me know if there are any others I should add. | |
.Bl -tag -width Ds | |
.It Ar General keys | |
.Pp | |
-.Bl -tag -width Ds -compact | |
-.It Ar backspace | |
-.It Ar begin | |
-.It Ar break | |
-.It Ar cancel | |
-.It Ar clear | |
-.It Ar delete | |
-.It Ar down | |
-.It Ar end | |
-.It Ar escape | |
-.It Ar execute | |
-.It Ar find | |
-.It Ar help | |
-.It Ar home | |
-.It Ar insert | |
-.It Ar left | |
-.It Ar linefeed | |
-.It Ar menu | |
-.It Ar mode-switch | |
-.It Ar next | |
-.It Ar num-lock | |
-.It Ar page-down | |
-.It Ar page-up | |
-.It Ar pause | |
-.It Ar print | |
-.It Ar prior | |
-.It Ar redo | |
-.It Ar return | |
-.It Ar right | |
-.It Ar script-switch | |
-.It Ar scroll-lock | |
-.It Ar select | |
-.It Ar space | |
-.It Ar sysreq | |
-.It Ar tab | |
-.It Ar up | |
-.It Ar undo | |
-.El | |
+.Ar backspace | |
+.Ar begin | |
+.Ar break | |
+.Ar cancel | |
+.Ar clear | |
+.Ar delete | |
+.Ar down | |
+.Ar end | |
+.Ar escape | |
+.Ar execute | |
+.Ar find | |
+.Ar help | |
+.Ar home | |
+.Ar insert | |
+.Ar left | |
+.Ar linefeed | |
+.Ar menu | |
+.Ar mode-switch | |
+.Ar next | |
+.Ar num-lock | |
+.Ar page-down | |
+.Ar page-up | |
+.Ar pause | |
+.Ar print | |
+.Ar prior | |
+.Ar redo | |
+.Ar return | |
+.Ar right | |
+.Ar script-switch | |
+.Ar scroll-lock | |
+.Ar select | |
+.Ar space | |
+.Ar sysreq | |
+.Ar tab | |
+.Ar up | |
+.Ar undo | |
.It Ar Function keys | |
.Pp | |
-.Bl -tag -width Ds -compact | |
-.It Ar f1 | |
-.It Ar f2 | |
-.It Ar f3 | |
-.It Ar f4 | |
-.It Ar f5 | |
-.It Ar f6 | |
-.It Ar f7 | |
-.It Ar f8 | |
-.It Ar f9 | |
-.It Ar f10 | |
-.It Ar f11 | |
-.It Ar f12 | |
-.It Ar f13 | |
-.It Ar f14 | |
-.It Ar f15 | |
-.It Ar f16 | |
-.It Ar f17 | |
-.It Ar f18 | |
-.It Ar f19 | |
-.It Ar f20 | |
-.It Ar f21 | |
-.It Ar f22 | |
-.It Ar f23 | |
-.It Ar f24 | |
-.It Ar f25 | |
-.It Ar f26 | |
-.It Ar f27 | |
-.It Ar f28 | |
-.It Ar f29 | |
-.It Ar f30 | |
-.It Ar f31 | |
-.It Ar f32 | |
-.It Ar f33 | |
-.It Ar f34 | |
-.It Ar f35 | |
-.El | |
+.Ar f1 | |
+.Ar f2 | |
+.Ar f3 | |
+.Ar f4 | |
+.Ar f5 | |
+.Ar f6 | |
+.Ar f7 | |
+.Ar f8 | |
+.Ar f9 | |
+.Ar f10 | |
+.Ar f11 | |
+.Ar f12 | |
+.Ar f13 | |
+.Ar f14 | |
+.Ar f15 | |
+.Ar f16 | |
+.Ar f17 | |
+.Ar f18 | |
+.Ar f19 | |
+.Ar f20 | |
+.Ar f21 | |
+.Ar f22 | |
+.Ar f23 | |
+.Ar f24 | |
+.Ar f25 | |
+.Ar f26 | |
+.Ar f27 | |
+.Ar f28 | |
+.Ar f29 | |
+.Ar f30 | |
+.Ar f31 | |
+.Ar f32 | |
+.Ar f33 | |
+.Ar f34 | |
+.Ar f35 | |
.It Ar Keypad keys | |
.Pp | |
-.Bl -tag -width Ds -compact | |
-.It Ar kp-0 | |
-.It Ar kp-1 | |
-.It Ar kp-2 | |
-.It Ar kp-3 | |
-.It Ar kp-4 | |
-.It Ar kp-5 | |
-.It Ar kp-6 | |
-.It Ar kp-7 | |
-.It Ar kp-8 | |
-.It Ar kp-9 | |
-.It Ar kp-add | |
-.It Ar kp-begin | |
-.It Ar kp-decimal | |
-.It Ar kp-delete | |
-.It Ar kp-divide | |
-.It Ar kp-down | |
-.It Ar kp-end | |
-.It Ar kp-enter | |
-.It Ar kp-equal | |
-.It Ar kp-f1 | |
-.It Ar kp-f2 | |
-.It Ar kp-f3 | |
-.It Ar kp-f4 | |
-.It Ar kp-home | |
-.It Ar kp-insert | |
-.It Ar kp-left | |
-.It Ar kp-multiply | |
-.It Ar kp-next | |
-.It Ar kp-page-down | |
-.It Ar kp-page-up | |
-.It Ar kp-prior | |
-.It Ar kp-right | |
-.It Ar kp-separator | |
-.It Ar kp-space | |
-.It Ar kp-subtract | |
-.It Ar kp-tab | |
-.It Ar kp-up | |
-.El | |
+.Ar kp-0 | |
+.Ar kp-1 | |
+.Ar kp-2 | |
+.Ar kp-3 | |
+.Ar kp-4 | |
+.Ar kp-5 | |
+.Ar kp-6 | |
+.Ar kp-7 | |
+.Ar kp-8 | |
+.Ar kp-9 | |
+.Ar kp-add | |
+.Ar kp-begin | |
+.Ar kp-decimal | |
+.Ar kp-delete | |
+.Ar kp-divide | |
+.Ar kp-down | |
+.Ar kp-end | |
+.Ar kp-enter | |
+.Ar kp-equal | |
+.Ar kp-f1 | |
+.Ar kp-f2 | |
+.Ar kp-f3 | |
+.Ar kp-f4 | |
+.Ar kp-home | |
+.Ar kp-insert | |
+.Ar kp-left | |
+.Ar kp-multiply | |
+.Ar kp-next | |
+.Ar kp-page-down | |
+.Ar kp-page-up | |
+.Ar kp-prior | |
+.Ar kp-right | |
+.Ar kp-separator | |
+.Ar kp-space | |
+.Ar kp-subtract | |
+.Ar kp-tab | |
+.Ar kp-up | |
.It Ar Weird keys that I don't know | |
.Pp | |
-.Bl -tag -width Ds -compact | |
-.It Ar l1 | |
-.It Ar l2 | |
-.It Ar l3 | |
-.It Ar l4 | |
-.It Ar l5 | |
-.It Ar l6 | |
-.It Ar l7 | |
-.It Ar l8 | |
-.It Ar l9 | |
-.It Ar l10 | |
-.It Ar r1 | |
-.It Ar r2 | |
-.It Ar r3 | |
-.It Ar r4 | |
-.It Ar r5 | |
-.It Ar r6 | |
-.It Ar r7 | |
-.It Ar r8 | |
-.It Ar r9 | |
-.It Ar r10 | |
-.It Ar r11 | |
-.It Ar r12 | |
-.It Ar r13 | |
-.It Ar r14 | |
-.It Ar r15 | |
-.El | |
+.Ar l1 | |
+.Ar l2 | |
+.Ar l3 | |
+.Ar l4 | |
+.Ar l5 | |
+.Ar l6 | |
+.Ar l7 | |
+.Ar l8 | |
+.Ar l9 | |
+.Ar l10 | |
+.Ar r1 | |
+.Ar r2 | |
+.Ar r3 | |
+.Ar r4 | |
+.Ar r5 | |
+.Ar r6 | |
+.Ar r7 | |
+.Ar r8 | |
+.Ar r9 | |
+.Ar r10 | |
+.Ar r11 | |
+.Ar r12 | |
+.Ar r13 | |
+.Ar r14 | |
+.Ar r15 | |
.El | |
.Sh EXAMPLES | |
See the example configuration file | |
diff --git a/leditrc.example b/leditrc.example | |
t@@ -13,6 +13,7 @@ theme = { | |
bar-fg = 000000 | |
bar-bg = CCCCCC | |
bar-cursor = 000000 | |
+ bar-fmt = "%l,%b%s%m|%h" | |
scrollbar-width = 10 | |
scrollbar-step = 20 | |
scrollbar-bg = CCCCCC | |
diff --git a/theme_config.h b/theme_config.h | |
t@@ -33,6 +33,8 @@ static const char *BAR_FG = "#000000"; | |
static const char *BAR_BG = "#CCCCCC"; | |
/* color of text cursor in line editor */ | |
static const char *BAR_CURSOR = "#000000"; | |
+/* format of bottom bar */ | |
+static const char *BAR_FMT = "%l,%b%s%m|%h"; | |
/* FIXME: give in units other than pixels */ | |
/* scrollbar width in pixels */ | |
diff --git a/view.c b/view.c | |
t@@ -92,7 +92,6 @@ void | |
view_set_mode(ledit_view *view, ledit_mode mode) { | |
view->mode = mode; | |
undo_change_mode_group(view->buffer->undo); | |
- window_set_mode(view->window, mode); | |
} | |
ledit_view * | |
t@@ -108,7 +107,7 @@ view_create(ledit_buffer *buffer, ledit_mode mode, size_t … | |
ledit_view *view = ledit_malloc(sizeof(ledit_view)); | |
view->mode = mode; | |
view->buffer = buffer; | |
- view->window = window_create(buffer->common, buffer->clipboard, mode); | |
+ view->window = window_create(buffer->common, buffer->clipboard); | |
view->cache = cache_create(buffer->common->dpy); | |
view->lock_text = NULL; | |
view->cur_action = (struct action){ACTION_NONE, NULL}; | |
t@@ -1992,6 +1991,10 @@ view_redraw_text(ledit_view *view) { | |
void | |
view_redraw(ledit_view *view) { | |
+ window_set_format_args( | |
+ view->window, view->mode, view->buffer->hard_line_based, | |
+ view->cur_line + 1, view->cur_index + 1 | |
+ ); | |
if (view->redraw || view->window->redraw) { | |
window_clear(view->window); | |
view_redraw_text(view); | |
diff --git a/window.c b/window.c | |
t@@ -24,18 +24,32 @@ | |
#include "draw_util.h" | |
#include "configparser.h" | |
+enum bb_itemtype { | |
+ BB_STR, | |
+ BB_MODE, | |
+ BB_HLMODE, | |
+ BB_LINE, | |
+ BB_BYTE, | |
+ BB_SEP | |
+}; | |
+ | |
+struct bb_item { | |
+ PangoLayout *layout; | |
+ ledit_draw *draw; | |
+ int w, h; | |
+ enum bb_itemtype type; | |
+ union { | |
+ int i; | |
+ ledit_mode m; | |
+ size_t sz; | |
+ } val; | |
+}; | |
+ | |
/* FIXME: Everything to do with the bottom bar is extremely hacky */ | |
struct bottom_bar { | |
- /* FIXME: encapsulate layout, width, draw a bit */ | |
- /* text display of mode and possible some further text */ | |
- PangoLayout *mode; | |
- ledit_draw *mode_draw; | |
- int mode_w, mode_h; | |
- | |
- /* line and position display (not implemented yet - FIXME) */ | |
- PangoLayout *ruler; | |
- ledit_draw *ruler_draw; | |
- int ruler_w, ruler_h; | |
+ struct bb_item *items; | |
+ size_t items_num, items_alloc; | |
+ int w_per_sep; /* pixels used per separator in bottom bar */ | |
/* message or editable text display */ | |
PangoLayout *line; | |
t@@ -66,12 +80,104 @@ static void get_scroll_pos_height(ledit_window *windown, … | |
*/ | |
static void set_scroll_pos(ledit_window *window, double pos); | |
+/* FIXME: maybe just draw to one big draw instead of keeping all these small o… | |
+static void | |
+set_item_text(ledit_window *window, ledit_theme *theme, struct bb_item *item, … | |
+ pango_layout_set_text(item->layout, text, -1); | |
+ pango_layout_get_pixel_size(item->layout, &item->w, &item->h); | |
+ draw_grow(window, item->draw, item->w, item->h); | |
+ XftDrawRect(item->draw->xftdraw, &theme->bar_bg, 0, 0, item->w, item->… | |
+ pango_xft_render_layout(item->draw->xftdraw, &theme->bar_fg, item->lay… | |
+} | |
+ | |
+void | |
+window_set_format_args(ledit_window *window, ledit_mode mode, int hl_mode, siz… | |
+ struct bb_item *items = window->bb->items; | |
+ char *text; | |
+ int changed = 0; | |
+ ledit_theme *theme = config_get_theme(); | |
+ for (size_t i = 0; i < window->bb->items_num; i++) { | |
+ switch (items[i].type) { | |
+ case BB_MODE: | |
+ if (mode == items[i].val.m) | |
+ continue; | |
+ switch (mode) { | |
+ case NORMAL: | |
+ text = "Normal"; | |
+ break; | |
+ case VISUAL: | |
+ text = "Visual"; | |
+ break; | |
+ case INSERT: | |
+ text = "Insert"; | |
+ break; | |
+ default: | |
+ text = "ledit is buggy"; | |
+ break; | |
+ } | |
+ set_item_text(window, theme, &items[i], text); | |
+ changed = 1; | |
+ items[i].val.m = mode; | |
+ break; | |
+ case BB_HLMODE: | |
+ if (hl_mode == items[i].val.i) | |
+ continue; | |
+ if (hl_mode) | |
+ text = "HL"; | |
+ else | |
+ text = "SL"; | |
+ set_item_text(window, theme, &items[i], text); | |
+ changed = 1; | |
+ items[i].val.i = hl_mode; | |
+ break; | |
+ /* FIXME: avoid allocating new each time */ | |
+ case BB_LINE: | |
+ if (line == items[i].val.sz) | |
+ continue; | |
+ text = print_fmt("%zu", line); | |
+ set_item_text(window, theme, &items[i], text); | |
+ free(text); | |
+ changed = 1; | |
+ items[i].val.sz = line; | |
+ break; | |
+ case BB_BYTE: | |
+ if (byte == items[i].val.sz) | |
+ continue; | |
+ text = print_fmt("%zu", byte); | |
+ set_item_text(window, theme, &items[i], text); | |
+ free(text); | |
+ changed = 1; | |
+ items[i].val.sz = byte; | |
+ break; | |
+ default: | |
+ break; | |
+ } | |
+ } | |
+ if (changed) { | |
+ recalc_text_size(window); | |
+ window->redraw = 1; | |
+ } | |
+} | |
+ | |
/* FIXME: shouldn't window->bottom_text_shown also be true when message_shown?… | |
/* FIXME: guard against negative width/height */ | |
static void | |
recalc_text_size(ledit_window *window) { | |
ledit_theme *theme = config_get_theme(); | |
- int bar_h = window->bb->mode_h; | |
+ int bar_h = 0; | |
+ int total_static_w = 0; | |
+ int num_sep = 0; | |
+ struct bb_item *items = window->bb->items; | |
+ for (size_t i = 0; i < window->bb->items_num; i++) { | |
+ if (items[i].type == BB_SEP) { | |
+ num_sep++; | |
+ } else { | |
+ total_static_w += items[i].w; | |
+ if (items[i].h > bar_h) | |
+ bar_h = items[i].h; | |
+ } | |
+ } | |
+ window->bb->w_per_sep = (window->w - total_static_w) / num_sep; | |
if (window->bottom_text_shown || window->message_shown) | |
bar_h = window->bb->line_h; | |
window->text_w = window->w - theme->scrollbar_width; | |
t@@ -308,44 +414,6 @@ window_hide_message(ledit_window *window) { | |
recalc_text_size(window); | |
} | |
-void | |
-window_set_mode(ledit_window *window, ledit_mode mode) { | |
- ledit_theme *theme = config_get_theme(); | |
- window->mode = mode; | |
- char *text; | |
- switch (mode) { | |
- case NORMAL: | |
- text = "Normal"; | |
- break; | |
- case VISUAL: | |
- text = "Visual"; | |
- break; | |
- case INSERT: | |
- text = "Insert"; | |
- break; | |
- default: | |
- text = "ledit is buggy"; | |
- break; | |
- } | |
- char *final_text = ledit_strcat(text, window->mode_extra_text ? window… | |
- pango_layout_set_text(window->bb->mode, final_text, -1); | |
- free(final_text); | |
- pango_layout_get_pixel_size(window->bb->mode, &window->bb->mode_w, &wi… | |
- draw_grow(window, window->bb->mode_draw, window->bb->mode_w, window->b… | |
- XftDrawRect(window->bb->mode_draw->xftdraw, &theme->bar_bg, 0, 0, wind… | |
- pango_xft_render_layout(window->bb->mode_draw->xftdraw, &theme->bar_fg… | |
- recalc_text_size(window); | |
- window->redraw = 1; | |
-} | |
- | |
-void | |
-window_set_mode_extra_text(ledit_window *window, char *text) { | |
- free(window->mode_extra_text); | |
- window->mode_extra_text = ledit_strdup(text); | |
- window_set_mode(window, window->mode); | |
- window->redraw = 1; | |
-} | |
- | |
/* FIXME: give these functions more sensible names */ | |
static void | |
get_scroll_pos_height(ledit_window *window, double *pos_ret, double *height_re… | |
t@@ -483,8 +551,24 @@ xximspot(ledit_window *window, int x, int y) { | |
XSetICValues(window->xic, XNPreeditAttributes, window->spotlist, NULL); | |
} | |
+static struct bb_item * | |
+push_bb_item(ledit_window *window) { | |
+ if (window->bb->items_num == window->bb->items_alloc) { | |
+ size_t new_alloc = ideal_array_size(window->bb->items_alloc, a… | |
+ window->bb->items = ledit_reallocarray(window->bb->items, new_… | |
+ window->bb->items_alloc = new_alloc; | |
+ } | |
+ struct bb_item *item = &window->bb->items[window->bb->items_num]; | |
+ item->layout = pango_layout_new(window->context); | |
+ pango_layout_set_font_description(item->layout, window->font); | |
+ item->draw = draw_create(window, 10, 10); | |
+ item->w = item->h = 0; | |
+ window->bb->items_num++; | |
+ return item; | |
+} | |
+ | |
ledit_window * | |
-window_create(ledit_common *common, ledit_clipboard *clipboard, ledit_mode mod… | |
+window_create(ledit_common *common, ledit_clipboard *clipboard) { | |
XGCValues gcv; | |
ledit_theme *theme = config_get_theme(); | |
t@@ -492,12 +576,10 @@ window_create(ledit_common *common, ledit_clipboard *cli… | |
ledit_window *window = ledit_malloc(sizeof(ledit_window)); | |
window->first_resize = 1; | |
- window->mode = mode; | |
window->scroll_dragging = 0; | |
window->scroll_grab_handle = 0; | |
window->w = 500; | |
window->h = 500; | |
- window->mode_extra_text = NULL; | |
window->scroll_callback = NULL; | |
window->button_callback = NULL; | |
window->resize_callback = NULL; | |
t@@ -548,10 +630,9 @@ window_create(ledit_common *common, ledit_clipboard *clip… | |
window->clipboard = clipboard; | |
window->bb = ledit_malloc(sizeof(bottom_bar)); | |
- window->bb->mode = pango_layout_new(window->context); | |
- pango_layout_set_font_description(window->bb->mode, window->font); | |
- /* FIXME: only create "dummy draw" at first and create with proper siz… | |
- window->bb->mode_draw = draw_create(window, 10, 10); | |
+ window->bb->items = NULL; | |
+ window->bb->items_num = window->bb->items_alloc = 0; | |
+ window->bb->w_per_sep = 0; | |
window->bb->line = pango_layout_new(window->context); | |
pango_layout_set_font_description(window->bb->line, window->font); | |
pango_layout_set_wrap(window->bb->line, PANGO_WRAP_WORD_CHAR); | |
t@@ -596,18 +677,102 @@ window_create(ledit_common *common, ledit_clipboard *cl… | |
window->last_motion_valid = 0; | |
window->last_resize_valid = 0; | |
window->scroll_num = 0; | |
- recalc_text_size(window); | |
+ | |
+ /* setup format for bottom bar */ | |
+ /* FIXME: this seems ugly, there's probably a better way | |
+ also, it might still be buggy */ | |
+ char *fmt = ledit_strdup(theme->bar_fmt); | |
+ int offset = 0; | |
+ int in_text = 0; | |
+ int start = 0; | |
+ size_t i = 0; | |
+ struct bb_item *item = NULL; | |
+ for (; fmt[i] != '\0'; i++) { | |
+ if (fmt[i] == '%') { | |
+ i++; | |
+ if (fmt[i] == '%') { | |
+ if (!in_text) { | |
+ start = i; | |
+ offset = 0; | |
+ in_text = 1; | |
+ } else { | |
+ offset++; | |
+ } | |
+ } else { | |
+ if (in_text) { | |
+ item = push_bb_item(window); | |
+ item->type = BB_STR; | |
+ fmt[i - 1 - offset] = '\0'; | |
+ set_item_text(window, theme, item, fmt… | |
+ in_text = 0; | |
+ } | |
+ switch (fmt[i]) { | |
+ case 'l': | |
+ item = push_bb_item(window); | |
+ item->type = BB_LINE; | |
+ item->val.sz = 0; | |
+ break; | |
+ case 'b': | |
+ item = push_bb_item(window); | |
+ item->type = BB_BYTE; | |
+ item->val.sz = 0; | |
+ break; | |
+ case 'm': | |
+ item = push_bb_item(window); | |
+ item->type = BB_MODE; | |
+ item->val.m = VISUAL; | |
+ break; | |
+ case 'h': | |
+ item = push_bb_item(window); | |
+ item->type = BB_HLMODE; | |
+ item->val.i = -1; | |
+ break; | |
+ case 's': | |
+ /* FIXME: don't create layout and draw… | |
+ item = push_bb_item(window); | |
+ item->type = BB_SEP; | |
+ break; | |
+ default: | |
+ /* FIXME: better error reporting (also… | |
+ fprintf(stderr, "WARNING: Invalid form… | |
+ window_show_message(window, "Invalid f… | |
+ /* FIXME: it might make more sense to … | |
+ but this is the easiest */ | |
+ goto end; | |
+ } | |
+ } | |
+ } else if (!in_text) { | |
+ start = i; | |
+ offset = 0; | |
+ in_text = 1; | |
+ } | |
+ fmt[i - offset] = fmt[i]; | |
+ } | |
+ if (in_text) { | |
+ item = push_bb_item(window); | |
+ item->type = BB_STR; | |
+ fmt[i - offset] = '\0'; | |
+ set_item_text(window, theme, item, fmt + start); | |
+ } | |
+end: | |
+ free(fmt); | |
+ window_set_format_args(window, NORMAL, 1, 1, 1); | |
return window; | |
} | |
void | |
window_destroy(ledit_window *window) { | |
+ struct bb_item *items = window->bb->items; | |
+ for (size_t i = 0; i < window->bb->items_num; i++) { | |
+ if (items[i].layout) | |
+ g_object_unref(items[i].layout); | |
+ if (items[i].draw) | |
+ draw_destroy(window, items[i].draw); | |
+ } | |
+ free(window->bb->items); | |
/* FIXME: check what's still missing */ | |
- g_object_unref(window->bb->mode); | |
- /*g_object_unref(window->bb->ruler);*/ /* FIXME: implement ruler */ | |
g_object_unref(window->bb->line); | |
- draw_destroy(window, window->bb->mode_draw); | |
draw_destroy(window, window->bb->line_draw); | |
pango_font_description_free(window->font); | |
t@@ -621,8 +786,6 @@ window_destroy(ledit_window *window) { | |
XFree(window->spotlist); | |
XDestroyWindow(window->common->dpy, window->xwin); | |
- if (window->mode_extra_text) | |
- free(window->mode_extra_text); | |
free(window->bb->line_text); | |
free(window->bb); | |
free(window); | |
t@@ -703,12 +866,21 @@ window_redraw(ledit_window *window) { | |
window->text_h + (strong.y + strong.height) / PANGO_SCALE | |
); | |
} else { | |
- XCopyArea( | |
- window->common->dpy, window->bb->mode_draw->pixmap, | |
- window->drawable, window->gc, | |
- 0, 0, window->bb->mode_w, window->bb->mode_h, | |
- window->w - window->bb->mode_w, window->text_h | |
- ); | |
+ struct bb_item *items = window->bb->items; | |
+ int cur_x = 0; | |
+ for (size_t i = 0; i < window->bb->items_num; i++) { | |
+ if (items[i].type == BB_SEP) { | |
+ cur_x += window->bb->w_per_sep; | |
+ } else { | |
+ XCopyArea( | |
+ window->common->dpy, items[i].draw->pixmap, | |
+ window->drawable, window->gc, | |
+ 0, 0, items[i].w, items[i].h, | |
+ cur_x, window->text_h | |
+ ); | |
+ cur_x += items[i].w; | |
+ } | |
+ } | |
} | |
XdbeSwapInfo swap_info; | |
diff --git a/window.h b/window.h | |
t@@ -51,7 +51,6 @@ typedef struct { | |
int message_shown; /* whether a readonly message is shown at the… | |
bottom_bar *bb; /* encapsulates the text at the bottom */ | |
int redraw; /* whether something has changed and the wind… | |
- ledit_mode mode; /* mode of the view - a bit ugly to duplicate… | |
Cursor cursor_text; /* text cursor shown when cursor is over text… | |
/* stuff for filtering events so not too many have to be handled */ | |
t@@ -89,15 +88,12 @@ typedef struct { | |
void *scroll_cb_data; | |
void *button_cb_data; | |
void *resize_cb_data; | |
- | |
- /* extra text shown beside the mode display at the bottom */ | |
- char *mode_extra_text; | |
} ledit_window; | |
/* | |
* Create a window with initial mode 'mode'. | |
*/ | |
-ledit_window *window_create(ledit_common *common, ledit_clipboard *clipboard, … | |
+ledit_window *window_create(ledit_common *common, ledit_clipboard *clipboard); | |
/* | |
* Destroy a window. | |
t@@ -211,15 +207,8 @@ void window_hide_message(ledit_window *window); | |
*/ | |
int window_message_shown(ledit_window *window); | |
-/* | |
- * Set the displayed mode of the window. | |
- */ | |
-void window_set_mode(ledit_window *window, ledit_mode mode); | |
- | |
-/* | |
- * Set extra text that is shown to the right of the mode. | |
- */ | |
-void window_set_mode_extra_text(ledit_window *window, char *text); | |
+/* FIXME: document */ | |
+void window_set_format_args(ledit_window *window, ledit_mode mode, int hl_mode… | |
/* | |
* Set the total pixel height of the text. |