ltk.h (4635B)
1 /* 2 * This file is part of the Lumidify ToolKit (LTK) 3 * Copyright (c) 2016, 2017, 2018 lumidify <nobody@lumidify.org> 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a copy 6 * of this software and associated documentation files (the "Software"), to deal 7 * in the Software without restriction, including without limitation the rights 8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 * copies of the Software, and to permit persons to whom the Software is 10 * furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice shall be included in all 13 * copies or substantial portions of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 * SOFTWARE. 22 */ 23 24 #ifndef _LTK_H_ 25 #define _LTK_H_ 26 27 /* Requires the following includes: <X11/Xlib.h>, <X11/Xutil.h> */ 28 29 typedef struct { 30 int x; 31 int y; 32 int w; 33 int h; 34 } LtkRect; 35 36 typedef enum { 37 LTK_STICKY_LEFT = 1 << 0, 38 LTK_STICKY_RIGHT = 1 << 1, 39 LTK_STICKY_TOP = 1 << 2, 40 LTK_STICKY_BOTTOM = 1 << 3 41 } LtkStickyMask; 42 43 typedef enum { 44 LTK_NORMAL = 0, 45 LTK_HOVER = 1, 46 LTK_PRESSED = 2, 47 LTK_ACTIVE = 3, 48 LTK_HOVERACTIVE = 4, 49 LTK_DISABLED = 5 50 } LtkWidgetState; 51 52 typedef struct LtkWindow LtkWindow; 53 54 /* FIXME: change row, column, etc. to void* struct so 55 other layout systems can be implemented */ 56 typedef struct LtkWidget { 57 LtkWindow *window; 58 struct LtkWidget *active_widget; 59 struct LtkWidget *hover_widget; 60 struct LtkWidget *parent; 61 62 void (*key_press) (void *, XEvent event); 63 void (*key_release) (void *, XEvent event); 64 void (*mouse_press) (void *, XEvent event); 65 void (*mouse_release) (void *, XEvent event); 66 void (*motion_notify) (void *, XEvent event); 67 void (*mouse_leave) (void *, XEvent event); 68 void (*mouse_enter) (void *, XEvent event); 69 70 void (*resize) (void *, int, int); 71 void (*draw) (void *); 72 void (*destroy) (void *); 73 74 LtkRect collision_rect; /* rect for collision with mouse */ 75 LtkRect rect; /* rect in grid - this is only different when the widget is floating */ 76 unsigned int row; 77 unsigned int column; 78 unsigned int row_span; 79 unsigned int column_span; 80 unsigned int needs_redraw; 81 LtkWidgetState state; 82 unsigned short sticky; 83 } LtkWidget; 84 85 typedef struct LtkWindow { 86 Window xwindow; 87 GC gc; 88 LtkWidget *root_widget; 89 int (*other_event) (LtkWindow *, XEvent event); 90 LtkRect rect; 91 LtkWidget **float_widgets; 92 int num_float_widgets; 93 int max_float_widgets; 94 } LtkWindow; 95 96 typedef struct LtkWindowTheme { 97 int border_width; 98 char *font; 99 XColor fg; 100 XColor bg; 101 } LtkWindowTheme; 102 103 typedef struct LtkButtonTheme LtkButtonTheme; 104 105 typedef struct { 106 LtkWindowTheme *window; 107 LtkButtonTheme *button; 108 } LtkTheme; 109 110 typedef struct LtkTextManager LtkTextManager; 111 LtkTextManager *ltk_get_text_manager(void); 112 LtkTheme *ltk_get_theme(void); 113 Display *ltk_get_display(void); 114 Colormap ltk_get_colormap(void); 115 116 LtkTheme *ltk_load_theme(const char *path); 117 118 typedef struct LtkTextManager LtkTextManager; 119 120 void ltk_window_invalidate_rect(LtkWindow *window, LtkRect rect); 121 122 void ltk_init(const char *theme_path); 123 124 void ltk_fatal(const char *msg); 125 126 XColor ltk_create_xcolor(const char *hex); 127 128 void ltk_mainloop(void); 129 130 LtkWindow *ltk_create_window(const char *title, int x, int y, 131 unsigned int w, unsigned int h); 132 133 void ltk_redraw_window(LtkWindow *window, LtkRect rect); 134 135 void ltk_remove_window(LtkWindow *window); 136 137 void ltk_destroy_window(LtkWindow *window); 138 139 void ltk_window_other_event(LtkWindow *window, XEvent event); 140 141 void ltk_destroy_theme(LtkTheme *theme); 142 143 int ltk_collide_rect(LtkRect rect, int x, int y); 144 145 char *ltk_read_file(const char *path, unsigned long *len); 146 147 void ltk_change_active_widget_state(void *widget, LtkWidgetState state); 148 149 void ltk_remove_active_widget(void *widget); 150 151 void ltk_remove_hover_widget(void *widget); 152 153 void ltk_fill_widget_defaults(LtkWidget *widget, LtkWindow * window, 154 void (*draw) (void *), void (*destroy) (void *), unsigned int needs_redraw); 155 156 void ltk_widget_mouse_press_event(void *widget, XEvent event); 157 158 void ltk_widget_mouse_release_event(void *widget, XEvent event); 159 160 void ltk_widget_motion_notify_event(void *widget, XEvent event); 161 162 void ltk_handle_event(XEvent event); 163 164 #endif