ltk

Socket-based GUI for X11 (WIP)
git clone git://lumidify.org/ltk.git (fast, but not encrypted)
git clone https://lumidify.org/git/ltk.git (encrypted, but very slow)
Log | Files | Refs | README | LICENSE

text.h (4044B)


      1 /*
      2  * Copyright (c) 2021-2023 lumidify <nobody@lumidify.org>
      3  *
      4  * Permission to use, copy, modify, and/or distribute this software for any
      5  * purpose with or without fee is hereby granted, provided that the above
      6  * copyright notice and this permission notice appear in all copies.
      7  *
      8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
      9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     15  */
     16 
     17 #ifndef LTK_TEXT_H
     18 #define LTK_TEXT_H
     19 
     20 #include "color.h"
     21 #include "graphics.h"
     22 #include "ltk.h"
     23 
     24 typedef struct ltk_text_line ltk_text_line;
     25 /* typedef struct ltk_text_context ltk_text_context; */
     26 
     27 ltk_text_context *ltk_text_context_create(ltk_renderdata *data, char *default_font);
     28 void ltk_text_context_destroy(ltk_text_context *ctx);
     29 
     30 /* FIXME: allow to give length of text */
     31 /* FIXME: uint16_t as size is kind of ugly (also see window theme) */
     32 ltk_text_line *ltk_text_line_create(ltk_text_context *ctx, uint16_t font_size, char *text, int take_over_text, int width);
     33 void ltk_text_line_set_width(ltk_text_line *tl, int width);
     34 void ltk_text_line_get_size(ltk_text_line *tl, int *w, int *h);
     35 void ltk_text_line_destroy(ltk_text_line *tl);
     36 /* FIXME: length of text */
     37 void ltk_text_line_set_text(ltk_text_line *line, char *text, int take_over_text);
     38 
     39 /* Draw the entire line to a surface. */
     40 /* FIXME: Some widgets rely on this to not fail when negative coordinates are given or
     41    the text goes outside of the surface boundaries - in the stb backend, this is taken
     42    into account and the pango-xft backend doesn't *seem* to have any problems with it,
     43    but I don't know if that's guaranteed. */
     44 void ltk_text_line_draw(ltk_text_line *tl, ltk_surface *s, ltk_color *color, int x, int y);
     45 
     46 /* Draw a line onto a surface at position x,y and clipped to 'clip'.
     47    Note that 'clip' is relative to the origin of the given surface, not 'x' and 'y'. */
     48 void ltk_text_line_draw_clipped(ltk_text_line *tl, ltk_surface *s, ltk_color *color, int x, int y, ltk_rect clip);
     49 
     50 void ltk_text_line_clear_attrs(ltk_text_line *tl);
     51 void ltk_text_line_add_attr_bg(ltk_text_line *tl, size_t start, size_t end, ltk_color *color);
     52 void ltk_text_line_add_attr_fg(ltk_text_line *tl, size_t start, size_t end, ltk_color *color);
     53 
     54 typedef enum {
     55 	LTK_TEXT_LTR,
     56 	LTK_TEXT_RTL,
     57 } ltk_text_direction;
     58 
     59 /* FIXME: support for strong and weak cursor */
     60 /* FIXME: better interface that doesn't just return ltr on error (e.g. invalid index) */
     61 ltk_text_direction ltk_text_line_get_byte_direction(ltk_text_line *tl, size_t byte);
     62 ltk_text_direction ltk_text_line_get_softline_direction(ltk_text_line *tl, size_t line);
     63 size_t ltk_text_line_get_num_softlines(ltk_text_line *tl);
     64 size_t ltk_text_line_xy_to_pos(ltk_text_line *tl, int x, int y, int snap_nearest);
     65 void ltk_text_line_pos_to_rect(ltk_text_line *tl, size_t pos, int *x_ret, int *y_ret, int *w_ret, int *h_ret);
     66 size_t ltk_text_line_x_softline_to_pos(ltk_text_line *tl, int x, size_t softline, int snap_nearest);
     67 void ltk_text_line_pos_to_x_softline(ltk_text_line *tl, size_t pos, int middle, int *x_ret, size_t *softline_ret);
     68 size_t ltk_text_line_move_cursor_visually(ltk_text_line *tl, size_t pos, int movement, size_t *prev_index_ret);
     69 
     70 /* FIXME: two versions: bigline and normal line with text stored in memory but no bidi etc. */
     71 /* need to set endline separator so it can return when end of line reached! */
     72 /* FIXME: does this even make sense? */
     73 void ltk_text_bline_create(
     74     size_t (*iter_cur)(void *data),
     75     void (*iter_next)(void *data, char **text_ret, size_t *len_ret),
     76     void (*iter_prev)(void *data, size_t maxlen, char **text_ret, size_t *len_ret),
     77     void *data
     78 );
     79 
     80 #endif /* LTK_TEXT_H */