sapp_linux/
lib.rs

1#![allow(non_snake_case, non_camel_case_types, non_upper_case_globals)]
2#![allow(improper_ctypes)]
3#![allow(improper_ctypes_definitions)]
4#![allow(
5    unused_variables,
6    dead_code,
7    mutable_transmutes,
8    non_camel_case_types,
9    non_snake_case,
10    non_upper_case_globals,
11    unused_assignments,
12    unused_mut
13)]
14
15pub mod gl;
16mod rand;
17mod x;
18mod x_cursor;
19mod xi_input;
20
21pub mod clipboard;
22
23pub use gl::*;
24pub use rand::*;
25
26use std::path::PathBuf;
27
28use crate::x::*;
29
30pub type sapp_event_type = libc::c_uint;
31pub const sapp_event_type__SAPP_EVENTTYPE_FORCE_U32: sapp_event_type = 2147483647;
32pub const sapp_event_type__SAPP_EVENTTYPE_NUM: sapp_event_type = 23;
33pub const sapp_event_type_SAPP_EVENTTYPE_FILES_DROPPED: sapp_event_type = 22;
34pub const sapp_event_type_SAPP_EVENTTYPE_RAW_DEVICE: sapp_event_type = 21;
35pub const sapp_event_type_SAPP_EVENTTYPE_QUIT_REQUESTED: sapp_event_type = 20;
36pub const sapp_event_type_SAPP_EVENTTYPE_UPDATE_CURSOR: sapp_event_type = 19;
37pub const sapp_event_type_SAPP_EVENTTYPE_RESUMED: sapp_event_type = 18;
38pub const sapp_event_type_SAPP_EVENTTYPE_SUSPENDED: sapp_event_type = 17;
39pub const sapp_event_type_SAPP_EVENTTYPE_RESTORED: sapp_event_type = 16;
40pub const sapp_event_type_SAPP_EVENTTYPE_ICONIFIED: sapp_event_type = 15;
41pub const sapp_event_type_SAPP_EVENTTYPE_RESIZED: sapp_event_type = 14;
42pub const sapp_event_type_SAPP_EVENTTYPE_TOUCHES_CANCELLED: sapp_event_type = 13;
43pub const sapp_event_type_SAPP_EVENTTYPE_TOUCHES_ENDED: sapp_event_type = 12;
44pub const sapp_event_type_SAPP_EVENTTYPE_TOUCHES_MOVED: sapp_event_type = 11;
45pub const sapp_event_type_SAPP_EVENTTYPE_TOUCHES_BEGAN: sapp_event_type = 10;
46pub const sapp_event_type_SAPP_EVENTTYPE_MOUSE_LEAVE: sapp_event_type = 9;
47pub const sapp_event_type_SAPP_EVENTTYPE_MOUSE_ENTER: sapp_event_type = 8;
48pub const sapp_event_type_SAPP_EVENTTYPE_MOUSE_MOVE: sapp_event_type = 7;
49pub const sapp_event_type_SAPP_EVENTTYPE_MOUSE_SCROLL: sapp_event_type = 6;
50pub const sapp_event_type_SAPP_EVENTTYPE_MOUSE_UP: sapp_event_type = 5;
51pub const sapp_event_type_SAPP_EVENTTYPE_MOUSE_DOWN: sapp_event_type = 4;
52pub const sapp_event_type_SAPP_EVENTTYPE_CHAR: sapp_event_type = 3;
53pub const sapp_event_type_SAPP_EVENTTYPE_KEY_UP: sapp_event_type = 2;
54pub const sapp_event_type_SAPP_EVENTTYPE_KEY_DOWN: sapp_event_type = 1;
55pub const sapp_event_type_SAPP_EVENTTYPE_INVALID: sapp_event_type = 0;
56
57pub type sapp_keycode = libc::c_uint;
58pub const sapp_keycode_SAPP_KEYCODE_MENU: sapp_keycode = 348;
59pub const sapp_keycode_SAPP_KEYCODE_RIGHT_SUPER: sapp_keycode = 347;
60pub const sapp_keycode_SAPP_KEYCODE_RIGHT_ALT: sapp_keycode = 346;
61pub const sapp_keycode_SAPP_KEYCODE_RIGHT_CONTROL: sapp_keycode = 345;
62pub const sapp_keycode_SAPP_KEYCODE_RIGHT_SHIFT: sapp_keycode = 344;
63pub const sapp_keycode_SAPP_KEYCODE_LEFT_SUPER: sapp_keycode = 343;
64pub const sapp_keycode_SAPP_KEYCODE_LEFT_ALT: sapp_keycode = 342;
65pub const sapp_keycode_SAPP_KEYCODE_LEFT_CONTROL: sapp_keycode = 341;
66pub const sapp_keycode_SAPP_KEYCODE_LEFT_SHIFT: sapp_keycode = 340;
67pub const sapp_keycode_SAPP_KEYCODE_KP_EQUAL: sapp_keycode = 336;
68pub const sapp_keycode_SAPP_KEYCODE_KP_ENTER: sapp_keycode = 335;
69pub const sapp_keycode_SAPP_KEYCODE_KP_ADD: sapp_keycode = 334;
70pub const sapp_keycode_SAPP_KEYCODE_KP_SUBTRACT: sapp_keycode = 333;
71pub const sapp_keycode_SAPP_KEYCODE_KP_MULTIPLY: sapp_keycode = 332;
72pub const sapp_keycode_SAPP_KEYCODE_KP_DIVIDE: sapp_keycode = 331;
73pub const sapp_keycode_SAPP_KEYCODE_KP_DECIMAL: sapp_keycode = 330;
74pub const sapp_keycode_SAPP_KEYCODE_KP_9: sapp_keycode = 329;
75pub const sapp_keycode_SAPP_KEYCODE_KP_8: sapp_keycode = 328;
76pub const sapp_keycode_SAPP_KEYCODE_KP_7: sapp_keycode = 327;
77pub const sapp_keycode_SAPP_KEYCODE_KP_6: sapp_keycode = 326;
78pub const sapp_keycode_SAPP_KEYCODE_KP_5: sapp_keycode = 325;
79pub const sapp_keycode_SAPP_KEYCODE_KP_4: sapp_keycode = 324;
80pub const sapp_keycode_SAPP_KEYCODE_KP_3: sapp_keycode = 323;
81pub const sapp_keycode_SAPP_KEYCODE_KP_2: sapp_keycode = 322;
82pub const sapp_keycode_SAPP_KEYCODE_KP_1: sapp_keycode = 321;
83pub const sapp_keycode_SAPP_KEYCODE_KP_0: sapp_keycode = 320;
84pub const sapp_keycode_SAPP_KEYCODE_F25: sapp_keycode = 314;
85pub const sapp_keycode_SAPP_KEYCODE_F24: sapp_keycode = 313;
86pub const sapp_keycode_SAPP_KEYCODE_F23: sapp_keycode = 312;
87pub const sapp_keycode_SAPP_KEYCODE_F22: sapp_keycode = 311;
88pub const sapp_keycode_SAPP_KEYCODE_F21: sapp_keycode = 310;
89pub const sapp_keycode_SAPP_KEYCODE_F20: sapp_keycode = 309;
90pub const sapp_keycode_SAPP_KEYCODE_F19: sapp_keycode = 308;
91pub const sapp_keycode_SAPP_KEYCODE_F18: sapp_keycode = 307;
92pub const sapp_keycode_SAPP_KEYCODE_F17: sapp_keycode = 306;
93pub const sapp_keycode_SAPP_KEYCODE_F16: sapp_keycode = 305;
94pub const sapp_keycode_SAPP_KEYCODE_F15: sapp_keycode = 304;
95pub const sapp_keycode_SAPP_KEYCODE_F14: sapp_keycode = 303;
96pub const sapp_keycode_SAPP_KEYCODE_F13: sapp_keycode = 302;
97pub const sapp_keycode_SAPP_KEYCODE_F12: sapp_keycode = 301;
98pub const sapp_keycode_SAPP_KEYCODE_F11: sapp_keycode = 300;
99pub const sapp_keycode_SAPP_KEYCODE_F10: sapp_keycode = 299;
100pub const sapp_keycode_SAPP_KEYCODE_F9: sapp_keycode = 298;
101pub const sapp_keycode_SAPP_KEYCODE_F8: sapp_keycode = 297;
102pub const sapp_keycode_SAPP_KEYCODE_F7: sapp_keycode = 296;
103pub const sapp_keycode_SAPP_KEYCODE_F6: sapp_keycode = 295;
104pub const sapp_keycode_SAPP_KEYCODE_F5: sapp_keycode = 294;
105pub const sapp_keycode_SAPP_KEYCODE_F4: sapp_keycode = 293;
106pub const sapp_keycode_SAPP_KEYCODE_F3: sapp_keycode = 292;
107pub const sapp_keycode_SAPP_KEYCODE_F2: sapp_keycode = 291;
108pub const sapp_keycode_SAPP_KEYCODE_F1: sapp_keycode = 290;
109pub const sapp_keycode_SAPP_KEYCODE_PAUSE: sapp_keycode = 284;
110pub const sapp_keycode_SAPP_KEYCODE_PRINT_SCREEN: sapp_keycode = 283;
111pub const sapp_keycode_SAPP_KEYCODE_NUM_LOCK: sapp_keycode = 282;
112pub const sapp_keycode_SAPP_KEYCODE_SCROLL_LOCK: sapp_keycode = 281;
113pub const sapp_keycode_SAPP_KEYCODE_CAPS_LOCK: sapp_keycode = 280;
114pub const sapp_keycode_SAPP_KEYCODE_END: sapp_keycode = 269;
115pub const sapp_keycode_SAPP_KEYCODE_HOME: sapp_keycode = 268;
116pub const sapp_keycode_SAPP_KEYCODE_PAGE_DOWN: sapp_keycode = 267;
117pub const sapp_keycode_SAPP_KEYCODE_PAGE_UP: sapp_keycode = 266;
118pub const sapp_keycode_SAPP_KEYCODE_UP: sapp_keycode = 265;
119pub const sapp_keycode_SAPP_KEYCODE_DOWN: sapp_keycode = 264;
120pub const sapp_keycode_SAPP_KEYCODE_LEFT: sapp_keycode = 263;
121pub const sapp_keycode_SAPP_KEYCODE_RIGHT: sapp_keycode = 262;
122pub const sapp_keycode_SAPP_KEYCODE_DELETE: sapp_keycode = 261;
123pub const sapp_keycode_SAPP_KEYCODE_INSERT: sapp_keycode = 260;
124pub const sapp_keycode_SAPP_KEYCODE_BACKSPACE: sapp_keycode = 259;
125pub const sapp_keycode_SAPP_KEYCODE_TAB: sapp_keycode = 258;
126pub const sapp_keycode_SAPP_KEYCODE_ENTER: sapp_keycode = 257;
127pub const sapp_keycode_SAPP_KEYCODE_ESCAPE: sapp_keycode = 256;
128pub const sapp_keycode_SAPP_KEYCODE_WORLD_2: sapp_keycode = 162;
129pub const sapp_keycode_SAPP_KEYCODE_WORLD_1: sapp_keycode = 161;
130pub const sapp_keycode_SAPP_KEYCODE_GRAVE_ACCENT: sapp_keycode = 96;
131pub const sapp_keycode_SAPP_KEYCODE_RIGHT_BRACKET: sapp_keycode = 93;
132pub const sapp_keycode_SAPP_KEYCODE_BACKSLASH: sapp_keycode = 92;
133pub const sapp_keycode_SAPP_KEYCODE_LEFT_BRACKET: sapp_keycode = 91;
134pub const sapp_keycode_SAPP_KEYCODE_Z: sapp_keycode = 90;
135pub const sapp_keycode_SAPP_KEYCODE_Y: sapp_keycode = 89;
136pub const sapp_keycode_SAPP_KEYCODE_X: sapp_keycode = 88;
137pub const sapp_keycode_SAPP_KEYCODE_W: sapp_keycode = 87;
138pub const sapp_keycode_SAPP_KEYCODE_V: sapp_keycode = 86;
139pub const sapp_keycode_SAPP_KEYCODE_U: sapp_keycode = 85;
140pub const sapp_keycode_SAPP_KEYCODE_T: sapp_keycode = 84;
141pub const sapp_keycode_SAPP_KEYCODE_S: sapp_keycode = 83;
142pub const sapp_keycode_SAPP_KEYCODE_R: sapp_keycode = 82;
143pub const sapp_keycode_SAPP_KEYCODE_Q: sapp_keycode = 81;
144pub const sapp_keycode_SAPP_KEYCODE_P: sapp_keycode = 80;
145pub const sapp_keycode_SAPP_KEYCODE_O: sapp_keycode = 79;
146pub const sapp_keycode_SAPP_KEYCODE_N: sapp_keycode = 78;
147pub const sapp_keycode_SAPP_KEYCODE_M: sapp_keycode = 77;
148pub const sapp_keycode_SAPP_KEYCODE_L: sapp_keycode = 76;
149pub const sapp_keycode_SAPP_KEYCODE_K: sapp_keycode = 75;
150pub const sapp_keycode_SAPP_KEYCODE_J: sapp_keycode = 74;
151pub const sapp_keycode_SAPP_KEYCODE_I: sapp_keycode = 73;
152pub const sapp_keycode_SAPP_KEYCODE_H: sapp_keycode = 72;
153pub const sapp_keycode_SAPP_KEYCODE_G: sapp_keycode = 71;
154pub const sapp_keycode_SAPP_KEYCODE_F: sapp_keycode = 70;
155pub const sapp_keycode_SAPP_KEYCODE_E: sapp_keycode = 69;
156pub const sapp_keycode_SAPP_KEYCODE_D: sapp_keycode = 68;
157pub const sapp_keycode_SAPP_KEYCODE_C: sapp_keycode = 67;
158pub const sapp_keycode_SAPP_KEYCODE_B: sapp_keycode = 66;
159pub const sapp_keycode_SAPP_KEYCODE_A: sapp_keycode = 65;
160pub const sapp_keycode_SAPP_KEYCODE_EQUAL: sapp_keycode = 61;
161pub const sapp_keycode_SAPP_KEYCODE_SEMICOLON: sapp_keycode = 59;
162pub const sapp_keycode_SAPP_KEYCODE_9: sapp_keycode = 57;
163pub const sapp_keycode_SAPP_KEYCODE_8: sapp_keycode = 56;
164pub const sapp_keycode_SAPP_KEYCODE_7: sapp_keycode = 55;
165pub const sapp_keycode_SAPP_KEYCODE_6: sapp_keycode = 54;
166pub const sapp_keycode_SAPP_KEYCODE_5: sapp_keycode = 53;
167pub const sapp_keycode_SAPP_KEYCODE_4: sapp_keycode = 52;
168pub const sapp_keycode_SAPP_KEYCODE_3: sapp_keycode = 51;
169pub const sapp_keycode_SAPP_KEYCODE_2: sapp_keycode = 50;
170pub const sapp_keycode_SAPP_KEYCODE_1: sapp_keycode = 49;
171pub const sapp_keycode_SAPP_KEYCODE_0: sapp_keycode = 48;
172pub const sapp_keycode_SAPP_KEYCODE_SLASH: sapp_keycode = 47;
173pub const sapp_keycode_SAPP_KEYCODE_PERIOD: sapp_keycode = 46;
174pub const sapp_keycode_SAPP_KEYCODE_MINUS: sapp_keycode = 45;
175pub const sapp_keycode_SAPP_KEYCODE_COMMA: sapp_keycode = 44;
176pub const sapp_keycode_SAPP_KEYCODE_APOSTROPHE: sapp_keycode = 39;
177pub const sapp_keycode_SAPP_KEYCODE_SPACE: sapp_keycode = 32;
178pub const sapp_keycode_SAPP_KEYCODE_INVALID: sapp_keycode = 0;
179
180#[derive(Copy, Clone)]
181#[repr(C)]
182pub struct sapp_touchpoint {
183    pub identifier: libc::c_ulong,
184    pub pos_x: libc::c_float,
185    pub pos_y: libc::c_float,
186    pub changed: bool,
187}
188
189pub type sapp_mousebutton = libc::c_int;
190pub const sapp_mousebutton_SAPP_MOUSEBUTTON_MIDDLE: sapp_mousebutton = 2;
191pub const sapp_mousebutton_SAPP_MOUSEBUTTON_RIGHT: sapp_mousebutton = 1;
192pub const sapp_mousebutton_SAPP_MOUSEBUTTON_LEFT: sapp_mousebutton = 0;
193pub const sapp_mousebutton_SAPP_MOUSEBUTTON_INVALID: sapp_mousebutton = -1;
194
195pub const SAPP_MODIFIER_SHIFT: libc::c_uint = 1 << 0;
196pub const SAPP_MODIFIER_CTRL: libc::c_uint = 1 << 1;
197pub const SAPP_MODIFIER_ALT: libc::c_uint = 1 << 2;
198pub const SAPP_MODIFIER_SUPER: libc::c_uint = 1 << 3;
199
200pub const SAPP_CURSOR_DEFAULT: u32 = 0;
201pub const SAPP_CURSOR_HELP: u32 = 1;
202pub const SAPP_CURSOR_POINTER: u32 = 2;
203pub const SAPP_CURSOR_WAIT: u32 = 3;
204pub const SAPP_CURSOR_CROSSHAIR: u32 = 4;
205pub const SAPP_CURSOR_TEXT: u32 = 5;
206pub const SAPP_CURSOR_MOVE: u32 = 6;
207pub const SAPP_CURSOR_NOTALLOWED: u32 = 7;
208pub const SAPP_CURSOR_EWRESIZE: u32 = 8;
209pub const SAPP_CURSOR_NSRESIZE: u32 = 9;
210pub const SAPP_CURSOR_NESWRESIZE: u32 = 10;
211pub const SAPP_CURSOR_NWSERESIZE: u32 = 11;
212pub const SAPP_CURSOR_NUM: usize = 12; // number of cursors
213
214#[derive(Copy, Clone)]
215#[repr(C)]
216pub struct sapp_xdnd_atoms {
217    aware: Atom,
218    enter: Atom,
219    position: Atom,
220    status: Atom,
221    action_copy: Atom,
222    drop: Atom,
223    finished: Atom,
224    selection: Atom,
225    type_list: Atom,
226    text_uri_list: Atom,
227}
228
229#[derive(Copy, Clone)]
230#[repr(C)]
231pub struct sapp_xdnd {
232    version: Atom,
233    format: Atom,
234    source: Window,
235    atoms: sapp_xdnd_atoms,
236}
237
238#[derive(Copy, Clone)]
239#[repr(C)]
240pub struct sapp_event {
241    pub frame_count: u64,
242    pub type_: sapp_event_type,
243    pub key_code: sapp_keycode,
244    pub char_code: u32,
245    pub key_repeat: bool,
246    pub modifiers: u32,
247    pub mouse_button: sapp_mousebutton,
248    pub mouse_x: libc::c_float,
249    pub mouse_y: libc::c_float,
250    pub mouse_dx: libc::c_float,
251    pub mouse_dy: libc::c_float,
252    pub scroll_x: libc::c_float,
253    pub scroll_y: libc::c_float,
254    pub num_touches: libc::c_int,
255    pub touches: [sapp_touchpoint; 8],
256    pub window_width: libc::c_int,
257    pub window_height: libc::c_int,
258    pub framebuffer_width: libc::c_int,
259    pub framebuffer_height: libc::c_int,
260}
261
262#[derive(Clone)]
263pub struct sapp_drop {
264    pub file_paths: Vec<PathBuf>,
265}
266
267#[derive(Copy, Clone)]
268#[repr(C)]
269pub struct sapp_desc {
270    pub init_cb: Option<unsafe extern "C" fn() -> ()>,
271    pub frame_cb: Option<unsafe extern "C" fn() -> ()>,
272    pub cleanup_cb: Option<unsafe extern "C" fn() -> ()>,
273    pub event_cb: Option<unsafe extern "C" fn(_: *const sapp_event) -> ()>,
274    pub fail_cb: Option<unsafe extern "C" fn(_: *const libc::c_char) -> ()>,
275    pub user_data: *mut libc::c_void,
276    pub init_userdata_cb: Option<unsafe extern "C" fn(_: *mut libc::c_void) -> ()>,
277    pub frame_userdata_cb: Option<unsafe extern "C" fn(_: *mut libc::c_void) -> ()>,
278    pub cleanup_userdata_cb: Option<unsafe extern "C" fn(_: *mut libc::c_void) -> ()>,
279    pub event_userdata_cb:
280        Option<unsafe extern "C" fn(_: *const sapp_event, _: *mut libc::c_void) -> ()>,
281    pub fail_userdata_cb:
282        Option<unsafe extern "C" fn(_: *const libc::c_char, _: *mut libc::c_void) -> ()>,
283    pub width: libc::c_int,
284    pub height: libc::c_int,
285    pub window_resizable: bool,
286    pub sample_count: libc::c_int,
287    pub swap_interval: libc::c_int,
288    pub high_dpi: bool,
289    pub fullscreen: bool,
290    pub alpha: bool,
291    pub window_title: *const libc::c_char,
292    pub user_cursor: bool,
293    pub html5_canvas_name: *const libc::c_char,
294    pub html5_canvas_resize: bool,
295    pub html5_preserve_drawing_buffer: bool,
296    pub html5_premultiplied_alpha: bool,
297    pub html5_ask_leave_site: bool,
298    pub ios_keyboard_resizes_canvas: bool,
299    pub gl_force_gles2: bool,
300}
301#[derive(Clone)]
302pub struct _sapp_state {
303    pub valid: bool,
304    pub window_width: libc::c_int,
305    pub window_height: libc::c_int,
306    pub framebuffer_width: libc::c_int,
307    pub framebuffer_height: libc::c_int,
308    pub sample_count: libc::c_int,
309    pub swap_interval: libc::c_int,
310    pub dpi_scale: libc::c_float,
311    pub gles2_fallback: bool,
312    pub first_frame: bool,
313    pub init_called: bool,
314    pub cleanup_called: bool,
315    pub quit_requested: bool,
316    pub quit_ordered: bool,
317    pub html5_canvas_name: *const libc::c_char,
318    pub html5_ask_leave_site: bool,
319    pub window_title: [libc::c_char; 128],
320    pub window_title_wide: [i32; 128],
321    pub frame_count: u64,
322    pub mouse_x: libc::c_float,
323    pub mouse_y: libc::c_float,
324    pub win32_mouse_tracked: bool,
325    pub onscreen_keyboard_shown: bool,
326    pub event: sapp_event,
327    pub desc: sapp_desc,
328    pub keycodes: [sapp_keycode; 512],
329    pub xdnd: sapp_xdnd,
330    pub drop: sapp_drop,
331}
332
333/// opcode from XQueryExtension("XInputExtension")
334static mut _sapp_xi_extension_opcode: i32 = -1;
335
336static mut _sapp_empty_cursor: x_cursor::Cursor = 0;
337static mut _sapp_cursor_cache: [x_cursor::Cursor; SAPP_CURSOR_NUM] = [0; SAPP_CURSOR_NUM];
338static mut _sapp_cursor_icon: u32 = SAPP_CURSOR_DEFAULT;
339static mut _sapp_cursor_shown: bool = true;
340
341pub type GLXContext = *mut __GLXcontext;
342pub type PFNGLXDESTROYCONTEXTPROC =
343    Option<unsafe extern "C" fn(_: *mut Display, _: GLXContext) -> ()>;
344pub type GLXWindow = XID;
345pub type PFNGLXDESTROYWINDOWPROC =
346    Option<unsafe extern "C" fn(_: *mut Display, _: GLXWindow) -> ()>;
347pub type PFNGLXSWAPBUFFERSPROC =
348    Option<unsafe extern "C" fn(_: *mut Display, _: GLXDrawable) -> ()>;
349pub type GLXDrawable = XID;
350#[derive(Copy, Clone)]
351#[repr(C)]
352pub struct C2RustUnnamed_1 {
353    pub state: CARD32,
354    pub icon: Window,
355}
356#[derive(Copy, Clone)]
357#[repr(C)]
358pub struct _sapp_x11_codepair {
359    pub keysym: u16,
360    pub ucs: u16,
361}
362impl _sapp_x11_codepair {
363    const fn new(keysym: u16, ucs: u16) -> _sapp_x11_codepair {
364        _sapp_x11_codepair { keysym, ucs }
365    }
366}
367pub type PFNGLXMAKECURRENTPROC =
368    Option<unsafe extern "C" fn(_: *mut Display, _: GLXDrawable, _: GLXContext) -> libc::c_int>;
369pub type PFNGLXSWAPINTERVALMESAPROC = Option<unsafe extern "C" fn(_: libc::c_int) -> libc::c_int>;
370pub type PFNGLXSWAPINTERVALEXTPROC =
371    Option<unsafe extern "C" fn(_: *mut Display, _: GLXDrawable, _: libc::c_int) -> ()>;
372pub type GLXFBConfig = *mut __GLXFBConfig;
373#[derive(Copy, Clone)]
374#[repr(C)]
375pub struct _sapp_gl_fbconfig {
376    pub red_bits: libc::c_int,
377    pub green_bits: libc::c_int,
378    pub blue_bits: libc::c_int,
379    pub alpha_bits: libc::c_int,
380    pub depth_bits: libc::c_int,
381    pub stencil_bits: libc::c_int,
382    pub samples: libc::c_int,
383    pub doublebuffer: bool,
384    pub handle: libc::c_ulong,
385}
386pub type PFNGLXGETFBCONFIGATTRIBPROC = Option<
387    unsafe extern "C" fn(
388        _: *mut Display,
389        _: GLXFBConfig,
390        _: libc::c_int,
391        _: *mut libc::c_int,
392    ) -> libc::c_int,
393>;
394pub type PFNGLXGETFBCONFIGSPROC = Option<
395    unsafe extern "C" fn(_: *mut Display, _: libc::c_int, _: *mut libc::c_int) -> *mut GLXFBConfig,
396>;
397pub type PFNGLXGETCLIENTSTRINGPROC =
398    Option<unsafe extern "C" fn(_: *mut Display, _: libc::c_int) -> *const libc::c_char>;
399pub type PFNGLXCREATEWINDOWPROC = Option<
400    unsafe extern "C" fn(
401        _: *mut Display,
402        _: GLXFBConfig,
403        _: Window,
404        _: *const libc::c_int,
405    ) -> GLXWindow,
406>;
407pub type PFNGLXCREATECONTEXTATTRIBSARBPROC = Option<
408    unsafe extern "C" fn(
409        _: *mut Display,
410        _: GLXFBConfig,
411        _: GLXContext,
412        _: libc::c_int,
413        _: *const libc::c_int,
414    ) -> GLXContext,
415>;
416pub type PFNGLXGETVISUALFROMFBCONFIGPROC =
417    Option<unsafe extern "C" fn(_: *mut Display, _: GLXFBConfig) -> *mut XVisualInfo>;
418pub type PFNGLXQUERYEXTENSIONSSTRINGPROC =
419    Option<unsafe extern "C" fn(_: *mut Display, _: libc::c_int) -> *const libc::c_char>;
420pub type __GLXextproc = Option<unsafe extern "C" fn() -> ()>;
421pub type PFNGLXGETPROCADDRESSPROC = Option<unsafe extern "C" fn(_: *const GLubyte) -> __GLXextproc>;
422pub type PFNGLXQUERYVERSIONPROC = Option<
423    unsafe extern "C" fn(_: *mut Display, _: *mut libc::c_int, _: *mut libc::c_int) -> libc::c_int,
424>;
425pub type PFNGLXQUERYEXTENSIONPROC = Option<
426    unsafe extern "C" fn(_: *mut Display, _: *mut libc::c_int, _: *mut libc::c_int) -> libc::c_int,
427>;
428pub type PFNGLXCREATENEWCONTEXTPROC = Option<
429    unsafe extern "C" fn(
430        _: *mut Display,
431        _: GLXFBConfig,
432        _: libc::c_int,
433        _: GLXContext,
434        _: libc::c_int,
435    ) -> GLXContext,
436>;
437
438pub unsafe extern "C" fn _sapp_x11_create_window(mut visual: *mut Visual, mut depth: libc::c_int) {
439    _sapp_x11_colormap = XCreateColormap(_sapp_x11_display, _sapp_x11_root, visual, AllocNone);
440    let mut wa = XSetWindowAttributes {
441        background_pixmap: 0,
442        background_pixel: 0,
443        border_pixmap: 0,
444        border_pixel: 0,
445        bit_gravity: 0,
446        win_gravity: 0,
447        backing_store: 0,
448        backing_planes: 0,
449        backing_pixel: 0,
450        save_under: 0,
451        event_mask: 0,
452        do_not_propagate_mask: 0,
453        override_redirect: 0,
454        colormap: 0,
455        cursor: 0,
456    };
457    memset(
458        &mut wa as *mut XSetWindowAttributes as *mut libc::c_void,
459        0 as libc::c_int,
460        ::std::mem::size_of::<XSetWindowAttributes>() as libc::c_ulong,
461    );
462    let wamask = (CWBorderPixel | CWColormap | CWEventMask) as u32;
463    wa.colormap = _sapp_x11_colormap;
464    wa.border_pixel = 0 as libc::c_int as libc::c_ulong;
465    wa.event_mask = StructureNotifyMask
466        | KeyPressMask
467        | KeyReleaseMask
468        | PointerMotionMask
469        | ButtonPressMask
470        | ButtonReleaseMask
471        | ExposureMask
472        | FocusChangeMask
473        | VisibilityChangeMask
474        | EnterWindowMask
475        | LeaveWindowMask
476        | PropertyChangeMask;
477    _sapp_x11_grab_error_handler();
478
479    _sapp_x11_window = XCreateWindow(
480        _sapp_x11_display,
481        _sapp_x11_root,
482        0 as libc::c_int,
483        0 as libc::c_int,
484        _sapp.window_width as libc::c_uint,
485        _sapp.window_height as libc::c_uint,
486        0 as libc::c_int as libc::c_uint,
487        depth,
488        InputOutput as libc::c_uint,
489        visual,
490        wamask as libc::c_ulong,
491        &mut wa,
492    );
493    _sapp_x11_release_error_handler();
494    if _sapp_x11_window == 0 {
495        _sapp_fail("X11: Failed to create window");
496    }
497
498    _sapp_xi_extension_opcode = xi_input::query_xi_extension()
499        .unwrap_or_else(|| panic!("Failed to initialize XInputExtension"));
500
501    _sapp_empty_cursor = x_cursor::create_empty_cursor();
502
503    let mut protocols: [Atom; 1] = [_sapp_x11_WM_DELETE_WINDOW];
504    XSetWMProtocols(
505        _sapp_x11_display,
506        _sapp_x11_window,
507        protocols.as_mut_ptr(),
508        1 as libc::c_int,
509    );
510    let mut hints = XAllocSizeHints();
511    (*hints).flags |= PWinGravity;
512    if _sapp.desc.window_resizable == false {
513        (*hints).flags |= PMinSize | PMaxSize;
514        (*hints).min_width = _sapp.desc.width;
515        (*hints).min_height = _sapp.desc.height;
516        (*hints).max_width = _sapp.desc.width;
517        (*hints).max_height = _sapp.desc.height;
518    }
519    (*hints).win_gravity = StaticGravity;
520    XSetWMNormalHints(_sapp_x11_display, _sapp_x11_window, hints);
521    XFree(hints as *mut libc::c_void);
522    _sapp_x11_update_window_title();
523    _sapp_x11_query_window_size();
524
525    XChangeProperty(
526        _sapp_x11_display,
527        _sapp_x11_window,
528        _sapp.xdnd.atoms.aware,
529        _sapp_x11_XA_ATOM,
530        32,
531        PropModeReplace,
532        &_sapp_x11_XDND_VERSION as *const _ as *const libc::c_uchar,
533        1);
534}
535
536pub unsafe extern "C" fn _sapp_strcpy(
537    mut src: *const libc::c_char,
538    mut dst: *mut libc::c_char,
539    mut max_len: libc::c_int,
540) {
541    assert!(
542        !src.is_null() && !dst.is_null() && max_len > 0 as libc::c_int,
543        "src && dst && (max_len > 0)"
544    );
545    let end: *mut libc::c_char =
546        &mut *dst.offset((max_len - 1 as libc::c_int) as isize) as *mut libc::c_char;
547    let mut c = 0 as libc::c_int as libc::c_char;
548    let mut i = 0 as libc::c_int;
549    while i < max_len {
550        c = *src;
551        if c as libc::c_int != 0 as libc::c_int {
552            src = src.offset(1)
553        }
554        let fresh0 = dst;
555        dst = dst.offset(1);
556        *fresh0 = c;
557        i += 1
558    }
559    if c as libc::c_int != 0 as libc::c_int {
560        *end = 0 as libc::c_int as libc::c_char
561    };
562}
563pub unsafe extern "C" fn _sapp_init_state(mut desc: *const sapp_desc) {
564    memset(
565        &mut _sapp as *mut _sapp_state as *mut libc::c_void,
566        0 as libc::c_int,
567        ::std::mem::size_of::<_sapp_state>() as libc::c_ulong,
568    );
569    _sapp.desc = *desc;
570    _sapp.first_frame = true;
571    _sapp.window_width = if _sapp.desc.width == 0 as libc::c_int {
572        640 as libc::c_int
573    } else {
574        _sapp.desc.width
575    };
576    _sapp.window_height = if _sapp.desc.height == 0 as libc::c_int {
577        480 as libc::c_int
578    } else {
579        _sapp.desc.height
580    };
581    _sapp.framebuffer_width = _sapp.window_width;
582    _sapp.framebuffer_height = _sapp.window_height;
583    _sapp.sample_count = if _sapp.desc.sample_count == 0 as libc::c_int {
584        1 as libc::c_int
585    } else {
586        _sapp.desc.sample_count
587    };
588    _sapp.swap_interval = if _sapp.desc.swap_interval == 0 as libc::c_int {
589        1 as libc::c_int
590    } else {
591        _sapp.desc.swap_interval
592    };
593    _sapp.html5_canvas_name = if _sapp.desc.html5_canvas_name.is_null() {
594        b"canvas\x00" as *const u8 as *const libc::c_char
595    } else {
596        _sapp.desc.html5_canvas_name
597    };
598    _sapp.html5_ask_leave_site = _sapp.desc.html5_ask_leave_site;
599    if !_sapp.desc.window_title.is_null() {
600        _sapp_strcpy(
601            _sapp.desc.window_title,
602            _sapp.window_title.as_mut_ptr(),
603            ::std::mem::size_of::<[libc::c_char; 128]>() as libc::c_ulong as libc::c_int,
604        );
605    } else {
606        _sapp_strcpy(
607            b"sokol_app\x00" as *const u8 as *const libc::c_char,
608            _sapp.window_title.as_mut_ptr(),
609            ::std::mem::size_of::<[libc::c_char; 128]>() as libc::c_ulong as libc::c_int,
610        );
611    }
612    _sapp.dpi_scale = 1.0f32;
613}
614pub unsafe extern "C" fn _sapp_x11_query_system_dpi() {
615    let mut rms = XResourceManagerString(_sapp_x11_display);
616    if !rms.is_null() {
617        let mut db = XrmGetStringDatabase(rms);
618        if !db.is_null() {
619            let mut value = XrmValue {
620                size: 0,
621                addr: 0 as *mut libc::c_char,
622            };
623            let mut type_ = std::ptr::null_mut();
624            if XrmGetResource(
625                db,
626                b"Xft.dpi\x00" as *const u8 as *const libc::c_char,
627                b"Xft.Dpi\x00" as *const u8 as *const libc::c_char,
628                &mut type_,
629                &mut value,
630            ) != 0
631            {
632                if !type_.is_null()
633                    && strcmp(type_, b"String\x00" as *const u8 as *const libc::c_char)
634                        == 0 as libc::c_int
635                {
636                    _sapp_x11_dpi = atof(value.addr as *const libc::c_char) as libc::c_float
637                }
638            }
639            XrmDestroyDatabase(db);
640        }
641    };
642}
643pub static mut _sapp_x11_dpi: libc::c_float = 0.;
644pub unsafe extern "C" fn _sapp_x11_init_extensions() {
645    _sapp_x11_UTF8_STRING = XInternAtom(
646        _sapp_x11_display,
647        b"UTF8_STRING\x00" as *const u8 as *const libc::c_char,
648        false as _,
649    );
650    _sapp_x11_WM_PROTOCOLS = XInternAtom(
651        _sapp_x11_display,
652        b"WM_PROTOCOLS\x00" as *const u8 as *const libc::c_char,
653        false as _,
654    );
655    _sapp_x11_WM_DELETE_WINDOW = XInternAtom(
656        _sapp_x11_display,
657        b"WM_DELETE_WINDOW\x00" as *const u8 as *const libc::c_char,
658        false as _,
659    );
660    _sapp_x11_WM_STATE = XInternAtom(
661        _sapp_x11_display,
662        b"WM_STATE\x00" as *const u8 as *const libc::c_char,
663        false as _,
664    );
665    _sapp_x11_NET_WM_NAME = XInternAtom(
666        _sapp_x11_display,
667        b"_NET_WM_NAME\x00" as *const u8 as *const libc::c_char,
668        false as _,
669    );
670    _sapp_x11_NET_WM_ICON_NAME = XInternAtom(
671        _sapp_x11_display,
672        b"_NET_WM_ICON_NAME\x00" as *const u8 as *const libc::c_char,
673        false as _,
674    );
675    _sapp.xdnd.atoms.aware = XInternAtom(
676        _sapp_x11_display,
677        b"XdndAware\x00" as *const u8 as *const libc::c_char,
678        false as _,
679    );
680    _sapp.xdnd.atoms.enter = XInternAtom(
681        _sapp_x11_display,
682        b"XdndEnter\x00" as *const u8 as *const libc::c_char,
683        false as _,
684    );
685    _sapp.xdnd.atoms.position = XInternAtom(
686        _sapp_x11_display,
687        b"XdndPosition\x00" as *const u8 as *const libc::c_char,
688        false as _,
689    );
690    _sapp.xdnd.atoms.status = XInternAtom(
691        _sapp_x11_display,
692        b"XdndStatus\x00" as *const u8 as *const libc::c_char,
693        false as _,
694    );
695    _sapp.xdnd.atoms.action_copy = XInternAtom(
696        _sapp_x11_display,
697        b"XdndActionCopy\x00" as *const u8 as *const libc::c_char,
698        false as _,
699    );
700    _sapp.xdnd.atoms.drop = XInternAtom(
701        _sapp_x11_display,
702        b"XdndDrop\x00" as *const u8 as *const libc::c_char,
703        false as _,
704    );
705    _sapp.xdnd.atoms.finished = XInternAtom(
706        _sapp_x11_display,
707        b"XdndFinished\x00" as *const u8 as *const libc::c_char,
708        false as _,
709    );
710    _sapp.xdnd.atoms.selection = XInternAtom(
711        _sapp_x11_display,
712        b"XdndSelection\x00" as *const u8 as *const libc::c_char,
713        false as _,
714    );
715    _sapp.xdnd.atoms.type_list = XInternAtom(
716        _sapp_x11_display,
717        b"XdndTypeList\x00" as *const u8 as *const libc::c_char,
718        false as _,
719    );
720    _sapp.xdnd.atoms.text_uri_list = XInternAtom(
721        _sapp_x11_display,
722        b"text/uri-list\x00" as *const u8 as *const libc::c_char,
723        false as _,
724    );
725}
726
727pub static mut _sapp_glx_CreateNewContext: PFNGLXCREATENEWCONTEXTPROC = None;
728pub static mut _sapp_glx_QueryExtension: PFNGLXQUERYEXTENSIONPROC = None;
729pub static mut _sapp_glx_errorbase: libc::c_int = 0;
730pub static mut _sapp_glx_eventbase: libc::c_int = 0;
731pub static mut _sapp_glx_QueryVersion: PFNGLXQUERYVERSIONPROC = None;
732pub static mut _sapp_glx_major: libc::c_int = 0;
733pub static mut _sapp_glx_minor: libc::c_int = 0;
734pub static mut _sapp_glx_ARB_framebuffer_sRGB: bool = false;
735pub static mut _sapp_glx_EXT_framebuffer_sRGB: bool = false;
736pub static mut _sapp_glx_GetProcAddress: PFNGLXGETPROCADDRESSPROC = None;
737pub static mut _sapp_glx_GetProcAddressARB: PFNGLXGETPROCADDRESSPROC = None;
738pub static mut _sapp_glx_libgl: *mut libc::c_void = 0 as *const libc::c_void as *mut libc::c_void;
739
740unsafe fn _sapp_glx_getprocaddr<T: Sized>(procname: &[u8]) -> T {
741    let procname = procname.as_ptr() as _;
742
743    if _sapp_glx_GetProcAddress.is_some() {
744        return ::std::mem::transmute_copy::<_, T>(&_sapp_glx_GetProcAddress
745            .expect("non-null function pointer")(
746            procname
747        ));
748    } else if _sapp_glx_GetProcAddressARB.is_some() {
749        return ::std::mem::transmute_copy::<_, T>(&_sapp_glx_GetProcAddressARB
750            .expect("non-null function pointer")(
751            procname
752        ));
753    } else {
754        return ::std::mem::transmute_copy::<_, T>(&dlsym(_sapp_glx_libgl, procname as _));
755    };
756}
757pub unsafe extern "C" fn _sapp_glx_has_ext(
758    mut ext: *const libc::c_char,
759    mut extensions: *const libc::c_char,
760) -> bool {
761    assert!(!ext.is_null());
762
763    let mut start = extensions;
764    loop {
765        let mut where_0: *const libc::c_char = strstr(start, ext);
766        if where_0.is_null() {
767            return false;
768        }
769        let mut terminator = where_0.offset(strlen(ext) as isize);
770        if where_0 == start
771            || *where_0.offset(-(1 as libc::c_int as isize)) as libc::c_int == ' ' as i32
772        {
773            if *terminator as libc::c_int == ' ' as i32
774                || *terminator as libc::c_int == '\u{0}' as i32
775            {
776                break;
777            }
778        }
779        start = terminator
780    }
781    return true;
782}
783pub unsafe fn _sapp_glx_extsupported(mut ext: &[u8], mut extensions: *const libc::c_char) -> bool {
784    if !extensions.is_null() {
785        return _sapp_glx_has_ext(ext.as_ptr() as _, extensions);
786    } else {
787        return false;
788    };
789}
790pub static mut _sapp_glx_QueryExtensionsString: PFNGLXQUERYEXTENSIONSSTRINGPROC = None;
791pub unsafe extern "C" fn _sapp_glx_init() {
792    let mut sonames: [*const libc::c_char; 3] = [
793        b"libGL.so.1\x00" as *const u8 as *const libc::c_char,
794        b"libGL.so\x00" as *const u8 as *const libc::c_char,
795        0 as *const libc::c_char,
796    ];
797    let mut i = 0 as libc::c_int;
798    while !sonames[i as usize].is_null() {
799        _sapp_glx_libgl = dlopen(sonames[i as usize], RTLD_LAZY | RTLD_GLOBAL);
800        if !_sapp_glx_libgl.is_null() {
801            break;
802        }
803        i += 1
804    }
805    if _sapp_glx_libgl.is_null() {
806        _sapp_fail("GLX: failed to load libGL");
807    }
808
809    unsafe fn load<T: Sized>(lib: *mut libc::c_void, symbol: &[u8]) -> T {
810        ::std::mem::transmute_copy::<*mut libc::c_void, T>(&dlsym(lib, symbol.as_ptr() as _))
811    }
812    _sapp_glx_GetFBConfigs = load(_sapp_glx_libgl, b"glXGetFBConfigs\x00");
813    _sapp_glx_GetFBConfigAttrib = load(_sapp_glx_libgl, b"glXGetFBConfigAttrib\x00");
814    _sapp_glx_GetClientString = load(_sapp_glx_libgl, b"glXGetClientString\x00");
815    _sapp_glx_QueryExtension = load(_sapp_glx_libgl, b"glXQueryExtension\x00");
816    _sapp_glx_QueryVersion = load(_sapp_glx_libgl, b"glXQueryVersion\x00");
817    _sapp_glx_DestroyContext = load(_sapp_glx_libgl, b"glXDestroyContext\x00");
818    _sapp_glx_MakeCurrent = load(_sapp_glx_libgl, b"glXMakeCurrent\x00");
819    _sapp_glx_SwapBuffers = load(_sapp_glx_libgl, b"glXSwapBuffers\x00");
820    _sapp_glx_QueryExtensionsString = load(_sapp_glx_libgl, b"glXQueryExtensionsString\x00");
821    _sapp_glx_CreateNewContext = load(_sapp_glx_libgl, b"glXCreateNewContext\x00");
822    _sapp_glx_CreateWindow = load(_sapp_glx_libgl, b"glXCreateWindow\x00");
823    _sapp_glx_DestroyWindow = load(_sapp_glx_libgl, b"glXDestroyWindow\x00");
824    _sapp_glx_GetProcAddress = load(_sapp_glx_libgl, b"glXGetProcAddress\x00");
825    _sapp_glx_GetProcAddressARB = load(_sapp_glx_libgl, b"glXGetProcAddressARB\x00");
826    _sapp_glx_GetVisualFromFBConfig = load(_sapp_glx_libgl, b"glXGetVisualFromFBConfig\x00");
827    if _sapp_glx_GetFBConfigs.is_none()
828        || _sapp_glx_GetFBConfigAttrib.is_none()
829        || _sapp_glx_GetClientString.is_none()
830        || _sapp_glx_QueryExtension.is_none()
831        || _sapp_glx_QueryVersion.is_none()
832        || _sapp_glx_DestroyContext.is_none()
833        || _sapp_glx_MakeCurrent.is_none()
834        || _sapp_glx_SwapBuffers.is_none()
835        || _sapp_glx_QueryExtensionsString.is_none()
836        || _sapp_glx_CreateNewContext.is_none()
837        || _sapp_glx_CreateWindow.is_none()
838        || _sapp_glx_DestroyWindow.is_none()
839        || _sapp_glx_GetProcAddress.is_none()
840        || _sapp_glx_GetProcAddressARB.is_none()
841        || _sapp_glx_GetVisualFromFBConfig.is_none()
842    {
843        _sapp_fail("GLX: failed to load required entry points");
844    }
845    if _sapp_glx_QueryExtension.expect("non-null function pointer")(
846        _sapp_x11_display,
847        &mut _sapp_glx_errorbase,
848        &mut _sapp_glx_eventbase,
849    ) == 0
850    {
851        _sapp_fail("GLX: GLX extension not found");
852    }
853    if _sapp_glx_QueryVersion.expect("non-null function pointer")(
854        _sapp_x11_display,
855        &mut _sapp_glx_major,
856        &mut _sapp_glx_minor,
857    ) == 0
858    {
859        _sapp_fail("GLX: Failed to query GLX version");
860    }
861    if _sapp_glx_major == 1 as libc::c_int && _sapp_glx_minor < 3 as libc::c_int {
862        _sapp_fail("GLX: GLX version 1.3 is required");
863    }
864    let mut exts = _sapp_glx_QueryExtensionsString.expect("non-null function pointer")(
865        _sapp_x11_display,
866        _sapp_x11_screen,
867    );
868    if _sapp_glx_extsupported(b"GLX_EXT_swap_control\x00", exts) {
869        _sapp_glx_SwapIntervalEXT =
870            _sapp_glx_getprocaddr::<PFNGLXSWAPINTERVALEXTPROC>(b"glXSwapIntervalEXT\x00");
871        _sapp_glx_EXT_swap_control = _sapp_glx_SwapIntervalEXT.is_some()
872    }
873    if _sapp_glx_extsupported(b"GLX_MESA_swap_control\x00", exts) {
874        _sapp_glx_SwapIntervalMESA = _sapp_glx_getprocaddr(b"glXSwapIntervalMESA\x00");
875        _sapp_glx_MESA_swap_control = _sapp_glx_SwapIntervalMESA.is_some()
876    }
877    _sapp_glx_ARB_multisample = _sapp_glx_extsupported(b"GLX_ARB_multisample\x00", exts);
878    _sapp_glx_ARB_framebuffer_sRGB = _sapp_glx_extsupported(b"GLX_ARB_framebuffer_sRGB\x00", exts);
879    _sapp_glx_EXT_framebuffer_sRGB = _sapp_glx_extsupported(b"GLX_EXT_framebuffer_sRGB\x00", exts);
880    if _sapp_glx_extsupported(b"GLX_ARB_create_context\x00", exts) {
881        _sapp_glx_CreateContextAttribsARB =
882            _sapp_glx_getprocaddr(b"glXCreateContextAttribsARB\x00");
883        _sapp_glx_ARB_create_context = _sapp_glx_CreateContextAttribsARB.is_some()
884    }
885    _sapp_glx_ARB_create_context_profile =
886        _sapp_glx_extsupported(b"GLX_ARB_create_context_profile\x00", exts);
887}
888pub static mut _sapp_glx_GetVisualFromFBConfig: PFNGLXGETVISUALFROMFBCONFIGPROC = None;
889pub unsafe extern "C" fn _sapp_glx_choose_visual(
890    mut visual: *mut *mut Visual,
891    mut depth: *mut libc::c_int,
892) {
893    let mut native = _sapp_glx_choosefbconfig();
894    if native.is_null() {
895        _sapp_fail("GLX: Failed to find a suitable GLXFBConfig");
896    }
897    let mut result = _sapp_glx_GetVisualFromFBConfig.expect("non-null function pointer")(
898        _sapp_x11_display,
899        native,
900    );
901    if result.is_null() {
902        _sapp_fail("GLX: Failed to retrieve Visual for GLXFBConfig");
903    }
904    *visual = (*result).visual;
905    *depth = (*result).depth;
906    XFree(result as *mut libc::c_void);
907}
908pub static mut _sapp_x11_root: Window = 0;
909pub static mut _sapp_x11_NET_WM_NAME: Atom = 0;
910pub static mut _sapp_x11_NET_WM_ICON_NAME: Atom = 0;
911pub static mut _sapp_x11_UTF8_STRING: Atom = 0;
912pub static mut _sapp_x11_XA_ATOM: Atom = 4;
913pub static mut _sapp_x11_XDND_VERSION: Atom = 5;
914
915pub unsafe extern "C" fn _sapp_x11_update_window_title() {
916    Xutf8SetWMProperties(
917        _sapp_x11_display,
918        _sapp_x11_window,
919        _sapp.window_title.as_mut_ptr(),
920        _sapp.window_title.as_mut_ptr(),
921        std::ptr::null_mut(),
922        0 as libc::c_int,
923        std::ptr::null_mut(),
924        std::ptr::null_mut(),
925        std::ptr::null_mut(),
926    );
927    XChangeProperty(
928        _sapp_x11_display,
929        _sapp_x11_window,
930        _sapp_x11_NET_WM_NAME,
931        _sapp_x11_UTF8_STRING,
932        8 as libc::c_int,
933        PropModeReplace,
934        _sapp.window_title.as_mut_ptr() as *mut libc::c_uchar,
935        strlen(_sapp.window_title.as_mut_ptr()) as libc::c_int,
936    );
937    XChangeProperty(
938        _sapp_x11_display,
939        _sapp_x11_window,
940        _sapp_x11_NET_WM_ICON_NAME,
941        _sapp_x11_UTF8_STRING,
942        8 as libc::c_int,
943        PropModeReplace,
944        _sapp.window_title.as_mut_ptr() as *mut libc::c_uchar,
945        strlen(_sapp.window_title.as_mut_ptr()) as libc::c_int,
946    );
947    XFlush(_sapp_x11_display);
948}
949pub unsafe extern "C" fn _sapp_x11_query_window_size() {
950    let mut attribs = XWindowAttributes {
951        x: 0,
952        y: 0,
953        width: 0,
954        height: 0,
955        border_width: 0,
956        depth: 0,
957        visual: 0 as *mut Visual,
958        root: 0,
959        class: 0,
960        bit_gravity: 0,
961        win_gravity: 0,
962        backing_store: 0,
963        backing_planes: 0,
964        backing_pixel: 0,
965        save_under: 0,
966        colormap: 0,
967        map_installed: 0,
968        map_state: 0,
969        all_event_masks: 0,
970        your_event_mask: 0,
971        do_not_propagate_mask: 0,
972        override_redirect: 0,
973        screen: 0 as *mut Screen,
974    };
975    XGetWindowAttributes(_sapp_x11_display, _sapp_x11_window, &mut attribs);
976    _sapp.window_width = attribs.width;
977    _sapp.window_height = attribs.height;
978    _sapp.framebuffer_width = _sapp.window_width;
979    _sapp.framebuffer_height = _sapp.framebuffer_height;
980}
981pub static mut _sapp_glx_ARB_create_context: bool = false;
982pub static mut _sapp_glx_ARB_create_context_profile: bool = false;
983pub static mut _sapp_x11_error_code: libc::c_uchar = 0;
984pub unsafe extern "C" fn _sapp_x11_error_handler(
985    mut display: *mut Display,
986    mut event: *mut XErrorEvent,
987) -> libc::c_int {
988    _sapp_x11_error_code = (*event).error_code;
989    return 0 as libc::c_int;
990}
991pub unsafe extern "C" fn _sapp_x11_grab_error_handler() {
992    _sapp_x11_error_code = Success as libc::c_uchar;
993    XSetErrorHandler(Some(
994        _sapp_x11_error_handler
995            as unsafe extern "C" fn(_: *mut Display, _: *mut XErrorEvent) -> libc::c_int,
996    ));
997}
998pub static mut _sapp_glx_CreateContextAttribsARB: PFNGLXCREATECONTEXTATTRIBSARBPROC = None;
999pub const GLX_CONTEXT_MAJOR_VERSION_ARB: libc::c_int = 0x2091 as libc::c_int;
1000pub const GLX_CONTEXT_MINOR_VERSION_ARB: libc::c_int = 0x2092 as libc::c_int;
1001pub const GLX_CONTEXT_PROFILE_MASK_ARB: libc::c_int = 0x9126 as libc::c_int;
1002pub const GLX_CONTEXT_CORE_PROFILE_BIT_ARB: libc::c_int = 0x1 as libc::c_int;
1003pub const GLX_CONTEXT_FLAGS_ARB: libc::c_int = 0x2094 as libc::c_int;
1004pub const GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB: libc::c_int = 0x2 as libc::c_int;
1005pub unsafe extern "C" fn _sapp_x11_release_error_handler() {
1006    XSync(_sapp_x11_display, false as _);
1007    XSetErrorHandler(None);
1008}
1009pub static mut _sapp_glx_CreateWindow: PFNGLXCREATEWINDOWPROC = None;
1010pub static mut _sapp_glx_GetClientString: PFNGLXGETCLIENTSTRINGPROC = None;
1011pub const GLX_VENDOR: libc::c_int = 1 as libc::c_int;
1012pub static mut _sapp_glx_GetFBConfigs: PFNGLXGETFBCONFIGSPROC = None;
1013pub static mut _sapp_x11_screen: libc::c_int = 0;
1014pub const GLX_RENDER_TYPE: libc::c_int = 0x8011 as libc::c_int;
1015pub const GLX_RGBA_BIT: libc::c_int = 0x1 as libc::c_int;
1016pub const GLX_DRAWABLE_TYPE: libc::c_int = 0x8010 as libc::c_int;
1017pub const GLX_WINDOW_BIT: libc::c_int = 0x1 as libc::c_int;
1018pub const GLX_RED_SIZE: libc::c_int = 8 as libc::c_int;
1019pub const GLX_GREEN_SIZE: libc::c_int = 9 as libc::c_int;
1020pub const GLX_BLUE_SIZE: libc::c_int = 10 as libc::c_int;
1021pub const GLX_ALPHA_SIZE: libc::c_int = 11 as libc::c_int;
1022pub const GLX_DEPTH_SIZE: libc::c_int = 12 as libc::c_int;
1023pub const GLX_STENCIL_SIZE: libc::c_int = 13 as libc::c_int;
1024pub const GLX_DOUBLEBUFFER: libc::c_int = 5 as libc::c_int;
1025pub static mut _sapp_glx_ARB_multisample: bool = false;
1026pub static mut _sapp_glx_GetFBConfigAttrib: PFNGLXGETFBCONFIGATTRIBPROC = None;
1027pub unsafe extern "C" fn _sapp_glx_attrib(
1028    mut fbconfig: GLXFBConfig,
1029    mut attrib: libc::c_int,
1030) -> libc::c_int {
1031    let mut value: libc::c_int = 0;
1032    _sapp_glx_GetFBConfigAttrib.expect("non-null function pointer")(
1033        _sapp_x11_display,
1034        fbconfig,
1035        attrib,
1036        &mut value,
1037    );
1038    return value;
1039}
1040pub const GLX_SAMPLES: libc::c_int = 0x186a1 as libc::c_int;
1041pub fn _sapp_gl_init_fbconfig() -> _sapp_gl_fbconfig {
1042    _sapp_gl_fbconfig {
1043        red_bits: -(1 as libc::c_int),
1044        green_bits: -(1 as libc::c_int),
1045        blue_bits: -(1 as libc::c_int),
1046        alpha_bits: -(1 as libc::c_int),
1047        depth_bits: -(1 as libc::c_int),
1048        stencil_bits: -(1 as libc::c_int),
1049        samples: -(1 as libc::c_int),
1050        doublebuffer: false,
1051        handle: 0,
1052    }
1053}
1054pub unsafe extern "C" fn _sapp_gl_choose_fbconfig(
1055    mut desired: *const _sapp_gl_fbconfig,
1056    mut alternatives: *const _sapp_gl_fbconfig,
1057    mut count: libc::c_uint,
1058) -> *const _sapp_gl_fbconfig {
1059    let mut i: i32 = 0;
1060    let mut missing: i32 = 0;
1061    let mut least_missing: i32 = 1000000;
1062    let mut color_diff: i32 = 0;
1063    let mut least_color_diff: i32 = 10000000;
1064    let mut extra_diff: i32 = 0;
1065    let mut least_extra_diff: i32 = 10000000;
1066    let mut current = 0 as *const _sapp_gl_fbconfig;
1067    let mut closest = std::ptr::null();
1068
1069    for i in 0..count as i32 {
1070        current = alternatives.offset(i as isize);
1071
1072        if (*desired).doublebuffer == (*current).doublebuffer {
1073            missing = 0;
1074            if (*desired).alpha_bits > 0 && (*current).alpha_bits == 0 {
1075                missing += 1;
1076            }
1077            if (*desired).depth_bits > 0 && (*current).depth_bits == 0 {
1078                missing += 1;
1079            }
1080            if (*desired).stencil_bits > 0 && (*current).stencil_bits == 0 {
1081                missing += 1;
1082            }
1083            if (*desired).samples > 0 && (*current).samples == 0 {
1084                // Technically, several multisampling buffers could be
1085                //  involved, but that's a lower level implentation detail and
1086                //  not important to us here, so we count them as one
1087
1088                missing += 1;
1089            }
1090
1091            // These polynomials make many small channel size differences matter
1092            //  less than one large channel size difference
1093            //  Calculate color channel size difference value
1094
1095            color_diff = 0;
1096            if (*desired).red_bits != -1 {
1097                color_diff += ((*desired).red_bits - (*current).red_bits)
1098                    * ((*desired).red_bits - (*current).red_bits);
1099            }
1100            if (*desired).green_bits != -1 {
1101                color_diff += ((*desired).green_bits - (*current).green_bits)
1102                    * ((*desired).green_bits - (*current).green_bits)
1103            }
1104            if (*desired).blue_bits != -1 {
1105                color_diff += ((*desired).blue_bits - (*current).blue_bits)
1106                    * ((*desired).blue_bits - (*current).blue_bits)
1107            }
1108
1109            // Calculate non-color channel size difference value
1110            extra_diff = 0;
1111            if (*desired).alpha_bits != -1 {
1112                extra_diff += ((*desired).alpha_bits - (*current).alpha_bits)
1113                    * ((*desired).alpha_bits - (*current).alpha_bits)
1114            }
1115            if (*desired).depth_bits != -1 {
1116                extra_diff += ((*desired).depth_bits - (*current).depth_bits)
1117                    * ((*desired).depth_bits - (*current).depth_bits);
1118            }
1119            if (*desired).stencil_bits != -1 {
1120                extra_diff = ((*desired).stencil_bits - (*current).stencil_bits)
1121                    * ((*desired).stencil_bits - (*current).stencil_bits);
1122            }
1123            if (*desired).samples != -1 {
1124                extra_diff += ((*desired).samples - (*current).samples)
1125                    * ((*desired).samples - (*current).samples);
1126            }
1127            if missing < least_missing {
1128                closest = current
1129            } else if missing == least_missing {
1130                if color_diff < least_color_diff
1131                    || color_diff == least_color_diff && extra_diff < least_extra_diff
1132                {
1133                    closest = current
1134                }
1135            }
1136
1137            // Figure out if the current one is better than the best one found so far
1138            //  Least number of missing buffers is the most important heuristic,
1139            //  then color buffer size match and lastly size match for other buffers
1140
1141            if current == closest {
1142                least_missing = missing;
1143                least_color_diff = color_diff;
1144                least_extra_diff = extra_diff
1145            }
1146        }
1147    }
1148    return closest;
1149}
1150pub unsafe extern "C" fn _sapp_glx_choosefbconfig() -> GLXFBConfig {
1151    let mut native_configs = 0 as *mut GLXFBConfig;
1152    let mut closest = 0 as *const _sapp_gl_fbconfig;
1153    let mut i: libc::c_int = 0;
1154    let mut native_count: libc::c_int = 0;
1155    let mut usable_count: libc::c_int = 0;
1156    let mut vendor = 0 as *const libc::c_char;
1157    let mut trust_window_bit = true;
1158    vendor = _sapp_glx_GetClientString.expect("non-null function pointer")(
1159        _sapp_x11_display,
1160        GLX_VENDOR,
1161    );
1162    if !vendor.is_null()
1163        && strcmp(vendor, b"Chromium\x00" as *const u8 as *const libc::c_char) == 0 as libc::c_int
1164    {
1165        trust_window_bit = false
1166    }
1167    native_configs = _sapp_glx_GetFBConfigs.expect("non-null function pointer")(
1168        _sapp_x11_display,
1169        _sapp_x11_screen,
1170        &mut native_count,
1171    );
1172    if native_configs.is_null() || native_count == 0 {
1173        _sapp_fail("GLX: No GLXFBConfigs returned");
1174    }
1175    let mut usable_configs: Vec<_sapp_gl_fbconfig> = Vec::new();
1176    usable_count = 0 as libc::c_int;
1177    let mut current_block_25: u64;
1178    for i in 0..native_count {
1179        let n = *native_configs.offset(i as isize);
1180        let mut u = _sapp_gl_init_fbconfig();
1181        if 0 == _sapp_glx_attrib(n, GLX_RENDER_TYPE) & GLX_RGBA_BIT {
1182            continue;
1183        }
1184        if 0 == _sapp_glx_attrib(n, GLX_DRAWABLE_TYPE) & GLX_WINDOW_BIT {
1185            if trust_window_bit {
1186                continue;
1187            }
1188        }
1189
1190        u.red_bits = _sapp_glx_attrib(n, GLX_RED_SIZE);
1191        u.green_bits = _sapp_glx_attrib(n, GLX_GREEN_SIZE);
1192        u.blue_bits = _sapp_glx_attrib(n, GLX_BLUE_SIZE);
1193        u.alpha_bits = _sapp_glx_attrib(n, GLX_ALPHA_SIZE);
1194        u.depth_bits = _sapp_glx_attrib(n, GLX_DEPTH_SIZE);
1195        u.stencil_bits = _sapp_glx_attrib(n, GLX_STENCIL_SIZE);
1196        if _sapp_glx_attrib(n, GLX_DOUBLEBUFFER) != 0 {
1197            u.doublebuffer = true
1198        }
1199        if _sapp_glx_ARB_multisample {
1200            u.samples = _sapp_glx_attrib(n, GLX_SAMPLES)
1201        }
1202        u.handle = n as libc::c_ulong;
1203        usable_configs.push(u);
1204        usable_count += 1
1205    }
1206
1207    let mut desired = _sapp_gl_init_fbconfig();
1208    desired.red_bits = 8;
1209    desired.green_bits = 8;
1210    desired.blue_bits = 8;
1211    desired.alpha_bits = 8;
1212    desired.depth_bits = 24;
1213    desired.stencil_bits = 8;
1214    desired.doublebuffer = true;
1215    desired.samples = if _sapp.sample_count > 1 {
1216        _sapp.sample_count
1217    } else {
1218        0
1219    };
1220    closest = _sapp_gl_choose_fbconfig(
1221        &mut desired,
1222        usable_configs.as_mut_ptr(),
1223        usable_count as libc::c_uint,
1224    );
1225    let mut result = 0 as GLXFBConfig;
1226    if !closest.is_null() {
1227        result = (*closest).handle as GLXFBConfig
1228    }
1229    XFree(native_configs as *mut libc::c_void);
1230    return result;
1231}
1232
1233pub unsafe extern "C" fn _sapp_fail(msg: &str) {
1234    println!("{}", msg);
1235    std::process::exit(0);
1236}
1237
1238pub unsafe extern "C" fn _sapp_glx_create_context() {
1239    let mut native = _sapp_glx_choosefbconfig();
1240    if native.is_null() {
1241        _sapp_fail("GLX: Failed to find a suitable GLXFBConfig (2)");
1242    }
1243    if !(_sapp_glx_ARB_create_context && _sapp_glx_ARB_create_context_profile) {
1244        _sapp_fail("GLX: ARB_create_context and ARB_create_context_profile required");
1245    }
1246    _sapp_x11_grab_error_handler();
1247    let attribs: [libc::c_int; 10] = [
1248        GLX_CONTEXT_MAJOR_VERSION_ARB,
1249        3,
1250        GLX_CONTEXT_MINOR_VERSION_ARB,
1251        3,
1252        GLX_CONTEXT_PROFILE_MASK_ARB,
1253        GLX_CONTEXT_CORE_PROFILE_BIT_ARB,
1254        GLX_CONTEXT_FLAGS_ARB,
1255        GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
1256        0,
1257        0,
1258    ];
1259    _sapp_glx_ctx = _sapp_glx_CreateContextAttribsARB.expect("non-null function pointer")(
1260        _sapp_x11_display,
1261        native,
1262        std::ptr::null_mut(),
1263        true as _,
1264        attribs.as_ptr(),
1265    );
1266    if _sapp_glx_ctx.is_null() {
1267        _sapp_fail("GLX: failed to create GL context");
1268    }
1269    _sapp_x11_release_error_handler();
1270    _sapp_glx_window = _sapp_glx_CreateWindow.expect("non-null function pointer")(
1271        _sapp_x11_display,
1272        native,
1273        _sapp_x11_window,
1274        std::ptr::null(),
1275    );
1276    if _sapp_glx_window == 0 {
1277        _sapp_fail("GLX: failed to create window");
1278    };
1279}
1280pub unsafe extern "C" fn _sapp_x11_window_visible() -> bool {
1281    let mut wa = XWindowAttributes {
1282        x: 0,
1283        y: 0,
1284        width: 0,
1285        height: 0,
1286        border_width: 0,
1287        depth: 0,
1288        visual: 0 as *mut Visual,
1289        root: 0,
1290        class: 0,
1291        bit_gravity: 0,
1292        win_gravity: 0,
1293        backing_store: 0,
1294        backing_planes: 0,
1295        backing_pixel: 0,
1296        save_under: 0,
1297        colormap: 0,
1298        map_installed: 0,
1299        map_state: 0,
1300        all_event_masks: 0,
1301        your_event_mask: 0,
1302        do_not_propagate_mask: 0,
1303        override_redirect: 0,
1304        screen: 0 as *mut Screen,
1305    };
1306    XGetWindowAttributes(_sapp_x11_display, _sapp_x11_window, &mut wa);
1307    return wa.map_state == IsViewable;
1308}
1309pub unsafe extern "C" fn _sapp_x11_show_window() {
1310    if !_sapp_x11_window_visible() {
1311        XMapWindow(_sapp_x11_display, _sapp_x11_window);
1312        XRaiseWindow(_sapp_x11_display, _sapp_x11_window);
1313        XFlush(_sapp_x11_display);
1314    };
1315}
1316
1317#[deprecated(note = "Should be removed")]
1318unsafe fn _sapp_x11_set_fullscreen() {
1319    let mut wm_state = XInternAtom(
1320        _sapp_x11_display,
1321        b"_NET_WM_STATE\x00" as *const u8 as *const libc::c_char,
1322        false as _,
1323    );
1324    let wm_fullscreen = XInternAtom(
1325        _sapp_x11_display,
1326        b"_NET_WM_STATE_FULLSCREEN\x00" as *const u8 as *const libc::c_char,
1327        false as _,
1328    );
1329
1330    // this is the first method to make window fullscreen
1331    // hide it, change _NET_WM_STATE_FULLSCREEN property and than show it back
1332    // someone on stackoverflow mentioned that this is not working on ubuntu/unity though
1333    {
1334        XLowerWindow(_sapp_x11_display, _sapp_x11_window);
1335        XUnmapWindow(_sapp_x11_display, _sapp_x11_window);
1336        XSync(_sapp_x11_display, false as _);
1337
1338        let mut atoms: [Atom; 2] = [wm_fullscreen, 0 as _];
1339        XChangeProperty(
1340            _sapp_x11_display,
1341            _sapp_x11_window,
1342            wm_state,
1343            4 as _,
1344            32,
1345            PropModeReplace,
1346            atoms.as_mut_ptr() as *mut _ as *mut _,
1347            1,
1348        );
1349        XMapWindow(_sapp_x11_display, _sapp_x11_window);
1350        XRaiseWindow(_sapp_x11_display, _sapp_x11_window);
1351        XFlush(_sapp_x11_display);
1352    }
1353
1354    // however, this is X, so just in case - the second method
1355    // send ClientMessage to the window with request to change property to fullscreen
1356    {
1357        let mut data = [0isize; 5];
1358
1359        data[0] = 1;
1360        data[1] = wm_fullscreen as isize;
1361        data[2] = 0;
1362
1363        let mut ev = XClientMessageEvent {
1364            type_0: 33,
1365            serial: 0,
1366            send_event: true as _,
1367            message_type: wm_state,
1368            window: _sapp_x11_window,
1369            display: _sapp_x11_display,
1370            format: 32,
1371            data: ClientMessageData {
1372                l: std::mem::transmute(data),
1373            },
1374        };
1375        XSendEvent(
1376            _sapp_x11_display,
1377            _sapp_x11_root,
1378            false as _,
1379            (1048576 | 131072) as _,
1380            &mut ev as *mut XClientMessageEvent as *mut XEvent,
1381        );
1382    }
1383}
1384
1385unsafe fn _sapp_x11_send_event(t: Atom, a: isize, b: isize, c: isize, d: isize, e: isize) {
1386    let mut data = [0isize; 5];
1387
1388    data[0] = a;
1389    data[1] = b;
1390    data[2] = c;
1391    data[3] = d;
1392    data[4] = e;
1393
1394    let mut ev = XClientMessageEvent {
1395        type_0: 33,
1396        serial: 0,
1397        send_event: true as _,
1398        message_type: t,
1399        window: _sapp_x11_window,
1400        display: _sapp_x11_display,
1401        format: 32,
1402        data: ClientMessageData {
1403            l: std::mem::transmute(data),
1404        },
1405    };
1406
1407    XSendEvent(
1408        _sapp_x11_display,
1409        _sapp_x11_root,
1410        false as _,
1411        (1048576 | 131072) as _,
1412        &mut ev as *mut XClientMessageEvent as *mut XEvent,
1413    );
1414}
1415
1416pub static mut _sapp_glx_EXT_swap_control: bool = false;
1417pub static mut _sapp_glx_SwapIntervalEXT: PFNGLXSWAPINTERVALEXTPROC = None;
1418pub static mut _sapp_glx_MESA_swap_control: bool = false;
1419pub static mut _sapp_glx_SwapIntervalMESA: PFNGLXSWAPINTERVALMESAPROC = None;
1420pub unsafe extern "C" fn _sapp_glx_swapinterval(mut interval: libc::c_int) {
1421    _sapp_glx_make_current();
1422    if _sapp_glx_EXT_swap_control {
1423        _sapp_glx_SwapIntervalEXT.expect("non-null function pointer")(
1424            _sapp_x11_display,
1425            _sapp_glx_window,
1426            interval,
1427        );
1428    } else if _sapp_glx_MESA_swap_control {
1429        _sapp_glx_SwapIntervalMESA.expect("non-null function pointer")(interval);
1430    };
1431}
1432pub static mut _sapp_glx_MakeCurrent: PFNGLXMAKECURRENTPROC = None;
1433pub unsafe extern "C" fn _sapp_glx_make_current() {
1434    _sapp_glx_MakeCurrent.expect("non-null function pointer")(
1435        _sapp_x11_display,
1436        _sapp_glx_window,
1437        _sapp_glx_ctx,
1438    );
1439}
1440pub unsafe extern "C" fn _sapp_x11_char_event(mut chr: u32, mut repeat: bool, mut mods: u32) {
1441    if _sapp_events_enabled() {
1442        _sapp_init_event(sapp_event_type_SAPP_EVENTTYPE_CHAR);
1443        _sapp.event.char_code = chr;
1444        _sapp.event.key_repeat = repeat;
1445        _sapp.event.modifiers = mods;
1446        _sapp_call_event(&mut _sapp.event);
1447    };
1448}
1449
1450pub unsafe extern "C" fn _sapp_x11_raw_device_event(dx: f32, dy: f32) {
1451    if _sapp_events_enabled() {
1452        _sapp_init_event(sapp_event_type_SAPP_EVENTTYPE_RAW_DEVICE);
1453        _sapp.event.mouse_dx = dx;
1454        _sapp.event.mouse_dy = dy;
1455        _sapp_call_event(&mut _sapp.event);
1456    };
1457}
1458
1459pub static mut _sapp_x11_keysymtab: [_sapp_x11_codepair; 828] = [
1460    _sapp_x11_codepair::new(0x01a1, 0x0104),
1461    _sapp_x11_codepair::new(0x01a2, 0x02d8),
1462    _sapp_x11_codepair::new(0x01a3, 0x0141),
1463    _sapp_x11_codepair::new(0x01a5, 0x013d),
1464    _sapp_x11_codepair::new(0x01a6, 0x015a),
1465    _sapp_x11_codepair::new(0x01a9, 0x0160),
1466    _sapp_x11_codepair::new(0x01aa, 0x015e),
1467    _sapp_x11_codepair::new(0x01ab, 0x0164),
1468    _sapp_x11_codepair::new(0x01ac, 0x0179),
1469    _sapp_x11_codepair::new(0x01ae, 0x017d),
1470    _sapp_x11_codepair::new(0x01af, 0x017b),
1471    _sapp_x11_codepair::new(0x01b1, 0x0105),
1472    _sapp_x11_codepair::new(0x01b2, 0x02db),
1473    _sapp_x11_codepair::new(0x01b3, 0x0142),
1474    _sapp_x11_codepair::new(0x01b5, 0x013e),
1475    _sapp_x11_codepair::new(0x01b6, 0x015b),
1476    _sapp_x11_codepair::new(0x01b7, 0x02c7),
1477    _sapp_x11_codepair::new(0x01b9, 0x0161),
1478    _sapp_x11_codepair::new(0x01ba, 0x015f),
1479    _sapp_x11_codepair::new(0x01bb, 0x0165),
1480    _sapp_x11_codepair::new(0x01bc, 0x017a),
1481    _sapp_x11_codepair::new(0x01bd, 0x02dd),
1482    _sapp_x11_codepair::new(0x01be, 0x017e),
1483    _sapp_x11_codepair::new(0x01bf, 0x017c),
1484    _sapp_x11_codepair::new(0x01c0, 0x0154),
1485    _sapp_x11_codepair::new(0x01c3, 0x0102),
1486    _sapp_x11_codepair::new(0x01c5, 0x0139),
1487    _sapp_x11_codepair::new(0x01c6, 0x0106),
1488    _sapp_x11_codepair::new(0x01c8, 0x010c),
1489    _sapp_x11_codepair::new(0x01ca, 0x0118),
1490    _sapp_x11_codepair::new(0x01cc, 0x011a),
1491    _sapp_x11_codepair::new(0x01cf, 0x010e),
1492    _sapp_x11_codepair::new(0x01d0, 0x0110),
1493    _sapp_x11_codepair::new(0x01d1, 0x0143),
1494    _sapp_x11_codepair::new(0x01d2, 0x0147),
1495    _sapp_x11_codepair::new(0x01d5, 0x0150),
1496    _sapp_x11_codepair::new(0x01d8, 0x0158),
1497    _sapp_x11_codepair::new(0x01d9, 0x016e),
1498    _sapp_x11_codepair::new(0x01db, 0x0170),
1499    _sapp_x11_codepair::new(0x01de, 0x0162),
1500    _sapp_x11_codepair::new(0x01e0, 0x0155),
1501    _sapp_x11_codepair::new(0x01e3, 0x0103),
1502    _sapp_x11_codepair::new(0x01e5, 0x013a),
1503    _sapp_x11_codepair::new(0x01e6, 0x0107),
1504    _sapp_x11_codepair::new(0x01e8, 0x010d),
1505    _sapp_x11_codepair::new(0x01ea, 0x0119),
1506    _sapp_x11_codepair::new(0x01ec, 0x011b),
1507    _sapp_x11_codepair::new(0x01ef, 0x010f),
1508    _sapp_x11_codepair::new(0x01f0, 0x0111),
1509    _sapp_x11_codepair::new(0x01f1, 0x0144),
1510    _sapp_x11_codepair::new(0x01f2, 0x0148),
1511    _sapp_x11_codepair::new(0x01f5, 0x0151),
1512    _sapp_x11_codepair::new(0x01f8, 0x0159),
1513    _sapp_x11_codepair::new(0x01f9, 0x016f),
1514    _sapp_x11_codepair::new(0x01fb, 0x0171),
1515    _sapp_x11_codepair::new(0x01fe, 0x0163),
1516    _sapp_x11_codepair::new(0x01ff, 0x02d9),
1517    _sapp_x11_codepair::new(0x02a1, 0x0126),
1518    _sapp_x11_codepair::new(0x02a6, 0x0124),
1519    _sapp_x11_codepair::new(0x02a9, 0x0130),
1520    _sapp_x11_codepair::new(0x02ab, 0x011e),
1521    _sapp_x11_codepair::new(0x02ac, 0x0134),
1522    _sapp_x11_codepair::new(0x02b1, 0x0127),
1523    _sapp_x11_codepair::new(0x02b6, 0x0125),
1524    _sapp_x11_codepair::new(0x02b9, 0x0131),
1525    _sapp_x11_codepair::new(0x02bb, 0x011f),
1526    _sapp_x11_codepair::new(0x02bc, 0x0135),
1527    _sapp_x11_codepair::new(0x02c5, 0x010a),
1528    _sapp_x11_codepair::new(0x02c6, 0x0108),
1529    _sapp_x11_codepair::new(0x02d5, 0x0120),
1530    _sapp_x11_codepair::new(0x02d8, 0x011c),
1531    _sapp_x11_codepair::new(0x02dd, 0x016c),
1532    _sapp_x11_codepair::new(0x02de, 0x015c),
1533    _sapp_x11_codepair::new(0x02e5, 0x010b),
1534    _sapp_x11_codepair::new(0x02e6, 0x0109),
1535    _sapp_x11_codepair::new(0x02f5, 0x0121),
1536    _sapp_x11_codepair::new(0x02f8, 0x011d),
1537    _sapp_x11_codepair::new(0x02fd, 0x016d),
1538    _sapp_x11_codepair::new(0x02fe, 0x015d),
1539    _sapp_x11_codepair::new(0x03a2, 0x0138),
1540    _sapp_x11_codepair::new(0x03a3, 0x0156),
1541    _sapp_x11_codepair::new(0x03a5, 0x0128),
1542    _sapp_x11_codepair::new(0x03a6, 0x013b),
1543    _sapp_x11_codepair::new(0x03aa, 0x0112),
1544    _sapp_x11_codepair::new(0x03ab, 0x0122),
1545    _sapp_x11_codepair::new(0x03ac, 0x0166),
1546    _sapp_x11_codepair::new(0x03b3, 0x0157),
1547    _sapp_x11_codepair::new(0x03b5, 0x0129),
1548    _sapp_x11_codepair::new(0x03b6, 0x013c),
1549    _sapp_x11_codepair::new(0x03ba, 0x0113),
1550    _sapp_x11_codepair::new(0x03bb, 0x0123),
1551    _sapp_x11_codepair::new(0x03bc, 0x0167),
1552    _sapp_x11_codepair::new(0x03bd, 0x014a),
1553    _sapp_x11_codepair::new(0x03bf, 0x014b),
1554    _sapp_x11_codepair::new(0x03c0, 0x0100),
1555    _sapp_x11_codepair::new(0x03c7, 0x012e),
1556    _sapp_x11_codepair::new(0x03cc, 0x0116),
1557    _sapp_x11_codepair::new(0x03cf, 0x012a),
1558    _sapp_x11_codepair::new(0x03d1, 0x0145),
1559    _sapp_x11_codepair::new(0x03d2, 0x014c),
1560    _sapp_x11_codepair::new(0x03d3, 0x0136),
1561    _sapp_x11_codepair::new(0x03d9, 0x0172),
1562    _sapp_x11_codepair::new(0x03dd, 0x0168),
1563    _sapp_x11_codepair::new(0x03de, 0x016a),
1564    _sapp_x11_codepair::new(0x03e0, 0x0101),
1565    _sapp_x11_codepair::new(0x03e7, 0x012f),
1566    _sapp_x11_codepair::new(0x03ec, 0x0117),
1567    _sapp_x11_codepair::new(0x03ef, 0x012b),
1568    _sapp_x11_codepair::new(0x03f1, 0x0146),
1569    _sapp_x11_codepair::new(0x03f2, 0x014d),
1570    _sapp_x11_codepair::new(0x03f3, 0x0137),
1571    _sapp_x11_codepair::new(0x03f9, 0x0173),
1572    _sapp_x11_codepair::new(0x03fd, 0x0169),
1573    _sapp_x11_codepair::new(0x03fe, 0x016b),
1574    _sapp_x11_codepair::new(0x047e, 0x203e),
1575    _sapp_x11_codepair::new(0x04a1, 0x3002),
1576    _sapp_x11_codepair::new(0x04a2, 0x300c),
1577    _sapp_x11_codepair::new(0x04a3, 0x300d),
1578    _sapp_x11_codepair::new(0x04a4, 0x3001),
1579    _sapp_x11_codepair::new(0x04a5, 0x30fb),
1580    _sapp_x11_codepair::new(0x04a6, 0x30f2),
1581    _sapp_x11_codepair::new(0x04a7, 0x30a1),
1582    _sapp_x11_codepair::new(0x04a8, 0x30a3),
1583    _sapp_x11_codepair::new(0x04a9, 0x30a5),
1584    _sapp_x11_codepair::new(0x04aa, 0x30a7),
1585    _sapp_x11_codepair::new(0x04ab, 0x30a9),
1586    _sapp_x11_codepair::new(0x04ac, 0x30e3),
1587    _sapp_x11_codepair::new(0x04ad, 0x30e5),
1588    _sapp_x11_codepair::new(0x04ae, 0x30e7),
1589    _sapp_x11_codepair::new(0x04af, 0x30c3),
1590    _sapp_x11_codepair::new(0x04b0, 0x30fc),
1591    _sapp_x11_codepair::new(0x04b1, 0x30a2),
1592    _sapp_x11_codepair::new(0x04b2, 0x30a4),
1593    _sapp_x11_codepair::new(0x04b3, 0x30a6),
1594    _sapp_x11_codepair::new(0x04b4, 0x30a8),
1595    _sapp_x11_codepair::new(0x04b5, 0x30aa),
1596    _sapp_x11_codepair::new(0x04b6, 0x30ab),
1597    _sapp_x11_codepair::new(0x04b7, 0x30ad),
1598    _sapp_x11_codepair::new(0x04b8, 0x30af),
1599    _sapp_x11_codepair::new(0x04b9, 0x30b1),
1600    _sapp_x11_codepair::new(0x04ba, 0x30b3),
1601    _sapp_x11_codepair::new(0x04bb, 0x30b5),
1602    _sapp_x11_codepair::new(0x04bc, 0x30b7),
1603    _sapp_x11_codepair::new(0x04bd, 0x30b9),
1604    _sapp_x11_codepair::new(0x04be, 0x30bb),
1605    _sapp_x11_codepair::new(0x04bf, 0x30bd),
1606    _sapp_x11_codepair::new(0x04c0, 0x30bf),
1607    _sapp_x11_codepair::new(0x04c1, 0x30c1),
1608    _sapp_x11_codepair::new(0x04c2, 0x30c4),
1609    _sapp_x11_codepair::new(0x04c3, 0x30c6),
1610    _sapp_x11_codepair::new(0x04c4, 0x30c8),
1611    _sapp_x11_codepair::new(0x04c5, 0x30ca),
1612    _sapp_x11_codepair::new(0x04c6, 0x30cb),
1613    _sapp_x11_codepair::new(0x04c7, 0x30cc),
1614    _sapp_x11_codepair::new(0x04c8, 0x30cd),
1615    _sapp_x11_codepair::new(0x04c9, 0x30ce),
1616    _sapp_x11_codepair::new(0x04ca, 0x30cf),
1617    _sapp_x11_codepair::new(0x04cb, 0x30d2),
1618    _sapp_x11_codepair::new(0x04cc, 0x30d5),
1619    _sapp_x11_codepair::new(0x04cd, 0x30d8),
1620    _sapp_x11_codepair::new(0x04ce, 0x30db),
1621    _sapp_x11_codepair::new(0x04cf, 0x30de),
1622    _sapp_x11_codepair::new(0x04d0, 0x30df),
1623    _sapp_x11_codepair::new(0x04d1, 0x30e0),
1624    _sapp_x11_codepair::new(0x04d2, 0x30e1),
1625    _sapp_x11_codepair::new(0x04d3, 0x30e2),
1626    _sapp_x11_codepair::new(0x04d4, 0x30e4),
1627    _sapp_x11_codepair::new(0x04d5, 0x30e6),
1628    _sapp_x11_codepair::new(0x04d6, 0x30e8),
1629    _sapp_x11_codepair::new(0x04d7, 0x30e9),
1630    _sapp_x11_codepair::new(0x04d8, 0x30ea),
1631    _sapp_x11_codepair::new(0x04d9, 0x30eb),
1632    _sapp_x11_codepair::new(0x04da, 0x30ec),
1633    _sapp_x11_codepair::new(0x04db, 0x30ed),
1634    _sapp_x11_codepair::new(0x04dc, 0x30ef),
1635    _sapp_x11_codepair::new(0x04dd, 0x30f3),
1636    _sapp_x11_codepair::new(0x04de, 0x309b),
1637    _sapp_x11_codepair::new(0x04df, 0x309c),
1638    _sapp_x11_codepair::new(0x05ac, 0x060c),
1639    _sapp_x11_codepair::new(0x05bb, 0x061b),
1640    _sapp_x11_codepair::new(0x05bf, 0x061f),
1641    _sapp_x11_codepair::new(0x05c1, 0x0621),
1642    _sapp_x11_codepair::new(0x05c2, 0x0622),
1643    _sapp_x11_codepair::new(0x05c3, 0x0623),
1644    _sapp_x11_codepair::new(0x05c4, 0x0624),
1645    _sapp_x11_codepair::new(0x05c5, 0x0625),
1646    _sapp_x11_codepair::new(0x05c6, 0x0626),
1647    _sapp_x11_codepair::new(0x05c7, 0x0627),
1648    _sapp_x11_codepair::new(0x05c8, 0x0628),
1649    _sapp_x11_codepair::new(0x05c9, 0x0629),
1650    _sapp_x11_codepair::new(0x05ca, 0x062a),
1651    _sapp_x11_codepair::new(0x05cb, 0x062b),
1652    _sapp_x11_codepair::new(0x05cc, 0x062c),
1653    _sapp_x11_codepair::new(0x05cd, 0x062d),
1654    _sapp_x11_codepair::new(0x05ce, 0x062e),
1655    _sapp_x11_codepair::new(0x05cf, 0x062f),
1656    _sapp_x11_codepair::new(0x05d0, 0x0630),
1657    _sapp_x11_codepair::new(0x05d1, 0x0631),
1658    _sapp_x11_codepair::new(0x05d2, 0x0632),
1659    _sapp_x11_codepair::new(0x05d3, 0x0633),
1660    _sapp_x11_codepair::new(0x05d4, 0x0634),
1661    _sapp_x11_codepair::new(0x05d5, 0x0635),
1662    _sapp_x11_codepair::new(0x05d6, 0x0636),
1663    _sapp_x11_codepair::new(0x05d7, 0x0637),
1664    _sapp_x11_codepair::new(0x05d8, 0x0638),
1665    _sapp_x11_codepair::new(0x05d9, 0x0639),
1666    _sapp_x11_codepair::new(0x05da, 0x063a),
1667    _sapp_x11_codepair::new(0x05e0, 0x0640),
1668    _sapp_x11_codepair::new(0x05e1, 0x0641),
1669    _sapp_x11_codepair::new(0x05e2, 0x0642),
1670    _sapp_x11_codepair::new(0x05e3, 0x0643),
1671    _sapp_x11_codepair::new(0x05e4, 0x0644),
1672    _sapp_x11_codepair::new(0x05e5, 0x0645),
1673    _sapp_x11_codepair::new(0x05e6, 0x0646),
1674    _sapp_x11_codepair::new(0x05e7, 0x0647),
1675    _sapp_x11_codepair::new(0x05e8, 0x0648),
1676    _sapp_x11_codepair::new(0x05e9, 0x0649),
1677    _sapp_x11_codepair::new(0x05ea, 0x064a),
1678    _sapp_x11_codepair::new(0x05eb, 0x064b),
1679    _sapp_x11_codepair::new(0x05ec, 0x064c),
1680    _sapp_x11_codepair::new(0x05ed, 0x064d),
1681    _sapp_x11_codepair::new(0x05ee, 0x064e),
1682    _sapp_x11_codepair::new(0x05ef, 0x064f),
1683    _sapp_x11_codepair::new(0x05f0, 0x0650),
1684    _sapp_x11_codepair::new(0x05f1, 0x0651),
1685    _sapp_x11_codepair::new(0x05f2, 0x0652),
1686    _sapp_x11_codepair::new(0x06a1, 0x0452),
1687    _sapp_x11_codepair::new(0x06a2, 0x0453),
1688    _sapp_x11_codepair::new(0x06a3, 0x0451),
1689    _sapp_x11_codepair::new(0x06a4, 0x0454),
1690    _sapp_x11_codepair::new(0x06a5, 0x0455),
1691    _sapp_x11_codepair::new(0x06a6, 0x0456),
1692    _sapp_x11_codepair::new(0x06a7, 0x0457),
1693    _sapp_x11_codepair::new(0x06a8, 0x0458),
1694    _sapp_x11_codepair::new(0x06a9, 0x0459),
1695    _sapp_x11_codepair::new(0x06aa, 0x045a),
1696    _sapp_x11_codepair::new(0x06ab, 0x045b),
1697    _sapp_x11_codepair::new(0x06ac, 0x045c),
1698    _sapp_x11_codepair::new(0x06ae, 0x045e),
1699    _sapp_x11_codepair::new(0x06af, 0x045f),
1700    _sapp_x11_codepair::new(0x06b0, 0x2116),
1701    _sapp_x11_codepair::new(0x06b1, 0x0402),
1702    _sapp_x11_codepair::new(0x06b2, 0x0403),
1703    _sapp_x11_codepair::new(0x06b3, 0x0401),
1704    _sapp_x11_codepair::new(0x06b4, 0x0404),
1705    _sapp_x11_codepair::new(0x06b5, 0x0405),
1706    _sapp_x11_codepair::new(0x06b6, 0x0406),
1707    _sapp_x11_codepair::new(0x06b7, 0x0407),
1708    _sapp_x11_codepair::new(0x06b8, 0x0408),
1709    _sapp_x11_codepair::new(0x06b9, 0x0409),
1710    _sapp_x11_codepair::new(0x06ba, 0x040a),
1711    _sapp_x11_codepair::new(0x06bb, 0x040b),
1712    _sapp_x11_codepair::new(0x06bc, 0x040c),
1713    _sapp_x11_codepair::new(0x06be, 0x040e),
1714    _sapp_x11_codepair::new(0x06bf, 0x040f),
1715    _sapp_x11_codepair::new(0x06c0, 0x044e),
1716    _sapp_x11_codepair::new(0x06c1, 0x0430),
1717    _sapp_x11_codepair::new(0x06c2, 0x0431),
1718    _sapp_x11_codepair::new(0x06c3, 0x0446),
1719    _sapp_x11_codepair::new(0x06c4, 0x0434),
1720    _sapp_x11_codepair::new(0x06c5, 0x0435),
1721    _sapp_x11_codepair::new(0x06c6, 0x0444),
1722    _sapp_x11_codepair::new(0x06c7, 0x0433),
1723    _sapp_x11_codepair::new(0x06c8, 0x0445),
1724    _sapp_x11_codepair::new(0x06c9, 0x0438),
1725    _sapp_x11_codepair::new(0x06ca, 0x0439),
1726    _sapp_x11_codepair::new(0x06cb, 0x043a),
1727    _sapp_x11_codepair::new(0x06cc, 0x043b),
1728    _sapp_x11_codepair::new(0x06cd, 0x043c),
1729    _sapp_x11_codepair::new(0x06ce, 0x043d),
1730    _sapp_x11_codepair::new(0x06cf, 0x043e),
1731    _sapp_x11_codepair::new(0x06d0, 0x043f),
1732    _sapp_x11_codepair::new(0x06d1, 0x044f),
1733    _sapp_x11_codepair::new(0x06d2, 0x0440),
1734    _sapp_x11_codepair::new(0x06d3, 0x0441),
1735    _sapp_x11_codepair::new(0x06d4, 0x0442),
1736    _sapp_x11_codepair::new(0x06d5, 0x0443),
1737    _sapp_x11_codepair::new(0x06d6, 0x0436),
1738    _sapp_x11_codepair::new(0x06d7, 0x0432),
1739    _sapp_x11_codepair::new(0x06d8, 0x044c),
1740    _sapp_x11_codepair::new(0x06d9, 0x044b),
1741    _sapp_x11_codepair::new(0x06da, 0x0437),
1742    _sapp_x11_codepair::new(0x06db, 0x0448),
1743    _sapp_x11_codepair::new(0x06dc, 0x044d),
1744    _sapp_x11_codepair::new(0x06dd, 0x0449),
1745    _sapp_x11_codepair::new(0x06de, 0x0447),
1746    _sapp_x11_codepair::new(0x06df, 0x044a),
1747    _sapp_x11_codepair::new(0x06e0, 0x042e),
1748    _sapp_x11_codepair::new(0x06e1, 0x0410),
1749    _sapp_x11_codepair::new(0x06e2, 0x0411),
1750    _sapp_x11_codepair::new(0x06e3, 0x0426),
1751    _sapp_x11_codepair::new(0x06e4, 0x0414),
1752    _sapp_x11_codepair::new(0x06e5, 0x0415),
1753    _sapp_x11_codepair::new(0x06e6, 0x0424),
1754    _sapp_x11_codepair::new(0x06e7, 0x0413),
1755    _sapp_x11_codepair::new(0x06e8, 0x0425),
1756    _sapp_x11_codepair::new(0x06e9, 0x0418),
1757    _sapp_x11_codepair::new(0x06ea, 0x0419),
1758    _sapp_x11_codepair::new(0x06eb, 0x041a),
1759    _sapp_x11_codepair::new(0x06ec, 0x041b),
1760    _sapp_x11_codepair::new(0x06ed, 0x041c),
1761    _sapp_x11_codepair::new(0x06ee, 0x041d),
1762    _sapp_x11_codepair::new(0x06ef, 0x041e),
1763    _sapp_x11_codepair::new(0x06f0, 0x041f),
1764    _sapp_x11_codepair::new(0x06f1, 0x042f),
1765    _sapp_x11_codepair::new(0x06f2, 0x0420),
1766    _sapp_x11_codepair::new(0x06f3, 0x0421),
1767    _sapp_x11_codepair::new(0x06f4, 0x0422),
1768    _sapp_x11_codepair::new(0x06f5, 0x0423),
1769    _sapp_x11_codepair::new(0x06f6, 0x0416),
1770    _sapp_x11_codepair::new(0x06f7, 0x0412),
1771    _sapp_x11_codepair::new(0x06f8, 0x042c),
1772    _sapp_x11_codepair::new(0x06f9, 0x042b),
1773    _sapp_x11_codepair::new(0x06fa, 0x0417),
1774    _sapp_x11_codepair::new(0x06fb, 0x0428),
1775    _sapp_x11_codepair::new(0x06fc, 0x042d),
1776    _sapp_x11_codepair::new(0x06fd, 0x0429),
1777    _sapp_x11_codepair::new(0x06fe, 0x0427),
1778    _sapp_x11_codepair::new(0x06ff, 0x042a),
1779    _sapp_x11_codepair::new(0x07a1, 0x0386),
1780    _sapp_x11_codepair::new(0x07a2, 0x0388),
1781    _sapp_x11_codepair::new(0x07a3, 0x0389),
1782    _sapp_x11_codepair::new(0x07a4, 0x038a),
1783    _sapp_x11_codepair::new(0x07a5, 0x03aa),
1784    _sapp_x11_codepair::new(0x07a7, 0x038c),
1785    _sapp_x11_codepair::new(0x07a8, 0x038e),
1786    _sapp_x11_codepair::new(0x07a9, 0x03ab),
1787    _sapp_x11_codepair::new(0x07ab, 0x038f),
1788    _sapp_x11_codepair::new(0x07ae, 0x0385),
1789    _sapp_x11_codepair::new(0x07af, 0x2015),
1790    _sapp_x11_codepair::new(0x07b1, 0x03ac),
1791    _sapp_x11_codepair::new(0x07b2, 0x03ad),
1792    _sapp_x11_codepair::new(0x07b3, 0x03ae),
1793    _sapp_x11_codepair::new(0x07b4, 0x03af),
1794    _sapp_x11_codepair::new(0x07b5, 0x03ca),
1795    _sapp_x11_codepair::new(0x07b6, 0x0390),
1796    _sapp_x11_codepair::new(0x07b7, 0x03cc),
1797    _sapp_x11_codepair::new(0x07b8, 0x03cd),
1798    _sapp_x11_codepair::new(0x07b9, 0x03cb),
1799    _sapp_x11_codepair::new(0x07ba, 0x03b0),
1800    _sapp_x11_codepair::new(0x07bb, 0x03ce),
1801    _sapp_x11_codepair::new(0x07c1, 0x0391),
1802    _sapp_x11_codepair::new(0x07c2, 0x0392),
1803    _sapp_x11_codepair::new(0x07c3, 0x0393),
1804    _sapp_x11_codepair::new(0x07c4, 0x0394),
1805    _sapp_x11_codepair::new(0x07c5, 0x0395),
1806    _sapp_x11_codepair::new(0x07c6, 0x0396),
1807    _sapp_x11_codepair::new(0x07c7, 0x0397),
1808    _sapp_x11_codepair::new(0x07c8, 0x0398),
1809    _sapp_x11_codepair::new(0x07c9, 0x0399),
1810    _sapp_x11_codepair::new(0x07ca, 0x039a),
1811    _sapp_x11_codepair::new(0x07cb, 0x039b),
1812    _sapp_x11_codepair::new(0x07cc, 0x039c),
1813    _sapp_x11_codepair::new(0x07cd, 0x039d),
1814    _sapp_x11_codepair::new(0x07ce, 0x039e),
1815    _sapp_x11_codepair::new(0x07cf, 0x039f),
1816    _sapp_x11_codepair::new(0x07d0, 0x03a0),
1817    _sapp_x11_codepair::new(0x07d1, 0x03a1),
1818    _sapp_x11_codepair::new(0x07d2, 0x03a3),
1819    _sapp_x11_codepair::new(0x07d4, 0x03a4),
1820    _sapp_x11_codepair::new(0x07d5, 0x03a5),
1821    _sapp_x11_codepair::new(0x07d6, 0x03a6),
1822    _sapp_x11_codepair::new(0x07d7, 0x03a7),
1823    _sapp_x11_codepair::new(0x07d8, 0x03a8),
1824    _sapp_x11_codepair::new(0x07d9, 0x03a9),
1825    _sapp_x11_codepair::new(0x07e1, 0x03b1),
1826    _sapp_x11_codepair::new(0x07e2, 0x03b2),
1827    _sapp_x11_codepair::new(0x07e3, 0x03b3),
1828    _sapp_x11_codepair::new(0x07e4, 0x03b4),
1829    _sapp_x11_codepair::new(0x07e5, 0x03b5),
1830    _sapp_x11_codepair::new(0x07e6, 0x03b6),
1831    _sapp_x11_codepair::new(0x07e7, 0x03b7),
1832    _sapp_x11_codepair::new(0x07e8, 0x03b8),
1833    _sapp_x11_codepair::new(0x07e9, 0x03b9),
1834    _sapp_x11_codepair::new(0x07ea, 0x03ba),
1835    _sapp_x11_codepair::new(0x07eb, 0x03bb),
1836    _sapp_x11_codepair::new(0x07ec, 0x03bc),
1837    _sapp_x11_codepair::new(0x07ed, 0x03bd),
1838    _sapp_x11_codepair::new(0x07ee, 0x03be),
1839    _sapp_x11_codepair::new(0x07ef, 0x03bf),
1840    _sapp_x11_codepair::new(0x07f0, 0x03c0),
1841    _sapp_x11_codepair::new(0x07f1, 0x03c1),
1842    _sapp_x11_codepair::new(0x07f2, 0x03c3),
1843    _sapp_x11_codepair::new(0x07f3, 0x03c2),
1844    _sapp_x11_codepair::new(0x07f4, 0x03c4),
1845    _sapp_x11_codepair::new(0x07f5, 0x03c5),
1846    _sapp_x11_codepair::new(0x07f6, 0x03c6),
1847    _sapp_x11_codepair::new(0x07f7, 0x03c7),
1848    _sapp_x11_codepair::new(0x07f8, 0x03c8),
1849    _sapp_x11_codepair::new(0x07f9, 0x03c9),
1850    _sapp_x11_codepair::new(0x08a1, 0x23b7),
1851    _sapp_x11_codepair::new(0x08a2, 0x250c),
1852    _sapp_x11_codepair::new(0x08a3, 0x2500),
1853    _sapp_x11_codepair::new(0x08a4, 0x2320),
1854    _sapp_x11_codepair::new(0x08a5, 0x2321),
1855    _sapp_x11_codepair::new(0x08a6, 0x2502),
1856    _sapp_x11_codepair::new(0x08a7, 0x23a1),
1857    _sapp_x11_codepair::new(0x08a8, 0x23a3),
1858    _sapp_x11_codepair::new(0x08a9, 0x23a4),
1859    _sapp_x11_codepair::new(0x08aa, 0x23a6),
1860    _sapp_x11_codepair::new(0x08ab, 0x239b),
1861    _sapp_x11_codepair::new(0x08ac, 0x239d),
1862    _sapp_x11_codepair::new(0x08ad, 0x239e),
1863    _sapp_x11_codepair::new(0x08ae, 0x23a0),
1864    _sapp_x11_codepair::new(0x08af, 0x23a8),
1865    _sapp_x11_codepair::new(0x08b0, 0x23ac),
1866    _sapp_x11_codepair::new(0x08bc, 0x2264),
1867    _sapp_x11_codepair::new(0x08bd, 0x2260),
1868    _sapp_x11_codepair::new(0x08be, 0x2265),
1869    _sapp_x11_codepair::new(0x08bf, 0x222b),
1870    _sapp_x11_codepair::new(0x08c0, 0x2234),
1871    _sapp_x11_codepair::new(0x08c1, 0x221d),
1872    _sapp_x11_codepair::new(0x08c2, 0x221e),
1873    _sapp_x11_codepair::new(0x08c5, 0x2207),
1874    _sapp_x11_codepair::new(0x08c8, 0x223c),
1875    _sapp_x11_codepair::new(0x08c9, 0x2243),
1876    _sapp_x11_codepair::new(0x08cd, 0x21d4),
1877    _sapp_x11_codepair::new(0x08ce, 0x21d2),
1878    _sapp_x11_codepair::new(0x08cf, 0x2261),
1879    _sapp_x11_codepair::new(0x08d6, 0x221a),
1880    _sapp_x11_codepair::new(0x08da, 0x2282),
1881    _sapp_x11_codepair::new(0x08db, 0x2283),
1882    _sapp_x11_codepair::new(0x08dc, 0x2229),
1883    _sapp_x11_codepair::new(0x08dd, 0x222a),
1884    _sapp_x11_codepair::new(0x08de, 0x2227),
1885    _sapp_x11_codepair::new(0x08df, 0x2228),
1886    _sapp_x11_codepair::new(0x08ef, 0x2202),
1887    _sapp_x11_codepair::new(0x08f6, 0x0192),
1888    _sapp_x11_codepair::new(0x08fb, 0x2190),
1889    _sapp_x11_codepair::new(0x08fc, 0x2191),
1890    _sapp_x11_codepair::new(0x08fd, 0x2192),
1891    _sapp_x11_codepair::new(0x08fe, 0x2193),
1892    _sapp_x11_codepair::new(0x09e0, 0x25c6),
1893    _sapp_x11_codepair::new(0x09e1, 0x2592),
1894    _sapp_x11_codepair::new(0x09e2, 0x2409),
1895    _sapp_x11_codepair::new(0x09e3, 0x240c),
1896    _sapp_x11_codepair::new(0x09e4, 0x240d),
1897    _sapp_x11_codepair::new(0x09e5, 0x240a),
1898    _sapp_x11_codepair::new(0x09e8, 0x2424),
1899    _sapp_x11_codepair::new(0x09e9, 0x240b),
1900    _sapp_x11_codepair::new(0x09ea, 0x2518),
1901    _sapp_x11_codepair::new(0x09eb, 0x2510),
1902    _sapp_x11_codepair::new(0x09ec, 0x250c),
1903    _sapp_x11_codepair::new(0x09ed, 0x2514),
1904    _sapp_x11_codepair::new(0x09ee, 0x253c),
1905    _sapp_x11_codepair::new(0x09ef, 0x23ba),
1906    _sapp_x11_codepair::new(0x09f0, 0x23bb),
1907    _sapp_x11_codepair::new(0x09f1, 0x2500),
1908    _sapp_x11_codepair::new(0x09f2, 0x23bc),
1909    _sapp_x11_codepair::new(0x09f3, 0x23bd),
1910    _sapp_x11_codepair::new(0x09f4, 0x251c),
1911    _sapp_x11_codepair::new(0x09f5, 0x2524),
1912    _sapp_x11_codepair::new(0x09f6, 0x2534),
1913    _sapp_x11_codepair::new(0x09f7, 0x252c),
1914    _sapp_x11_codepair::new(0x09f8, 0x2502),
1915    _sapp_x11_codepair::new(0x0aa1, 0x2003),
1916    _sapp_x11_codepair::new(0x0aa2, 0x2002),
1917    _sapp_x11_codepair::new(0x0aa3, 0x2004),
1918    _sapp_x11_codepair::new(0x0aa4, 0x2005),
1919    _sapp_x11_codepair::new(0x0aa5, 0x2007),
1920    _sapp_x11_codepair::new(0x0aa6, 0x2008),
1921    _sapp_x11_codepair::new(0x0aa7, 0x2009),
1922    _sapp_x11_codepair::new(0x0aa8, 0x200a),
1923    _sapp_x11_codepair::new(0x0aa9, 0x2014),
1924    _sapp_x11_codepair::new(0x0aaa, 0x2013),
1925    _sapp_x11_codepair::new(0x0aae, 0x2026),
1926    _sapp_x11_codepair::new(0x0aaf, 0x2025),
1927    _sapp_x11_codepair::new(0x0ab0, 0x2153),
1928    _sapp_x11_codepair::new(0x0ab1, 0x2154),
1929    _sapp_x11_codepair::new(0x0ab2, 0x2155),
1930    _sapp_x11_codepair::new(0x0ab3, 0x2156),
1931    _sapp_x11_codepair::new(0x0ab4, 0x2157),
1932    _sapp_x11_codepair::new(0x0ab5, 0x2158),
1933    _sapp_x11_codepair::new(0x0ab6, 0x2159),
1934    _sapp_x11_codepair::new(0x0ab7, 0x215a),
1935    _sapp_x11_codepair::new(0x0ab8, 0x2105),
1936    _sapp_x11_codepair::new(0x0abb, 0x2012),
1937    _sapp_x11_codepair::new(0x0abc, 0x2329),
1938    _sapp_x11_codepair::new(0x0abe, 0x232a),
1939    _sapp_x11_codepair::new(0x0ac3, 0x215b),
1940    _sapp_x11_codepair::new(0x0ac4, 0x215c),
1941    _sapp_x11_codepair::new(0x0ac5, 0x215d),
1942    _sapp_x11_codepair::new(0x0ac6, 0x215e),
1943    _sapp_x11_codepair::new(0x0ac9, 0x2122),
1944    _sapp_x11_codepair::new(0x0aca, 0x2613),
1945    _sapp_x11_codepair::new(0x0acc, 0x25c1),
1946    _sapp_x11_codepair::new(0x0acd, 0x25b7),
1947    _sapp_x11_codepair::new(0x0ace, 0x25cb),
1948    _sapp_x11_codepair::new(0x0acf, 0x25af),
1949    _sapp_x11_codepair::new(0x0ad0, 0x2018),
1950    _sapp_x11_codepair::new(0x0ad1, 0x2019),
1951    _sapp_x11_codepair::new(0x0ad2, 0x201c),
1952    _sapp_x11_codepair::new(0x0ad3, 0x201d),
1953    _sapp_x11_codepair::new(0x0ad4, 0x211e),
1954    _sapp_x11_codepair::new(0x0ad6, 0x2032),
1955    _sapp_x11_codepair::new(0x0ad7, 0x2033),
1956    _sapp_x11_codepair::new(0x0ad9, 0x271d),
1957    _sapp_x11_codepair::new(0x0adb, 0x25ac),
1958    _sapp_x11_codepair::new(0x0adc, 0x25c0),
1959    _sapp_x11_codepair::new(0x0add, 0x25b6),
1960    _sapp_x11_codepair::new(0x0ade, 0x25cf),
1961    _sapp_x11_codepair::new(0x0adf, 0x25ae),
1962    _sapp_x11_codepair::new(0x0ae0, 0x25e6),
1963    _sapp_x11_codepair::new(0x0ae1, 0x25ab),
1964    _sapp_x11_codepair::new(0x0ae2, 0x25ad),
1965    _sapp_x11_codepair::new(0x0ae3, 0x25b3),
1966    _sapp_x11_codepair::new(0x0ae4, 0x25bd),
1967    _sapp_x11_codepair::new(0x0ae5, 0x2606),
1968    _sapp_x11_codepair::new(0x0ae6, 0x2022),
1969    _sapp_x11_codepair::new(0x0ae7, 0x25aa),
1970    _sapp_x11_codepair::new(0x0ae8, 0x25b2),
1971    _sapp_x11_codepair::new(0x0ae9, 0x25bc),
1972    _sapp_x11_codepair::new(0x0aea, 0x261c),
1973    _sapp_x11_codepair::new(0x0aeb, 0x261e),
1974    _sapp_x11_codepair::new(0x0aec, 0x2663),
1975    _sapp_x11_codepair::new(0x0aed, 0x2666),
1976    _sapp_x11_codepair::new(0x0aee, 0x2665),
1977    _sapp_x11_codepair::new(0x0af0, 0x2720),
1978    _sapp_x11_codepair::new(0x0af1, 0x2020),
1979    _sapp_x11_codepair::new(0x0af2, 0x2021),
1980    _sapp_x11_codepair::new(0x0af3, 0x2713),
1981    _sapp_x11_codepair::new(0x0af4, 0x2717),
1982    _sapp_x11_codepair::new(0x0af5, 0x266f),
1983    _sapp_x11_codepair::new(0x0af6, 0x266d),
1984    _sapp_x11_codepair::new(0x0af7, 0x2642),
1985    _sapp_x11_codepair::new(0x0af8, 0x2640),
1986    _sapp_x11_codepair::new(0x0af9, 0x260e),
1987    _sapp_x11_codepair::new(0x0afa, 0x2315),
1988    _sapp_x11_codepair::new(0x0afb, 0x2117),
1989    _sapp_x11_codepair::new(0x0afc, 0x2038),
1990    _sapp_x11_codepair::new(0x0afd, 0x201a),
1991    _sapp_x11_codepair::new(0x0afe, 0x201e),
1992    _sapp_x11_codepair::new(0x0ba3, 0x003c),
1993    _sapp_x11_codepair::new(0x0ba6, 0x003e),
1994    _sapp_x11_codepair::new(0x0ba8, 0x2228),
1995    _sapp_x11_codepair::new(0x0ba9, 0x2227),
1996    _sapp_x11_codepair::new(0x0bc0, 0x00af),
1997    _sapp_x11_codepair::new(0x0bc2, 0x22a5),
1998    _sapp_x11_codepair::new(0x0bc3, 0x2229),
1999    _sapp_x11_codepair::new(0x0bc4, 0x230a),
2000    _sapp_x11_codepair::new(0x0bc6, 0x005f),
2001    _sapp_x11_codepair::new(0x0bca, 0x2218),
2002    _sapp_x11_codepair::new(0x0bcc, 0x2395),
2003    _sapp_x11_codepair::new(0x0bce, 0x22a4),
2004    _sapp_x11_codepair::new(0x0bcf, 0x25cb),
2005    _sapp_x11_codepair::new(0x0bd3, 0x2308),
2006    _sapp_x11_codepair::new(0x0bd6, 0x222a),
2007    _sapp_x11_codepair::new(0x0bd8, 0x2283),
2008    _sapp_x11_codepair::new(0x0bda, 0x2282),
2009    _sapp_x11_codepair::new(0x0bdc, 0x22a2),
2010    _sapp_x11_codepair::new(0x0bfc, 0x22a3),
2011    _sapp_x11_codepair::new(0x0cdf, 0x2017),
2012    _sapp_x11_codepair::new(0x0ce0, 0x05d0),
2013    _sapp_x11_codepair::new(0x0ce1, 0x05d1),
2014    _sapp_x11_codepair::new(0x0ce2, 0x05d2),
2015    _sapp_x11_codepair::new(0x0ce3, 0x05d3),
2016    _sapp_x11_codepair::new(0x0ce4, 0x05d4),
2017    _sapp_x11_codepair::new(0x0ce5, 0x05d5),
2018    _sapp_x11_codepair::new(0x0ce6, 0x05d6),
2019    _sapp_x11_codepair::new(0x0ce7, 0x05d7),
2020    _sapp_x11_codepair::new(0x0ce8, 0x05d8),
2021    _sapp_x11_codepair::new(0x0ce9, 0x05d9),
2022    _sapp_x11_codepair::new(0x0cea, 0x05da),
2023    _sapp_x11_codepair::new(0x0ceb, 0x05db),
2024    _sapp_x11_codepair::new(0x0cec, 0x05dc),
2025    _sapp_x11_codepair::new(0x0ced, 0x05dd),
2026    _sapp_x11_codepair::new(0x0cee, 0x05de),
2027    _sapp_x11_codepair::new(0x0cef, 0x05df),
2028    _sapp_x11_codepair::new(0x0cf0, 0x05e0),
2029    _sapp_x11_codepair::new(0x0cf1, 0x05e1),
2030    _sapp_x11_codepair::new(0x0cf2, 0x05e2),
2031    _sapp_x11_codepair::new(0x0cf3, 0x05e3),
2032    _sapp_x11_codepair::new(0x0cf4, 0x05e4),
2033    _sapp_x11_codepair::new(0x0cf5, 0x05e5),
2034    _sapp_x11_codepair::new(0x0cf6, 0x05e6),
2035    _sapp_x11_codepair::new(0x0cf7, 0x05e7),
2036    _sapp_x11_codepair::new(0x0cf8, 0x05e8),
2037    _sapp_x11_codepair::new(0x0cf9, 0x05e9),
2038    _sapp_x11_codepair::new(0x0cfa, 0x05ea),
2039    _sapp_x11_codepair::new(0x0da1, 0x0e01),
2040    _sapp_x11_codepair::new(0x0da2, 0x0e02),
2041    _sapp_x11_codepair::new(0x0da3, 0x0e03),
2042    _sapp_x11_codepair::new(0x0da4, 0x0e04),
2043    _sapp_x11_codepair::new(0x0da5, 0x0e05),
2044    _sapp_x11_codepair::new(0x0da6, 0x0e06),
2045    _sapp_x11_codepair::new(0x0da7, 0x0e07),
2046    _sapp_x11_codepair::new(0x0da8, 0x0e08),
2047    _sapp_x11_codepair::new(0x0da9, 0x0e09),
2048    _sapp_x11_codepair::new(0x0daa, 0x0e0a),
2049    _sapp_x11_codepair::new(0x0dab, 0x0e0b),
2050    _sapp_x11_codepair::new(0x0dac, 0x0e0c),
2051    _sapp_x11_codepair::new(0x0dad, 0x0e0d),
2052    _sapp_x11_codepair::new(0x0dae, 0x0e0e),
2053    _sapp_x11_codepair::new(0x0daf, 0x0e0f),
2054    _sapp_x11_codepair::new(0x0db0, 0x0e10),
2055    _sapp_x11_codepair::new(0x0db1, 0x0e11),
2056    _sapp_x11_codepair::new(0x0db2, 0x0e12),
2057    _sapp_x11_codepair::new(0x0db3, 0x0e13),
2058    _sapp_x11_codepair::new(0x0db4, 0x0e14),
2059    _sapp_x11_codepair::new(0x0db5, 0x0e15),
2060    _sapp_x11_codepair::new(0x0db6, 0x0e16),
2061    _sapp_x11_codepair::new(0x0db7, 0x0e17),
2062    _sapp_x11_codepair::new(0x0db8, 0x0e18),
2063    _sapp_x11_codepair::new(0x0db9, 0x0e19),
2064    _sapp_x11_codepair::new(0x0dba, 0x0e1a),
2065    _sapp_x11_codepair::new(0x0dbb, 0x0e1b),
2066    _sapp_x11_codepair::new(0x0dbc, 0x0e1c),
2067    _sapp_x11_codepair::new(0x0dbd, 0x0e1d),
2068    _sapp_x11_codepair::new(0x0dbe, 0x0e1e),
2069    _sapp_x11_codepair::new(0x0dbf, 0x0e1f),
2070    _sapp_x11_codepair::new(0x0dc0, 0x0e20),
2071    _sapp_x11_codepair::new(0x0dc1, 0x0e21),
2072    _sapp_x11_codepair::new(0x0dc2, 0x0e22),
2073    _sapp_x11_codepair::new(0x0dc3, 0x0e23),
2074    _sapp_x11_codepair::new(0x0dc4, 0x0e24),
2075    _sapp_x11_codepair::new(0x0dc5, 0x0e25),
2076    _sapp_x11_codepair::new(0x0dc6, 0x0e26),
2077    _sapp_x11_codepair::new(0x0dc7, 0x0e27),
2078    _sapp_x11_codepair::new(0x0dc8, 0x0e28),
2079    _sapp_x11_codepair::new(0x0dc9, 0x0e29),
2080    _sapp_x11_codepair::new(0x0dca, 0x0e2a),
2081    _sapp_x11_codepair::new(0x0dcb, 0x0e2b),
2082    _sapp_x11_codepair::new(0x0dcc, 0x0e2c),
2083    _sapp_x11_codepair::new(0x0dcd, 0x0e2d),
2084    _sapp_x11_codepair::new(0x0dce, 0x0e2e),
2085    _sapp_x11_codepair::new(0x0dcf, 0x0e2f),
2086    _sapp_x11_codepair::new(0x0dd0, 0x0e30),
2087    _sapp_x11_codepair::new(0x0dd1, 0x0e31),
2088    _sapp_x11_codepair::new(0x0dd2, 0x0e32),
2089    _sapp_x11_codepair::new(0x0dd3, 0x0e33),
2090    _sapp_x11_codepair::new(0x0dd4, 0x0e34),
2091    _sapp_x11_codepair::new(0x0dd5, 0x0e35),
2092    _sapp_x11_codepair::new(0x0dd6, 0x0e36),
2093    _sapp_x11_codepair::new(0x0dd7, 0x0e37),
2094    _sapp_x11_codepair::new(0x0dd8, 0x0e38),
2095    _sapp_x11_codepair::new(0x0dd9, 0x0e39),
2096    _sapp_x11_codepair::new(0x0dda, 0x0e3a),
2097    _sapp_x11_codepair::new(0x0ddf, 0x0e3f),
2098    _sapp_x11_codepair::new(0x0de0, 0x0e40),
2099    _sapp_x11_codepair::new(0x0de1, 0x0e41),
2100    _sapp_x11_codepair::new(0x0de2, 0x0e42),
2101    _sapp_x11_codepair::new(0x0de3, 0x0e43),
2102    _sapp_x11_codepair::new(0x0de4, 0x0e44),
2103    _sapp_x11_codepair::new(0x0de5, 0x0e45),
2104    _sapp_x11_codepair::new(0x0de6, 0x0e46),
2105    _sapp_x11_codepair::new(0x0de7, 0x0e47),
2106    _sapp_x11_codepair::new(0x0de8, 0x0e48),
2107    _sapp_x11_codepair::new(0x0de9, 0x0e49),
2108    _sapp_x11_codepair::new(0x0dea, 0x0e4a),
2109    _sapp_x11_codepair::new(0x0deb, 0x0e4b),
2110    _sapp_x11_codepair::new(0x0dec, 0x0e4c),
2111    _sapp_x11_codepair::new(0x0ded, 0x0e4d),
2112    _sapp_x11_codepair::new(0x0df0, 0x0e50),
2113    _sapp_x11_codepair::new(0x0df1, 0x0e51),
2114    _sapp_x11_codepair::new(0x0df2, 0x0e52),
2115    _sapp_x11_codepair::new(0x0df3, 0x0e53),
2116    _sapp_x11_codepair::new(0x0df4, 0x0e54),
2117    _sapp_x11_codepair::new(0x0df5, 0x0e55),
2118    _sapp_x11_codepair::new(0x0df6, 0x0e56),
2119    _sapp_x11_codepair::new(0x0df7, 0x0e57),
2120    _sapp_x11_codepair::new(0x0df8, 0x0e58),
2121    _sapp_x11_codepair::new(0x0df9, 0x0e59),
2122    _sapp_x11_codepair::new(0x0ea1, 0x3131),
2123    _sapp_x11_codepair::new(0x0ea2, 0x3132),
2124    _sapp_x11_codepair::new(0x0ea3, 0x3133),
2125    _sapp_x11_codepair::new(0x0ea4, 0x3134),
2126    _sapp_x11_codepair::new(0x0ea5, 0x3135),
2127    _sapp_x11_codepair::new(0x0ea6, 0x3136),
2128    _sapp_x11_codepair::new(0x0ea7, 0x3137),
2129    _sapp_x11_codepair::new(0x0ea8, 0x3138),
2130    _sapp_x11_codepair::new(0x0ea9, 0x3139),
2131    _sapp_x11_codepair::new(0x0eaa, 0x313a),
2132    _sapp_x11_codepair::new(0x0eab, 0x313b),
2133    _sapp_x11_codepair::new(0x0eac, 0x313c),
2134    _sapp_x11_codepair::new(0x0ead, 0x313d),
2135    _sapp_x11_codepair::new(0x0eae, 0x313e),
2136    _sapp_x11_codepair::new(0x0eaf, 0x313f),
2137    _sapp_x11_codepair::new(0x0eb0, 0x3140),
2138    _sapp_x11_codepair::new(0x0eb1, 0x3141),
2139    _sapp_x11_codepair::new(0x0eb2, 0x3142),
2140    _sapp_x11_codepair::new(0x0eb3, 0x3143),
2141    _sapp_x11_codepair::new(0x0eb4, 0x3144),
2142    _sapp_x11_codepair::new(0x0eb5, 0x3145),
2143    _sapp_x11_codepair::new(0x0eb6, 0x3146),
2144    _sapp_x11_codepair::new(0x0eb7, 0x3147),
2145    _sapp_x11_codepair::new(0x0eb8, 0x3148),
2146    _sapp_x11_codepair::new(0x0eb9, 0x3149),
2147    _sapp_x11_codepair::new(0x0eba, 0x314a),
2148    _sapp_x11_codepair::new(0x0ebb, 0x314b),
2149    _sapp_x11_codepair::new(0x0ebc, 0x314c),
2150    _sapp_x11_codepair::new(0x0ebd, 0x314d),
2151    _sapp_x11_codepair::new(0x0ebe, 0x314e),
2152    _sapp_x11_codepair::new(0x0ebf, 0x314f),
2153    _sapp_x11_codepair::new(0x0ec0, 0x3150),
2154    _sapp_x11_codepair::new(0x0ec1, 0x3151),
2155    _sapp_x11_codepair::new(0x0ec2, 0x3152),
2156    _sapp_x11_codepair::new(0x0ec3, 0x3153),
2157    _sapp_x11_codepair::new(0x0ec4, 0x3154),
2158    _sapp_x11_codepair::new(0x0ec5, 0x3155),
2159    _sapp_x11_codepair::new(0x0ec6, 0x3156),
2160    _sapp_x11_codepair::new(0x0ec7, 0x3157),
2161    _sapp_x11_codepair::new(0x0ec8, 0x3158),
2162    _sapp_x11_codepair::new(0x0ec9, 0x3159),
2163    _sapp_x11_codepair::new(0x0eca, 0x315a),
2164    _sapp_x11_codepair::new(0x0ecb, 0x315b),
2165    _sapp_x11_codepair::new(0x0ecc, 0x315c),
2166    _sapp_x11_codepair::new(0x0ecd, 0x315d),
2167    _sapp_x11_codepair::new(0x0ece, 0x315e),
2168    _sapp_x11_codepair::new(0x0ecf, 0x315f),
2169    _sapp_x11_codepair::new(0x0ed0, 0x3160),
2170    _sapp_x11_codepair::new(0x0ed1, 0x3161),
2171    _sapp_x11_codepair::new(0x0ed2, 0x3162),
2172    _sapp_x11_codepair::new(0x0ed3, 0x3163),
2173    _sapp_x11_codepair::new(0x0ed4, 0x11a8),
2174    _sapp_x11_codepair::new(0x0ed5, 0x11a9),
2175    _sapp_x11_codepair::new(0x0ed6, 0x11aa),
2176    _sapp_x11_codepair::new(0x0ed7, 0x11ab),
2177    _sapp_x11_codepair::new(0x0ed8, 0x11ac),
2178    _sapp_x11_codepair::new(0x0ed9, 0x11ad),
2179    _sapp_x11_codepair::new(0x0eda, 0x11ae),
2180    _sapp_x11_codepair::new(0x0edb, 0x11af),
2181    _sapp_x11_codepair::new(0x0edc, 0x11b0),
2182    _sapp_x11_codepair::new(0x0edd, 0x11b1),
2183    _sapp_x11_codepair::new(0x0ede, 0x11b2),
2184    _sapp_x11_codepair::new(0x0edf, 0x11b3),
2185    _sapp_x11_codepair::new(0x0ee0, 0x11b4),
2186    _sapp_x11_codepair::new(0x0ee1, 0x11b5),
2187    _sapp_x11_codepair::new(0x0ee2, 0x11b6),
2188    _sapp_x11_codepair::new(0x0ee3, 0x11b7),
2189    _sapp_x11_codepair::new(0x0ee4, 0x11b8),
2190    _sapp_x11_codepair::new(0x0ee5, 0x11b9),
2191    _sapp_x11_codepair::new(0x0ee6, 0x11ba),
2192    _sapp_x11_codepair::new(0x0ee7, 0x11bb),
2193    _sapp_x11_codepair::new(0x0ee8, 0x11bc),
2194    _sapp_x11_codepair::new(0x0ee9, 0x11bd),
2195    _sapp_x11_codepair::new(0x0eea, 0x11be),
2196    _sapp_x11_codepair::new(0x0eeb, 0x11bf),
2197    _sapp_x11_codepair::new(0x0eec, 0x11c0),
2198    _sapp_x11_codepair::new(0x0eed, 0x11c1),
2199    _sapp_x11_codepair::new(0x0eee, 0x11c2),
2200    _sapp_x11_codepair::new(0x0eef, 0x316d),
2201    _sapp_x11_codepair::new(0x0ef0, 0x3171),
2202    _sapp_x11_codepair::new(0x0ef1, 0x3178),
2203    _sapp_x11_codepair::new(0x0ef2, 0x317f),
2204    _sapp_x11_codepair::new(0x0ef3, 0x3181),
2205    _sapp_x11_codepair::new(0x0ef4, 0x3184),
2206    _sapp_x11_codepair::new(0x0ef5, 0x3186),
2207    _sapp_x11_codepair::new(0x0ef6, 0x318d),
2208    _sapp_x11_codepair::new(0x0ef7, 0x318e),
2209    _sapp_x11_codepair::new(0x0ef8, 0x11eb),
2210    _sapp_x11_codepair::new(0x0ef9, 0x11f0),
2211    _sapp_x11_codepair::new(0x0efa, 0x11f9),
2212    _sapp_x11_codepair::new(0x0eff, 0x20a9),
2213    _sapp_x11_codepair::new(0x13a4, 0x20ac),
2214    _sapp_x11_codepair::new(0x13bc, 0x0152),
2215    _sapp_x11_codepair::new(0x13bd, 0x0153),
2216    _sapp_x11_codepair::new(0x13be, 0x0178),
2217    _sapp_x11_codepair::new(0x20ac, 0x20ac),
2218    _sapp_x11_codepair::new(0xfe50, '`' as u16),
2219    _sapp_x11_codepair::new(0xfe51, 0x00b4),
2220    _sapp_x11_codepair::new(0xfe52, '^' as u16),
2221    _sapp_x11_codepair::new(0xfe53, '~' as u16),
2222    _sapp_x11_codepair::new(0xfe54, 0x00af),
2223    _sapp_x11_codepair::new(0xfe55, 0x02d8),
2224    _sapp_x11_codepair::new(0xfe56, 0x02d9),
2225    _sapp_x11_codepair::new(0xfe57, 0x00a8),
2226    _sapp_x11_codepair::new(0xfe58, 0x02da),
2227    _sapp_x11_codepair::new(0xfe59, 0x02dd),
2228    _sapp_x11_codepair::new(0xfe5a, 0x02c7),
2229    _sapp_x11_codepair::new(0xfe5b, 0x00b8),
2230    _sapp_x11_codepair::new(0xfe5c, 0x02db),
2231    _sapp_x11_codepair::new(0xfe5d, 0x037a),
2232    _sapp_x11_codepair::new(0xfe5e, 0x309b),
2233    _sapp_x11_codepair::new(0xfe5f, 0x309c),
2234    _sapp_x11_codepair::new(0xfe63, '/' as u16),
2235    _sapp_x11_codepair::new(0xfe64, 0x02bc),
2236    _sapp_x11_codepair::new(0xfe65, 0x02bd),
2237    _sapp_x11_codepair::new(0xfe66, 0x02f5),
2238    _sapp_x11_codepair::new(0xfe67, 0x02f3),
2239    _sapp_x11_codepair::new(0xfe68, 0x02cd),
2240    _sapp_x11_codepair::new(0xfe69, 0xa788),
2241    _sapp_x11_codepair::new(0xfe6a, 0x02f7),
2242    _sapp_x11_codepair::new(0xfe6e, ',' as u16),
2243    _sapp_x11_codepair::new(0xfe6f, 0x00a4),
2244    _sapp_x11_codepair::new(0xfe80, 'a' as u16), // XK_dead_a
2245    _sapp_x11_codepair::new(0xfe81, 'A' as u16), // XK_dead_A
2246    _sapp_x11_codepair::new(0xfe82, 'e' as u16), // XK_dead_e
2247    _sapp_x11_codepair::new(0xfe83, 'E' as u16), // XK_dead_E
2248    _sapp_x11_codepair::new(0xfe84, 'i' as u16), // XK_dead_i
2249    _sapp_x11_codepair::new(0xfe85, 'I' as u16), // XK_dead_I
2250    _sapp_x11_codepair::new(0xfe86, 'o' as u16), // XK_dead_o
2251    _sapp_x11_codepair::new(0xfe87, 'O' as u16), // XK_dead_O
2252    _sapp_x11_codepair::new(0xfe88, 'u' as u16), // XK_dead_u
2253    _sapp_x11_codepair::new(0xfe89, 'U' as u16), // XK_dead_U
2254    _sapp_x11_codepair::new(0xfe8a, 0x0259),
2255    _sapp_x11_codepair::new(0xfe8b, 0x018f),
2256    _sapp_x11_codepair::new(0xfe8c, 0x00b5),
2257    _sapp_x11_codepair::new(0xfe90, '_' as u16),
2258    _sapp_x11_codepair::new(0xfe91, 0x02c8),
2259    _sapp_x11_codepair::new(0xfe92, 0x02cc),
2260    _sapp_x11_codepair::new(0xff80 /*XKB_KEY_KP_Space*/, ' ' as u16),
2261    _sapp_x11_codepair::new(0xff95 /*XKB_KEY_KP_7*/, 0x0037),
2262    _sapp_x11_codepair::new(0xff96 /*XKB_KEY_KP_4*/, 0x0034),
2263    _sapp_x11_codepair::new(0xff97 /*XKB_KEY_KP_8*/, 0x0038),
2264    _sapp_x11_codepair::new(0xff98 /*XKB_KEY_KP_6*/, 0x0036),
2265    _sapp_x11_codepair::new(0xff99 /*XKB_KEY_KP_2*/, 0x0032),
2266    _sapp_x11_codepair::new(0xff9a /*XKB_KEY_KP_9*/, 0x0039),
2267    _sapp_x11_codepair::new(0xff9b /*XKB_KEY_KP_3*/, 0x0033),
2268    _sapp_x11_codepair::new(0xff9c /*XKB_KEY_KP_1*/, 0x0031),
2269    _sapp_x11_codepair::new(0xff9d /*XKB_KEY_KP_5*/, 0x0035),
2270    _sapp_x11_codepair::new(0xff9e /*XKB_KEY_KP_0*/, 0x0030),
2271    _sapp_x11_codepair::new(0xffaa /*XKB_KEY_KP_Multiply*/, '*' as u16),
2272    _sapp_x11_codepair::new(0xffab /*XKB_KEY_KP_Add*/, '+' as u16),
2273    _sapp_x11_codepair::new(0xffac /*XKB_KEY_KP_Separator*/, ',' as u16),
2274    _sapp_x11_codepair::new(0xffad /*XKB_KEY_KP_Subtract*/, '-' as u16),
2275    _sapp_x11_codepair::new(0xffae /*XKB_KEY_KP_Decimal*/, '.' as u16),
2276    _sapp_x11_codepair::new(0xffaf /*XKB_KEY_KP_Divide*/, '/' as u16),
2277    _sapp_x11_codepair::new(0xffb0 /*XKB_KEY_KP_0*/, 0x0030),
2278    _sapp_x11_codepair::new(0xffb1 /*XKB_KEY_KP_1*/, 0x0031),
2279    _sapp_x11_codepair::new(0xffb2 /*XKB_KEY_KP_2*/, 0x0032),
2280    _sapp_x11_codepair::new(0xffb3 /*XKB_KEY_KP_3*/, 0x0033),
2281    _sapp_x11_codepair::new(0xffb4 /*XKB_KEY_KP_4*/, 0x0034),
2282    _sapp_x11_codepair::new(0xffb5 /*XKB_KEY_KP_5*/, 0x0035),
2283    _sapp_x11_codepair::new(0xffb6 /*XKB_KEY_KP_6*/, 0x0036),
2284    _sapp_x11_codepair::new(0xffb7 /*XKB_KEY_KP_7*/, 0x0037),
2285    _sapp_x11_codepair::new(0xffb8 /*XKB_KEY_KP_8*/, 0x0038),
2286    _sapp_x11_codepair::new(0xffb9 /*XKB_KEY_KP_9*/, 0x0039),
2287    _sapp_x11_codepair::new(0xffbd /*XKB_KEY_KP_Equal*/, '=' as u16),
2288];
2289pub unsafe extern "C" fn _sapp_x11_keysym_to_unicode(mut keysym: KeySym) -> i32 {
2290    let mut min = 0 as libc::c_int;
2291    let mut max = (::std::mem::size_of::<[_sapp_x11_codepair; 828]>() as libc::c_ulong)
2292        .wrapping_div(::std::mem::size_of::<_sapp_x11_codepair>() as libc::c_ulong)
2293        .wrapping_sub(1 as libc::c_int as libc::c_ulong) as libc::c_int;
2294    let mut mid: libc::c_int = 0;
2295    if keysym >= 0x20 as libc::c_int as libc::c_ulong
2296        && keysym <= 0x7e as libc::c_int as libc::c_ulong
2297        || keysym >= 0xa0 as libc::c_int as libc::c_ulong
2298            && keysym <= 0xff as libc::c_int as libc::c_ulong
2299    {
2300        return keysym as i32;
2301    }
2302    if keysym & 0xff000000 as libc::c_uint as libc::c_ulong
2303        == 0x1000000 as libc::c_int as libc::c_ulong
2304    {
2305        return (keysym & 0xffffff as libc::c_int as libc::c_ulong) as i32;
2306    }
2307    while max >= min {
2308        mid = (min + max) / 2 as libc::c_int;
2309        if (_sapp_x11_keysymtab[mid as usize].keysym as libc::c_ulong) < keysym {
2310            min = mid + 1 as libc::c_int
2311        } else if _sapp_x11_keysymtab[mid as usize].keysym as libc::c_ulong > keysym {
2312            max = mid - 1 as libc::c_int
2313        } else {
2314            return _sapp_x11_keysymtab[mid as usize].ucs as i32;
2315        }
2316    }
2317    return -(1 as libc::c_int);
2318}
2319pub static mut _sapp_x11_keycodes: [bool; 256] = [false; 256];
2320pub unsafe extern "C" fn _sapp_x11_key_event(
2321    mut type_: sapp_event_type,
2322    mut key: sapp_keycode,
2323    mut repeat: bool,
2324    mut mods: u32,
2325) {
2326    if _sapp_events_enabled() {
2327        _sapp_init_event(type_);
2328        _sapp.event.key_code = key;
2329        _sapp.event.key_repeat = repeat;
2330        _sapp.event.modifiers = mods;
2331        _sapp_call_event(&mut _sapp.event);
2332    };
2333}
2334pub unsafe extern "C" fn _sapp_x11_translate_key(mut scancode: libc::c_int) -> sapp_keycode {
2335    let mut dummy: libc::c_int = 0;
2336    let mut keysyms = XGetKeyboardMapping(
2337        _sapp_x11_display,
2338        scancode as KeyCode,
2339        1 as libc::c_int,
2340        &mut dummy,
2341    );
2342    assert!(!keysyms.is_null());
2343
2344    let mut keysym = *keysyms.offset(0 as libc::c_int as isize);
2345    XFree(keysyms as *mut libc::c_void);
2346    match keysym {
2347        65307 => return sapp_keycode_SAPP_KEYCODE_ESCAPE,
2348        65289 => return sapp_keycode_SAPP_KEYCODE_TAB,
2349        65505 => return sapp_keycode_SAPP_KEYCODE_LEFT_SHIFT,
2350        65506 => return sapp_keycode_SAPP_KEYCODE_RIGHT_SHIFT,
2351        65507 => return sapp_keycode_SAPP_KEYCODE_LEFT_CONTROL,
2352        65508 => return sapp_keycode_SAPP_KEYCODE_RIGHT_CONTROL,
2353        65511 | 65513 => return sapp_keycode_SAPP_KEYCODE_LEFT_ALT,
2354        65406 | 65027 | 65512 | 65514 => return sapp_keycode_SAPP_KEYCODE_RIGHT_ALT,
2355        65515 => return sapp_keycode_SAPP_KEYCODE_LEFT_SUPER,
2356        65516 => return sapp_keycode_SAPP_KEYCODE_RIGHT_SUPER,
2357        65383 => return sapp_keycode_SAPP_KEYCODE_MENU,
2358        65407 => return sapp_keycode_SAPP_KEYCODE_NUM_LOCK,
2359        65509 => return sapp_keycode_SAPP_KEYCODE_CAPS_LOCK,
2360        65377 => return sapp_keycode_SAPP_KEYCODE_PRINT_SCREEN,
2361        65300 => return sapp_keycode_SAPP_KEYCODE_SCROLL_LOCK,
2362        65299 => return sapp_keycode_SAPP_KEYCODE_PAUSE,
2363        65535 => return sapp_keycode_SAPP_KEYCODE_DELETE,
2364        65288 => return sapp_keycode_SAPP_KEYCODE_BACKSPACE,
2365        65293 => return sapp_keycode_SAPP_KEYCODE_ENTER,
2366        65360 => return sapp_keycode_SAPP_KEYCODE_HOME,
2367        65367 => return sapp_keycode_SAPP_KEYCODE_END,
2368        65365 => return sapp_keycode_SAPP_KEYCODE_PAGE_UP,
2369        65366 => return sapp_keycode_SAPP_KEYCODE_PAGE_DOWN,
2370        65379 => return sapp_keycode_SAPP_KEYCODE_INSERT,
2371        65361 => return sapp_keycode_SAPP_KEYCODE_LEFT,
2372        65363 => return sapp_keycode_SAPP_KEYCODE_RIGHT,
2373        65364 => return sapp_keycode_SAPP_KEYCODE_DOWN,
2374        65362 => return sapp_keycode_SAPP_KEYCODE_UP,
2375        65470 => return sapp_keycode_SAPP_KEYCODE_F1,
2376        65471 => return sapp_keycode_SAPP_KEYCODE_F2,
2377        65472 => return sapp_keycode_SAPP_KEYCODE_F3,
2378        65473 => return sapp_keycode_SAPP_KEYCODE_F4,
2379        65474 => return sapp_keycode_SAPP_KEYCODE_F5,
2380        65475 => return sapp_keycode_SAPP_KEYCODE_F6,
2381        65476 => return sapp_keycode_SAPP_KEYCODE_F7,
2382        65477 => return sapp_keycode_SAPP_KEYCODE_F8,
2383        65478 => return sapp_keycode_SAPP_KEYCODE_F9,
2384        65479 => return sapp_keycode_SAPP_KEYCODE_F10,
2385        65480 => return sapp_keycode_SAPP_KEYCODE_F11,
2386        65481 => return sapp_keycode_SAPP_KEYCODE_F12,
2387        65482 => return sapp_keycode_SAPP_KEYCODE_F13,
2388        65483 => return sapp_keycode_SAPP_KEYCODE_F14,
2389        65484 => return sapp_keycode_SAPP_KEYCODE_F15,
2390        65485 => return sapp_keycode_SAPP_KEYCODE_F16,
2391        65486 => return sapp_keycode_SAPP_KEYCODE_F17,
2392        65487 => return sapp_keycode_SAPP_KEYCODE_F18,
2393        65488 => return sapp_keycode_SAPP_KEYCODE_F19,
2394        65489 => return sapp_keycode_SAPP_KEYCODE_F20,
2395        65490 => return sapp_keycode_SAPP_KEYCODE_F21,
2396        65491 => return sapp_keycode_SAPP_KEYCODE_F22,
2397        65492 => return sapp_keycode_SAPP_KEYCODE_F23,
2398        65493 => return sapp_keycode_SAPP_KEYCODE_F24,
2399        65494 => return sapp_keycode_SAPP_KEYCODE_F25,
2400        65455 => return sapp_keycode_SAPP_KEYCODE_KP_DIVIDE,
2401        65450 => return sapp_keycode_SAPP_KEYCODE_KP_MULTIPLY,
2402        65453 => return sapp_keycode_SAPP_KEYCODE_KP_SUBTRACT,
2403        65451 => return sapp_keycode_SAPP_KEYCODE_KP_ADD,
2404        65438 => return sapp_keycode_SAPP_KEYCODE_KP_0,
2405        65436 => return sapp_keycode_SAPP_KEYCODE_KP_1,
2406        65433 => return sapp_keycode_SAPP_KEYCODE_KP_2,
2407        65435 => return sapp_keycode_SAPP_KEYCODE_KP_3,
2408        65430 => return sapp_keycode_SAPP_KEYCODE_KP_4,
2409        65437 => return sapp_keycode_SAPP_KEYCODE_KP_5,
2410        65432 => return sapp_keycode_SAPP_KEYCODE_KP_6,
2411        65429 => return sapp_keycode_SAPP_KEYCODE_KP_7,
2412        65431 => return sapp_keycode_SAPP_KEYCODE_KP_8,
2413        65434 => return sapp_keycode_SAPP_KEYCODE_KP_9,
2414        65439 => return sapp_keycode_SAPP_KEYCODE_KP_DECIMAL,
2415        65469 => return sapp_keycode_SAPP_KEYCODE_KP_EQUAL,
2416        65421 => return sapp_keycode_SAPP_KEYCODE_KP_ENTER,
2417        97 => return sapp_keycode_SAPP_KEYCODE_A,
2418        98 => return sapp_keycode_SAPP_KEYCODE_B,
2419        99 => return sapp_keycode_SAPP_KEYCODE_C,
2420        100 => return sapp_keycode_SAPP_KEYCODE_D,
2421        101 => return sapp_keycode_SAPP_KEYCODE_E,
2422        102 => return sapp_keycode_SAPP_KEYCODE_F,
2423        103 => return sapp_keycode_SAPP_KEYCODE_G,
2424        104 => return sapp_keycode_SAPP_KEYCODE_H,
2425        105 => return sapp_keycode_SAPP_KEYCODE_I,
2426        106 => return sapp_keycode_SAPP_KEYCODE_J,
2427        107 => return sapp_keycode_SAPP_KEYCODE_K,
2428        108 => return sapp_keycode_SAPP_KEYCODE_L,
2429        109 => return sapp_keycode_SAPP_KEYCODE_M,
2430        110 => return sapp_keycode_SAPP_KEYCODE_N,
2431        111 => return sapp_keycode_SAPP_KEYCODE_O,
2432        112 => return sapp_keycode_SAPP_KEYCODE_P,
2433        113 => return sapp_keycode_SAPP_KEYCODE_Q,
2434        114 => return sapp_keycode_SAPP_KEYCODE_R,
2435        115 => return sapp_keycode_SAPP_KEYCODE_S,
2436        116 => return sapp_keycode_SAPP_KEYCODE_T,
2437        117 => return sapp_keycode_SAPP_KEYCODE_U,
2438        118 => return sapp_keycode_SAPP_KEYCODE_V,
2439        119 => return sapp_keycode_SAPP_KEYCODE_W,
2440        120 => return sapp_keycode_SAPP_KEYCODE_X,
2441        121 => return sapp_keycode_SAPP_KEYCODE_Y,
2442        122 => return sapp_keycode_SAPP_KEYCODE_Z,
2443        49 => return sapp_keycode_SAPP_KEYCODE_1,
2444        50 => return sapp_keycode_SAPP_KEYCODE_2,
2445        51 => return sapp_keycode_SAPP_KEYCODE_3,
2446        52 => return sapp_keycode_SAPP_KEYCODE_4,
2447        53 => return sapp_keycode_SAPP_KEYCODE_5,
2448        54 => return sapp_keycode_SAPP_KEYCODE_6,
2449        55 => return sapp_keycode_SAPP_KEYCODE_7,
2450        56 => return sapp_keycode_SAPP_KEYCODE_8,
2451        57 => return sapp_keycode_SAPP_KEYCODE_9,
2452        48 => return sapp_keycode_SAPP_KEYCODE_0,
2453        32 => return sapp_keycode_SAPP_KEYCODE_SPACE,
2454        45 => return sapp_keycode_SAPP_KEYCODE_MINUS,
2455        61 => return sapp_keycode_SAPP_KEYCODE_EQUAL,
2456        91 => return sapp_keycode_SAPP_KEYCODE_LEFT_BRACKET,
2457        93 => return sapp_keycode_SAPP_KEYCODE_RIGHT_BRACKET,
2458        92 => return sapp_keycode_SAPP_KEYCODE_BACKSLASH,
2459        59 => return sapp_keycode_SAPP_KEYCODE_SEMICOLON,
2460        39 => return sapp_keycode_SAPP_KEYCODE_APOSTROPHE,
2461        96 => return sapp_keycode_SAPP_KEYCODE_GRAVE_ACCENT,
2462        44 => return sapp_keycode_SAPP_KEYCODE_COMMA,
2463        46 => return sapp_keycode_SAPP_KEYCODE_PERIOD,
2464        47 => return sapp_keycode_SAPP_KEYCODE_SLASH,
2465        60 => return sapp_keycode_SAPP_KEYCODE_WORLD_1,
2466        _ => return sapp_keycode_SAPP_KEYCODE_INVALID,
2467    };
2468}
2469pub unsafe extern "C" fn _sapp_x11_scroll_event(
2470    mut x: libc::c_float,
2471    mut y: libc::c_float,
2472    mut mods: u32,
2473) {
2474    if _sapp_events_enabled() {
2475        _sapp_init_event(sapp_event_type_SAPP_EVENTTYPE_MOUSE_SCROLL);
2476        _sapp.event.modifiers = mods;
2477        _sapp.event.scroll_x = x;
2478        _sapp.event.scroll_y = y;
2479        _sapp_call_event(&mut _sapp.event);
2480    };
2481}
2482pub unsafe extern "C" fn _sapp_x11_translate_button(mut event: *const XEvent) -> sapp_mousebutton {
2483    match (*event).xbutton.button {
2484        1 => return sapp_mousebutton_SAPP_MOUSEBUTTON_LEFT,
2485        2 => return sapp_mousebutton_SAPP_MOUSEBUTTON_MIDDLE,
2486        3 => return sapp_mousebutton_SAPP_MOUSEBUTTON_RIGHT,
2487        _ => return sapp_mousebutton_SAPP_MOUSEBUTTON_INVALID,
2488    };
2489}
2490pub unsafe extern "C" fn _sapp_x11_mouse_event(
2491    mut type_: sapp_event_type,
2492    mut btn: sapp_mousebutton,
2493    mut mods: u32,
2494) {
2495    if _sapp_events_enabled() {
2496        _sapp_init_event(type_);
2497        _sapp.event.mouse_button = btn;
2498        _sapp.event.modifiers = mods;
2499        _sapp.event.mouse_x = _sapp.mouse_x;
2500        _sapp.event.mouse_y = _sapp.mouse_y;
2501        _sapp_call_event(&mut _sapp.event);
2502    };
2503}
2504pub unsafe extern "C" fn _sapp_x11_mod(mut x11_mods: libc::c_int) -> u32 {
2505    let mut mods = 0 as libc::c_int as u32;
2506    if x11_mods & ShiftMask != 0 {
2507        mods |= SAPP_MODIFIER_SHIFT as libc::c_int as libc::c_uint
2508    }
2509    if x11_mods & ControlMask != 0 {
2510        mods |= SAPP_MODIFIER_CTRL as libc::c_int as libc::c_uint
2511    }
2512    if x11_mods & Mod1Mask != 0 {
2513        mods |= SAPP_MODIFIER_ALT as libc::c_int as libc::c_uint
2514    }
2515    if x11_mods & Mod4Mask != 0 {
2516        mods |= SAPP_MODIFIER_SUPER as libc::c_int as libc::c_uint
2517    }
2518    return mods;
2519}
2520pub static mut _sapp_x11_window_state: libc::c_int = 0;
2521pub unsafe extern "C" fn _sapp_x11_get_window_property(
2522    window: Window,
2523    mut property: Atom,
2524    mut type_: Atom,
2525    mut value: *mut *mut libc::c_uchar,
2526) -> libc::c_ulong {
2527    let mut actualType: Atom = 0;
2528    let mut actualFormat: libc::c_int = 0;
2529    let mut itemCount: libc::c_ulong = 0;
2530    let mut bytesAfter: libc::c_ulong = 0;
2531    XGetWindowProperty(
2532        _sapp_x11_display,
2533        window,
2534        property,
2535        0,
2536        libc::c_long::max_value(),
2537        false as _,
2538        type_,
2539        &mut actualType,
2540        &mut actualFormat,
2541        &mut itemCount,
2542        &mut bytesAfter,
2543        value,
2544    );
2545    return itemCount;
2546}
2547pub static mut _sapp_x11_WM_STATE: Atom = 0;
2548pub unsafe extern "C" fn _sapp_x11_get_window_state() -> libc::c_int {
2549    let mut result = WithdrawnState;
2550    let mut state: *mut C2RustUnnamed_1 = std::ptr::null_mut();
2551    if _sapp_x11_get_window_property(
2552        _sapp_x11_window,
2553        _sapp_x11_WM_STATE,
2554        _sapp_x11_WM_STATE,
2555        &mut state as *mut *mut C2RustUnnamed_1 as *mut *mut libc::c_uchar,
2556    ) >= 2
2557    {
2558        result = (*state).state as libc::c_int
2559    }
2560    if !state.is_null() {
2561        XFree(state as *mut libc::c_void);
2562    }
2563    return result;
2564}
2565pub static mut _sapp_x11_WM_PROTOCOLS: Atom = 0;
2566pub static mut _sapp_x11_WM_DELETE_WINDOW: Atom = 0;
2567pub unsafe extern "C" fn _sapp_x11_process_event(mut event: *mut XEvent) {
2568    match (*event).type_0 {
2569        2 => {
2570            let mut keycode = (*event).xkey.keycode as libc::c_int;
2571            let key = _sapp_x11_translate_key(keycode);
2572            let mut repeat = _sapp_x11_keycodes[(keycode & 0xff as libc::c_int) as usize];
2573            _sapp_x11_keycodes[(keycode & 0xff as libc::c_int) as usize] = true;
2574            let mods = _sapp_x11_mod((*event).xkey.state as libc::c_int);
2575            if key as libc::c_uint
2576                != sapp_keycode_SAPP_KEYCODE_INVALID as libc::c_int as libc::c_uint
2577            {
2578                _sapp_x11_key_event(sapp_event_type_SAPP_EVENTTYPE_KEY_DOWN, key, repeat, mods);
2579            }
2580            let mut keysym: KeySym = 0;
2581            XLookupString(
2582                &mut (*event).xkey,
2583                std::ptr::null_mut(),
2584                0 as libc::c_int,
2585                &mut keysym,
2586                std::ptr::null_mut(),
2587            );
2588            let mut chr = _sapp_x11_keysym_to_unicode(keysym);
2589            if chr > 0 as libc::c_int {
2590                _sapp_x11_char_event(chr as u32, repeat, mods);
2591            }
2592        }
2593        3 => {
2594            let mut keycode_0 = (*event).xkey.keycode as libc::c_int;
2595            let key_0 = _sapp_x11_translate_key(keycode_0);
2596            _sapp_x11_keycodes[(keycode_0 & 0xff as libc::c_int) as usize] = false;
2597            if key_0 as libc::c_uint
2598                != sapp_keycode_SAPP_KEYCODE_INVALID as libc::c_int as libc::c_uint
2599            {
2600                let mods_0 = _sapp_x11_mod((*event).xkey.state as libc::c_int);
2601                _sapp_x11_key_event(sapp_event_type_SAPP_EVENTTYPE_KEY_UP, key_0, false, mods_0);
2602            }
2603        }
2604        4 => {
2605            let btn = _sapp_x11_translate_button(event);
2606            let mods_1 = _sapp_x11_mod((*event).xbutton.state as libc::c_int);
2607            if btn as libc::c_int != sapp_mousebutton_SAPP_MOUSEBUTTON_INVALID as libc::c_int {
2608                _sapp_x11_mouse_event(sapp_event_type_SAPP_EVENTTYPE_MOUSE_DOWN, btn, mods_1);
2609            } else {
2610                match (*event).xbutton.button {
2611                    4 => {
2612                        _sapp_x11_scroll_event(0.0f32, 1.0f32, mods_1);
2613                    }
2614                    5 => {
2615                        _sapp_x11_scroll_event(0.0f32, -1.0f32, mods_1);
2616                    }
2617                    6 => {
2618                        _sapp_x11_scroll_event(1.0f32, 0.0f32, mods_1);
2619                    }
2620                    7 => {
2621                        _sapp_x11_scroll_event(-1.0f32, 0.0f32, mods_1);
2622                    }
2623                    _ => {}
2624                }
2625            }
2626        }
2627        5 => {
2628            let btn_0 = _sapp_x11_translate_button(event);
2629            if btn_0 as libc::c_int != sapp_mousebutton_SAPP_MOUSEBUTTON_INVALID as libc::c_int {
2630                _sapp_x11_mouse_event(
2631                    sapp_event_type_SAPP_EVENTTYPE_MOUSE_UP,
2632                    btn_0,
2633                    _sapp_x11_mod((*event).xbutton.state as libc::c_int),
2634                );
2635            }
2636        }
2637        7 => {
2638            _sapp_x11_mouse_event(
2639                sapp_event_type_SAPP_EVENTTYPE_MOUSE_ENTER,
2640                sapp_mousebutton_SAPP_MOUSEBUTTON_INVALID,
2641                _sapp_x11_mod((*event).xcrossing.state as libc::c_int),
2642            );
2643        }
2644        8 => {
2645            _sapp_x11_mouse_event(
2646                sapp_event_type_SAPP_EVENTTYPE_MOUSE_LEAVE,
2647                sapp_mousebutton_SAPP_MOUSEBUTTON_INVALID,
2648                _sapp_x11_mod((*event).xcrossing.state as libc::c_int),
2649            );
2650        }
2651        6 => {
2652            _sapp.mouse_x = (*event).xmotion.x as libc::c_float;
2653            _sapp.mouse_y = (*event).xmotion.y as libc::c_float;
2654            _sapp_x11_mouse_event(
2655                sapp_event_type_SAPP_EVENTTYPE_MOUSE_MOVE,
2656                sapp_mousebutton_SAPP_MOUSEBUTTON_INVALID,
2657                _sapp_x11_mod((*event).xmotion.state as libc::c_int),
2658            );
2659        }
2660        22 => {
2661            if (*event).xconfigure.width != _sapp.window_width
2662                || (*event).xconfigure.height != _sapp.window_height
2663            {
2664                _sapp.window_width = (*event).xconfigure.width;
2665                _sapp.window_height = (*event).xconfigure.height;
2666                _sapp.framebuffer_width = _sapp.window_width;
2667                _sapp.framebuffer_height = _sapp.window_height;
2668                _sapp_x11_app_event(sapp_event_type_SAPP_EVENTTYPE_RESIZED);
2669            }
2670        }
2671        28 => {
2672            if (*event).xproperty.state == PropertyNewValue {
2673                if (*event).xproperty.atom == _sapp_x11_WM_STATE {
2674                    let state = _sapp_x11_get_window_state();
2675                    if state != _sapp_x11_window_state {
2676                        _sapp_x11_window_state = state;
2677                        if state == IconicState {
2678                            _sapp_x11_app_event(sapp_event_type_SAPP_EVENTTYPE_ICONIFIED);
2679                        } else if state == NormalState {
2680                            _sapp_x11_app_event(sapp_event_type_SAPP_EVENTTYPE_RESTORED);
2681                        }
2682                    }
2683                }
2684            }
2685        }
2686        33 => {
2687            let message_type = (*event).xclient.message_type;
2688            if message_type == _sapp_x11_WM_PROTOCOLS {
2689                let protocol = (*event).xclient.data.l[0 as libc::c_int as usize] as Atom;
2690                if protocol == _sapp_x11_WM_DELETE_WINDOW {
2691                    _sapp.quit_requested = true
2692                }
2693            } else if message_type == _sapp.xdnd.atoms.enter {
2694                let is_list = (*event).xclient.data.l[1] & 1 == 1;
2695                _sapp.xdnd.source = (*event).xclient.data.l[0] as Window;
2696                _sapp.xdnd.version = (*event).xclient.data.l[1] as Atom >> 24;
2697                _sapp.xdnd.format = 0;
2698
2699                if _sapp.xdnd.version > _sapp_x11_XDND_VERSION {
2700                    return;
2701                }
2702
2703                let mut count = 0;
2704                let mut formats: *mut Atom = std::ptr::null_mut();
2705
2706                if is_list {
2707                    count = _sapp_x11_get_window_property(
2708                        _sapp.xdnd.source,
2709                        _sapp.xdnd.atoms.type_list,
2710                        _sapp_x11_XA_ATOM,
2711                        &mut formats as *mut _ as _);
2712                } else {
2713                    count = 3;
2714                    formats = (*event).xclient.data.l.as_mut_ptr().offset(2) as *mut Atom;
2715                }
2716
2717                let formats = std::slice::from_raw_parts_mut(formats, count as _);
2718
2719                for i in 0..count as usize {
2720                    if formats[i] == _sapp.xdnd.atoms.text_uri_list {
2721                        _sapp.xdnd.format = _sapp.xdnd.atoms.text_uri_list;
2722                        break;
2723                    }
2724                }
2725
2726                if is_list && !formats.is_empty() {
2727                    XFree(formats.as_mut_ptr() as *mut libc::c_void);
2728                }
2729            } else if message_type == _sapp.xdnd.atoms.position {
2730                if _sapp.xdnd.version > _sapp_x11_XDND_VERSION {
2731                    return;
2732                }
2733
2734                let mut data = [0isize; 5];
2735                data[0] = _sapp_x11_window as _;
2736                if _sapp.xdnd.format > 0 {
2737                    data[1] = 1;
2738                    if _sapp.xdnd.version >= 2 {
2739                        data[4] = _sapp.xdnd.atoms.action_copy as _;
2740                    }
2741                }
2742
2743                let mut ev = XClientMessageEvent {
2744                    type_0: 33,
2745                    serial: 0,
2746                    send_event: true as _,
2747                    message_type: _sapp.xdnd.atoms.status,
2748                    window: _sapp.xdnd.source,
2749                    display: _sapp_x11_display,
2750                    format: 32,
2751                    data: ClientMessageData {
2752                        l: std::mem::transmute(data),
2753                    },
2754                };
2755                XSendEvent(
2756                    _sapp_x11_display,
2757                    (*event).xclient.data.l[0] as Window,
2758                    false as _,
2759                    0,
2760                    &mut ev as *mut XClientMessageEvent as *mut XEvent,
2761                );
2762                XFlush(_sapp_x11_display);
2763            } else if message_type == _sapp.xdnd.atoms.drop {
2764                if _sapp.xdnd.version > _sapp_x11_XDND_VERSION {
2765                    return;
2766                }
2767
2768                let mut time = 0;
2769                if _sapp.xdnd.format > 0 {
2770                    if _sapp.xdnd.version >= 1 {
2771                        time = (*event).xclient.data.l[2] as Time;
2772                    }
2773
2774                    XConvertSelection(
2775                        _sapp_x11_display,
2776                        _sapp.xdnd.atoms.selection,
2777                        _sapp_x11_UTF8_STRING,
2778                        _sapp.xdnd.atoms.selection,
2779                        _sapp_x11_window,
2780                        time
2781                    );
2782                } else if _sapp.xdnd.version >= 2 {
2783                    let mut data = [0isize; 5];
2784                    data[0] = _sapp_x11_window as _;
2785                    data[1] = 0;
2786                    data[2] = 0;
2787
2788                    let mut ev = XClientMessageEvent {
2789                        type_0: 33,
2790                        serial: 0,
2791                        send_event: true as _,
2792                        message_type: _sapp.xdnd.atoms.finished,
2793                        window: _sapp.xdnd.source,
2794                        display: _sapp_x11_display,
2795                        format: 32,
2796                        data: ClientMessageData {
2797                            l: std::mem::transmute(data),
2798                        },
2799                    };
2800                    XSendEvent(
2801                        _sapp_x11_display,
2802                        _sapp.xdnd.source,
2803                        false as _,
2804                        0,
2805                        &mut ev as *mut XClientMessageEvent as *mut XEvent,
2806                    );
2807                    XFlush(_sapp_x11_display);
2808                }
2809            }
2810        }
2811        // SelectionRequest
2812        30 => {
2813            // some other app is waiting for clibpoard content
2814            // need to make appropriate XSelectionEvent - response for this request
2815            // only UTF8_STRING request is actually supported
2816            crate::clipboard::respond_to_clipboard_request(event);
2817        }
2818        // SelectionNotify
2819        31 => {
2820            let xsel = &mut *(event as *mut XSelectionEvent);
2821
2822            if xsel.property == _sapp.xdnd.atoms.selection as _ {
2823                let mut buf : *mut libc::c_uchar = std::ptr::null_mut();
2824                let len = _sapp_x11_get_window_property(
2825                    xsel.requestor,
2826                    xsel.property,
2827                    xsel.target,
2828                    &mut buf) as usize;
2829                let data = std::slice::from_raw_parts(buf as _, len);
2830                let decoded = sapp_x11_percent_decode(&data);
2831
2832                _sapp.drop.file_paths = decoded.split("\r\n")
2833                    .filter(|path| !path.is_empty())
2834                    .map(|path| path.trim_start_matches("file://").to_string())
2835                    .map(PathBuf::from)
2836                    .collect();
2837
2838                if !_sapp.drop.file_paths.is_empty() {
2839                    _sapp_init_event(sapp_event_type_SAPP_EVENTTYPE_FILES_DROPPED);
2840                    _sapp_call_event(&mut _sapp.event);
2841                }
2842            }
2843        }
2844        // SelectionClear
2845        29 => {}
2846        17 => {}
2847
2848        // GenericEvent
2849        35 if (*event).xcookie.extension == _sapp_xi_extension_opcode => {
2850            if (*event).xcookie.evtype == crate::xi_input::XI_RawMotion {
2851                let (dx, dy) = crate::xi_input::read_cookie(&mut (*event).xcookie);
2852                _sapp_x11_raw_device_event(dx as f32, dy as f32);
2853            }
2854        }
2855        _ => {}
2856    };
2857}
2858pub unsafe extern "C" fn _sapp_call_init() {
2859    if _sapp.desc.init_cb.is_some() {
2860        _sapp.desc.init_cb.expect("non-null function pointer")();
2861    } else if _sapp.desc.init_userdata_cb.is_some() {
2862        _sapp
2863            .desc
2864            .init_userdata_cb
2865            .expect("non-null function pointer")(_sapp.desc.user_data);
2866    }
2867    _sapp.init_called = true;
2868}
2869pub unsafe extern "C" fn _sapp_call_frame() {
2870    if _sapp.init_called as libc::c_int != 0 && !_sapp.cleanup_called {
2871        if _sapp.desc.frame_cb.is_some() {
2872            _sapp.desc.frame_cb.expect("non-null function pointer")();
2873        } else if _sapp.desc.frame_userdata_cb.is_some() {
2874            _sapp
2875                .desc
2876                .frame_userdata_cb
2877                .expect("non-null function pointer")(_sapp.desc.user_data);
2878        }
2879    };
2880}
2881pub unsafe extern "C" fn _sapp_frame() {
2882    if _sapp.first_frame {
2883        _sapp.first_frame = false;
2884        _sapp_call_init();
2885    }
2886    _sapp_call_frame();
2887    _sapp.frame_count = _sapp.frame_count.wrapping_add(1);
2888}
2889pub static mut _sapp_glx_SwapBuffers: PFNGLXSWAPBUFFERSPROC = None;
2890pub unsafe extern "C" fn _sapp_glx_swap_buffers() {
2891    _sapp_glx_SwapBuffers.expect("non-null function pointer")(_sapp_x11_display, _sapp_glx_window);
2892}
2893pub unsafe extern "C" fn _sapp_events_enabled() -> bool {
2894    return (_sapp.desc.event_cb.is_some() || _sapp.desc.event_userdata_cb.is_some())
2895        && _sapp.init_called as libc::c_int != 0;
2896}
2897pub unsafe extern "C" fn _sapp_init_event(mut type_: sapp_event_type) {
2898    memset(
2899        &mut _sapp.event as *mut sapp_event as *mut libc::c_void,
2900        0,
2901        ::std::mem::size_of::<sapp_event>() as libc::c_ulong,
2902    );
2903    _sapp.event.type_ = type_;
2904    _sapp.event.frame_count = _sapp.frame_count;
2905    _sapp.event.mouse_button = sapp_mousebutton_SAPP_MOUSEBUTTON_INVALID;
2906    _sapp.event.window_width = _sapp.window_width;
2907    _sapp.event.window_height = _sapp.window_height;
2908    _sapp.event.framebuffer_width = _sapp.framebuffer_width;
2909    _sapp.event.framebuffer_height = _sapp.framebuffer_height;
2910}
2911pub unsafe extern "C" fn _sapp_call_event(mut e: *const sapp_event) {
2912    if !_sapp.cleanup_called {
2913        if _sapp.desc.event_cb.is_some() {
2914            _sapp.desc.event_cb.expect("non-null function pointer")(e);
2915        } else if _sapp.desc.event_userdata_cb.is_some() {
2916            _sapp
2917                .desc
2918                .event_userdata_cb
2919                .expect("non-null function pointer")(e, _sapp.desc.user_data);
2920        }
2921    };
2922}
2923pub unsafe extern "C" fn _sapp_x11_app_event(mut type_: sapp_event_type) {
2924    if _sapp_events_enabled() {
2925        _sapp_init_event(type_);
2926        _sapp_call_event(&mut _sapp.event);
2927    };
2928}
2929pub unsafe extern "C" fn _sapp_call_cleanup() {
2930    if !_sapp.cleanup_called {
2931        if _sapp.desc.cleanup_cb.is_some() {
2932            _sapp.desc.cleanup_cb.expect("non-null function pointer")();
2933        } else if _sapp.desc.cleanup_userdata_cb.is_some() {
2934            _sapp
2935                .desc
2936                .cleanup_userdata_cb
2937                .expect("non-null function pointer")(_sapp.desc.user_data);
2938        }
2939        _sapp.cleanup_called = true
2940    };
2941}
2942pub static mut _sapp_glx_DestroyWindow: PFNGLXDESTROYWINDOWPROC = None;
2943pub static mut _sapp_glx_window: GLXWindow = 0;
2944pub static mut _sapp_glx_DestroyContext: PFNGLXDESTROYCONTEXTPROC = None;
2945pub static mut _sapp_glx_ctx: GLXContext = 0 as *const __GLXcontext as *mut __GLXcontext;
2946pub unsafe extern "C" fn _sapp_glx_destroy_context() {
2947    if _sapp_glx_window != 0 {
2948        _sapp_glx_DestroyWindow.expect("non-null function pointer")(
2949            _sapp_x11_display,
2950            _sapp_glx_window,
2951        );
2952        _sapp_glx_window = 0 as libc::c_int as GLXWindow
2953    }
2954    if !_sapp_glx_ctx.is_null() {
2955        _sapp_glx_DestroyContext.expect("non-null function pointer")(
2956            _sapp_x11_display,
2957            _sapp_glx_ctx,
2958        );
2959        _sapp_glx_ctx = 0 as GLXContext
2960    };
2961}
2962pub static mut _sapp_x11_window: Window = 0;
2963pub static mut _sapp_x11_colormap: Colormap = 0;
2964pub unsafe extern "C" fn _sapp_x11_destroy_window() {
2965    if _sapp_x11_window != 0 {
2966        XUnmapWindow(_sapp_x11_display, _sapp_x11_window);
2967        XDestroyWindow(_sapp_x11_display, _sapp_x11_window);
2968        _sapp_x11_window = 0 as libc::c_int as Window
2969    }
2970    if _sapp_x11_colormap != 0 {
2971        XFreeColormap(_sapp_x11_display, _sapp_x11_colormap);
2972        _sapp_x11_colormap = 0 as libc::c_int as Colormap
2973    }
2974    XFlush(_sapp_x11_display);
2975}
2976pub static mut _sapp_x11_display: *mut Display = 0 as *const Display as *mut Display;
2977
2978#[no_mangle]
2979pub unsafe extern "C" fn sapp_run(mut desc: *const sapp_desc) {
2980    _sapp_init_state(desc);
2981    _sapp_x11_window_state = NormalState;
2982    XInitThreads();
2983    XrmInitialize();
2984    _sapp_x11_display = XOpenDisplay(std::ptr::null());
2985    if _sapp_x11_display.is_null() {
2986        _sapp_fail("XOpenDisplay() failed!");
2987    }
2988    _sapp_x11_screen = (*(_sapp_x11_display as _XPrivDisplay)).default_screen;
2989    _sapp_x11_root = (*(*(_sapp_x11_display as _XPrivDisplay))
2990        .screens
2991        .offset((*(_sapp_x11_display as _XPrivDisplay)).default_screen as isize))
2992    .root;
2993    XkbSetDetectableAutoRepeat(_sapp_x11_display, true as _, std::ptr::null_mut());
2994
2995    // because X11 Xft.dpi may be not presented on the linux system at all
2996    // and _sapp_x11_query_system_dpi will keep _sapp_x11_dpi as 0
2997    // this hack make final dpi as 1.0 wich probably makes sense for systems without dpi (hm)
2998    _sapp_x11_dpi = 96.0f32;
2999
3000    _sapp_x11_query_system_dpi();
3001    _sapp.dpi_scale = if _sapp.desc.high_dpi {
3002        _sapp_x11_dpi / 96.0f32
3003    } else {
3004        1.0
3005    };
3006    _sapp_x11_init_extensions();
3007    _sapp_glx_init();
3008    let mut visual = 0 as *mut Visual;
3009    let mut depth = 0 as libc::c_int;
3010    _sapp_glx_choose_visual(&mut visual, &mut depth);
3011    _sapp_x11_create_window(visual, depth);
3012    _sapp_glx_create_context();
3013    _sapp.valid = true;
3014    _sapp_x11_show_window();
3015    if (*desc).fullscreen {
3016        sapp_set_fullscreen(true);
3017    }
3018    _sapp_glx_swapinterval(_sapp.swap_interval);
3019    XFlush(_sapp_x11_display);
3020
3021    while !_sapp.quit_ordered {
3022        _sapp_glx_make_current();
3023        let mut count = XPending(_sapp_x11_display);
3024        loop {
3025            let fresh1 = count;
3026            count = count - 1;
3027            if !(fresh1 != 0) {
3028                break;
3029            }
3030            let mut event = _XEvent { type_0: 0 };
3031            XNextEvent(_sapp_x11_display, &mut event);
3032            _sapp_x11_process_event(&mut event);
3033        }
3034        _sapp_frame();
3035        _sapp_glx_swap_buffers();
3036        XFlush(_sapp_x11_display);
3037        if _sapp.quit_requested as libc::c_int != 0 && !_sapp.quit_ordered {
3038            _sapp_x11_app_event(sapp_event_type_SAPP_EVENTTYPE_QUIT_REQUESTED);
3039            if _sapp.quit_requested {
3040                _sapp.quit_ordered = true
3041            }
3042        }
3043    }
3044    _sapp_call_cleanup();
3045    _sapp_glx_destroy_context();
3046    _sapp_x11_destroy_window();
3047    XCloseDisplay(_sapp_x11_display);
3048}
3049#[no_mangle]
3050pub unsafe extern "C" fn sapp_frame_count() -> u64 {
3051    return _sapp.frame_count;
3052}
3053#[no_mangle]
3054pub unsafe extern "C" fn sapp_quit() {
3055    _sapp.quit_ordered = true;
3056}
3057#[no_mangle]
3058pub unsafe extern "C" fn sapp_cancel_quit() {
3059    _sapp.quit_requested = false;
3060}
3061#[no_mangle]
3062pub unsafe extern "C" fn sapp_request_quit() {
3063    _sapp.quit_requested = true;
3064}
3065#[no_mangle]
3066pub unsafe extern "C" fn sapp_query_desc() -> sapp_desc {
3067    return _sapp.desc;
3068}
3069#[no_mangle]
3070pub unsafe extern "C" fn sapp_userdata() -> *mut libc::c_void {
3071    return _sapp.desc.user_data;
3072}
3073#[no_mangle]
3074pub unsafe extern "C" fn sapp_mouse_shown() -> bool {
3075    return false;
3076}
3077
3078pub unsafe extern "C" fn sapp_set_cursor_grab(mut grab: bool) {
3079    XUngrabPointer(_sapp_x11_display, 0);
3080
3081    if grab {
3082        XGrabPointer(
3083            _sapp_x11_display,
3084            _sapp_x11_window,
3085            true as _,
3086            (ButtonPressMask
3087                | ButtonReleaseMask
3088                | EnterWindowMask
3089                | LeaveWindowMask
3090                | PointerMotionMask
3091                | PointerMotionHintMask
3092                | Button1MotionMask
3093                | Button2MotionMask
3094                | Button3MotionMask
3095                | Button4MotionMask
3096                | Button5MotionMask
3097                | ButtonMotionMask
3098                | KeymapStateMask) as libc::c_uint,
3099            GrabModeAsync,
3100            GrabModeAsync,
3101            _sapp_x11_window,
3102            0,
3103            0, // CurrentTime
3104        );
3105    }
3106
3107    XFlush(_sapp_x11_display);
3108}
3109
3110pub unsafe extern "C" fn sapp_set_mouse_cursor(cursor_icon: u32) {
3111    _sapp_cursor_icon = cursor_icon;
3112    update_cursor();
3113}
3114
3115unsafe fn update_cursor() {
3116    let mut cursor;
3117
3118    if !_sapp_cursor_shown {
3119        cursor = _sapp_empty_cursor
3120    } else {
3121        cursor = _sapp_cursor_cache[_sapp_cursor_icon as usize];
3122
3123        if cursor == 0 {
3124            cursor = x_cursor::load_cursor(match _sapp_cursor_icon {
3125                SAPP_CURSOR_DEFAULT => x_cursor::XC_left_ptr,
3126                SAPP_CURSOR_HELP => x_cursor::XC_question_arrow,
3127                SAPP_CURSOR_POINTER => x_cursor::XC_hand2,
3128                SAPP_CURSOR_WAIT => x_cursor::XC_watch,
3129                SAPP_CURSOR_CROSSHAIR => x_cursor::XC_crosshair,
3130                SAPP_CURSOR_TEXT => x_cursor::XC_xterm,
3131                SAPP_CURSOR_MOVE => x_cursor::XC_fleur,
3132                SAPP_CURSOR_NOTALLOWED => x_cursor::XC_pirate,
3133                SAPP_CURSOR_EWRESIZE => x_cursor::XC_sb_h_double_arrow,
3134                SAPP_CURSOR_NSRESIZE => x_cursor::XC_sb_v_double_arrow,
3135                SAPP_CURSOR_NESWRESIZE => x_cursor::XC_top_right_corner,
3136                SAPP_CURSOR_NWSERESIZE => x_cursor::XC_top_left_corner,
3137                _ => return,
3138            });
3139            _sapp_cursor_cache[_sapp_cursor_icon as usize] = cursor;
3140        }
3141    }
3142
3143    x_cursor::set_cursor(cursor);
3144}
3145
3146pub unsafe fn sapp_is_fullscreen() -> bool {
3147    _sapp.desc.fullscreen as _
3148}
3149
3150pub unsafe fn sapp_set_fullscreen(fullscreen: bool) {
3151    _sapp.desc.fullscreen = fullscreen as _;
3152
3153    let mut wm_state = XInternAtom(
3154        _sapp_x11_display,
3155        b"_NET_WM_STATE\x00" as *const u8 as *const libc::c_char,
3156        false as _,
3157    );
3158    let wm_fullscreen = XInternAtom(
3159        _sapp_x11_display,
3160        b"_NET_WM_STATE_FULLSCREEN\x00" as *const u8 as *const libc::c_char,
3161        false as _,
3162    );
3163
3164    if fullscreen {
3165        let _NET_WM_STATE_ADD = 1;
3166        _sapp_x11_send_event(wm_state, _NET_WM_STATE_ADD, wm_fullscreen as isize, 0, 1, 0);
3167    } else {
3168        let _NET_WM_STATE_REMOVE = 0;
3169        _sapp_x11_send_event(
3170            wm_state,
3171            _NET_WM_STATE_REMOVE,
3172            wm_fullscreen as isize,
3173            0,
3174            1,
3175            0,
3176        );
3177    }
3178}
3179
3180#[no_mangle]
3181pub unsafe extern "C" fn sapp_show_mouse(mut shown: bool) {
3182    _sapp_cursor_shown = shown;
3183    update_cursor();
3184}
3185#[no_mangle]
3186pub unsafe extern "C" fn sapp_keyboard_shown() -> bool {
3187    return _sapp.onscreen_keyboard_shown;
3188}
3189#[no_mangle]
3190pub unsafe extern "C" fn sapp_show_keyboard(mut shown: bool) {}
3191#[no_mangle]
3192pub unsafe extern "C" fn sapp_dpi_scale() -> libc::c_float {
3193    return _sapp.dpi_scale;
3194}
3195#[no_mangle]
3196pub unsafe extern "C" fn sapp_high_dpi() -> bool {
3197    return _sapp.desc.high_dpi && _sapp.dpi_scale > 1.5f32;
3198}
3199#[no_mangle]
3200pub unsafe extern "C" fn sapp_height() -> libc::c_int {
3201    return if _sapp.framebuffer_height > 0 {
3202        _sapp.framebuffer_height
3203    } else {
3204        1
3205    };
3206}
3207#[no_mangle]
3208pub unsafe extern "C" fn sapp_width() -> libc::c_int {
3209    return if _sapp.framebuffer_width > 0 {
3210        _sapp.framebuffer_width
3211    } else {
3212        1
3213    };
3214}
3215pub static mut _sapp: _sapp_state = _sapp_state {
3216    valid: false,
3217    window_width: 0,
3218    window_height: 0,
3219    framebuffer_width: 0,
3220    framebuffer_height: 0,
3221    sample_count: 0,
3222    swap_interval: 0,
3223    dpi_scale: 0.,
3224    gles2_fallback: false,
3225    first_frame: false,
3226    init_called: false,
3227    cleanup_called: false,
3228    quit_requested: false,
3229    quit_ordered: false,
3230    html5_canvas_name: 0 as *const libc::c_char,
3231    html5_ask_leave_site: false,
3232    window_title: [0; 128],
3233    window_title_wide: [0; 128],
3234    frame_count: 0,
3235    mouse_x: 0.,
3236    mouse_y: 0.,
3237    win32_mouse_tracked: false,
3238    onscreen_keyboard_shown: false,
3239    event: sapp_event {
3240        frame_count: 0,
3241        type_: sapp_event_type_SAPP_EVENTTYPE_INVALID,
3242        key_code: sapp_keycode_SAPP_KEYCODE_INVALID,
3243        char_code: 0,
3244        key_repeat: false,
3245        modifiers: 0,
3246        mouse_button: sapp_mousebutton_SAPP_MOUSEBUTTON_LEFT,
3247        mouse_x: 0.,
3248        mouse_y: 0.,
3249        mouse_dx: 0.,
3250        mouse_dy: 0.,
3251        scroll_x: 0.,
3252        scroll_y: 0.,
3253        num_touches: 0,
3254        touches: [sapp_touchpoint {
3255            identifier: 0,
3256            pos_x: 0.,
3257            pos_y: 0.,
3258            changed: false,
3259        }; 8],
3260        window_width: 0,
3261        window_height: 0,
3262        framebuffer_width: 0,
3263        framebuffer_height: 0,
3264    },
3265    desc: sapp_desc {
3266        init_cb: None,
3267        frame_cb: None,
3268        cleanup_cb: None,
3269        event_cb: None,
3270        fail_cb: None,
3271        user_data: 0 as *const libc::c_void as *mut libc::c_void,
3272        init_userdata_cb: None,
3273        frame_userdata_cb: None,
3274        cleanup_userdata_cb: None,
3275        event_userdata_cb: None,
3276        fail_userdata_cb: None,
3277        width: 0,
3278        height: 0,
3279        window_resizable: false,
3280        sample_count: 0,
3281        swap_interval: 0,
3282        high_dpi: false,
3283        fullscreen: false,
3284        alpha: false,
3285        window_title: 0 as *const libc::c_char,
3286        user_cursor: false,
3287        html5_canvas_name: 0 as *const libc::c_char,
3288        html5_canvas_resize: false,
3289        html5_preserve_drawing_buffer: false,
3290        html5_premultiplied_alpha: false,
3291        html5_ask_leave_site: false,
3292        ios_keyboard_resizes_canvas: false,
3293        gl_force_gles2: false,
3294    },
3295    keycodes: [sapp_keycode_SAPP_KEYCODE_INVALID; 512],
3296    xdnd: sapp_xdnd {
3297        version: 0,
3298        format: 0,
3299        source: 0,
3300        atoms: sapp_xdnd_atoms {
3301            aware: 0,
3302            enter: 0,
3303            position: 0,
3304            status: 0,
3305            action_copy: 0,
3306            drop: 0,
3307            finished: 0,
3308            selection: 0,
3309            type_list: 0,
3310            text_uri_list: 0
3311        }
3312    },
3313    drop: sapp_drop {
3314        file_paths: vec![]
3315    }
3316};
3317#[no_mangle]
3318pub unsafe extern "C" fn sapp_isvalid() -> bool {
3319    return _sapp.valid;
3320}
3321#[no_mangle]
3322pub unsafe fn sapp_is_elapsed_timer_supported() -> bool {
3323    return true;
3324}
3325
3326fn sapp_x11_percent_decode(bytes: &[u8]) -> String {
3327    let mut decoded = Vec::new();
3328
3329    let mut i = 0;
3330    while i < bytes.len() {
3331        let byte = bytes[i];
3332        i += 1;
3333
3334        decoded.push(if byte == b'%' && i < bytes.len() - 1 {
3335            let hi = char::from(bytes[i]).to_digit(16).unwrap();
3336            let lo = char::from(bytes[i + 1]).to_digit(16).unwrap();
3337            i += 2;
3338            ((hi as u8) << 4) | (lo as u8)
3339        } else {
3340            byte
3341        });
3342    }
3343
3344    String::from_utf8_lossy(&decoded).into_owned()
3345}
3346
3347pub fn dropped_file_count() -> usize {
3348    unsafe {
3349        _sapp.drop.file_paths.len()
3350    }
3351}
3352
3353pub fn dropped_file_bytes(index: usize) -> Option<Vec<u8>> {
3354    None
3355}
3356
3357pub fn dropped_file_path(index: usize) -> Option<PathBuf> {
3358    unsafe {
3359        _sapp.drop.file_paths.get(index).cloned()
3360    }
3361}