Ticket #3685: 0001-Add-hotkey-support-to-labels-and-groupboxes.patch

File 0001-Add-hotkey-support-to-labels-and-groupboxes.patch, 8.8 KB (added by kmws, 8 years ago)
  • lib/widget/groupbox.c

    From 37978a2ce0d2e664644da3b9d8b90ff0adde996c Mon Sep 17 00:00:00 2001
    From: Kamil W <istonar3@gmail.com>
    Date: Mon, 26 Sep 2016 19:05:57 +0200
    Subject: [PATCH] Add hotkey support to labels and groupboxes
    
    ---
     lib/widget/groupbox.c      | 25 +++++++++++++++++++------
     lib/widget/groupbox.h      |  2 +-
     lib/widget/label.c         | 45 +++++++++++++++++++++++++++++++++++----------
     lib/widget/label.h         |  2 +-
     lib/widget/widget-common.c | 21 +++++++++++++++++++++
     lib/widget/widget-common.h |  2 ++
     6 files changed, 79 insertions(+), 18 deletions(-)
    
    diff --git a/lib/widget/groupbox.c b/lib/widget/groupbox.c
    index 2d7a5b4..cf48996 100644
    a b groupbox_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void 
    6262    case MSG_INIT: 
    6363        return MSG_HANDLED; 
    6464 
     65    case MSG_HOTKEY: 
     66        if (g->title.hotkey != NULL) 
     67        { 
     68            if (g_ascii_tolower ((gchar) g->title.hotkey[0]) == parm) 
     69            { 
     70                /* select next widget in this groupbox */ 
     71                dlg_select_by_id (w->owner, (w->id + 1)); 
     72                return MSG_HANDLED; 
     73            } 
     74        } 
     75        return MSG_NOT_HANDLED; 
     76 
    6577    case MSG_DRAW: 
    6678        { 
    6779            WDialog *h = w->owner; 
    groupbox_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void 
    7284            tty_setcolor (disabled ? DISABLED_COLOR : h->color[DLG_COLOR_NORMAL]); 
    7385            tty_draw_box (w->y, w->x, w->lines, w->cols, TRUE); 
    7486 
    75             if (g->title != NULL) 
     87            if ((get_hotkey_text (g->title)) != NULL) 
    7688            { 
    7789                tty_setcolor (disabled ? DISABLED_COLOR : h->color[DLG_COLOR_TITLE]); 
    7890                widget_move (w, 0, 1); 
    79                 tty_print_string (g->title); 
     91                hotkey_draw (w, g->title, FALSE); 
    8092            } 
    8193            return MSG_HANDLED; 
    8294        } 
    8395 
    8496    case MSG_DESTROY: 
    85         g_free (g->title); 
     97        release_hotkey (g->title); 
    8698        return MSG_HANDLED; 
    8799 
    88100    default: 
    groupbox_new (int y, int x, int height, int width, const char *title) 
    102114 
    103115    g = g_new (WGroupbox, 1); 
    104116    w = WIDGET (g); 
     117    g->title = parse_hotkey (title); 
    105118    widget_init (w, y, x, height, width, groupbox_callback, NULL); 
    106119 
    107     g->title = NULL; 
     120    w->options |= WOP_WANT_HOTKEY; 
    108121    groupbox_set_title (g, title); 
    109122 
    110123    return g; 
    groupbox_new (int y, int x, int height, int width, const char *title) 
    115128void 
    116129groupbox_set_title (WGroupbox * g, const char *title) 
    117130{ 
    118     MC_PTR_FREE (g->title); 
     131    release_hotkey (g->title); 
    119132 
    120133    /* Strip existing spaces, add one space before and after the title */ 
    121134    if (title != NULL && *title != '\0') 
    groupbox_set_title (WGroupbox * g, const char *title) 
    123136        char *t; 
    124137 
    125138        t = g_strstrip (g_strdup (title)); 
    126         g->title = g_strconcat (" ", t, " ", (char *) NULL); 
     139        g->title = parse_hotkey (g_strconcat (" ", t, " ", (char *) NULL)); 
    127140        g_free (t); 
    128141    } 
    129142 
  • lib/widget/groupbox.h

    diff --git a/lib/widget/groupbox.h b/lib/widget/groupbox.h
    index 06fb0d3..e8b3fcc 100644
    a b  
    1717typedef struct WGroupbox 
    1818{ 
    1919    Widget widget; 
    20     char *title; 
     20    hotkey_t title; 
    2121} WGroupbox; 
    2222 
    2323/*** global variables defined in .c file *********************************************************/ 
  • lib/widget/label.c

    diff --git a/lib/widget/label.c b/lib/widget/label.c
    index 769a9c3..e471400 100644
    a b label_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *d 
    6767    case MSG_INIT: 
    6868        return MSG_HANDLED; 
    6969 
     70    case MSG_HOTKEY: 
     71        if (l->text.hotkey != NULL) 
     72        { 
     73            if (g_ascii_tolower ((gchar) l->text.hotkey[0]) == parm) 
     74            { 
     75                /* select next widget after this label */ 
     76                dlg_select_by_id (w->owner, (w->id + 1)); 
     77                return MSG_HANDLED; 
     78            } 
     79        } 
     80        return MSG_NOT_HANDLED; 
     81 
    7082    case MSG_DRAW: 
    7183        { 
    72             char *p = l->text; 
     84            char *p = get_hotkey_text (l->text); 
    7385            int y = 0; 
    7486            gboolean disabled; 
     87            gboolean focused; 
    7588            align_crt_t align; 
    7689 
    77             if (l->text == NULL) 
     90            if (p == NULL) 
    7891                return MSG_HANDLED; 
    7992 
    8093            disabled = widget_get_state (w, WST_DISABLED); 
     94            focused = widget_get_state (w, WST_FOCUSED); 
    8195 
    8296            if (l->transparent) 
    8397                tty_setcolor (disabled ? DISABLED_COLOR : DEFAULT_COLOR); 
    8498            else 
    8599                tty_setcolor (disabled ? DISABLED_COLOR : h->color[DLG_COLOR_NORMAL]); 
    86100 
     101            /* if there is a hotkey, we assume that text will be a one liner */ 
     102            if (l->text.hotkey != NULL) 
     103            { 
     104                widget_move (w, 0, 0); 
     105                hotkey_draw (w, l->text, focused); 
     106                return MSG_HANDLED; 
     107            } 
     108 
    87109            align = (w->pos_flags & WPOS_CENTER_HORZ) != 0 ? J_CENTER_LEFT : J_LEFT; 
    88110 
    89111            while (TRUE) 
    label_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *d 
    91113                char *q; 
    92114                char c = '\0'; 
    93115 
    94  
    95116                q = strchr (p, '\n'); 
    96117                if (q != NULL) 
    97118                { 
    label_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *d 
    109130                p = q + 1; 
    110131                y++; 
    111132            } 
     133 
    112134            return MSG_HANDLED; 
    113135        } 
    114136 
    115137    case MSG_DESTROY: 
    116         g_free (l->text); 
     138        release_hotkey (l->text); 
    117139        return MSG_HANDLED; 
    118140 
    119141    default: 
    label_new (int y, int x, const char *text) 
    138160 
    139161    l = g_new (WLabel, 1); 
    140162    w = WIDGET (l); 
     163    l->text = parse_hotkey (text); 
    141164    widget_init (w, y, x, lines, cols, label_callback, NULL); 
    142  
    143     l->text = g_strdup (text); 
     165    w->options |= WOP_WANT_HOTKEY; 
    144166    l->auto_adjust_cols = TRUE; 
    145167    l->transparent = FALSE; 
    146168 
    label_set_text (WLabel * label, const char *text) 
    155177    Widget *w = WIDGET (label); 
    156178    int newcols = w->cols; 
    157179    int newlines; 
     180    char *temp_str = get_hotkey_text (label->text); 
    158181 
    159     if (label->text != NULL && text != NULL && strcmp (label->text, text) == 0) 
     182    if (temp_str != NULL && text != NULL && strcmp (temp_str, text) == 0) 
    160183        return;                 /* Flickering is not nice */ 
    161184 
    162     g_free (label->text); 
     185    release_hotkey (label->text); 
    163186 
    164187    if (text == NULL) 
    165         label->text = NULL; 
     188        label->text = parse_hotkey (NULL); 
    166189    else 
    167190    { 
    168         label->text = g_strdup (text); 
     191        label->text = parse_hotkey (text); 
    169192        if (label->auto_adjust_cols) 
    170193        { 
    171194            str_msg_term_size (text, &newlines, &newcols); 
    label_set_text (WLabel * label, const char *text) 
    180203 
    181204    if (newcols < w->cols) 
    182205        w->cols = newcols; 
     206 
     207    g_free (temp_str); 
    183208} 
    184209 
    185210/* --------------------------------------------------------------------------------------------- */ 
  • lib/widget/label.h

    diff --git a/lib/widget/label.h b/lib/widget/label.h
    index 6d1607f..59d5281 100644
    a b typedef struct 
    1818{ 
    1919    Widget widget; 
    2020    gboolean auto_adjust_cols;  /* compute widget.cols from strlen(text)? */ 
    21     char *text; 
     21    hotkey_t text; 
    2222    gboolean transparent;       /* Paint in the default color fg/bg */ 
    2323} WLabel; 
    2424 
  • lib/widget/widget-common.c

    diff --git a/lib/widget/widget-common.c b/lib/widget/widget-common.c
    index e97b526..17c8db1 100644
    a b hotkey_width (const hotkey_t hotkey) 
    173173 
    174174/* --------------------------------------------------------------------------------------------- */ 
    175175 
     176char * 
     177get_hotkey_text (const hotkey_t hotkey) 
     178{ 
     179    int hk_width; 
     180    char *temp; 
     181 
     182    hk_width = hotkey_width (hotkey); 
     183    temp = g_malloc (hk_width + 1); 
     184 
     185    strcpy (temp, hotkey.start); 
     186 
     187    if (hotkey.hotkey != NULL) 
     188        strcat (temp, hotkey.hotkey); 
     189    if (hotkey.end != NULL) 
     190        strcat (temp, hotkey.end); 
     191 
     192    return temp; 
     193} 
     194 
     195/* --------------------------------------------------------------------------------------------- */ 
     196 
    176197void 
    177198hotkey_draw (Widget * w, const hotkey_t hotkey, gboolean focused) 
    178199{ 
  • lib/widget/widget-common.h

    diff --git a/lib/widget/widget-common.h b/lib/widget/widget-common.h
    index 540189a..9d93967 100644
    a b hotkey_t parse_hotkey (const char *text); 
    168168void release_hotkey (const hotkey_t hotkey); 
    169169/* return width on terminal of hotkey */ 
    170170int hotkey_width (const hotkey_t hotkey); 
     171/* get text of hotkey as one string */ 
     172char * get_hotkey_text (const hotkey_t hotkey); 
    171173/* draw hotkey of widget */ 
    172174void hotkey_draw (Widget * w, const hotkey_t hotkey, gboolean focused); 
    173175