tFix various problems - 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 8c56c0d034a6e99583be2d9926946997c8fa82bb | |
parent b4c5e772118e3f198989732e3aee1146ef9b5217 | |
Author: lumidify <[email protected]> | |
Date: Wed, 22 Dec 2021 21:44:07 +0100 | |
Fix various problems | |
* Sort of clean up key types | |
* Change cursor type over text area | |
* Fix cache invalidation | |
* Make 'G' work with selections | |
* Improve themes | |
Diffstat: | |
M keys_basic.c | 38 +++++++++++++++++++----------… | |
M keys_basic_config.h | 226 ++++++++++++++---------------… | |
M keys_command.c | 2 +- | |
M ledit.1 | 2 ++ | |
M ledit.c | 1 + | |
M theme.c | 7 +++++++ | |
M theme.h | 5 +++++ | |
M theme_config.h | 5 +++-- | |
M view.c | 11 +++++++++-- | |
M window.c | 44 ++++++++++++++++-------------… | |
M window.h | 1 + | |
11 files changed, 174 insertions(+), 168 deletions(-) | |
--- | |
diff --git a/keys_basic.c b/keys_basic.c | |
t@@ -147,8 +147,8 @@ push_key_stack(void) { | |
key_stack.alloc = new_alloc; | |
} | |
e = &key_stack.stack[key_stack.len]; | |
- e->key = KEY_NONE; | |
- e->followup = KEY_NONE; | |
+ e->key = KEY_INVALID; | |
+ e->followup = KEY_INVALID; | |
e->motion_cb = NULL; | |
e->count = 0; | |
key_stack.len++; | |
t@@ -629,7 +629,10 @@ move_to_line(ledit_view *view, char *text, size_t len) { | |
ledit_line *ll = buffer_get_line(view->buffer, line - 1); | |
cb(view, line - 1, ll->len, KEY_MOTION_LINE); | |
} else { | |
- view_wipe_line_cursor_attrs(view, view->cur_line); | |
+ if (view->mode == NORMAL) | |
+ view_wipe_line_cursor_attrs(view, view->cur_line); | |
+ else | |
+ view_set_selection(view, view->sel.line1, view->sel.by… | |
view->cur_line = line - 1; | |
view->cur_index = 0; | |
int text_w, text_h; | |
t@@ -642,7 +645,8 @@ move_to_line(ledit_view *view, char *text, size_t len) { | |
vl->y_offset + h > view->display_offset + text_h) { | |
view_scroll(view, vl->y_offset - text_h / 2); | |
} | |
- view_set_line_cursor_attrs(view, view->cur_line, view->cur_ind… | |
+ if (view->mode == NORMAL) | |
+ view_set_line_cursor_attrs(view, view->cur_line, view-… | |
discard_repetition_stack(); | |
} | |
return (struct action){ACTION_NONE, NULL}; | |
t@@ -932,7 +936,7 @@ change(ledit_view *view, char *text, size_t len) { | |
return err_invalid_key(view); | |
} else { | |
struct key_stack_elem *e = push_key_stack(); | |
- e->key = KEY_MOTION; /* ? */ | |
+ e->key = KEY_MOTIONALLOWED; | |
e->count = num; | |
e->motion_cb = &change_cb; | |
} | |
t@@ -1010,7 +1014,7 @@ yank(ledit_view *view, char *text, size_t len) { | |
clear_key_stack(); | |
} else if (cb == NULL) { | |
struct key_stack_elem *e = push_key_stack(); | |
- e->key = KEY_MOTION; | |
+ e->key = KEY_MOTIONALLOWED; | |
e->count = num; | |
e->motion_cb = &yank_cb; | |
} else { | |
t@@ -1116,7 +1120,7 @@ delete(ledit_view *view, char *text, size_t len) { | |
return err_invalid_key(view); | |
} else { | |
struct key_stack_elem *e = push_key_stack(); | |
- e->key = KEY_MOTION; /* ? */ | |
+ e->key = KEY_MOTIONALLOWED; | |
e->count = num; | |
e->motion_cb = &delete_cb; | |
} | |
t@@ -2231,7 +2235,7 @@ toggle_hard_line_based(ledit_view *view, char *text, siz… | |
} | |
static struct action | |
-handle_key(ledit_view *view, char *key_text, size_t len, KeySym sym, unsigned … | |
+handle_key(ledit_view *view, char *key_text, size_t len, KeySym sym, unsigned … | |
struct key *cur_keys = keys[lang_index].keys; | |
int num_keys = keys[lang_index].num_keys; | |
struct key_stack_elem *e = peek_key_stack(); | |
t@@ -2249,18 +2253,21 @@ handle_key(ledit_view *view, char *key_text, size_t le… | |
if (cur_keys[i].text) { | |
if (len > 0 && | |
(cur_keys[i].modes & view->mode) && | |
- (!e || (e->key & cur_keys[i].prev_keys)) && | |
+ (cur_keys[i].prev_keys == KEY_ANY || (!e && (cur_k… | |
((!strncmp(cur_keys[i].text, key_text, len) && | |
match_key(cur_keys[i].mods, key_state & ~ShiftM… | |
cur_keys[i].text[0] == '\0')) { | |
/* FIXME: seems a bit hacky to remove shift, b… | |
is needed to make keys that use shift match… | |
+ *type = cur_keys[i].type; | |
*found = 1; | |
return cur_keys[i].func(view, key_text, len); | |
} | |
} else if ((cur_keys[i].modes & view->mode) && | |
- cur_keys[i].keysym == sym && | |
- match_key(cur_keys[i].mods, key_state)) { | |
+ cur_keys[i].keysym == sym && | |
+ (cur_keys[i].prev_keys == KEY_ANY || (!e && (cur_ke… | |
+ match_key(cur_keys[i].mods, key_state)) { | |
+ *type = cur_keys[i].type; | |
*found = 1; | |
return cur_keys[i].func(view, key_text, len); | |
} | |
t@@ -2284,12 +2291,13 @@ repeat_command(ledit_view *view, char *text, size_t le… | |
return (struct action){ACTION_NONE, NULL}; | |
} | |
int found; | |
+ enum key_type type; | |
repetition_stack.replaying = 1; | |
for (int i = 0; i < num; i++) { | |
unwind_repetition_stack(); | |
struct repetition_stack_elem *e = get_cur_repetition_stack_ele… | |
while (e) { | |
- (void)handle_key(view, e->key_text, e->len, e->sym, e-… | |
+ (void)handle_key(view, e->key_text, e->len, e->sym, e-… | |
advance_repetition_stack(); | |
e = get_cur_repetition_stack_elem(); | |
} | |
t@@ -2322,14 +2330,14 @@ basic_key_handler(ledit_view *view, XEvent *event, int… | |
int found = 0; | |
int msg_shown = view->window->message_shown; | |
view->window->message_shown = 0; /* FIXME: this is hacky */ | |
- struct action act = handle_key(view, buf, (size_t)n, sym, key_state, l… | |
+ enum key_type type; | |
+ struct action act = handle_key(view, buf, (size_t)n, sym, key_state, l… | |
if (found && n > 0 && !view->window->message_shown) | |
window_hide_message(view->window); | |
else if (msg_shown) | |
view->window->message_shown = msg_shown; | |
- /* FIXME: add attribute for this to keys - this doesn't take e.g. curs… | |
- if (found && n > 0) | |
+ if (found && (type & KEY_ENSURE_CURSOR_SHOWN)) | |
view_ensure_cursor_shown(view); | |
if (!found && n > 0) | |
window_show_message(view->window, "Invalid key", -1); | |
diff --git a/keys_basic_config.h b/keys_basic_config.h | |
t@@ -2,17 +2,21 @@ | |
* These are all the regular keys used in normal, visual, and insert mode. | |
*/ | |
-/* FIXME: these aren't really used properly */ | |
+/* | |
+ * Note: The key types are currently very inconsistent and don't always make | |
+ * sense. This will hopefully be fixed sometime. (FIXME) | |
+ */ | |
+ | |
enum key_type { | |
- KEY_NONE = 0, | |
- KEY_MISC = 1, | |
- KEY_CHAR = 2, | |
+ KEY_INVALID = 0, | |
+ KEY_NONE = 2, | |
KEY_MOTION_CHAR = 4, | |
KEY_MOTION_LINE = 8, | |
KEY_MOTION = 4|8, | |
- KEY_NUMBER = 16, | |
- KEY_NUMBERALLOWED = 32, | |
- KEY_ACTIONCALLBACK = 64, | |
+ KEY_MOTIONALLOWED = 16, | |
+ KEY_NUMBER = 32, | |
+ KEY_NUMBERALLOWED = 64, | |
+ KEY_ENSURE_CURSOR_SHOWN = 128, /* jump to cursor if it is off screen */ | |
KEY_ANY = 0xFF | |
}; | |
t@@ -20,9 +24,9 @@ struct key { | |
char *text; /* for keys that … | |
unsigned int mods; /* modifier mask … | |
KeySym keysym; /* for other keys… | |
- ledit_mode modes; /* modes in which this… | |
+ ledit_mode modes; /* modes in which… | |
enum key_type prev_keys; /* allowed previo… | |
- enum key_type key_types; /* key types - us… | |
+ enum key_type type; /* type of key - … | |
struct action (*func)(ledit_view *, char *, size_t); /* callback funct… | |
}; | |
t@@ -102,133 +106,103 @@ static struct action toggle_hard_line_based(ledit_view… | |
/* FIXME: maybe sort these and use binary search | |
-> but that would mess with the catch-all keys */ | |
-/* FIXME: sort out the key types */ | |
static struct key keys_en[] = { | |
- {NULL, 0, XK_BackSpace, INSERT, KEY_ANY, KEY_ANY, &backspace}, | |
- {NULL, 0, XK_Left, VISUAL|INSERT|NORMAL, KEY_ANY, KEY_ANY, &cursor_lef… | |
- {NULL, 0, XK_Right, VISUAL|INSERT|NORMAL, KEY_ANY, KEY_ANY, &cursor_ri… | |
- {NULL, 0, XK_Up, VISUAL|INSERT|NORMAL, KEY_ANY, KEY_ANY, &cursor_up}, | |
- {NULL, 0, XK_Down, VISUAL|INSERT|NORMAL, KEY_ANY, KEY_ANY, &cursor_dow… | |
- {NULL, XK_ANY_MOD, XK_Return, INSERT, KEY_ANY, KEY_ANY, &return_key}, | |
- {NULL, 0, XK_Delete, INSERT, KEY_ANY, KEY_ANY, &delete_key}, | |
- {NULL, 0, XK_Escape, NORMAL|VISUAL|INSERT, KEY_ANY, KEY_ANY, &escape_k… | |
- {"i", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_ANY, &enter_insert}, | |
- {"h", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_MOTION | KEY_NUMBERALLOWED, &… | |
- {"l", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_MOTION | KEY_NUMBERALLOWED, &… | |
- {"j", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_MOTION | KEY_NUMBERALLOWED, &… | |
- {"k", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_MOTION | KEY_NUMBERALLOWED, &… | |
- {"h", ControlMask, 0, NORMAL|VISUAL, KEY_ANY, KEY_MOTION | KEY_NUMBER… | |
- {"t", ControlMask, 0, NORMAL|VISUAL, KEY_ANY, KEY_ANY, &toggle_hard_l… | |
- {NULL, 0, XK_space, NORMAL|VISUAL, KEY_ANY, KEY_MOTION | KEY_NUMBERAL… | |
- {"j", ControlMask, 0, NORMAL|VISUAL, KEY_ANY, KEY_MOTION | KEY_NUMBER… | |
- {"n", ControlMask, 0, NORMAL|VISUAL, KEY_ANY, KEY_MOTION | KEY_NUMBER… | |
- {"p", ControlMask, 0, NORMAL|VISUAL, KEY_ANY, KEY_MOTION | KEY_NUMBER… | |
- {"0", 0, 0, NORMAL|VISUAL, ~KEY_NUMBER, KEY_ANY, &cursor_to_beginning… | |
- {"0", 0, 0, NORMAL|VISUAL, KEY_NUMBER, KEY_NUMBER, &push_0}, | |
- {"1", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_NUMBER, &push_1}, | |
- {"2", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_NUMBER, &push_2}, | |
- {"3", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_NUMBER, &push_3}, | |
- {"4", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_NUMBER, &push_4}, | |
- {"5", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_NUMBER, &push_5}, | |
- {"6", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_NUMBER, &push_6}, | |
- {"7", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_NUMBER, &push_7}, | |
- {"8", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_NUMBER, &push_8}, | |
- {"9", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_NUMBER, &push_9}, | |
- {"x", 0, 0, NORMAL, KEY_ANY, KEY_NUMBERALLOWED, &delete_chars_forward… | |
- {"X", 0, 0, NORMAL, KEY_ANY, KEY_NUMBERALLOWED, &delete_chars_backwar… | |
- {"d", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_MOTION|KEY_NUMBERALLOWED, &de… | |
- {"y", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_MOTION|KEY_NUMBERALLOWED, &ya… | |
- {"Y", 0, 0, NORMAL, KEY_ANY, KEY_NUMBERALLOWED, &yank_lines}, | |
- {"c", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_MOTION|KEY_NUMBERALLOWED, &ch… | |
- {"v", 0, 0, NORMAL, KEY_ANY, KEY_ANY, &enter_visual}, | |
- {"o", 0, 0, VISUAL, KEY_ANY, KEY_ANY, &switch_selection_end}, | |
- {"c", ControlMask, 0, VISUAL, KEY_ANY, KEY_ANY, &clipcopy}, | |
- {"v", ControlMask, 0, INSERT, KEY_ANY, KEY_ANY, &clippaste}, | |
- {"g", ControlMask, 0, NORMAL|VISUAL, KEY_ANY, KEY_ANY, &show_line}, | |
- {":", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_ANY, &enter_commandedit}, | |
- {"?", 0, 0, NORMAL, KEY_ANY, KEY_ANY, &enter_searchedit_backward}, | |
- {"/", 0, 0, NORMAL, KEY_ANY, KEY_ANY, &enter_searchedit_forward}, | |
- {"n", 0, 0, NORMAL, KEY_ANY, KEY_ANY, &key_search_next}, | |
- {"N", 0, 0, NORMAL, KEY_ANY, KEY_ANY, &key_search_prev}, | |
- {"u", 0, 0, NORMAL, KEY_ANY, KEY_ANY, &undo}, | |
- {"U", 0, 0, NORMAL, KEY_ANY, KEY_ANY, &redo}, | |
- {".", 0, 0, NORMAL, KEY_ANY, KEY_ANY, &repeat_command}, /* FIXME: onl… | |
- {"z", ControlMask, 0, INSERT, KEY_ANY, KEY_ANY, &undo}, | |
- {"y", ControlMask, 0, INSERT, KEY_ANY, KEY_ANY, &redo}, /* FIXME: thi… | |
- {"b", ControlMask, 0, NORMAL, KEY_ANY, KEY_NUMBERALLOWED, &screen_up}, | |
- {"f", ControlMask, 0, NORMAL, KEY_ANY, KEY_NUMBERALLOWED, &screen_dow… | |
- {"e", ControlMask, 0, NORMAL, KEY_ANY, KEY_NUMBERALLOWED, &scroll_wit… | |
- {"y", ControlMask, 0, NORMAL, KEY_ANY, KEY_NUMBERALLOWED, &scroll_wit… | |
- {"d", ControlMask, 0, NORMAL, KEY_ANY, KEY_NUMBERALLOWED, &scroll_lin… | |
- {"u", ControlMask, 0, NORMAL, KEY_ANY, KEY_NUMBERALLOWED, &scroll_lin… | |
- {"$", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_NUMBERALLOWED, &move_to_eol}, | |
- {"w", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_NUMBERALLOWED, &next_word}, | |
- {"e", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_NUMBERALLOWED, &next_word_end… | |
- {"W", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_NUMBERALLOWED, &next_bigword}, | |
- {"E", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_NUMBERALLOWED, &next_bigword_… | |
- {"b", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_NUMBERALLOWED, &prev_word}, | |
- {"B", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_NUMBERALLOWED, &prev_bigword}, | |
- {"G", 0, 0, NORMAL, KEY_ANY, KEY_NUMBERALLOWED, &move_to_line}, | |
- {"J", 0, 0, NORMAL, KEY_ANY, KEY_NUMBERALLOWED, &join_lines}, | |
- {"I", 0, 0, NORMAL, KEY_ANY, KEY_ANY, &insert_at_beginning}, | |
- {"p", 0, 0, NORMAL, KEY_ANY, KEY_ANY, &paste_normal}, | |
- {"P", 0, 0, NORMAL, KEY_ANY, KEY_ANY, &paste_normal_backwards}, | |
- {"A", 0, 0, NORMAL, KEY_ANY, KEY_ANY, &append_after_eol}, | |
- {"a", 0, 0, NORMAL, KEY_ANY, KEY_ANY, &append_after_cursor}, | |
- {"O", 0, 0, NORMAL, KEY_ANY, KEY_ANY, &append_line_above}, | |
- {"o", 0, 0, NORMAL, KEY_ANY, KEY_ANY, &append_line_below}, | |
- {"m", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_ANY, &mark_line}, | |
- {"'", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_ANY, &jump_to_mark}, | |
- {"C", 0, 0, NORMAL, KEY_ANY, KEY_ANY, &change_to_eol}, | |
- {"D", 0, 0, NORMAL, KEY_ANY, KEY_ANY, &delete_to_eol}, | |
- {"r", 0, 0, NORMAL, KEY_ANY, KEY_ANY, &replace}, | |
- {"^", 0, 0, NORMAL, KEY_ANY, KEY_ANY, &cursor_to_first_non_ws}, | |
- {"t", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_NUMBERALLOWED, &find_next_cha… | |
- {"T", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_NUMBERALLOWED, &find_next_cha… | |
- {"f", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_NUMBERALLOWED, &find_char_for… | |
- {"F", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_NUMBERALLOWED, &find_char_bac… | |
- {"", 0, 0, INSERT, KEY_ANY, KEY_ANY, &insert_mode_insert_text} | |
+ {NULL, 0, XK_BackSpace, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &bac… | |
+ {NULL, 0, XK_Left, VISUAL|INSERT|NORMAL, KEY_NONE|KEY_MOTIONALLOWED|KE… | |
+ {NULL, 0, XK_Right, VISUAL|INSERT|NORMAL, KEY_NONE|KEY_MOTIONALLOWED|K… | |
+ {NULL, 0, XK_Up, VISUAL|INSERT|NORMAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_… | |
+ {NULL, 0, XK_Down, VISUAL|INSERT|NORMAL, KEY_NONE|KEY_MOTIONALLOWED|KE… | |
+ {NULL, XK_ANY_MOD, XK_Return, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN… | |
+ {NULL, 0, XK_Delete, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &delete… | |
+ {NULL, 0, XK_Escape, NORMAL|VISUAL|INSERT, KEY_ANY, KEY_ENSURE_CURSOR_… | |
+ {"i", 0, 0, NORMAL|VISUAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &enter_… | |
+ {"h", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY… | |
+ {"l", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY… | |
+ {"j", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY… | |
+ {"k", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY… | |
+ {"h", ControlMask, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_N… | |
+ {"t", ControlMask, 0, NORMAL|VISUAL, KEY_ANY, KEY_NONE, &toggle_hard_… | |
+ {NULL, 0, XK_space, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUM… | |
+ {"j", ControlMask, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_N… | |
+ {"n", ControlMask, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_N… | |
+ {"p", ControlMask, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_N… | |
+ {"0", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED, KEY_ENSURE_CUR… | |
+ {"0", 0, 0, NORMAL|VISUAL, KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &push… | |
+ {"1", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY… | |
+ {"2", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY… | |
+ {"3", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY… | |
+ {"4", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY… | |
+ {"5", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY… | |
+ {"6", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY… | |
+ {"7", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY… | |
+ {"8", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY… | |
+ {"9", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY… | |
+ {"x", 0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &de… | |
+ {"X", 0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &de… | |
+ {"d", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY… | |
+ {"y", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY… | |
+ {"Y", 0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &ya… | |
+ {"c", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY… | |
+ {"v", 0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &enter_visual}, | |
+ {"o", 0, 0, VISUAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &switch_select… | |
+ {"c", ControlMask, 0, VISUAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &cli… | |
+ {"v", ControlMask, 0, INSERT, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &cli… | |
+ {"g", ControlMask, 0, NORMAL|VISUAL, KEY_ANY, KEY_NONE, &show_line}, | |
+ {":", 0, 0, NORMAL|VISUAL, KEY_NONE, KEY_NONE, &enter_commandedit}, | |
+ {"?", 0, 0, NORMAL, KEY_NONE, KEY_NONE, &enter_searchedit_backward}, | |
+ {"/", 0, 0, NORMAL, KEY_NONE, KEY_NONE, &enter_searchedit_forward}, | |
+ {"n", 0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &key_search_ne… | |
+ {"N", 0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &key_search_pr… | |
+ {"u", 0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &un… | |
+ {"U", 0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &re… | |
+ {".", 0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &re… | |
+ {"z", ControlMask, 0, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &undo… | |
+ {"y", ControlMask, 0, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &redo… | |
+ {"b", ControlMask, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_… | |
+ {"f", ControlMask, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_… | |
+ {"e", ControlMask, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_… | |
+ {"y", ControlMask, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_… | |
+ {"d", ControlMask, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_… | |
+ {"u", ControlMask, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_… | |
+ {"$", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED, KEY_ENSURE_CUR… | |
+ {"w", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY… | |
+ {"e", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY… | |
+ {"W", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY… | |
+ {"E", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY… | |
+ {"b", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY… | |
+ {"B", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY… | |
+ {"G", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY… | |
+ {"J", 0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &jo… | |
+ {"I", 0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &insert_at_beg… | |
+ {"p", 0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &paste_normal}, | |
+ {"P", 0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &paste_normal_… | |
+ {"A", 0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &append_after_… | |
+ {"a", 0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &append_after_… | |
+ {"O", 0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &append_line_a… | |
+ {"o", 0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &append_line_b… | |
+ {"m", 0, 0, NORMAL|VISUAL, KEY_NONE, KEY_NONE, &mark_line}, | |
+ {"'", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED, KEY_ENSURE_CUR… | |
+ {"C", 0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &change_to_eol… | |
+ {"D", 0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &delete_to_eol… | |
+ {"r", 0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &replace}, | |
+ {"^", 0, 0, NORMAL, KEY_NONE|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHO… | |
+ {"t", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY… | |
+ {"T", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY… | |
+ {"f", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY… | |
+ {"F", 0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY… | |
+ {"", 0, 0, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &insert_mode_inse… | |
}; | |
static struct key keys_de[] = { | |
- {"", 0, 0, INSERT, KEY_ANY, KEY_ANY, &insert_mode_insert_text} | |
+ {"", 0, 0, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &insert_mode_inse… | |
}; | |
static struct key keys_ur[] = { | |
- {NULL, 0, XK_BackSpace, INSERT, KEY_ANY, KEY_ANY, &backspace}, | |
- {NULL, 0, XK_Left, INSERT|NORMAL, KEY_ANY, KEY_ANY, &cursor_left}, | |
- {NULL, 0, XK_Right, INSERT|NORMAL, KEY_ANY, KEY_ANY, &cursor_right}, | |
- {NULL, 0, XK_Up, INSERT|NORMAL, KEY_ANY, KEY_ANY, &cursor_up}, | |
- {NULL, 0, XK_Down, INSERT|NORMAL, KEY_ANY, KEY_ANY, &cursor_down}, | |
- {NULL, 0, XK_Return, INSERT, KEY_ANY, KEY_ANY, &return_key}, | |
- {NULL, 0, XK_Delete, INSERT, KEY_ANY, KEY_ANY, &delete_key}, | |
- {NULL, 0, XK_Escape, INSERT, KEY_ANY, KEY_ANY, &escape_key}, | |
- {"ی", 0, 0, NORMAL, KEY_ANY, KEY_ANY, &enter_insert}, | |
- {"Ø", 0, 0, NORMAL, KEY_ANY, KEY_MOTION | KEY_NUMBERALLOWED, &cursor… | |
- {"Ù„", 0, 0, NORMAL, KEY_ANY, KEY_MOTION | KEY_NUMBERALLOWED, &cursor… | |
- {"ج", 0, 0, NORMAL, KEY_ANY, KEY_MOTION | KEY_NUMBERALLOWED, &cursor… | |
- {"Ú©", 0, 0, NORMAL, KEY_ANY, KEY_MOTION | KEY_NUMBERALLOWED, &cursor… | |
- {"0", 0, 0, NORMAL, KEY_ANY, KEY_ANY, &cursor_to_beginning}, | |
- {"Ú†", ControlMask, 0, INSERT|VISUAL, KEY_ANY, KEY_ANY, &clipcopy}, | |
- {"", 0, 0, INSERT, KEY_ANY, KEY_ANY, &insert_mode_insert_text} | |
+ {"", 0, 0, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &insert_mode_inse… | |
}; | |
static struct key keys_hi[] = { | |
- {NULL, 0, XK_BackSpace, INSERT, KEY_ANY, KEY_ANY, &backspace}, | |
- {NULL, 0, XK_Left, INSERT|NORMAL, KEY_ANY, KEY_ANY, &cursor_left}, | |
- {NULL, 0, XK_Right, INSERT|NORMAL, KEY_ANY, KEY_ANY, &cursor_right}, | |
- {NULL, 0, XK_Up, INSERT|NORMAL, KEY_ANY, KEY_ANY, &cursor_up}, | |
- {NULL, 0, XK_Down, INSERT|NORMAL, KEY_ANY, KEY_ANY, &cursor_down}, | |
- {NULL, 0, XK_Return, INSERT, KEY_ANY, KEY_ANY, &return_key}, | |
- {NULL, 0, XK_Delete, INSERT, KEY_ANY, KEY_ANY, &delete_key}, | |
- {NULL, 0, XK_Escape, INSERT, KEY_ANY, KEY_ANY, &escape_key}, | |
- {"ि", 0, 0, NORMAL, KEY_ANY, KEY_ANY, &enter_insert}, | |
- {"ह", 0, 0, NORMAL, KEY_ANY, KEY_MOTION | KEY_NUMBERALLOWED, &curso… | |
- {"ल", 0, 0, NORMAL, KEY_ANY, KEY_MOTION | KEY_NUMBERALLOWED, &curso… | |
- {"ज", 0, 0, NORMAL, KEY_ANY, KEY_MOTION | KEY_NUMBERALLOWED, &curso… | |
- {"क", 0, 0, NORMAL, KEY_ANY, KEY_MOTION | KEY_NUMBERALLOWED, &curso… | |
- {"0", 0, 0, NORMAL, KEY_ANY, KEY_ANY, &cursor_to_beginning}, | |
- {"", 0, 0, INSERT, KEY_ANY, KEY_ANY, &insert_mode_insert_text} | |
+ {"", 0, 0, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &insert_mode_inse… | |
}; | |
GEN_KEY_ARRAY(struct key, keys_en, keys_de, keys_ur, keys_hi); | |
diff --git a/keys_command.c b/keys_command.c | |
t@@ -307,7 +307,7 @@ substitute_all_remaining(ledit_view *view) { | |
} | |
if (min_line < view->lines_num) | |
buffer_recalc_all_views_from_line(view->buffer, min_line); | |
- window_show_message_fmt(view->window, "Replaced %d occurrences", sub_s… | |
+ window_show_message_fmt(view->window, "Replaced %d occurrence(s)", sub… | |
/* this doesn't need to be added to the undo stack since it's called o… | |
view->cur_index = view_get_legal_normal_pos(view, view->cur_line, view… | |
view_set_line_cursor_attrs(view, view->cur_line, view->cur_index); | |
diff --git a/ledit.1 b/ledit.1 | |
t@@ -1,6 +1,8 @@ | |
.\" TODO: | |
.\" paste buffer line vs. char oriented | |
.\" bigword, etc. | |
+.\" commands - no good way for mapping found | |
+.\" difference between unicode char and grapheme | |
.\" | |
.\" WARNING: Some parts of this are stolen shamelessly from OpenBSD's | |
.\" vi(1) manpage! | |
diff --git a/ledit.c b/ledit.c | |
t@@ -91,6 +91,7 @@ mainloop(void) { | |
change_kbd = 1; | |
continue; | |
} | |
+ /* FIXME: why None? */ | |
if (XFilterEvent(&event, None)) | |
continue; | |
ledit_view *view = NULL; | |
diff --git a/theme.c b/theme.c | |
t@@ -13,13 +13,18 @@ theme_create(ledit_common *common) { | |
ledit_theme *theme = ledit_malloc(sizeof(ledit_theme)); | |
theme->scrollbar_width = SCROLLBAR_WIDTH; | |
theme->scrollbar_step = SCROLLBAR_STEP; | |
+ theme->text_font = TEXT_FONT; | |
theme->text_size = TEXT_SIZE; | |
theme->text_fg_hex = TEXT_FG; | |
theme->text_bg_hex = TEXT_BG; | |
+ theme->bar_fg_hex = BAR_FG; | |
+ theme->bar_bg_hex = BAR_BG; | |
theme->scrollbar_fg_hex = SCROLLBAR_FG; | |
theme->scrollbar_bg_hex = SCROLLBAR_BG; | |
XftColorAllocName(common->dpy, common->vis, common->cm, TEXT_FG, &them… | |
XftColorAllocName(common->dpy, common->vis, common->cm, TEXT_BG, &them… | |
+ XftColorAllocName(common->dpy, common->vis, common->cm, BAR_FG, &theme… | |
+ XftColorAllocName(common->dpy, common->vis, common->cm, BAR_BG, &theme… | |
XftColorAllocName(common->dpy, common->vis, common->cm, SCROLLBAR_FG, … | |
XftColorAllocName(common->dpy, common->vis, common->cm, SCROLLBAR_BG, … | |
return theme; | |
t@@ -29,6 +34,8 @@ void | |
theme_destroy(ledit_common *common, ledit_theme *theme) { | |
XftColorFree(common->dpy, common->vis, common->cm, &theme->text_fg); | |
XftColorFree(common->dpy, common->vis, common->cm, &theme->text_bg); | |
+ XftColorFree(common->dpy, common->vis, common->cm, &theme->bar_fg); | |
+ XftColorFree(common->dpy, common->vis, common->cm, &theme->bar_bg); | |
XftColorFree(common->dpy, common->vis, common->cm, &theme->scrollbar_f… | |
XftColorFree(common->dpy, common->vis, common->cm, &theme->scrollbar_b… | |
free(theme); | |
diff --git a/theme.h b/theme.h | |
t@@ -10,10 +10,15 @@ typedef struct { | |
int text_size; | |
XftColor text_fg; | |
XftColor text_bg; | |
+ XftColor bar_fg; | |
+ XftColor bar_bg; | |
XftColor scrollbar_fg; | |
XftColor scrollbar_bg; | |
+ const char *text_font; | |
const char *text_fg_hex; | |
const char *text_bg_hex; | |
+ const char *bar_fg_hex; | |
+ const char *bar_bg_hex; | |
const char *scrollbar_fg_hex; | |
const char *scrollbar_bg_hex; | |
} ledit_theme; | |
diff --git a/theme_config.h b/theme_config.h | |
t@@ -1,8 +1,9 @@ | |
-/* FIXME: different bg for bottom bar */ | |
-/* FIXME: configure font here */ | |
+static const char *TEXT_FONT = "Monospace"; | |
static const int TEXT_SIZE = 12; | |
static const char *TEXT_FG = "#000000"; | |
static const char *TEXT_BG = "#FFFFFF"; | |
+static const char *BAR_FG = "#000000"; | |
+static const char *BAR_BG = "#CCCCCC"; | |
/* FIXME: give in units other than pixels */ | |
static const int SCROLLBAR_WIDTH = 10; | |
diff --git a/view.c b/view.c | |
t@@ -229,6 +229,10 @@ view_notify_delete_text(ledit_view *view, size_t line, si… | |
void | |
view_notify_append_line(ledit_view *view, size_t line) { | |
+ cache_invalidate_from_line( | |
+ view->cache, line + 1, view, | |
+ &invalidate_pixmap_line_helper, &invalidate_layout_line_helper | |
+ ); | |
resize_and_move_line_gap(view, add_sz(view->lines_num, 1), line + 1); | |
if (line < view->cur_line) | |
view->cur_line++; | |
t@@ -1756,11 +1760,12 @@ static void | |
view_button_handler(void *data, XEvent *event) { | |
size_t l, b; | |
ledit_view *view= (ledit_view *)data; | |
- int x = event->xbutton.x; | |
- int y = event->xbutton.y; | |
+ int x, y; | |
int snap; | |
switch (event->type) { | |
case ButtonPress: | |
+ x = event->xbutton.x; | |
+ y = event->xbutton.y; | |
snap = view->mode == NORMAL ? 0 : 1; | |
view_xy_to_line_byte(view, x, y, snap, &l, &b); | |
view->selecting = 1; | |
t@@ -1780,6 +1785,8 @@ view_button_handler(void *data, XEvent *event) { | |
view->selecting = 0; | |
break; | |
case MotionNotify: | |
+ x = event->xmotion.x; | |
+ y = event->xmotion.y; | |
if (view->selecting) { | |
y = y >= 0 ? y : 0; | |
view_xy_to_line_byte(view, x, y, 1, &l, &b); | |
diff --git a/window.c b/window.c | |
t@@ -8,6 +8,7 @@ | |
#include <X11/Xlib.h> | |
#include <X11/Xatom.h> | |
#include <X11/Xutil.h> | |
+#include <X11/cursorfont.h> | |
#include <pango/pangoxft.h> | |
#include <X11/extensions/Xdbe.h> | |
t@@ -122,8 +123,8 @@ redraw_line_text(ledit_window *window) { | |
pango_layout_set_text(window->bb->line, window->bb->line_text, window-… | |
pango_layout_get_pixel_size(window->bb->line, &window->bb->line_w, &wi… | |
draw_grow(window, window->bb->line_draw, window->bb->line_w, window->b… | |
- XftDrawRect(window->bb->line_draw->xftdraw, &window->theme->text_bg, 0… | |
- pango_xft_render_layout(window->bb->line_draw->xftdraw, &window->theme… | |
+ XftDrawRect(window->bb->line_draw->xftdraw, &window->theme->bar_bg, 0,… | |
+ pango_xft_render_layout(window->bb->line_draw->xftdraw, &window->theme… | |
recalc_text_size(window); | |
window->redraw = 1; | |
} | |
t@@ -231,15 +232,8 @@ window_delete_bottom_bar_char(ledit_window *window, int d… | |
); | |
window->bb->line_len -= (byte - window->bb->line_cur_pos); | |
} | |
- /* FIXME: move to separate function */ | |
window->bb->line_text[window->bb->line_len] = '\0'; | |
- pango_layout_set_text(window->bb->line, window->bb->line_text, window-… | |
- pango_layout_get_pixel_size(window->bb->line, &window->bb->line_w, &wi… | |
- draw_grow(window, window->bb->line_draw, window->bb->line_w, window->b… | |
- XftDrawRect(window->bb->line_draw->xftdraw, &window->theme->text_bg, 0… | |
- pango_xft_render_layout(window->bb->line_draw->xftdraw, &window->theme… | |
- recalc_text_size(window); | |
- window->redraw = 1; | |
+ redraw_line_text(window); | |
} | |
void | |
t@@ -358,8 +352,8 @@ window_set_mode(ledit_window *window, ledit_mode mode) { | |
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, &window->theme->text_bg, 0… | |
- pango_xft_render_layout(window->bb->mode_draw->xftdraw, &window->theme… | |
+ XftDrawRect(window->bb->mode_draw->xftdraw, &window->theme->bar_bg, 0,… | |
+ pango_xft_render_layout(window->bb->mode_draw->xftdraw, &window->theme… | |
recalc_text_size(window); | |
window->redraw = 1; | |
} | |
t@@ -545,7 +539,7 @@ window_create(ledit_common *common, ledit_theme *theme, le… | |
/* FIXME: FocusChangeMask? */ | |
window->wattrs.event_mask = KeyPressMask | | |
ExposureMask | VisibilityChangeMask | StructureNotifyMask | | |
- ButtonMotionMask | ButtonPressMask | ButtonReleaseMask; | |
+ PointerMotionMask | ButtonPressMask | ButtonReleaseMask; | |
window->xwin = XCreateWindow( | |
common->dpy, DefaultRootWindow(common->dpy), 0, 0, | |
window->w, window->h, 0, common->depth, | |
t@@ -567,8 +561,7 @@ window_create(ledit_common *common, ledit_theme *theme, le… | |
window->fontmap = pango_xft_get_font_map(common->dpy, common->screen); | |
window->context = pango_font_map_create_context(window->fontmap); | |
- /* FIXME: theme font name */ | |
- window->font = pango_font_description_from_string("Monospace"); | |
+ window->font = pango_font_description_from_string(theme->text_font); | |
pango_font_description_set_size(window->font, theme->text_size * PANGO… | |
window->wm_delete_msg = XInternAtom(common->dpy, "WM_DELETE_WINDOW", F… | |
t@@ -577,7 +570,6 @@ window_create(ledit_common *common, ledit_theme *theme, le… | |
window->common = common; | |
window->theme = theme; | |
- /* FIXME: theme font */ | |
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); | |
t@@ -619,6 +611,7 @@ window_create(ledit_common *common, ledit_theme *theme, le… | |
if (window->xtarget == None) | |
window->xtarget = XA_STRING; | |
+ window->cursor_text = XCreateFontCursor(window->common->dpy, XC_xterm); | |
/* | |
ledit_clear_window(window); | |
ledit_redraw_window(window); | |
t@@ -692,7 +685,7 @@ window_redraw(ledit_window *window) { | |
window->common->dpy, window->drawable, window->gc, | |
window->w - t->scrollbar_width, 0, t->scrollbar_width, win… | |
); | |
- XSetForeground(window->common->dpy, window->gc, t->text_fg.pix… | |
+ XSetForeground(window->common->dpy, window->gc, t->scrollbar_f… | |
double scroll_h, scroll_y; | |
get_scroll_pos_height(window, &scroll_y, &scroll_h); | |
XFillRectangle( | |
t@@ -701,8 +694,7 @@ window_redraw(ledit_window *window) { | |
t->scrollbar_width, (int)round(scroll_h) | |
); | |
} | |
- XSetForeground(window->common->dpy, window->gc, t->text_bg.pixel); | |
- /* FIXME: allow different color for bar */ | |
+ XSetForeground(window->common->dpy, window->gc, t->bar_bg.pixel); | |
XFillRectangle( | |
window->common->dpy, window->drawable, window->gc, | |
0, window->text_h, | |
t@@ -716,7 +708,7 @@ window_redraw(ledit_window *window) { | |
0, window->text_h | |
); | |
} else if (window->bottom_text_shown) { | |
- XSetForeground(window->common->dpy, window->gc, t->text_fg.pix… | |
+ XSetForeground(window->common->dpy, window->gc, t->bar_fg.pixe… | |
/* move input method position to cursor and draw cursor */ | |
PangoRectangle strong, weak; | |
pango_layout_get_cursor_pos( | |
t@@ -1027,6 +1019,14 @@ window_register_resize(ledit_window *window, XEvent *ev… | |
void | |
window_register_motion(ledit_window *window, XEvent *event) { | |
+ /* cursor should always change, even if time has not elapsed */ | |
+ int x = event->xmotion.x; | |
+ int y = event->xmotion.y; | |
+ /* FIXME: avoid these calls if nothing has changed */ | |
+ if (x < window->text_w && y < window->text_h) | |
+ XDefineCursor(window->common->dpy, window->xwin, window->curso… | |
+ else | |
+ XDefineCursor(window->common->dpy, window->xwin, None); | |
window->last_motion_event = *event; | |
window->last_motion_valid = 1; | |
} | |
t@@ -1084,8 +1084,8 @@ window_drag_motion(ledit_window *window, XEvent *event) { | |
if (window->scroll_dragging) { | |
double scroll_h, scroll_y; | |
get_scroll_pos_height(window, &scroll_y, &scroll_h); | |
- scroll_y += event->xbutton.y - window->scroll_grab_handle; | |
- window->scroll_grab_handle = event->xbutton.y; | |
+ scroll_y += event->xmotion.y - window->scroll_grab_handle; | |
+ window->scroll_grab_handle = event->xmotion.y; | |
set_scroll_pos(window, scroll_y); | |
window->redraw = 1; | |
} else { | |
diff --git a/window.h b/window.h | |
t@@ -53,6 +53,7 @@ typedef struct { | |
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 */ | |
struct timespec last_scroll; |