cache.h - ledit - Text editor (WIP) | |
git clone git://lumidify.org/ledit.git (fast, but not encrypted) | |
git clone https://lumidify.org/ledit.git (encrypted, but very slow) | |
git clone git://4kcetb7mo7hj6grozzybxtotsub5bempzo4lirzc3437amof2c2impyd.onion/… | |
Log | |
Files | |
Refs | |
README | |
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 pixmap… | |
41 size_t cur_layout_index; /* current replacement index for layout… | |
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_lin… | |
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_lin… | |
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 |