URI: 
       tImprove positioning of text on button - ltkx - GUI toolkit for X11 (WIP)
  HTML git clone git://lumidify.org/ltkx.git
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 9ad6cdddb14e3bc4594142edb39360a6588c9660
   DIR parent 323ceb5cbc54b4d70002a4f4e6e5ae9d308793c4
  HTML Author: lumidify <nobody@lumidify.org>
       Date:   Sun, 12 Aug 2018 21:36:36 +0200
       
       Improve positioning of text on button
       
       Diffstat:
         M NOTES                               |       1 +
         M button.c                            |      26 ++++++++++++--------------
         M button.h                            |       5 +----
         M grid.c                              |      82 +++++++++----------------------
         M themes/default.ini                  |       5 +----
       
       5 files changed, 38 insertions(+), 81 deletions(-)
       ---
   DIR diff --git a/NOTES b/NOTES
       t@@ -4,3 +4,4 @@ Maybe use XCheckWindowEvent? - this would eliminate need for hash (could just st
        HarfBuzz - need to add option to LTK functions to allow user to choose language system manually
        LtkTextSegment - just use array instead of linked list - just need to get actual number of glyphs in advance from hb
        Add void* to LtkWidget to hold specific widget instead of doing weird casts to simulate OOP
       +When the screen size is set differently by the window manager on startup, the original drawing stays on screen - any way to fix this?
   DIR diff --git a/button.c b/button.c
       t@@ -31,14 +31,8 @@ void ltk_button_ini_handler(LtkTheme *theme, const char *prop, const char *value
                        theme->button->border_width = atoi(value);
                } else if (strcmp(prop, "font_size") == 0) {
                        theme->button->font_size = atoi(value);
       -        } else if (strcmp(prop, "padl") == 0) {
       -                theme->button->padl = atoi(value);
       -        } else if (strcmp(prop, "padr") == 0) {
       -                theme->button->padr = atoi(value);
       -        } else if (strcmp(prop, "padt") == 0) {
       -                theme->button->padt = atoi(value);
       -        } else if (strcmp(prop, "padb") == 0) {
       -                theme->button->padb = atoi(value);
       +        } else if (strcmp(prop, "pad") == 0) {
       +                theme->button->pad = atoi(value);
                } else if (strcmp(prop, "border") == 0) {
                        theme->button->border = ltk_create_xcolor(value);
                } else if (strcmp(prop, "fill") == 0) {
       t@@ -71,9 +65,11 @@ void ltk_draw_button(LtkButton *button)
                LtkButtonTheme *theme = ltk_global->theme->button;
                LtkWindow *window = button->widget.window;
                LtkRect rect = button->widget.rect;
       +        int bw = theme->border_width;
                XColor border;
                XColor fill;
                XImage *img;
       +        int text_x, text_y;
                switch (button->widget.state) {
                case LTK_NORMAL:
                        border = theme->border;
       t@@ -107,10 +103,10 @@ void ltk_draw_button(LtkButton *button)
                XSetForeground(ltk_global->display, window->gc, fill.pixel);
                XFillRectangle(ltk_global->display, window->xwindow, window->gc, rect.x, rect.y, rect.w, rect.h);
                /* FIXME: Why did I do this? */
       -        if (theme->border_width < 1) return;
       +        if (bw < 1) return;
                XSetForeground(ltk_global->display, window->gc, border.pixel);
       -        XSetLineAttributes(ltk_global->display, window->gc, theme->border_width, LineSolid, CapButt, JoinMiter);
       -        XDrawRectangle(ltk_global->display, window->xwindow, window->gc, rect.x, rect.y, rect.w, rect.h);
       +        XSetLineAttributes(ltk_global->display, window->gc, bw, LineSolid, CapButt, JoinMiter);
       +        XDrawRectangle(ltk_global->display, window->xwindow, window->gc, rect.x + bw / 2, rect.y + bw / 2, rect.w - bw, rect.h - bw);
                if (!img) {
                        img = ltk_render_text_segment(button->ts, ltk_global->display, window->xwindow, window->gc, ltk_global->colormap, theme->text_color, fill);
                        /* FIXME: any nicer way to do this? */
       t@@ -133,7 +129,9 @@ void ltk_draw_button(LtkButton *button)
                                        break;
                        }
                }
       -        XPutImage(ltk_global->display, window->xwindow, window->gc, img, 0, 0, rect.x + theme->border_width, rect.y + theme->border_width, button->ts->w, button->ts->h);
       +        text_x = rect.x + (rect.w - button->ts->w) / 2;
       +        text_y = rect.y + (rect.h - button->ts->h) / 2;
       +        XPutImage(ltk_global->display, window->xwindow, window->gc, img, 0, 0, text_x, text_y, button->ts->w, button->ts->h);
        }
        
        LtkButton *ltk_create_button(LtkWindow *window, const char *text,
       t@@ -151,8 +149,8 @@ LtkButton *ltk_create_button(LtkWindow *window, const char *text,
                button->callback = callback;
                LtkTheme *theme = ltk_global->theme;
                button->ts = ltk_create_text_segment(ltk_global->tm, text, ltk_global->default_font, theme->button->font_size);
       -        button->widget.rect.w = button->ts->w + theme->button->border_width * 2;
       -        button->widget.rect.h = button->ts->h + theme->button->border_width * 2;
       +        button->widget.rect.w = button->ts->w + (theme->button->border_width + theme->button->pad) * 2;
       +        button->widget.rect.h = button->ts->h + (theme->button->border_width + theme->button->pad) * 2;
                button->text = NULL;
                button->text_pressed = NULL;
                button->text_hover = NULL;
   DIR diff --git a/button.h b/button.h
       t@@ -41,10 +41,7 @@ typedef struct LtkButtonTheme {
                int border_width;
                int font_size;
                XColor text_color;
       -        int padl;
       -        int padr;
       -        int padt;
       -        int padb;
       +        int pad;
        
                XColor border;
                XColor fill;
   DIR diff --git a/grid.c b/grid.c
       t@@ -133,20 +133,15 @@ void ltk_recalculate_grid(void *widget)
                        }
                }
                if (total_row_weight > 0) {
       -                height_unit =
       -                    (float) (grid->widget.rect.h -
       -                             height_static) / (float) total_row_weight;
       +                height_unit = (float) (grid->widget.rect.h - height_static) / (float) total_row_weight;
                }
                if (total_column_weight > 0) {
       -                width_unit =
       -                    (float) (grid->widget.rect.w -
       -                             width_static) / (float) total_column_weight;
       +                width_unit = (float) (grid->widget.rect.w - width_static) / (float) total_column_weight;
                }
                for (i = 0; i < grid->rows; i++) {
                        grid->row_pos[i] = currenty;
                        if (grid->row_weights[i] > 0) {
       -                        grid->row_heights[i] =
       -                            grid->row_weights[i] * height_unit;
       +                        grid->row_heights[i] = grid->row_weights[i] * height_unit;
                        }
                        currenty += grid->row_heights[i];
                }
       t@@ -154,8 +149,7 @@ void ltk_recalculate_grid(void *widget)
                for (i = 0; i < grid->columns; i++) {
                        grid->column_pos[i] = currentx;
                        if (grid->column_weights[i] > 0) {
       -                        grid->column_widths[i] =
       -                            grid->column_weights[i] * width_unit;
       +                        grid->column_widths[i] = grid->column_weights[i] * width_unit;
                        }
                        currentx += grid->column_widths[i];
                }
       t@@ -167,69 +161,43 @@ void ltk_recalculate_grid(void *widget)
                                if (!grid->widget_grid[i * grid->columns + j]) {
                                        continue;
                                }
       -                        LtkWidget *ptr =
       -                            grid->widget_grid[i * grid->columns + j];
       +                        LtkWidget *ptr = grid->widget_grid[i * grid->columns + j];
                                orig_width = ptr->rect.w;
                                orig_height = ptr->rect.h;
                                end_row = i + ptr->row_span;
                                end_column = j + ptr->column_span;
       -                        if ((ptr->
       -                             sticky & (LTK_STICKY_LEFT | LTK_STICKY_RIGHT))
       -                            == (LTK_STICKY_LEFT | LTK_STICKY_RIGHT)) {
       -                                ptr->rect.w =
       -                                    grid->column_pos[end_column] -
       -                                    grid->column_pos[j];
       +                        if (ptr->sticky & LTK_STICKY_LEFT && ptr->sticky & LTK_STICKY_RIGHT) {
       +                                ptr->rect.w = grid->column_pos[end_column] - grid->column_pos[j];
                                }
       -                        if ((ptr->
       -                             sticky & (LTK_STICKY_TOP | LTK_STICKY_BOTTOM))
       -                            == (LTK_STICKY_TOP | LTK_STICKY_BOTTOM)) {
       -                                ptr->rect.h =
       -                                    grid->row_pos[end_row] -
       -                                    grid->row_pos[i];
       +                        if (ptr->sticky & LTK_STICKY_TOP && ptr->sticky & LTK_STICKY_BOTTOM) {
       +                                ptr->rect.h = grid->row_pos[end_row] - grid->row_pos[i];
                                }
       -                        if (orig_width != ptr->rect.w
       -                            || orig_height != ptr->rect.h) {
       +                        if (orig_width != ptr->rect.w || orig_height != ptr->rect.h) {
                                        if (ptr->resize) {
                                                ptr->resize(ptr);
                                        }
                                }
        
       -                        if ((ptr->sticky & LTK_STICKY_RIGHT) ==
       -                            LTK_STICKY_RIGHT) {
       -                                ptr->rect.x =
       -                                    grid->column_pos[end_column] -
       -                                    ptr->rect.w;
       -                        } else if ((ptr->sticky & LTK_STICKY_LEFT) ==
       -                                   LTK_STICKY_LEFT) {
       +                        if (ptr->sticky & LTK_STICKY_RIGHT) {
       +                                ptr->rect.x = grid->column_pos[end_column] - ptr->rect.w;
       +                        } else if (ptr->sticky & LTK_STICKY_LEFT) {
                                        ptr->rect.x = grid->column_pos[j];
                                } else {
       -                                ptr->rect.x =
       -                                    grid->column_pos[j] +
       -                                    ((grid->column_pos[end_column] -
       -                                      grid->column_pos[j]) / 2 -
       -                                     ptr->rect.w / 2);
       +                                ptr->rect.x = grid->column_pos[j] + ((grid->column_pos[end_column] - grid->column_pos[j]) / 2 - ptr->rect.w / 2);
                                }
        
       -                        if ((ptr->sticky & LTK_STICKY_BOTTOM) ==
       -                            LTK_STICKY_BOTTOM) {
       -                                ptr->rect.y =
       -                                    grid->row_pos[end_row] - ptr->rect.h;
       -                        } else if ((ptr->sticky & LTK_STICKY_TOP) ==
       -                                   LTK_STICKY_TOP) {
       +                        if (ptr->sticky & LTK_STICKY_BOTTOM) {
       +                                ptr->rect.y = grid->row_pos[end_row] - ptr->rect.h;
       +                        } else if (ptr->sticky & LTK_STICKY_TOP) {
                                        ptr->rect.y = grid->row_pos[i];
                                } else {
       -                                ptr->rect.y =
       -                                    grid->row_pos[i] +
       -                                    ((grid->row_pos[end_row] -
       -                                      grid->row_pos[i]) / 2 -
       -                                     ptr->rect.h / 2);
       +                                ptr->rect.y = grid->row_pos[i] + ((grid->row_pos[end_row] - grid->row_pos[i]) / 2 - ptr->rect.h / 2);
                                }
                        }
                }
        }
        
       -void ltk_grid_widget(void *ptr, LtkGrid * grid, int row, int column,
       -                     int row_span, int column_span, unsigned short sticky)
       +void ltk_grid_widget(void *ptr, LtkGrid * grid, int row, int column, int row_span, int column_span, unsigned short sticky)
        {
                LtkWidget *widget = ptr;
                widget->sticky = sticky;
       t@@ -237,16 +205,13 @@ void ltk_grid_widget(void *ptr, LtkGrid * grid, int row, int column,
                widget->column = column;
                widget->row_span = row_span;
                widget->column_span = column_span;
       -        if (grid->column_weights[column] == 0
       -            && widget->rect.w > grid->column_widths[column]) {
       +        if (grid->column_weights[column] == 0 && widget->rect.w > grid->column_widths[column]) {
                        grid->column_widths[column] = widget->rect.w;
                }
       -        if (grid->row_weights[row] == 0
       -            && widget->rect.h > grid->row_heights[row]) {
       +        if (grid->row_weights[row] == 0 && widget->rect.h > grid->row_heights[row]) {
                        grid->row_heights[row] = widget->rect.h;
                }
       -        grid->widget_grid[widget->row * grid->columns + widget->column] =
       -            widget;
       +        grid->widget_grid[widget->row * grid->columns + widget->column] = widget;
                widget->parent = grid;
                ltk_recalculate_grid(grid);
        }
       t@@ -255,8 +220,7 @@ int ltk_grid_find_nearest_column(LtkGrid * grid, int x)
        {
                int i;
                for (i = 0; i < grid->columns; i++) {
       -                if (grid->column_pos[i] <= x
       -                    && grid->column_pos[i + 1] >= x) {
       +                if (grid->column_pos[i] <= x && grid->column_pos[i + 1] >= x) {
                                return i;
                        }
                }
   DIR diff --git a/themes/default.ini b/themes/default.ini
       t@@ -8,10 +8,7 @@ font = Lumidify_Casual.ttf
        border_width = 2
        font_size = 30
        text_color = #FFFFFF
       -padl = 5
       -padr = 5
       -padt = 5
       -padb = 5
       +pad = 5
        border = #339999
        fill = #113355
        border_hover = #FFFFFF