URI:
       cache.h - ledit - Text editor (WIP)
  HTML git clone git://lumidify.org/ledit.git (fast, but not encrypted)
  HTML git clone https://lumidify.org/git/ledit.git (encrypted, but very slow)
  HTML git clone git://4kcetb7mo7hj6grozzybxtotsub5bempzo4lirzc3437amof2c2impyd.onion/ledit.git (over tor)
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       cache.h (4471B)
       ---
            1 #ifndef _CACHE_H_
            2 #define _CACHE_H_
            3 
            4 #include <stddef.h>
            5 #include <X11/Xlib.h>
            6 #include <pango/pangoxft.h>
            7 
            8 /*
            9  *The maximum number of layouts in the cache.
           10  */
           11 #define LAYOUT_CACHE_SIZE 40
           12 
           13 /*
           14  * The initial number of pixmaps in the cache.
           15  * The size is increased when more pixmaps are visible
           16  * at the same time than there are entries in the cache.
           17  */
           18 #define PIXMAP_CACHE_INITIAL_SIZE 20
           19 
           20 typedef struct {
           21         Pixmap pixmap;
           22         XftDraw *draw;
           23         int w, h;     /* width and height of the pixmap */
           24         size_t line;  /* the line associated with this entry */
           25         int valid;    /* whether the entry is assigned to a line */
           26 } cache_pixmap;
           27 
           28 typedef struct {
           29         PangoLayout *layout;
           30         size_t line;  /* the line associated with this entry */
           31         int valid;    /* whether the entry is assigned to a line */
           32 } cache_layout;
           33 
           34 typedef struct {
           35         Display *dpy;
           36         cache_pixmap *pixmaps;
           37         cache_layout *layouts;
           38         size_t num_pixmaps;
           39         size_t num_layouts;
           40         size_t cur_pixmap_index; /* current replacement index for pixmaps */
           41         size_t cur_layout_index; /* current replacement index for layouts */
           42 } ledit_cache;
           43 
           44 /* FIXME: maybe handle pixmap creation and resizing here */
           45 
           46 /*
           47  * Create cache using X Display dpy (this is
           48  * needed to destroy the pixmaps in the end).
           49  */
           50 ledit_cache *cache_create(Display *dpy);
           51 
           52 /*
           53  * Reset line index of every cache entry (pixmaps and layouts).
           54  * invalidate_pixmap_line is called with callback_data as its first
           55  * argument and a line index which has been removed from the pixmap
           56  * cache as the second argument.
           57  * invalidate_layout_line is the same, but for the layout cache.
           58  */
           59 void cache_flush(
           60     ledit_cache *cache,
           61     void *callback_data,
           62     void (*invalidate_pixmap_line)(void *, size_t),
           63     void (*invalidate_layout_line)(void *, size_t)
           64 );
           65 
           66 /*
           67  * Like cache_flush, but only line numbers >= start are invalidated.
           68  */
           69 void cache_invalidate_from_line(
           70     ledit_cache *cache, size_t start,
           71     void *callback_data,
           72     void (*invalidate_pixmap_line)(void *, size_t),
           73     void (*invalidate_layout_line)(void *, size_t)
           74 );
           75 
           76 /*
           77  * Destroy cache.
           78  */
           79 void cache_destroy(ledit_cache *cache);
           80 
           81 /*
           82  * Get the cache_pixmap at index.
           83  */
           84 cache_pixmap *cache_get_pixmap(ledit_cache *cache, size_t index);
           85 
           86 /*
           87  * Get the cache_layout at index.
           88  */
           89 cache_layout *cache_get_layout(ledit_cache *cache, size_t index);
           90 
           91 /*
           92  * The following two functions have a somewhat cumbersome interface
           93  * because set_pixmap_line and set_layout_line are required as helper
           94  * functions instead of just returning the cache index and letting the
           95  * caller handle the updating. However, this has led to horrible bugs
           96  * in the past, when one of the updating steps was forgotten, so this
           97  * interface was designed instead to avoid some of those more basic bugs.
           98  */
           99 
          100 /*
          101  * Assign an unneeded pixmap cache index to the line with index 'line'.
          102  * line_needed is used to check if a line is needed.
          103  * It is called with callback_data as the first argument and the
          104  * line to be checked as the second argument.
          105  * The line of the cache entry is set to 'line' and if a line was
          106  * set before, it is reset by calling 'invalidate_pixmap_line' with
          107  * 'callback_data' as the first argumentand  the old line as the
          108  * second argument.
          109  * The cache index of the new line is changed by calling 'set_pixmap_line'
          110  * with 'callback_data' as the first argument, 'line' as the second
          111  * argument, and the new cache index as the third argument.
          112  */
          113 void cache_assign_pixmap_index(
          114     ledit_cache *cache, size_t line,
          115     void *callback_data,
          116     int (*line_needed)(void *, size_t),
          117     void (*set_pixmap_line)(void *, size_t, size_t),
          118     void (*invalidate_pixmap_line)(void *, size_t)
          119 );
          120 
          121 /*
          122  * Assign a layout cache index to the line with index 'line'.
          123  * Since it is not clear which layouts are needed more, this just
          124  * uses the next index in a clock fashion.
          125  * The line of the cache entry is set to 'line' and if a line was
          126  * set before, it is reset by calling 'invalidate_layout_line' with
          127  * 'callback_data' as the first argument and the old line as the
          128  * second argument.
          129  * The cache index of the new line is changed by calling 'set_layout_line'
          130  * with 'callback_data' as the first argument, 'line' as the second
          131  * argument, and the new cache index as the third argument.
          132  */
          133 void cache_assign_layout_index(
          134     ledit_cache *cache, size_t line,
          135     void *callback_data,
          136     void (*set_layout_line)(void *, size_t, size_t),
          137     void (*invalidate_layout_line)(void *, size_t)
          138 );
          139 
          140 #endif