1 /* 2 * Copyright (C) 2000-2019 the xine project 3 * 4 * This file is part of xine, a unix video player. 5 * 6 * xine is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * xine is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA 19 * 20 * 21 */ 22 23 #ifndef __XITK_H_ 24 #define __XITK_H_ 25 26 #ifdef HAVE_CONFIG_H 27 #include "config.h" 28 #endif 29 30 #include <stdio.h> 31 #include <stdlib.h> 32 #include <limits.h> 33 #include <inttypes.h> 34 #include <pthread.h> 35 36 #include <X11/Xlib.h> 37 #include <X11/Xutil.h> 38 #ifdef HAVE_SYS_IPC_H 39 #include <sys/ipc.h> 40 #endif 41 #ifdef HAVE_SYS_SHM_H 42 #include <sys/shm.h> 43 #endif 44 #ifdef HAVE_X11_EXTENSIONS_XSHM_H 45 #include <X11/extensions/XShm.h> 46 #endif 47 #ifdef WITH_XFT 48 #include <ft2build.h> 49 #include <X11/Xft/Xft.h> 50 #endif 51 52 #include "xitk/Imlib-light/Imlib.h" 53 54 #include "libcommon.h" 55 #include "xitk.h" 56 57 typedef struct xitk_font_cache_s xitk_font_cache_t; 58 59 struct xitk_s { 60 Display *display; 61 void (*x_lock_display) (Display *display); 62 void (*x_unlock_display) (Display *display); 63 64 xitk_font_cache_t *font_cache; 65 }; 66 67 extern xitk_t *gXitk; 68 69 extern void (*xitk_x_lock_display) (Display *display); 70 extern void (*xitk_x_unlock_display) (Display *display); 71 72 typedef struct { 73 xitk_widget_t *itemlist; 74 int sel; 75 } btnlist_t; 76 77 const xitk_skin_element_info_t *xitk_skin_get_info (xitk_skin_config_t *skin, const char *element_name); 78 79 #include "_config.h" 80 #include "browser.h" 81 #include "button.h" 82 #include "checkbox.h" 83 #include "combo.h" 84 #include "cursors.h" 85 #include "dnd.h" 86 #include "doublebox.h" 87 #include "font.h" 88 #include "image.h" 89 #include "inputtext.h" 90 #include "intbox.h" 91 #include "labelbutton.h" 92 #include "label.h" 93 #include "mrlbrowser.h" 94 #include "skin.h" 95 #include "slider.h" 96 #include "tabs.h" 97 #include "tips.h" 98 #include "widget.h" 99 #include "window.h" 100 #include "menu.h" 101 #include "xitkintl.h" 102 103 #define XITK_WIDGET_MAGIC 0x7869746b 104 105 #ifndef BUFSIZ 106 #define BUFSIZ 8192 107 #endif 108 109 #undef MAX 110 #define MAX(a, b) (((a) > (b)) ? (a) : (b)) 111 112 #undef MIN 113 #define MIN(a, b) (((a) < (b)) ? (a) : (b)) 114 115 #ifdef __GNUC__ 116 #define XITK_DIE(FMT, ARGS...) \ 117 do { \ 118 fprintf(stderr, "xiTK DIE: "FMT, ##ARGS); \ 119 exit(-1); \ 120 } while(0) 121 122 #define XITK_WARNING(FMT, ARGS...) \ 123 do { \ 124 fprintf(stderr, "xiTK WARNING(%s:%d): ", __FUNCTION__, __LINE__); \ 125 fprintf(stderr, FMT, ##ARGS); \ 126 } while(0) 127 #else /* C99 version: */ 128 #define XITK_DIE(...) \ 129 do { \ 130 fprintf(stderr, "xiTK DIE: "__VA_ARGS__); \ 131 exit(-1); \ 132 } while(0) 133 134 #define XITK_WARNING(...) \ 135 do { \ 136 fprintf(stderr, "xiTK WARNING(%s:%d): ", __FUNCTION__, __LINE__); \ 137 fprintf(stderr, __VA_ARGS__); \ 138 } while(0) 139 #endif 140 141 #define ABORT_IF_NOT_COND(cond) \ 142 do { \ 143 if(!(cond)) { \ 144 fprintf(stderr, "%s(%d): condition '%s' failed. Aborting.\n", __FUNCTION__, __LINE__, #cond); \ 145 abort(); \ 146 } \ 147 } while(0) 148 149 #define ABORT_IF_NULL(p) ABORT_IF_NOT_COND((p) != NULL) 150 151 #define XITK_FREE(X) \ 152 do { \ 153 free((X)); \ 154 (X) = NULL; \ 155 } while(0) 156 157 #define XITK_CHECK_CONSTITENCY(X) \ 158 do { \ 159 if(((X) == NULL) || ((X)->magic != XITK_WIDGET_MAGIC) \ 160 || ((X)->imlibdata == NULL)) \ 161 XITK_DIE("%s(%d): widget consistency failed.!\n", __FUNCTION__, __LINE__); \ 162 } while(0) 163 164 /* 165 * timeradd/timersub is missing on solaris' sys/time.h, provide 166 * some fallback macros 167 */ 168 #ifndef timeradd 169 #define timeradd(a, b, result) \ 170 do { \ 171 (result)->tv_sec = (a)->tv_sec + (b)->tv_sec; \ 172 (result)->tv_usec = (a)->tv_usec + (b)->tv_usec; \ 173 if ((result)->tv_usec >= 1000000) \ 174 { \ 175 ++(result)->tv_sec; \ 176 (result)->tv_usec -= 1000000; \ 177 } \ 178 } while (0) 179 #endif 180 181 #ifndef timersub 182 #define timersub(a, b, result) \ 183 do { \ 184 (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ 185 (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ 186 if ((result)->tv_usec < 0) { \ 187 --(result)->tv_sec; \ 188 (result)->tv_usec += 1000000; \ 189 } \ 190 } while (0) 191 #endif 192 193 /* Duplicate s to d timeval values */ 194 #define timercpy(s, d) do { \ 195 (d)->tv_sec = (s)->tv_sec; \ 196 (d)->tv_usec = (s)->tv_usec; \ 197 } while(0) 198 199 #define WINDOW_INFO_ZERO(w) do { \ 200 free((w)->name); \ 201 (w)->window = None; \ 202 (w)->name = NULL; \ 203 (w)->x = 0; \ 204 (w)->y = 0; \ 205 (w)->height = 0; \ 206 (w)->width = 0; \ 207 } while(0) 208 209 #define INPUT_MOTION (ExposureMask | ButtonPressMask | ButtonReleaseMask | \ 210 KeyPressMask | KeyReleaseMask | ButtonMotionMask | \ 211 StructureNotifyMask | PropertyChangeMask | \ 212 LeaveWindowMask | EnterWindowMask | PointerMotionMask) 213 214 #define DIRECTION_UP 1 215 #define DIRECTION_DOWN 2 216 #define DIRECTION_LEFT 3 217 #define DIRECTION_RIGHT 4 218 219 #define CHECK_STYLE_OLD 1 220 #define CHECK_STYLE_CHECK 2 221 #define CHECK_STYLE_ROUND 3 222 223 extern int xitk_x_error; 224 225 #ifndef _XITK_C_ 226 227 xitk_widget_list_t *xitk_widget_list_new (void); 228 xitk_register_key_t xitk_register_event_handler(const char *name, Window window, 229 widget_event_callback_t cb, 230 widget_newpos_callback_t pos_cb, 231 xitk_dnd_callback_t dnd_cb, 232 xitk_widget_list_t *wl, 233 void *user_data); 234 void xitk_unregister_event_handler(xitk_register_key_t *key); 235 int xitk_get_window_info(xitk_register_key_t key, window_info_t *winf); 236 void xitk_xevent_notify(XEvent *event); 237 238 #endif 239 240 int xitk_install_x_error_handler(void); 241 int xitk_uninstall_x_error_handler(void); 242 243 const char *xine_get_homedir(void); 244 void xitk_usec_sleep(unsigned long); 245 int xitk_system(int dont_run_as_root, const char *command); 246 int xitk_is_use_xshm(void); 247 248 const char *xitk_get_system_font(void); 249 const char *xitk_get_default_font(void); 250 251 int xitk_get_black_color(void); 252 int xitk_get_white_color(void); 253 int xitk_get_background_color(void); 254 int xitk_get_focus_color(void); 255 int xitk_get_select_color(void); 256 257 uint32_t xitk_get_wm_type(void); 258 259 char *xitk_filter_filename(const char *name); 260 unsigned long xitk_get_timer_label_animation(void); 261 long int xitk_get_timer_dbl_click(void); 262 int xitk_get_barstyle_feature(void); 263 int xitk_get_checkstyle_feature(void); 264 int xitk_get_cursors_feature(void); 265 unsigned long xitk_get_warning_foreground(void); 266 unsigned long xitk_get_warning_background(void); 267 void xitk_modal_window(Window w); 268 void xitk_unmodal_window(Window w); 269 void xitk_set_current_menu(xitk_widget_t *menu); 270 void xitk_unset_current_menu(void); 271 int xitk_get_display_width(void); 272 int xitk_get_display_height(void); 273 XColor xitk_get_black_pixel_color(void); 274 unsigned long xitk_get_tips_timeout(void); 275 void xitk_set_tips_timeout(unsigned long timeout); 276 277 int xitk_is_running(void); 278 279 int xitk_skin_get_direction(xitk_skin_config_t *, const char *); 280 int xitk_skin_get_visibility(xitk_skin_config_t *, const char *); 281 int xitk_skin_get_printability(xitk_skin_config_t *, const char *); 282 int xitk_skin_get_enability(xitk_skin_config_t *, const char *); 283 int xitk_skin_get_coord_x(xitk_skin_config_t *, const char *); 284 int xitk_skin_get_coord_y(xitk_skin_config_t *, const char *); 285 const char *xitk_skin_get_label_color(xitk_skin_config_t *, const char *); 286 const char *xitk_skin_get_label_color_focus(xitk_skin_config_t *, const char *); 287 const char *xitk_skin_get_label_color_click(xitk_skin_config_t *, const char *); 288 int xitk_skin_get_label_length(xitk_skin_config_t *, const char *); 289 int xitk_skin_get_label_animation(xitk_skin_config_t *, const char *); 290 const char *xitk_skin_get_label_fontname(xitk_skin_config_t *, const char *); 291 int xitk_skin_get_label_printable(xitk_skin_config_t *, const char *); 292 int xitk_skin_get_label_staticity(xitk_skin_config_t *, const char *); 293 int xitk_skin_get_label_alignment(xitk_skin_config_t *, const char *); 294 const char *xitk_skin_get_label_skinfont_filename(xitk_skin_config_t *, const char *); 295 const char *xitk_skin_get_skin_filename(xitk_skin_config_t *, const char *); 296 const char *xitk_skin_get_slider_skin_filename(xitk_skin_config_t *, const char *); 297 int xitk_skin_get_slider_type(xitk_skin_config_t *, const char *); 298 int xitk_skin_get_slider_radius(xitk_skin_config_t *, const char *); 299 const char *xitk_skin_get_logo(xitk_skin_config_t *); 300 const char *xitk_skin_get_animation(xitk_skin_config_t *); 301 int xitk_skin_get_browser_entries(xitk_skin_config_t *, const char *); 302 void xitk_skin_lock(xitk_skin_config_t *); 303 void xitk_skin_unlock(xitk_skin_config_t *); 304 305 void *labelbutton_get_user_data(xitk_widget_t *w); 306 void menu_auto_pop(xitk_widget_t *w); 307 308 int xitk_get_bool_value(const char *val); 309 310 311 struct xitk_font_s { 312 Display *display; 313 #ifdef WITH_XFT 314 XftFont *font; 315 #else 316 # ifdef WITH_XMB 317 XFontSet fontset; 318 # endif 319 XFontStruct *font; 320 #endif 321 char *name; 322 }; 323 324 typedef struct xitk_dialog_s xitk_dialog_t; 325 326 struct xitk_window_s { 327 Window window; 328 Window win_parent; 329 xitk_pixmap_t *background; 330 xitk_pixmap_t *background_mask; 331 int width; 332 int height; 333 xitk_dialog_t *parent; 334 }; 335 336 struct xitk_dialog_s { 337 ImlibData *imlibdata; 338 xitk_window_t *xwin; 339 xitk_register_key_t key; 340 xitk_widget_list_t *widget_list; 341 342 int type; 343 344 xitk_widget_t *wyes; 345 xitk_widget_t *wno; 346 xitk_widget_t *wcancel; 347 xitk_widget_t *checkbox; 348 xitk_widget_t *checkbox_label; 349 350 xitk_widget_t *default_button; 351 352 xitk_state_callback_t yescallback; 353 xitk_state_callback_t nocallback; 354 xitk_state_callback_t cancelcallback; 355 356 void *userdata; 357 }; 358 359 #endif 360