Annotation of embedaddon/tmux/key-bindings.c, revision 1.1

1.1     ! misho       1: /* $OpenBSD$ */
        !             2: 
        !             3: /*
        !             4:  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
        !             5:  *
        !             6:  * Permission to use, copy, modify, and distribute this software for any
        !             7:  * purpose with or without fee is hereby granted, provided that the above
        !             8:  * copyright notice and this permission notice appear in all copies.
        !             9:  *
        !            10:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
        !            11:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
        !            12:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
        !            13:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
        !            14:  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
        !            15:  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
        !            16:  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            17:  */
        !            18: 
        !            19: #include <sys/types.h>
        !            20: 
        !            21: #include <ctype.h>
        !            22: #include <stdlib.h>
        !            23: #include <string.h>
        !            24: 
        !            25: #include "tmux.h"
        !            26: 
        !            27: RB_GENERATE(key_bindings, key_binding, entry, key_bindings_cmp);
        !            28: RB_GENERATE(key_tables, key_table, entry, key_table_cmp);
        !            29: struct key_tables key_tables = RB_INITIALIZER(&key_tables);
        !            30: 
        !            31: int
        !            32: key_table_cmp(struct key_table *e1, struct key_table *e2)
        !            33: {
        !            34:        return (strcmp(e1->name, e2->name));
        !            35: }
        !            36: 
        !            37: int
        !            38: key_bindings_cmp(struct key_binding *bd1, struct key_binding *bd2)
        !            39: {
        !            40:        if (bd1->key < bd2->key)
        !            41:                return (-1);
        !            42:        if (bd1->key > bd2->key)
        !            43:                return (1);
        !            44:        return (0);
        !            45: }
        !            46: 
        !            47: struct key_table *
        !            48: key_bindings_get_table(const char *name, int create)
        !            49: {
        !            50:        struct key_table        table_find, *table;
        !            51: 
        !            52:        table_find.name = name;
        !            53:        table = RB_FIND(key_tables, &key_tables, &table_find);
        !            54:        if (table != NULL || !create)
        !            55:                return (table);
        !            56: 
        !            57:        table = xmalloc(sizeof *table);
        !            58:        table->name = xstrdup(name);
        !            59:        RB_INIT(&table->key_bindings);
        !            60: 
        !            61:        table->references = 1; /* one reference in key_tables */
        !            62:        RB_INSERT(key_tables, &key_tables, table);
        !            63: 
        !            64:        return (table);
        !            65: }
        !            66: 
        !            67: void
        !            68: key_bindings_unref_table(struct key_table *table)
        !            69: {
        !            70:        struct key_binding      *bd;
        !            71:        struct key_binding      *bd1;
        !            72: 
        !            73:        if (--table->references != 0)
        !            74:                return;
        !            75: 
        !            76:        RB_FOREACH_SAFE(bd, key_bindings, &table->key_bindings, bd1) {
        !            77:                RB_REMOVE(key_bindings, &table->key_bindings, bd);
        !            78:                cmd_list_free(bd->cmdlist);
        !            79:                free(bd);
        !            80:        }
        !            81: 
        !            82:        free((void *)table->name);
        !            83:        free(table);
        !            84: }
        !            85: 
        !            86: void
        !            87: key_bindings_add(const char *name, key_code key, int can_repeat,
        !            88:     struct cmd_list *cmdlist)
        !            89: {
        !            90:        struct key_table        *table;
        !            91:        struct key_binding       bd_find, *bd;
        !            92: 
        !            93:        table = key_bindings_get_table(name, 1);
        !            94: 
        !            95:        bd_find.key = key;
        !            96:        bd = RB_FIND(key_bindings, &table->key_bindings, &bd_find);
        !            97:        if (bd != NULL) {
        !            98:                RB_REMOVE(key_bindings, &table->key_bindings, bd);
        !            99:                cmd_list_free(bd->cmdlist);
        !           100:                free(bd);
        !           101:        }
        !           102: 
        !           103:        bd = xmalloc(sizeof *bd);
        !           104:        bd->key = key;
        !           105:        RB_INSERT(key_bindings, &table->key_bindings, bd);
        !           106: 
        !           107:        bd->can_repeat = can_repeat;
        !           108:        bd->cmdlist = cmdlist;
        !           109: }
        !           110: 
        !           111: void
        !           112: key_bindings_remove(const char *name, key_code key)
        !           113: {
        !           114:        struct key_table        *table;
        !           115:        struct key_binding       bd_find, *bd;
        !           116: 
        !           117:        table = key_bindings_get_table(name, 0);
        !           118:        if (table == NULL)
        !           119:                return;
        !           120: 
        !           121:        bd_find.key = key;
        !           122:        bd = RB_FIND(key_bindings, &table->key_bindings, &bd_find);
        !           123:        if (bd == NULL)
        !           124:                return;
        !           125: 
        !           126:        RB_REMOVE(key_bindings, &table->key_bindings, bd);
        !           127:        cmd_list_free(bd->cmdlist);
        !           128:        free(bd);
        !           129: 
        !           130:        if (RB_EMPTY(&table->key_bindings)) {
        !           131:                RB_REMOVE(key_tables, &key_tables, table);
        !           132:                key_bindings_unref_table(table);
        !           133:        }
        !           134: }
        !           135: 
        !           136: void
        !           137: key_bindings_remove_table(const char *name)
        !           138: {
        !           139:        struct key_table        *table;
        !           140: 
        !           141:        table = key_bindings_get_table(name, 0);
        !           142:        if (table != NULL) {
        !           143:                RB_REMOVE(key_tables, &key_tables, table);
        !           144:                key_bindings_unref_table(table);
        !           145:        }
        !           146: }
        !           147: 
        !           148: void
        !           149: key_bindings_init(void)
        !           150: {
        !           151:        static const char *defaults[] = {
        !           152:                "bind C-b send-prefix",
        !           153:                "bind C-o rotate-window",
        !           154:                "bind C-z suspend-client",
        !           155:                "bind Space next-layout",
        !           156:                "bind ! break-pane",
        !           157:                "bind '\"' split-window",
        !           158:                "bind '#' list-buffers",
        !           159:                "bind '$' command-prompt -I'#S' \"rename-session '%%'\"",
        !           160:                "bind % split-window -h",
        !           161:                "bind & confirm-before -p\"kill-window #W? (y/n)\" kill-window",
        !           162:                "bind \"'\" command-prompt -pindex \"select-window -t ':%%'\"",
        !           163:                "bind ( switch-client -p",
        !           164:                "bind ) switch-client -n",
        !           165:                "bind , command-prompt -I'#W' \"rename-window '%%'\"",
        !           166:                "bind - delete-buffer",
        !           167:                "bind . command-prompt \"move-window -t '%%'\"",
        !           168:                "bind 0 select-window -t:=0",
        !           169:                "bind 1 select-window -t:=1",
        !           170:                "bind 2 select-window -t:=2",
        !           171:                "bind 3 select-window -t:=3",
        !           172:                "bind 4 select-window -t:=4",
        !           173:                "bind 5 select-window -t:=5",
        !           174:                "bind 6 select-window -t:=6",
        !           175:                "bind 7 select-window -t:=7",
        !           176:                "bind 8 select-window -t:=8",
        !           177:                "bind 9 select-window -t:=9",
        !           178:                "bind : command-prompt",
        !           179:                "bind \\; last-pane",
        !           180:                "bind = choose-buffer",
        !           181:                "bind ? list-keys",
        !           182:                "bind D choose-client",
        !           183:                "bind L switch-client -l",
        !           184:                "bind M select-pane -M",
        !           185:                "bind [ copy-mode",
        !           186:                "bind ] paste-buffer",
        !           187:                "bind c new-window",
        !           188:                "bind d detach-client",
        !           189:                "bind f command-prompt \"find-window '%%'\"",
        !           190:                "bind i display-message",
        !           191:                "bind l last-window",
        !           192:                "bind m select-pane -m",
        !           193:                "bind n next-window",
        !           194:                "bind o select-pane -t:.+",
        !           195:                "bind p previous-window",
        !           196:                "bind q display-panes",
        !           197:                "bind r refresh-client",
        !           198:                "bind s choose-tree",
        !           199:                "bind t clock-mode",
        !           200:                "bind w choose-window",
        !           201:                "bind x confirm-before -p\"kill-pane #P? (y/n)\" kill-pane",
        !           202:                "bind z resize-pane -Z",
        !           203:                "bind { swap-pane -U",
        !           204:                "bind } swap-pane -D",
        !           205:                "bind '~' show-messages",
        !           206:                "bind PPage copy-mode -u",
        !           207:                "bind -r Up select-pane -U",
        !           208:                "bind -r Down select-pane -D",
        !           209:                "bind -r Left select-pane -L",
        !           210:                "bind -r Right select-pane -R",
        !           211:                "bind M-1 select-layout even-horizontal",
        !           212:                "bind M-2 select-layout even-vertical",
        !           213:                "bind M-3 select-layout main-horizontal",
        !           214:                "bind M-4 select-layout main-vertical",
        !           215:                "bind M-5 select-layout tiled",
        !           216:                "bind M-n next-window -a",
        !           217:                "bind M-o rotate-window -D",
        !           218:                "bind M-p previous-window -a",
        !           219:                "bind -r M-Up resize-pane -U 5",
        !           220:                "bind -r M-Down resize-pane -D 5",
        !           221:                "bind -r M-Left resize-pane -L 5",
        !           222:                "bind -r M-Right resize-pane -R 5",
        !           223:                "bind -r C-Up resize-pane -U",
        !           224:                "bind -r C-Down resize-pane -D",
        !           225:                "bind -r C-Left resize-pane -L",
        !           226:                "bind -r C-Right resize-pane -R",
        !           227:                "bind -n MouseDown1Pane select-pane -t=\\; send-keys -M",
        !           228:                "bind -n MouseDrag1Border resize-pane -M",
        !           229:                "bind -n MouseDown1Status select-window -t=",
        !           230:                "bind -n WheelDownStatus next-window",
        !           231:                "bind -n WheelUpStatus previous-window",
        !           232:                "bind -n MouseDrag1Pane if -Ft= '#{mouse_any_flag}' 'if -Ft= \"#{pane_in_mode}\" \"copy-mode -M\" \"send-keys -M\"' 'copy-mode -M'",
        !           233:                "bind -n MouseDown3Pane if-shell -Ft= '#{mouse_any_flag}' 'select-pane -t=; send-keys -M' 'select-pane -mt='",
        !           234:                "bind -n WheelUpPane if-shell -Ft= '#{mouse_any_flag}' 'send-keys -M' 'if -Ft= \"#{pane_in_mode}\" \"send-keys -M\" \"copy-mode -et=\"'",
        !           235: 
        !           236:                "bind -Tcopy-mode C-Space send -X begin-selection",
        !           237:                "bind -Tcopy-mode C-a send -X start-of-line",
        !           238:                "bind -Tcopy-mode C-c send -X cancel",
        !           239:                "bind -Tcopy-mode C-e send -X end-of-line",
        !           240:                "bind -Tcopy-mode C-f send -X cursor-right",
        !           241:                "bind -Tcopy-mode C-b send -X cursor-left",
        !           242:                "bind -Tcopy-mode C-g send -X clear-selection",
        !           243:                "bind -Tcopy-mode C-k send -X copy-end-of-line",
        !           244:                "bind -Tcopy-mode C-n send -X cursor-down",
        !           245:                "bind -Tcopy-mode C-p send -X cursor-up",
        !           246:                "bind -Tcopy-mode C-r command-prompt -ip'search up' 'send -X search-backward-incremental \"%%%\"'",
        !           247:                "bind -Tcopy-mode C-s command-prompt -ip'search down' 'send -X search-forward-incremental \"%%%\"'",
        !           248:                "bind -Tcopy-mode C-v send -X page-down",
        !           249:                "bind -Tcopy-mode C-w send -X copy-selection-and-cancel",
        !           250:                "bind -Tcopy-mode Escape send -X cancel",
        !           251:                "bind -Tcopy-mode Space send -X page-down",
        !           252:                "bind -Tcopy-mode , send -X jump-reverse",
        !           253:                "bind -Tcopy-mode \\; send -X jump-again",
        !           254:                "bind -Tcopy-mode F command-prompt -1p'jump backward' 'send -X jump-backward \"%%%\"'",
        !           255:                "bind -Tcopy-mode N send -X search-reverse",
        !           256:                "bind -Tcopy-mode R send -X rectangle-toggle",
        !           257:                "bind -Tcopy-mode T command-prompt -1p'jump to backward' 'send -X jump-to-backward \"%%%\"'",
        !           258:                "bind -Tcopy-mode f command-prompt -1p'jump forward' 'send -X jump-forward \"%%%\"'",
        !           259:                "bind -Tcopy-mode g command-prompt -p'goto line' 'send -X goto-line \"%%%\"'",
        !           260:                "bind -Tcopy-mode n send -X search-again",
        !           261:                "bind -Tcopy-mode q send -X cancel",
        !           262:                "bind -Tcopy-mode t command-prompt -1p'jump to forward' 'send -X jump-to-forward \"%%%\"'",
        !           263:                "bind -Tcopy-mode Home send -X start-of-line",
        !           264:                "bind -Tcopy-mode End send -X end-of-line",
        !           265:                "bind -Tcopy-mode MouseDown1Pane select-pane",
        !           266:                "bind -Tcopy-mode MouseDrag1Pane select-pane\\; send -X begin-selection",
        !           267:                "bind -Tcopy-mode MouseDragEnd1Pane send -X copy-selection-and-cancel",
        !           268:                "bind -Tcopy-mode WheelUpPane select-pane\\; send -N5 -X scroll-up",
        !           269:                "bind -Tcopy-mode WheelDownPane select-pane\\; send -N5 -X scroll-down",
        !           270:                "bind -Tcopy-mode DoubleClick1Pane select-pane\\; send -X select-word",
        !           271:                "bind -Tcopy-mode TripleClick1Pane select-pane\\; send -X select-line",
        !           272:                "bind -Tcopy-mode NPage send -X page-down",
        !           273:                "bind -Tcopy-mode PPage send -X page-up",
        !           274:                "bind -Tcopy-mode Up send -X cursor-up",
        !           275:                "bind -Tcopy-mode Down send -X cursor-down",
        !           276:                "bind -Tcopy-mode Left send -X cursor-left",
        !           277:                "bind -Tcopy-mode Right send -X cursor-right",
        !           278:                "bind -Tcopy-mode M-1 command-prompt -Np'repeat' -I1 'send -N \"%%%\"'",
        !           279:                "bind -Tcopy-mode M-2 command-prompt -Np'repeat' -I2 'send -N \"%%%\"'",
        !           280:                "bind -Tcopy-mode M-3 command-prompt -Np'repeat' -I3 'send -N \"%%%\"'",
        !           281:                "bind -Tcopy-mode M-4 command-prompt -Np'repeat' -I4 'send -N \"%%%\"'",
        !           282:                "bind -Tcopy-mode M-5 command-prompt -Np'repeat' -I5 'send -N \"%%%\"'",
        !           283:                "bind -Tcopy-mode M-6 command-prompt -Np'repeat' -I6 'send -N \"%%%\"'",
        !           284:                "bind -Tcopy-mode M-7 command-prompt -Np'repeat' -I7 'send -N \"%%%\"'",
        !           285:                "bind -Tcopy-mode M-8 command-prompt -Np'repeat' -I8 'send -N \"%%%\"'",
        !           286:                "bind -Tcopy-mode M-9 command-prompt -Np'repeat' -I9 'send -N \"%%%\"'",
        !           287:                "bind -Tcopy-mode M-< send -X history-top",
        !           288:                "bind -Tcopy-mode M-> send -X history-bottom",
        !           289:                "bind -Tcopy-mode M-R send -X top-line",
        !           290:                "bind -Tcopy-mode M-b send -X previous-word",
        !           291:                "bind -Tcopy-mode M-f send -X next-word-end",
        !           292:                "bind -Tcopy-mode M-m send -X back-to-indentation",
        !           293:                "bind -Tcopy-mode M-r send -X middle-line",
        !           294:                "bind -Tcopy-mode M-v send -X page-up",
        !           295:                "bind -Tcopy-mode M-w send -X copy-selection-and-cancel",
        !           296:                "bind -Tcopy-mode M-{ send -X previous-paragraph",
        !           297:                "bind -Tcopy-mode M-} send -X next-paragraph",
        !           298:                "bind -Tcopy-mode M-Up send -X halfpage-up",
        !           299:                "bind -Tcopy-mode M-Down send -X halfpage-down",
        !           300:                "bind -Tcopy-mode C-Up send -X scroll-up",
        !           301:                "bind -Tcopy-mode C-Down send -X scroll-down",
        !           302: 
        !           303:                "bind -Tcopy-mode-vi C-c send -X cancel",
        !           304:                "bind -Tcopy-mode-vi C-d send -X halfpage-down",
        !           305:                "bind -Tcopy-mode-vi C-e send -X scroll-down",
        !           306:                "bind -Tcopy-mode-vi C-b send -X page-up",
        !           307:                "bind -Tcopy-mode-vi C-f send -X page-down",
        !           308:                "bind -Tcopy-mode-vi C-h send -X cursor-left",
        !           309:                "bind -Tcopy-mode-vi C-j send -X copy-selection-and-cancel",
        !           310:                "bind -Tcopy-mode-vi Enter send -X copy-selection-and-cancel",
        !           311:                "bind -Tcopy-mode-vi C-u send -X halfpage-up",
        !           312:                "bind -Tcopy-mode-vi C-v send -X rectangle-toggle",
        !           313:                "bind -Tcopy-mode-vi C-y send -X scroll-up",
        !           314:                "bind -Tcopy-mode-vi Escape send -X clear-selection",
        !           315:                "bind -Tcopy-mode-vi Space send -X begin-selection",
        !           316:                "bind -Tcopy-mode-vi '$' send -X end-of-line",
        !           317:                "bind -Tcopy-mode-vi , send -X jump-reverse",
        !           318:                "bind -Tcopy-mode-vi / command-prompt -p'search down' 'send -X search-forward \"%%%\"'",
        !           319:                "bind -Tcopy-mode-vi 0 send -X start-of-line",
        !           320:                "bind -Tcopy-mode-vi 1 command-prompt -Np'repeat' -I1 'send -N \"%%%\"'",
        !           321:                "bind -Tcopy-mode-vi 2 command-prompt -Np'repeat' -I2 'send -N \"%%%\"'",
        !           322:                "bind -Tcopy-mode-vi 3 command-prompt -Np'repeat' -I3 'send -N \"%%%\"'",
        !           323:                "bind -Tcopy-mode-vi 4 command-prompt -Np'repeat' -I4 'send -N \"%%%\"'",
        !           324:                "bind -Tcopy-mode-vi 5 command-prompt -Np'repeat' -I5 'send -N \"%%%\"'",
        !           325:                "bind -Tcopy-mode-vi 6 command-prompt -Np'repeat' -I6 'send -N \"%%%\"'",
        !           326:                "bind -Tcopy-mode-vi 7 command-prompt -Np'repeat' -I7 'send -N \"%%%\"'",
        !           327:                "bind -Tcopy-mode-vi 8 command-prompt -Np'repeat' -I8 'send -N \"%%%\"'",
        !           328:                "bind -Tcopy-mode-vi 9 command-prompt -Np'repeat' -I9 'send -N \"%%%\"'",
        !           329:                "bind -Tcopy-mode-vi : command-prompt -p'goto line' 'send -X goto-line \"%%%\"'",
        !           330:                "bind -Tcopy-mode-vi \\; send -X jump-again",
        !           331:                "bind -Tcopy-mode-vi ? command-prompt -p'search up' 'send -X search-backward \"%%%\"'",
        !           332:                "bind -Tcopy-mode-vi A send -X append-selection-and-cancel",
        !           333:                "bind -Tcopy-mode-vi B send -X previous-space",
        !           334:                "bind -Tcopy-mode-vi D send -X copy-end-of-line",
        !           335:                "bind -Tcopy-mode-vi E send -X next-space-end",
        !           336:                "bind -Tcopy-mode-vi F command-prompt -1p'jump backward' 'send -X jump-backward \"%%%\"'",
        !           337:                "bind -Tcopy-mode-vi G send -X history-bottom",
        !           338:                "bind -Tcopy-mode-vi H send -X top-line",
        !           339:                "bind -Tcopy-mode-vi J send -X scroll-down",
        !           340:                "bind -Tcopy-mode-vi K send -X scroll-up",
        !           341:                "bind -Tcopy-mode-vi L send -X bottom-line",
        !           342:                "bind -Tcopy-mode-vi M send -X middle-line",
        !           343:                "bind -Tcopy-mode-vi N send -X search-reverse",
        !           344:                "bind -Tcopy-mode-vi T command-prompt -1p'jump to backward' 'send -X jump-to-backward \"%%%\"'",
        !           345:                "bind -Tcopy-mode-vi V send -X select-line",
        !           346:                "bind -Tcopy-mode-vi W send -X next-space",
        !           347:                "bind -Tcopy-mode-vi ^ send -X back-to-indentation",
        !           348:                "bind -Tcopy-mode-vi b send -X previous-word",
        !           349:                "bind -Tcopy-mode-vi e send -X next-word-end",
        !           350:                "bind -Tcopy-mode-vi f command-prompt -1p'jump forward' 'send -X jump-forward \"%%%\"'",
        !           351:                "bind -Tcopy-mode-vi g send -X history-top",
        !           352:                "bind -Tcopy-mode-vi h send -X cursor-left",
        !           353:                "bind -Tcopy-mode-vi j send -X cursor-down",
        !           354:                "bind -Tcopy-mode-vi k send -X cursor-up",
        !           355:                "bind -Tcopy-mode-vi l send -X cursor-right",
        !           356:                "bind -Tcopy-mode-vi n send -X search-again",
        !           357:                "bind -Tcopy-mode-vi o send -X other-end",
        !           358:                "bind -Tcopy-mode-vi q send -X cancel",
        !           359:                "bind -Tcopy-mode-vi t command-prompt -1p'jump to forward' 'send -X jump-to-forward \"%%%\"'",
        !           360:                "bind -Tcopy-mode-vi v send -X rectangle-toggle",
        !           361:                "bind -Tcopy-mode-vi w send -X next-word",
        !           362:                "bind -Tcopy-mode-vi { send -X previous-paragraph",
        !           363:                "bind -Tcopy-mode-vi } send -X next-paragraph",
        !           364:                "bind -Tcopy-mode-vi MouseDown1Pane select-pane",
        !           365:                "bind -Tcopy-mode-vi MouseDrag1Pane select-pane\\; send -X begin-selection",
        !           366:                "bind -Tcopy-mode-vi MouseDragEnd1Pane send -X copy-selection-and-cancel",
        !           367:                "bind -Tcopy-mode-vi WheelUpPane select-pane\\; send -N5 -X scroll-up",
        !           368:                "bind -Tcopy-mode-vi WheelDownPane select-pane\\; send -N5 -X scroll-down",
        !           369:                "bind -Tcopy-mode-vi DoubleClick1Pane select-pane\\; send -X select-word",
        !           370:                "bind -Tcopy-mode-vi TripleClick1Pane select-pane\\; send -X select-line",
        !           371:                "bind -Tcopy-mode-vi BSpace send -X cursor-left",
        !           372:                "bind -Tcopy-mode-vi NPage send -X page-down",
        !           373:                "bind -Tcopy-mode-vi PPage send -X page-up",
        !           374:                "bind -Tcopy-mode-vi Up send -X cursor-up",
        !           375:                "bind -Tcopy-mode-vi Down send -X cursor-down",
        !           376:                "bind -Tcopy-mode-vi Left send -X cursor-left",
        !           377:                "bind -Tcopy-mode-vi Right send -X cursor-right",
        !           378:                "bind -Tcopy-mode-vi C-Up send -X scroll-up",
        !           379:                "bind -Tcopy-mode-vi C-Down send -X scroll-down",
        !           380:        };
        !           381:        u_int            i;
        !           382:        struct cmd_list *cmdlist;
        !           383:        char            *cause;
        !           384: 
        !           385:        for (i = 0; i < nitems(defaults); i++) {
        !           386:                cmdlist = cmd_string_parse(defaults[i], "<default>", i, &cause);
        !           387:                if (cmdlist == NULL)
        !           388:                        fatalx("bad default key: %s", defaults[i]);
        !           389:                cmdq_append(NULL, cmdq_get_command(cmdlist, NULL, NULL, 0));
        !           390:                cmd_list_free(cmdlist);
        !           391:        }
        !           392: }
        !           393: 
        !           394: static enum cmd_retval
        !           395: key_bindings_read_only(struct cmdq_item *item, __unused void *data)
        !           396: {
        !           397:        cmdq_error(item, "client is read-only");
        !           398:        return (CMD_RETURN_ERROR);
        !           399: }
        !           400: 
        !           401: void
        !           402: key_bindings_dispatch(struct key_binding *bd, struct client *c,
        !           403:     struct mouse_event *m, struct cmd_find_state *fs)
        !           404: {
        !           405:        struct cmd              *cmd;
        !           406:        struct cmdq_item        *item;
        !           407:        int                      readonly;
        !           408: 
        !           409:        readonly = 1;
        !           410:        TAILQ_FOREACH(cmd, &bd->cmdlist->list, qentry) {
        !           411:                if (!(cmd->entry->flags & CMD_READONLY))
        !           412:                        readonly = 0;
        !           413:        }
        !           414:        if (!readonly && (c->flags & CLIENT_READONLY))
        !           415:                cmdq_append(c, cmdq_get_callback(key_bindings_read_only, NULL));
        !           416:        else {
        !           417:                item = cmdq_get_command(bd->cmdlist, fs, m, 0);
        !           418:                item->repeat = bd->can_repeat;
        !           419:                cmdq_append(c, item);
        !           420:        }
        !           421: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>