Skip to content

Commit

Permalink
Introduce the MODE_CHANGE event.
Browse files Browse the repository at this point in the history
This even is fired when the vis mode changes, and can be acted upon
by the user like any other event.
  • Loading branch information
Alexandre Rames authored and arames committed Mar 28, 2017
1 parent c8050b4 commit 4c65c39
Show file tree
Hide file tree
Showing 9 changed files with 34 additions and 7 deletions.
2 changes: 2 additions & 0 deletions lua/vis.lua
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ local events = {
INPUT = "Event::INPUT", -- see @{input}
QUIT = "Event::QUIT", -- see @{quit}
START = "Event::START", -- see @{start}
MODE_CHANGE = "Event::MODE_CHANGE", -- see @{mode_change}
WIN_CLOSE = "Event::WIN_CLOSE", -- see @{win_close}
WIN_FOCUS = "Event::WIN_FOCUS", -- see @{win_focus}
WIN_HIGHLIGHT = "Event::WIN_HIGHLIGHT", -- see @{win_highlight}
Expand All @@ -158,6 +159,7 @@ events.file_save_post = function(...) events.emit(events.FILE_SAVE_POST, ...) en
events.file_save_pre = function(...) return events.emit(events.FILE_SAVE_PRE, ...) end
events.init = function(...) events.emit(events.INIT, ...) end
events.input = function(...) return events.emit(events.INPUT, ...) end
events.mode_change = function(...) events.emit(events.MODE_CHANGE, ...) end
events.quit = function(...) events.emit(events.QUIT, ...) end
events.start = function(...) events.emit(events.START, ...) end
events.win_close = function(...) events.emit(events.WIN_CLOSE, ...) end
Expand Down
1 change: 1 addition & 0 deletions main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2002,6 +2002,7 @@ int main(int argc, char *argv[]) {
.win_focus = vis_lua_win_focus,
.win_highlight = vis_lua_win_highlight,
.win_status = vis_lua_win_status,
.mode_change = vis_lua_mode_change,
};

vis = vis_new(ui_term_new(), &event);
Expand Down
1 change: 0 additions & 1 deletion sam.c
Original file line number Diff line number Diff line change
Expand Up @@ -1164,7 +1164,6 @@ enum SamError sam_cmd(Vis *vis, Win *win, const char *s) {
break;
}
}
vis_mode_switch(vis, completed ? VIS_MODE_NORMAL : VIS_MODE_VISUAL);
}
command_free(cmd);
return err;
Expand Down
5 changes: 4 additions & 1 deletion vis-core.h
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,7 @@ enum VisEvents {
VIS_EVENT_WIN_FOCUS,
VIS_EVENT_WIN_HIGHLIGHT,
VIS_EVENT_WIN_STATUS,
VIS_EVENT_MODE_CHANGE,
};

bool vis_event_emit(Vis*, enum VisEvents, ...);
Expand Down Expand Up @@ -248,7 +249,9 @@ void vis_do(Vis *vis);
void action_reset(Action*);
size_t vis_text_insert_nl(Vis*, Text*, size_t pos);

void mode_set(Vis *vis, Mode *new_mode);
Mode *mode_get(Vis *vis, enum VisMode mode);
/* Returns true if the mode actually changed. */
bool mode_set(Vis *vis, Mode *new_mode);

void window_selection_save(Win *win);
Win *window_new_file(Vis*, File*, enum UiOption);
Expand Down
12 changes: 12 additions & 0 deletions vis-lua.c
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@ void vis_lua_win_close(Vis *vis, Win *win) { }
void vis_lua_win_focus(Vis *vis, Win *win) { }
void vis_lua_win_highlight(Vis *vis, Win *win) { }
void vis_lua_win_status(Vis *vis, Win *win) { window_status_update(vis, win); }
void vis_lua_mode_change(Vis *vis) { }

#else

Expand Down Expand Up @@ -2887,4 +2888,15 @@ void vis_lua_win_status(Vis *vis, Win *win) {
lua_pop(L, 1);
}

/**
* Window mode change.
* The vis mode has changed.
* @function mode_change
* @see Vis.mode
* @see Vis.modes
*/
void vis_lua_mode_change(Vis *vis) {
vis_lua_event_call(vis, "mode_change");
}

#endif
1 change: 1 addition & 0 deletions vis-lua.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,5 +38,6 @@ void vis_lua_win_close(Vis*, Win*);
void vis_lua_win_focus(Vis*, Win*);
void vis_lua_win_highlight(Vis*, Win*);
void vis_lua_win_status(Vis*, Win*);
void vis_lua_mode_change(Vis*);

#endif
10 changes: 6 additions & 4 deletions vis-modes.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,27 +70,29 @@ void vis_binding_free(Vis *vis, KeyBinding *binding) {
}
}

static Mode *mode_get(Vis *vis, enum VisMode mode) {
Mode *mode_get(Vis *vis, enum VisMode mode) {
if (mode < LENGTH(vis_modes))
return &vis_modes[mode];
return NULL;
}

void mode_set(Vis *vis, Mode *new_mode) {
bool mode_set(Vis *vis, Mode *new_mode) {
if (vis->mode == new_mode)
return;
return false;
if (vis->mode->leave)
vis->mode->leave(vis, new_mode);
if (vis->mode != &vis_modes[VIS_MODE_OPERATOR_PENDING])
vis->mode_prev = vis->mode;
vis->mode = new_mode;
if (new_mode->enter)
new_mode->enter(vis, vis->mode_prev);
return true;
}

void vis_mode_switch(Vis *vis, enum VisMode mode) {
if (mode < LENGTH(vis_modes))
mode_set(vis, &vis_modes[mode]);
if (mode_set(vis, &vis_modes[mode]))
vis_event_emit(vis, VIS_EVENT_MODE_CHANGE);
}

enum VisMode vis_mode_from(Vis *vis, const char *name) {
Expand Down
8 changes: 7 additions & 1 deletion vis.c
Original file line number Diff line number Diff line change
Expand Up @@ -128,8 +128,14 @@ bool vis_event_emit(Vis *vis, enum VisEvents id, ...) {
vis->event->win_focus(vis, win);
break;
}
case VIS_EVENT_MODE_CHANGE:
{
if (vis->event->mode_change)
vis->event->mode_change(vis);
break;
}
case VIS_EVENT_QUIT:
if (vis->event->quit)
if (vis->event->quit)
vis->event->quit(vis);
break;
}
Expand Down
1 change: 1 addition & 0 deletions vis.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ typedef struct {
void (*win_focus)(Vis*, Win*);
void (*win_highlight)(Vis*, Win*);
void (*win_status)(Vis*, Win*);
void (*mode_change)(Vis*);
} VisEvent;

typedef union { /* various types of arguments passed to key action functions */
Expand Down

0 comments on commit 4c65c39

Please sign in to comment.