window.h (9546B)
1 #ifndef _WINDOW_H_ 2 #define _WINDOW_H_ 3 4 /* 5 * A window is associated with exactly one view and is responsible everything 6 * other than the actual text handling (of the text in the buffer). 7 * It's a bit ugly right now because the line editor for commands is implemented 8 * partially here and partially in keys_command, but that's the way it is for now. 9 */ 10 11 #include <time.h> 12 #include <stdarg.h> 13 #include <X11/Xlib.h> 14 #include <X11/Xatom.h> 15 #include <X11/Xutil.h> 16 #include <X11/extensions/Xdbe.h> 17 #include <pango/pangoxft.h> 18 19 #include "common.h" 20 #include "clipboard.h" 21 #include "txtbuf.h" 22 23 typedef struct bottom_bar bottom_bar; 24 25 typedef struct { 26 /* Pango stuff */ 27 /* FIXME: maybe move to common? */ 28 PangoFontMap *fontmap; 29 PangoContext *context; 30 PangoFontDescription *font; 31 32 /* X stuff */ 33 GC gc; 34 Window xwin; 35 XdbeBackBuffer back_buf; /* the back buffer for double buffering */ 36 Drawable drawable; /* the actual drawable to draw to */ 37 /* this is currently always the same as back_buf, 38 but that might be changed at some point */ 39 XSetWindowAttributes wattrs; 40 Atom wm_delete_msg; /* used to check when window is closed */ 41 42 int w; /* width of window */ 43 int h; /* height of window */ 44 int text_w; /* width of the text part of the window */ 45 int text_h; /* height of the text part of the window */ 46 int scroll_dragging; /* whether scrollbar is being dragged with mouse */ 47 int scroll_grab_handle; /* the y position where the mouse was was while dragging the scrollbar */ 48 long scroll_max; /* total pixel height of displayed text */ 49 double scroll_offset; /* double for smoother scrolling */ 50 int bottom_text_shown; /* whether editable text is shown at the bottom */ 51 int message_shown; /* whether a readonly message is shown at the bottom */ 52 bottom_bar *bb; /* encapsulates the text at the bottom */ 53 int redraw; /* whether something has changed and the window has to be redrawn */ 54 Cursor cursor_text; /* text cursor shown when cursor is over text area */ 55 56 /* stuff for filtering events so not too many have to be handled */ 57 struct timespec last_scroll; 58 struct timespec last_motion; 59 struct timespec last_resize; 60 XEvent last_scroll_event; 61 XEvent last_motion_event; 62 XEvent last_resize_event; 63 int last_scroll_valid; 64 int last_motion_valid; 65 int last_resize_valid; 66 /* This is a hack to make the first resizing of the window go quickly instead 67 of being delayed due to the event filtering - this is noticeable in tiling 68 window managers that resize the window immediately after it is created. 69 The whole event filtering system needs to be rethought anyways, but this 70 at least sort of works for the time being. (FIXME) */ 71 int first_resize; 72 int scroll_num; 73 int scroll_delta; 74 75 /* IME stuff */ 76 XIM xim; 77 XIC xic; 78 XPoint spot; 79 XVaNestedList spotlist; 80 81 ledit_common *common; /* shared with others */ 82 ledit_clipboard *clipboard; /* also shared */ 83 84 /* various callbacks */ 85 void (*scroll_callback)(void *, long); 86 void (*button_callback)(void *, XEvent *); 87 void (*resize_callback)(void *); 88 void *scroll_cb_data; 89 void *button_cb_data; 90 void *resize_cb_data; 91 } ledit_window; 92 93 /* 94 * Create a window with initial mode 'mode'. 95 */ 96 ledit_window *window_create(ledit_common *common, ledit_clipboard *clipboard); 97 98 /* 99 * Destroy a window. 100 */ 101 void window_destroy(ledit_window *window); 102 103 /* FIXME: this is a bit confusing because there's a difference between editable 104 text shown and non-editable message shown */ 105 106 /* 107 * Move the cursor of the editable text at the bottom movement cursor positions. 108 * Negative movement means to the left, positive movement to the right. 109 */ 110 void window_move_bottom_bar_cursor(ledit_window *window, int movement); 111 112 /* 113 * Delete a unicode character from he editable text. 114 * Negative dir means to the left of the cursor, positive to the right. 115 */ 116 void window_delete_bottom_bar_char(ledit_window *window, int dir); 117 118 /* 119 * Move the cursor of the editable text to position 0. 120 */ 121 void window_bottom_bar_cursor_to_beginning(ledit_window *window); 122 123 /* 124 * Move the cursor of the editable text to the end of the line. 125 */ 126 void window_bottom_bar_cursor_to_end(ledit_window *window); 127 128 /* 129 * Set the minimum byte position of the cursor of the editable text to 'pos'. 130 * This means that the cursor will not be allowed to go further left 131 * than that position (used e.g. for the ':' in commands). 132 */ 133 void window_set_bottom_bar_min_pos(ledit_window *window, int pos); 134 135 /* 136 * Get the mininum position (see above). 137 */ 138 int window_get_bottom_bar_min_pos(ledit_window *window); 139 140 /* 141 * Set whether the editable text is shown. 142 */ 143 void window_set_bottom_bar_text_shown(ledit_window *window, int shown); 144 145 /* 146 * get whether the editable text is shown. 147 */ 148 int ledit_window_bottom_bar_text_shown(ledit_window *window); 149 150 /* 151 * Set the byte position of the editable text cursor to 'byte_pos'. 152 */ 153 void window_set_bottom_bar_cursor(ledit_window *window, int byte_pos); 154 155 /* 156 * Get the byte position of the editable text cursor. 157 */ 158 int ledit_window_get_bottom_bar_cursor(ledit_window *window); 159 160 /* 161 * Insert 'len' bytes of text into the editable line at the cursor position. 162 */ 163 void window_insert_bottom_bar_text(ledit_window *window, char *text, int len); 164 165 /* 166 * Set the text of the editable line. 167 */ 168 void window_set_bottom_bar_text(ledit_window *window, char *text, int len); 169 170 /* 171 * Set the text after the minimum position. 172 * If the set minimum position is after the current length 173 * of the text in the bar, the text is just appended. 174 */ 175 void window_set_bottom_bar_realtext(ledit_window *window, char *text, int len); 176 177 /* 178 * Get the text of the editable line. 179 * WARNING: this is a direct pointer to the internal storage, 180 * it is not copied. 181 */ 182 char *window_get_bottom_bar_text(ledit_window *window); 183 184 /* 185 * Show a non-editable message at the bottom. 186 */ 187 void window_show_message(ledit_window *window, char *text, int len); 188 189 /* 190 * Show a non-editable message that is given as a 191 * format string and arguments as interpreted by 192 * vsnprintf(3) 193 * WARNING: This may reallocate the internal text storage for the 194 * bottom bar before actually using the format arguments, so don't 195 * ever pass parts of the text returned by window_get_bottom_bar_text 196 * to this function without first copying it. 197 */ 198 void window_show_message_fmt(ledit_window *window, char *fmt, ...); 199 200 /* 201 * Hide the non-editable message. 202 */ 203 void window_hide_message(ledit_window *window); 204 205 /* 206 * Get whether a non-editable message is shown. 207 */ 208 int window_message_shown(ledit_window *window); 209 210 /* FIXME: document */ 211 void window_set_format_args(ledit_window *window, ledit_mode mode, int hl_mode, size_t line, size_t byte, size_t lang_index); 212 213 /* 214 * Set the total pixel height of the text. 215 */ 216 void window_set_scroll_max(ledit_window *window, long max); 217 218 /* 219 * Set the scroll position of the window. 220 * This is in absolute pixels from the top of the text. 221 */ 222 void window_set_scroll_pos(ledit_window *window, long pos); 223 224 /* 225 * Set a callback that will be called when the user scrolls. 226 * The callback is called with 'data' as the first argument and 227 * the scroll offset as the second argument. 228 */ 229 void window_set_scroll_callback(ledit_window *window, void (*cb)(void *, long), void *data); 230 231 /* 232 * Set a callback that is called when Button1 is clicked or released 233 * in the text area. 234 */ 235 void window_set_button_callback(ledit_window *window, void (*cb)(void *, XEvent *), void *data); 236 237 /* 238 * Set a callback that is called when the window is resized. 239 */ 240 void window_set_resize_callback(ledit_window *window, void (*cb)(void *), void *data); 241 242 /* 243 * The following three functions are used to register events that 244 * need to be filtered in order to avoid processing too many events 245 * (which leads to lagging). 246 */ 247 void window_register_resize(ledit_window *window, XEvent *event); 248 void window_register_button_press(ledit_window *window, XEvent *event); 249 void window_register_motion(ledit_window *window, XEvent *event); 250 251 /* 252 * Check if any of the previously registered events should be handled 253 * now. This should be called every frame to check if processin is 254 * necessary. 255 */ 256 void window_handle_filtered_events(ledit_window *window); 257 258 /* 259 * Clear the window. 260 */ 261 void window_clear(ledit_window *window); 262 263 /* 264 * Redraw the window. 265 * This only redraws the parts mANAGED BY THE window. 266 * The text area needs to be redrawn separately. 267 */ 268 void window_redraw(ledit_window *window); 269 270 /* 271 * Resize the window and call the resize callback if set. 272 */ 273 void window_resize(ledit_window *window, int w, int h); 274 275 /* 276 * Get the size of the actual text area (everything other than the 277 * scrollbar and the line at the bottom). 278 */ 279 void window_get_textview_size(ledit_window *window, int *w_ret, int *h_ret); 280 281 /* 282 * Handle a button press. 283 * This does not filter events like the register function! 284 */ 285 void window_button_press(ledit_window *window, XEvent *event, int scroll_num); 286 287 /* 288 * Handle a button release. 289 */ 290 void window_button_release(ledit_window *window, XEvent *event); 291 292 /* 293 * Handle a button motion event. 294 * This does not filter events like the register function! 295 */ 296 void window_drag_motion(ledit_window *window, XEvent *event); 297 298 /* 299 * Set the pixel position of the input method context. 300 * This is used by some input method editors to show an editor at 301 * the position that text is being inserted at. 302 */ 303 void xximspot(ledit_window *window, int x, int y); 304 305 #endif