ltkx

GUI toolkit for X11 (WIP)
git clone git://lumidify.org/ltkx.git
Log | Files | Refs | README | LICENSE

commit 9ad6cdddb14e3bc4594142edb39360a6588c9660
parent 323ceb5cbc54b4d70002a4f4e6e5ae9d308793c4
Author: lumidify <nobody@lumidify.org>
Date:   Sun, 12 Aug 2018 21:36:36 +0200

Improve positioning of text on button

Diffstat:
MNOTES | 1+
Mbutton.c | 26++++++++++++--------------
Mbutton.h | 5+----
Mgrid.c | 82++++++++++++++++++++++---------------------------------------------------------
Mthemes/default.ini | 5+----
5 files changed, 38 insertions(+), 81 deletions(-)

diff --git a/NOTES b/NOTES @@ -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? diff --git a/button.c b/button.c @@ -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) { @@ -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; @@ -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? */ @@ -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, @@ -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; diff --git a/button.h b/button.h @@ -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; diff --git a/grid.c b/grid.c @@ -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]; } @@ -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]; } @@ -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; @@ -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); } @@ -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; } } diff --git a/themes/default.ini b/themes/default.ini @@ -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