From 3f90f707b5598f6e0e92dc41c586bf2f5450e354 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Sat, 19 Nov 2016 20:21:04 -0500 Subject: [PATCH] restructure xedit.c for maintainability --- xedit | Bin 66100 -> 0 bytes xedit.c | 499 ++++++++++++++++++++++++++++++-------------------------- 2 files changed, 266 insertions(+), 233 deletions(-) delete mode 100755 xedit diff --git a/xedit b/xedit deleted file mode 100755 index b04166f51f8dbf38616563e88e7575698c44b69c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66100 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�YQv{x)NlS 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 diff --git a/xedit.c b/xedit.c index 8740686..f81fadc 100644 --- a/xedit.c +++ b/xedit.c @@ -4,18 +4,62 @@ #include #include -static void redraw(int width, int height); +enum RegionId { + STATUS = 0, + TAGS = 1, + EDIT = 2, + NREGIONS = 3 +}; + +// Input Handlers static void mouse_handler(MouseAct act, MouseBtn btn, int x, int y); +static void tag_handler(char* cmd); static void key_handler(Rune key); +// Drawing Rotuines +static void draw_runes(size_t x, size_t y, int fg, int bg, UGlyph* glyphs, size_t rlen); +static void draw_glyphs(size_t x, size_t y, UGlyph* glyphs, size_t rlen, size_t ncols); +static void draw_status(int fg, size_t ncols); +static void draw_region(enum RegionId id); +static void layout(int width, int height); +static void redraw(int width, int height); + +// UI Callbacks +static void delete(void); +static void cursor_up(void); +static void cursor_dn(void); +static void cursor_left(void); +static void cursor_right(void); +static void cursor_bol(void); +static void cursor_eol(void); +static void page_up(void); +static void page_dn(void); +static void change_focus(void); +static void quit(void); +static void save(void); +static void undo(void); +static void redo(void); +static void cut(void); +static void copy(void); +static void paste(void); + +// Mouse Handling +static void mouse_left(enum RegionId id, size_t count, size_t row, size_t col); +static void mouse_middle(enum RegionId id, size_t count, size_t row, size_t col); +static void mouse_right(enum RegionId id, size_t count, size_t row, size_t col); +static void mouse_wheelup(enum RegionId id, size_t count, size_t row, size_t col); +static void mouse_wheeldn(enum RegionId id, size_t count, size_t row, size_t col); + +// Region Utils +static View* getview(enum RegionId id); +static Buf* getbuf(enum RegionId id); +static View* currview(void); +static Buf* currbuf(void); +static enum RegionId getregion(size_t x, size_t y); + /* Global Data *****************************************************************************/ -static enum RegionId { - STATUS = 0, - TAGS = 1, - EDIT = 2, - NREGIONS = 3 -} Focused = EDIT; +static enum RegionId Focused = EDIT; static Region Regions[NREGIONS] = { 0 }; static bool TagWinExpanded = false; static ButtonState MouseBtns[MOUSE_BTN_COUNT] = { 0 }; @@ -27,136 +71,6 @@ static XConfig Config = { .palette = COLOR_PALETTE }; -/* External Commands - *****************************************************************************/ -#ifdef __MACH__ -static char* CopyCmd[] = { "pbcopy", NULL }; -static char* PasteCmd[] = { "pbpaste", NULL }; -#else -static char* CopyCmd[] = { "xsel", "-bi", NULL }; -static char* PasteCmd[] = { "xsel", "-bo", NULL }; -#endif - -/* Region Utils - *****************************************************************************/ -static View* getview(enum RegionId id) { - return &(Regions[id].view); -} - -static Buf* getbuf(enum RegionId id) { - return &(getview(id)->buffer); -} - -static View* currview(void) { - return getview(Focused); -} - -static Buf* currbuf(void) { - return getbuf(Focused); -} - -static enum RegionId getregion(size_t x, size_t y) { - for (int i = 0; i < NREGIONS; i++) { - size_t startx = Regions[i].x, endx = startx + Regions[i].width; - size_t starty = Regions[i].y, endy = starty + Regions[i].height; - if ((startx <= x && x <= endx) && (starty <= y && y <= endy)) - return (enum RegionId)i; - } - return NREGIONS; -} - -/* UI Callbacks - *****************************************************************************/ -static void delete(void) { - view_delete(currview()); -} - -static void cursor_up(void) { - view_byline(currview(), -1); -} - -static void cursor_dn(void) { - view_byline(currview(), +1); -} - -static void cursor_left(void) { - view_byrune(currview(), -1); -} - -static void cursor_right(void) { - view_byrune(currview(), +1); -} - -static void cursor_bol(void) { - view_bol(currview()); -} - -static void cursor_eol(void) { - view_eol(currview()); -} - -static void page_up(void) { - view_scrollpage(currview(), -1); -} - -static void page_dn(void) { - view_scrollpage(currview(), +1); -} - -static void change_focus(void) { - if (Focused == TAGS) { - Focused = EDIT; - } else { - Focused = TAGS; - } -} - -static void quit(void) { - static uint32_t num_clicks = 0; - static uint32_t prevtime = 0; - uint32_t now = getmillis(); - num_clicks = (now - prevtime < 250 ? num_clicks+1 : 1); - prevtime = now; - if (!getbuf(EDIT)->modified || num_clicks >= 2) - exit(0); -} - -static void save(void) { - buf_save(getbuf(EDIT)); -} - -static void undo(void) { - view_undo(currview()); -} - -static void redo(void) { - view_redo(currview()); -} - -static void cut(void) { - char* str = view_getstr(currview(), NULL); - if (str && *str) { - cmdwrite(CopyCmd, str); - delete(); - } - free(str); -} - -static void copy(void) { - char* str = view_getstr(currview(), NULL); - if (str && *str) - cmdwrite(CopyCmd, str); - free(str); -} - -static void paste(void) { - char* str = cmdread(PasteCmd); - view_putstr(currview(), str); - free(str); -} - -/* Builtin Tags - *****************************************************************************/ Tag Builtins[] = { { "Quit", quit }, { "Save", save }, @@ -167,55 +81,6 @@ Tag Builtins[] = { { NULL, NULL } }; -static void tagexec(char* cmd) { - Tag* tags = Builtins; - while (tags->tag) { - if (!strcmp(tags->tag, cmd)) { - Focused = EDIT; - tags->action(); - break; - } - tags++; - } -} - -/* Mouse Handling - *****************************************************************************/ -static void mouse_left(enum RegionId id, size_t count, size_t row, size_t col) { - if (count == 1) { - view_setcursor(getview(id), row, col); - } else if (count == 2) { - view_select(getview(id), row, col); - } else if (count == 3) { - view_selword(getview(id), row, col); - } -} - -static void mouse_middle(enum RegionId id, size_t count, size_t row, size_t col) { - if (MouseBtns[MOUSE_BTN_LEFT].pressed) - cut(); - else { - char* str = view_fetch(getview(id), row, col); - tagexec(str); - free(str); - } -} - -static void mouse_right(enum RegionId id, size_t count, size_t row, size_t col) { - if (MouseBtns[MOUSE_BTN_LEFT].pressed) - paste(); - else - view_find(getview(id), row, col); -} - -static void mouse_wheelup(enum RegionId id, size_t count, size_t row, size_t col) { - view_scroll(getview(id), -ScrollLines); -} - -static void mouse_wheeldn(enum RegionId id, size_t count, size_t row, size_t col) { - view_scroll(getview(id), +ScrollLines); -} - void (*MouseActs[MOUSE_BTN_COUNT])(enum RegionId id, size_t count, size_t row, size_t col) = { [MOUSE_BTN_LEFT] = mouse_left, [MOUSE_BTN_MIDDLE] = mouse_middle, @@ -224,6 +89,53 @@ void (*MouseActs[MOUSE_BTN_COUNT])(enum RegionId id, size_t count, size_t row, s [MOUSE_BTN_WHEELDOWN] = mouse_wheeldn, }; +static KeyBinding Insert[] = { + { KEY_DELETE, delete }, + { KEY_UP, cursor_up }, + { KEY_DOWN, cursor_dn }, + { KEY_LEFT, cursor_left }, + { KEY_RIGHT, cursor_right }, + { KEY_HOME, cursor_bol }, + { KEY_END, cursor_eol }, + { KEY_PGUP, page_up }, + { KEY_PGDN, page_dn }, + { KEY_CTRL_T, change_focus }, + { KEY_CTRL_Q, quit }, + { KEY_CTRL_S, save }, + { KEY_CTRL_Z, undo }, + { KEY_CTRL_Y, redo }, + { KEY_CTRL_X, cut }, + { KEY_CTRL_C, copy }, + { KEY_CTRL_V, paste }, + { 0, NULL } +}; + +/* External Commands + *****************************************************************************/ +#ifdef __MACH__ +static char* CopyCmd[] = { "pbcopy", NULL }; +static char* PasteCmd[] = { "pbpaste", NULL }; +#else +static char* CopyCmd[] = { "xsel", "-bi", NULL }; +static char* PasteCmd[] = { "xsel", "-bo", NULL }; +#endif + +/* Main Routine + *****************************************************************************/ +int main(int argc, char** argv) { + /* load the buffer views */ + view_init(getview(TAGS), NULL); + view_putstr(getview(TAGS), DEFAULT_TAGS); + view_init(getview(EDIT), (argc > 1 ? argv[1] : NULL)); + /* initialize the display engine */ + x11_init(&Config); + x11_window("edit", Width, Height); + x11_show(); + Font = x11_font_load(FONTNAME); + x11_loop(); + return 0; +} + static void mouse_handler(MouseAct act, MouseBtn btn, int x, int y) { enum RegionId id = getregion(x, y); if (id != TAGS && id != EDIT) return; @@ -261,30 +173,26 @@ static void mouse_handler(MouseAct act, MouseBtn btn, int x, int y) { } } -/* Keyboard Bindings - *****************************************************************************/ -static KeyBinding Insert[] = { - { KEY_DELETE, delete }, - { KEY_UP, cursor_up }, - { KEY_DOWN, cursor_dn }, - { KEY_LEFT, cursor_left }, - { KEY_RIGHT, cursor_right }, - { KEY_HOME, cursor_bol }, - { KEY_END, cursor_eol }, - { KEY_PGUP, page_up }, - { KEY_PGDN, page_dn }, - { KEY_CTRL_T, change_focus }, - { KEY_CTRL_Q, quit }, - { KEY_CTRL_S, save }, - { KEY_CTRL_Z, undo }, - { KEY_CTRL_Y, redo }, - { KEY_CTRL_X, cut }, - { KEY_CTRL_C, copy }, - { KEY_CTRL_V, paste }, - { 0, NULL } -}; +static void tag_handler(char* cmd) { + Tag* tags = Builtins; + while (tags->tag) { + if (!strcmp(tags->tag, cmd)) { + Focused = EDIT; + tags->action(); + break; + } + tags++; + } +} -static void process_table(KeyBinding* bindings, Rune key) { +static void key_handler(Rune key) { + /* ignore invalid keys */ + if (key == RUNE_ERR) return; + /* handle the proper line endings */ + if (key == '\r') key = '\n'; + if (key == '\n' && currview()->buffer.crlf) key = RUNE_CRLF; + /* handle the key */ + KeyBinding* bindings = Insert; while (bindings->key) { if (key == bindings->key) { bindings->action(); @@ -298,17 +206,7 @@ static void process_table(KeyBinding* bindings, Rune key) { view_insert(currview(), key); } -static void key_handler(Rune key) { - /* ignore invalid keys */ - if (key == RUNE_ERR) return; - /* handle the proper line endings */ - if (key == '\r') key = '\n'; - if (key == '\n' && currview()->buffer.crlf) key = RUNE_CRLF; - /* handle the key */ - process_table(Insert, key); -} - -/* Redisplay Functions +/* Drawing Routines *****************************************************************************/ static void draw_runes(size_t x, size_t y, int fg, int bg, UGlyph* glyphs, size_t rlen) { XGlyphSpec specs[rlen]; @@ -421,20 +319,155 @@ static void redraw(int width, int height) { draw_region(EDIT); } -/* Main Routine +/* UI Callbacks *****************************************************************************/ -int main(int argc, char** argv) { - /* load the buffer views */ - view_init(getview(TAGS), NULL); - view_putstr(getview(TAGS), DEFAULT_TAGS); - view_init(getview(EDIT), (argc > 1 ? argv[1] : NULL)); - /* initialize the display engine */ - x11_init(&Config); - x11_window("edit", Width, Height); - x11_show(); - Font = x11_font_load(FONTNAME); - x11_loop(); - return 0; +static void delete(void) { + view_delete(currview()); +} + +static void cursor_up(void) { + view_byline(currview(), -1); +} + +static void cursor_dn(void) { + view_byline(currview(), +1); +} + +static void cursor_left(void) { + view_byrune(currview(), -1); +} + +static void cursor_right(void) { + view_byrune(currview(), +1); +} + +static void cursor_bol(void) { + view_bol(currview()); +} + +static void cursor_eol(void) { + view_eol(currview()); +} + +static void page_up(void) { + view_scrollpage(currview(), -1); +} + +static void page_dn(void) { + view_scrollpage(currview(), +1); +} + +static void change_focus(void) { + Focused = (Focused == TAGS ? EDIT : TAGS); +} + +static void quit(void) { + static uint32_t num_clicks = 0; + static uint32_t prevtime = 0; + uint32_t now = getmillis(); + num_clicks = (now - prevtime < 250 ? num_clicks+1 : 1); + prevtime = now; + if (!getbuf(EDIT)->modified || num_clicks >= 2) + exit(0); +} + +static void save(void) { + buf_save(getbuf(EDIT)); +} + +static void undo(void) { + view_undo(currview()); +} + +static void redo(void) { + view_redo(currview()); +} + +static void cut(void) { + char* str = view_getstr(currview(), NULL); + if (str && *str) { + cmdwrite(CopyCmd, str); + delete(); + } + free(str); +} + +static void copy(void) { + char* str = view_getstr(currview(), NULL); + if (str && *str) + cmdwrite(CopyCmd, str); + free(str); +} + +static void paste(void) { + char* str = cmdread(PasteCmd); + view_putstr(currview(), str); + free(str); +} + +/* Mouse Handling + *****************************************************************************/ +static void mouse_left(enum RegionId id, size_t count, size_t row, size_t col) { + if (count == 1) { + view_setcursor(getview(id), row, col); + } else if (count == 2) { + view_select(getview(id), row, col); + } else if (count == 3) { + view_selword(getview(id), row, col); + } +} + +static void mouse_middle(enum RegionId id, size_t count, size_t row, size_t col) { + if (MouseBtns[MOUSE_BTN_LEFT].pressed) { + cut(); + } else { + char* str = view_fetch(getview(id), row, col); + tag_handler(str); + free(str); + } +} + +static void mouse_right(enum RegionId id, size_t count, size_t row, size_t col) { + if (MouseBtns[MOUSE_BTN_LEFT].pressed) + paste(); + else + view_find(getview(id), row, col); +} + +static void mouse_wheelup(enum RegionId id, size_t count, size_t row, size_t col) { + view_scroll(getview(id), -ScrollLines); +} + +static void mouse_wheeldn(enum RegionId id, size_t count, size_t row, size_t col) { + view_scroll(getview(id), +ScrollLines); +} + +/* Region Utils + *****************************************************************************/ +static View* getview(enum RegionId id) { + return &(Regions[id].view); +} + +static Buf* getbuf(enum RegionId id) { + return &(getview(id)->buffer); +} + +static View* currview(void) { + return getview(Focused); +} + +static Buf* currbuf(void) { + return getbuf(Focused); +} + +static enum RegionId getregion(size_t x, size_t y) { + for (int i = 0; i < NREGIONS; i++) { + size_t startx = Regions[i].x, endx = startx + Regions[i].width; + size_t starty = Regions[i].y, endy = starty + Regions[i].height; + if ((startx <= x && x <= endx) && (starty <= y && y <= endy)) + return (enum RegionId)i; + } + return NREGIONS; } #if 0 -- 2.52.0