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