Ticket #2199: mc-4.7.0.5-buttonbar-click-locations.patch

File mc-4.7.0.5-buttonbar-click-locations.patch, 4.2 KB (added by egmont, 12 years ago)

v2

  • src/widget.c

    diff -ur mc-4.7.0.5.orig/src/widget.c mc-4.7.0.5/src/widget.c
    old new  
    26632663    return ret; 
    26642664} 
    26652665 
    2666 /* calculate width of one button, width is never lesser than 7 */ 
     2666/* calculate positions of buttons; width is never less than 7 */ 
     2667static void 
     2668buttonbar_init_button_positions (WButtonBar *bb) 
     2669{ 
     2670    int i; 
     2671    int pos = 0; 
     2672    int div, mod; 
     2673    if (COLS < BUTTONBAR_LABELS_NUM * 7) { 
     2674      for (i = 0; i < BUTTONBAR_LABELS_NUM; i++) { 
     2675        if (pos + 7 <= COLS) { 
     2676          pos += 7; 
     2677        } 
     2678        bb->labels[i].end_coord = pos; 
     2679      } 
     2680    } else { 
     2681      /* Distribute the extra width in a way that the middle vertical line 
     2682         (between F5 and F6) aligns with the two panels. The extra width 
     2683         is distributed in this order: F10, F5, F9, F4, ..., F6, F1. */ 
     2684      div = COLS / BUTTONBAR_LABELS_NUM; 
     2685      mod = COLS % BUTTONBAR_LABELS_NUM; 
     2686      for (i = 0; i < BUTTONBAR_LABELS_NUM / 2; i++) { 
     2687        pos += div; 
     2688        if (BUTTONBAR_LABELS_NUM / 2 - 1 - i < mod / 2) { 
     2689          pos++; 
     2690        } 
     2691        bb->labels[i].end_coord = pos; 
     2692      } 
     2693      for (; i < BUTTONBAR_LABELS_NUM; i++) { 
     2694        pos += div; 
     2695        if (BUTTONBAR_LABELS_NUM - 1 - i < (mod + 1) / 2) { 
     2696          pos++; 
     2697        } 
     2698        bb->labels[i].end_coord = pos; 
     2699      } 
     2700    } 
     2701} 
     2702 
     2703/* return width of one button */ 
    26672704static int 
    2668 buttonbat_get_button_width (void) 
     2705buttonbar_get_button_width (const WButtonBar *bb, int i) 
    26692706{ 
    2670     int result = COLS / BUTTONBAR_LABELS_NUM; 
    2671     return (result >= 7) ? result : 7; 
     2707    if (i == 0) { 
     2708      return bb->labels[0].end_coord; 
     2709    } 
     2710    return bb->labels[i].end_coord - bb->labels[i - 1].end_coord; 
     2711} 
     2712 
     2713static int 
     2714buttonbar_get_button_by_x_coord (const WButtonBar *bb, int x) 
     2715{ 
     2716    int i; 
     2717    for (i = 0; i < BUTTONBAR_LABELS_NUM; i++) { 
     2718      if (bb->labels[i].end_coord > x) { 
     2719        return i; 
     2720      } 
     2721    } 
     2722    return -1; 
    26722723} 
    26732724 
    26742725static cb_ret_t 
     
    26902741 
    26912742    case WIDGET_DRAW: 
    26922743        if (bb->visible) { 
    2693             int offset = 0; 
    2694             int count_free_positions; 
     2744            int width; 
    26952745 
     2746            buttonbar_init_button_positions (bb); 
    26962747            widget_move (&bb->widget, 0, 0); 
    26972748            tty_setcolor (DEFAULT_COLOR); 
    2698             bb->btn_width = buttonbat_get_button_width (); 
    26992749            tty_printf ("%-*s", bb->widget.cols, ""); 
    2700             count_free_positions = COLS - bb->btn_width * BUTTONBAR_LABELS_NUM; 
     2750            widget_move (&bb->widget, 0, 0); 
    27012751 
    2702             for (i = 0; i < COLS / bb->btn_width && i < BUTTONBAR_LABELS_NUM; i++) { 
    2703                 widget_move (&bb->widget, 0, (i * bb->btn_width) + offset); 
     2752            for (i = 0; i < BUTTONBAR_LABELS_NUM && (width = buttonbar_get_button_width(bb, i)) > 0; i++) { 
    27042753                tty_setcolor (BUTTONBAR_HOTKEY_COLOR); 
    27052754                tty_printf ("%2d", i + 1); 
    27062755                tty_setcolor (BUTTONBAR_BUTTON_COLOR); 
    27072756                text = (bb->labels[i].text != NULL) ? bb->labels[i].text : ""; 
    27082757                tty_print_string (str_fit_to_term ( 
    27092758                        text, 
    2710                         bb->btn_width - 2 + (int)(offset < count_free_positions), 
     2759                        width - 2, 
    27112760                        J_LEFT_FIT)); 
    2712  
    2713                 if (count_free_positions != 0 && offset < count_free_positions) 
    2714                     offset++; 
    27152761            } 
    27162762        } 
    27172763        return MSG_HANDLED; 
     
    27362782        return MOU_NORMAL; 
    27372783    if (event->y == 2) 
    27382784        return MOU_NORMAL; 
    2739     button = (event->x - 1) * BUTTONBAR_LABELS_NUM / COLS; 
    2740     if (button < BUTTONBAR_LABELS_NUM) 
     2785    button = buttonbar_get_button_by_x_coord (bb, event->x - 1); 
     2786    if (button >= 0) 
    27412787        buttonbar_call (bb, button); 
    27422788    return MOU_NORMAL; 
    27432789} 
     
    27552801    bb->visible = visible; 
    27562802    widget_want_hotkey (bb->widget, 1); 
    27572803    widget_want_cursor (bb->widget, 0); 
    2758     bb->btn_width = buttonbat_get_button_width (); 
    27592804 
    27602805    return bb; 
    27612806} 
  • src/widget.h

    diff -ur mc-4.7.0.5.orig/src/widget.h mc-4.7.0.5/src/widget.h
    old new  
    165165typedef struct WButtonBar { 
    166166    Widget widget; 
    167167    gboolean visible;           /* Is it visible? */ 
    168     int btn_width;              /* width of one button */ 
    169168    struct { 
    170169        char *text; 
    171170        unsigned long command; 
    172171        Widget *receiver; 
     172        int end_coord;          /* cumulative width of buttons so far */ 
    173173    } labels [BUTTONBAR_LABELS_NUM]; 
    174174} WButtonBar; 
    175175