#include "SDL_internal.h"
#ifndef SDL_x11toolkit_h_
#define SDL_x11toolkit_h_
#include "../../SDL_list.h"
#include "SDL_x11video.h"
#include "SDL_x11dyn.h"
#include "SDL_x11settings.h"
#include "SDL_x11toolkit.h"
#include "xsettings-client.h"
#ifdef HAVE_FRIBIDI_H
#include "../../core/unix/SDL_fribidi.h"
#endif
#ifdef HAVE_LIBTHAI_H
#include "../../core/unix/SDL_libthai.h"
#endif
#ifdef SDL_VIDEO_DRIVER_X11
#define SDL_TOOLKIT_X11_ELEMENT_PADDING 4
#define SDL_TOOLKIT_X11_ELEMENT_PADDING_2 12
#define SDL_TOOLKIT_X11_ELEMENT_PADDING_3 8
#define SDL_TOOLKIT_X11_ELEMENT_PADDING_4 16
#define SDL_TOOLKIT_X11_ELEMENT_PADDING_5 3
typedef enum SDL_ToolkitChildModeX11
{
SDL_TOOLKIT_WINDOW_MODE_X11_DIALOG,
SDL_TOOLKIT_WINDOW_MODE_X11_CHILD,
SDL_TOOLKIT_WINDOW_MODE_X11_MENU,
SDL_TOOLKIT_WINDOW_MODE_X11_TOOLTIP
} SDL_ToolkitWindowModeX11;
typedef enum SDL_ToolkitThaiEncodingX11
{
SDL_TOOLKIT_THAI_ENCODING_X11_NONE,
SDL_TOOLKIT_THAI_ENCODING_X11_TIS,
SDL_TOOLKIT_THAI_ENCODING_X11_TIS_WIN,
SDL_TOOLKIT_THAI_ENCODING_X11_TIS_MAC,
SDL_TOOLKIT_THAI_ENCODING_X11_8859,
SDL_TOOLKIT_THAI_ENCODING_X11_UNICODE
} SDL_ToolkitThaiEncodingX11;
typedef enum SDL_ToolkitThaiFontX11
{
SDL_TOOLKIT_THAI_FONT_X11_OFFSET,
SDL_TOOLKIT_THAI_FONT_X11_CELL
} SDL_ToolkitThaiFontX11;
typedef struct SDL_ToolkitWindowX11
{
char *origlocale;
SDL_ToolkitWindowModeX11 mode;
Display *display;
int screen;
bool display_close;
SDL_VideoDevice *parent_device;
SDL_Window *parent;
struct SDL_ToolkitWindowX11 *tk_parent;
Window window;
Drawable drawable;
#ifndef NO_SHARED_MEMORY
XImage *image;
XShmSegmentInfo shm_info;
int shm_bytes_per_line;
#endif
Visual *visual;
XVisualInfo vi;
Colormap cmap;
GC ctx;
int depth;
bool pixmap;
#ifdef SDL_VIDEO_DRIVER_X11_XDBE
XdbeBackBuffer buf;
bool xdbe; #endif
#ifdef SDL_VIDEO_DRIVER_X11_XRANDR
bool xrandr; #endif
#ifndef NO_SHARED_MEMORY
bool shm;
Bool shm_pixmap;
#endif
bool utf8;
Atom wm_protocols;
Atom wm_delete_message;
int window_width; int window_height; int pixmap_width;
int pixmap_height;
int window_x;
int window_y;
XSettingsClient *xsettings;
bool xsettings_first_time;
int iscale;
float scale;
XFontSet font_set; XFontStruct *font_struct; SDL_ToolkitThaiEncodingX11 thai_encoding;
SDL_ToolkitThaiFontX11 thai_font;
const SDL_MessageBoxColor *color_hints;
XColor xcolor[SDL_MESSAGEBOX_COLOR_COUNT];
XColor xcolor_bevel_l1;
XColor xcolor_bevel_l2;
XColor xcolor_bevel_d;
XColor xcolor_pressed;
XColor xcolor_disabled_text;
bool has_focus;
struct SDL_ToolkitControlX11 *focused_control;
struct SDL_ToolkitControlX11 *fiddled_control;
struct SDL_ToolkitControlX11 **controls;
size_t controls_sz;
struct SDL_ToolkitControlX11 **dyn_controls;
size_t dyn_controls_sz;
void *cb_data;
void (*cb_on_scale_change)(struct SDL_ToolkitWindowX11 *, void *);
SDL_ListNode *popup_windows;
XEvent *e;
struct SDL_ToolkitControlX11 *previous_control;
struct SDL_ToolkitControlX11 *key_control_esc;
struct SDL_ToolkitControlX11 *key_control_enter;
KeySym last_key_pressed;
int ev_i;
float ev_scale;
float ev_iscale;
bool draw;
bool close;
long event_mask;
#ifdef HAVE_FRIBIDI_H
SDL_FriBidi *fribidi;
bool do_shaping;
#endif
#ifdef HAVE_LIBTHAI_H
SDL_LibThai *th;
#endif
bool flip_interface;
} SDL_ToolkitWindowX11;
typedef enum SDL_ToolkitControlStateX11
{
SDL_TOOLKIT_CONTROL_STATE_X11_NORMAL,
SDL_TOOLKIT_CONTROL_STATE_X11_HOVER,
SDL_TOOLKIT_CONTROL_STATE_X11_PRESSED,
SDL_TOOLKIT_CONTROL_STATE_X11_PRESSED_HELD,
SDL_TOOLKIT_CONTROL_STATE_X11_DISABLED
} SDL_ToolkitControlStateX11;
typedef struct SDL_ToolkitControlX11
{
SDL_ToolkitWindowX11 *window;
SDL_ToolkitControlStateX11 state;
SDL_Rect rect;
bool selected;
bool dynamic;
bool is_default_enter;
bool is_default_esc;
bool do_size;
void *data;
void (*func_draw)(struct SDL_ToolkitControlX11 *);
void (*func_calc_size)(struct SDL_ToolkitControlX11 *);
void (*func_on_scale_change)(struct SDL_ToolkitControlX11 *);
void (*func_on_state_change)(struct SDL_ToolkitControlX11 *);
void (*func_free)(struct SDL_ToolkitControlX11 *);
} SDL_ToolkitControlX11;
typedef struct SDL_ToolkitMenuItemX11
{
const char *utf8;
bool checkbox;
bool checked;
bool disabled;
void *cb_data;
void (*cb)(struct SDL_ToolkitMenuItemX11 *, void *);
SDL_ListNode *sub_menu;
SDL_Rect utf8_rect;
SDL_Rect hover_rect;
SDL_Rect check_rect;
SDL_ToolkitControlStateX11 state;
int arrow_x;
int arrow_y;
bool reverse_arrows;
} SDL_ToolkitMenuItemX11;
extern SDL_ToolkitWindowX11 *X11Toolkit_CreateWindowStruct(SDL_Window *parent, SDL_ToolkitWindowX11 *tkparent, SDL_ToolkitWindowModeX11 mode, const SDL_MessageBoxColor *colorhints, bool create_new_display);
extern bool X11Toolkit_CreateWindowRes(SDL_ToolkitWindowX11 *data, int w, int h, int cx, int cy, char *title);
extern void X11Toolkit_DoWindowEventLoop(SDL_ToolkitWindowX11 *data);
extern void X11Toolkit_ResizeWindow(SDL_ToolkitWindowX11 *data, int w, int h);
extern void X11Toolkit_DestroyWindow(SDL_ToolkitWindowX11 *data);
extern void X11Toolkit_SignalWindowClose(SDL_ToolkitWindowX11 *data);
extern bool X11Toolkit_NotifyControlOfSizeChange(SDL_ToolkitControlX11 *control);
extern SDL_ToolkitControlX11 *X11Toolkit_CreateIconControl(SDL_ToolkitWindowX11 *window, SDL_MessageBoxFlags flags);
extern SDL_ToolkitControlX11 *X11Toolkit_CreateLabelControl(SDL_ToolkitWindowX11 *window, char *utf8);
extern int X11Toolkit_GetLabelControlFirstLineHeight(SDL_ToolkitControlX11 *control);
extern SDL_ToolkitControlX11 *X11Toolkit_CreateButtonControl(SDL_ToolkitWindowX11 *window, const SDL_MessageBoxButtonData *data);
extern void X11Toolkit_RegisterCallbackForButtonControl(SDL_ToolkitControlX11 *control, void *data, void (*cb)(struct SDL_ToolkitControlX11 *, void *));
extern const SDL_MessageBoxButtonData *X11Toolkit_GetButtonControlData(SDL_ToolkitControlX11 *control);
#endif
#endif