-
Notifications
You must be signed in to change notification settings - Fork 158
/
xcb_loader.h
129 lines (119 loc) · 7.09 KB
/
xcb_loader.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/*
* Copyright (c) 2024 The Khronos Group Inc.
* Copyright (c) 2024 Valve Corporation
* Copyright (c) 2024 LunarG, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Author: Charles Giessen <[email protected]>
*/
#pragma once
#include <dlfcn.h>
#include <stdlib.h>
#include <xcb/xcb.h>
typedef xcb_void_cookie_t (*PFN_xcb_destroy_window)(xcb_connection_t *c, xcb_window_t window);
typedef void (*PFN_xcb_disconnect)(xcb_connection_t *c);
typedef int (*PFN_xcb_flush)(xcb_connection_t *c);
typedef xcb_generic_event_t *(*PFN_xcb_wait_for_event)(xcb_connection_t *c);
typedef xcb_generic_event_t *(*PFN_xcb_poll_for_event)(xcb_connection_t *c);
typedef uint32_t (*PFN_xcb_generate_id)(xcb_connection_t *c);
typedef xcb_void_cookie_t (*PFN_xcb_create_window)(xcb_connection_t *c, uint8_t depth, xcb_window_t wid, xcb_window_t parent,
int16_t x, int16_t y, uint16_t width, uint16_t height, uint16_t border_width,
uint16_t _class, xcb_visualid_t visual, uint32_t value_mask,
const void *value_list);
typedef xcb_intern_atom_cookie_t (*PFN_xcb_intern_atom)(xcb_connection_t *c, uint8_t only_if_exists, uint16_t name_len,
const char *name);
typedef xcb_intern_atom_reply_t *(*PFN_xcb_intern_atom_reply)(xcb_connection_t *c, xcb_intern_atom_cookie_t cookie /**< */,
xcb_generic_error_t **e);
typedef xcb_void_cookie_t (*PFN_xcb_change_property)(xcb_connection_t *c, uint8_t mode, xcb_window_t window, xcb_atom_t property,
xcb_atom_t type, uint8_t format, uint32_t data_len, const void *data);
typedef xcb_void_cookie_t (*PFN_xcb_map_window)(xcb_connection_t *c, xcb_window_t window);
typedef xcb_void_cookie_t (*PFN_xcb_configure_window)(xcb_connection_t *c, xcb_window_t window, uint16_t value_mask,
const void *value_list);
typedef xcb_connection_t *(*PFN_xcb_connect)(const char *displayname, int *screenp);
typedef int (*PFN_xcb_connection_has_error)(xcb_connection_t *c);
typedef const struct xcb_setup_t *(*PFN_xcb_get_setup)(xcb_connection_t *c);
typedef xcb_screen_iterator_t (*PFN_xcb_setup_roots_iterator)(const xcb_setup_t *R);
typedef void (*PFN_xcb_screen_next)(xcb_screen_iterator_t *i);
static PFN_xcb_destroy_window cube_xcb_destroy_window = NULL;
static PFN_xcb_disconnect cube_xcb_disconnect = NULL;
static PFN_xcb_flush cube_xcb_flush = NULL;
static PFN_xcb_wait_for_event cube_xcb_wait_for_event = NULL;
static PFN_xcb_poll_for_event cube_xcb_poll_for_event = NULL;
static PFN_xcb_generate_id cube_xcb_generate_id = NULL;
static PFN_xcb_create_window cube_xcb_create_window = NULL;
static PFN_xcb_intern_atom cube_xcb_intern_atom = NULL;
static PFN_xcb_intern_atom_reply cube_xcb_intern_atom_reply = NULL;
static PFN_xcb_change_property cube_xcb_change_property = NULL;
static PFN_xcb_map_window cube_xcb_map_window = NULL;
static PFN_xcb_configure_window cube_xcb_configure_window = NULL;
static PFN_xcb_connect cube_xcb_connect = NULL;
static PFN_xcb_connection_has_error cube_xcb_connection_has_error = NULL;
static PFN_xcb_get_setup cube_xcb_get_setup = NULL;
static PFN_xcb_setup_roots_iterator cube_xcb_setup_roots_iterator = NULL;
static PFN_xcb_screen_next cube_xcb_screen_next = NULL;
#define xcb_destroy_window cube_xcb_destroy_window
#define xcb_disconnect cube_xcb_disconnect
#define xcb_flush cube_xcb_flush
#define xcb_wait_for_event cube_xcb_wait_for_event
#define xcb_poll_for_event cube_xcb_poll_for_event
#define xcb_generate_id cube_xcb_generate_id
#define xcb_create_window cube_xcb_create_window
#define xcb_intern_atom cube_xcb_intern_atom
#define xcb_intern_atom_reply cube_xcb_intern_atom_reply
#define xcb_change_property cube_xcb_change_property
#define xcb_map_window cube_xcb_map_window
#define xcb_configure_window cube_xcb_configure_window
#define xcb_connect cube_xcb_connect
#define xcb_connection_has_error cube_xcb_connection_has_error
#define xcb_get_setup cube_xcb_get_setup
#define xcb_setup_roots_iterator cube_xcb_setup_roots_iterator
#define xcb_screen_next cube_xcb_screen_next
void *initialize_xcb() {
void *xcb_library = NULL;
#if defined(XCB_LIBRARY)
xcb_library = dlopen(XCB_LIBRARY, RTLD_NOW | RTLD_LOCAL);
#endif
if (NULL == xcb_library) {
xcb_library = dlopen("libxcb.so.1", RTLD_NOW | RTLD_LOCAL);
}
if (NULL == xcb_library) {
xcb_library = dlopen("libxcb.so", RTLD_NOW | RTLD_LOCAL);
}
if (NULL == xcb_library) {
return NULL;
}
#ifdef __cplusplus
#define TYPE_CONVERSION(type) reinterpret_cast<type>
#else
#define TYPE_CONVERSION(type)
#endif
cube_xcb_destroy_window = TYPE_CONVERSION(PFN_xcb_destroy_window)(dlsym(xcb_library, "xcb_destroy_window"));
cube_xcb_disconnect = TYPE_CONVERSION(PFN_xcb_disconnect)(dlsym(xcb_library, "xcb_disconnect"));
cube_xcb_flush = TYPE_CONVERSION(PFN_xcb_flush)(dlsym(xcb_library, "xcb_flush"));
cube_xcb_wait_for_event = TYPE_CONVERSION(PFN_xcb_wait_for_event)(dlsym(xcb_library, "xcb_wait_for_event"));
cube_xcb_poll_for_event = TYPE_CONVERSION(PFN_xcb_poll_for_event)(dlsym(xcb_library, "xcb_poll_for_event"));
cube_xcb_generate_id = TYPE_CONVERSION(PFN_xcb_generate_id)(dlsym(xcb_library, "xcb_generate_id"));
cube_xcb_create_window = TYPE_CONVERSION(PFN_xcb_create_window)(dlsym(xcb_library, "xcb_create_window"));
cube_xcb_intern_atom = TYPE_CONVERSION(PFN_xcb_intern_atom)(dlsym(xcb_library, "xcb_intern_atom"));
cube_xcb_intern_atom_reply = TYPE_CONVERSION(PFN_xcb_intern_atom_reply)(dlsym(xcb_library, "xcb_intern_atom_reply"));
cube_xcb_change_property = TYPE_CONVERSION(PFN_xcb_change_property)(dlsym(xcb_library, "xcb_change_property"));
cube_xcb_map_window = TYPE_CONVERSION(PFN_xcb_map_window)(dlsym(xcb_library, "xcb_map_window"));
cube_xcb_configure_window = TYPE_CONVERSION(PFN_xcb_configure_window)(dlsym(xcb_library, "xcb_configure_window"));
cube_xcb_connect = TYPE_CONVERSION(PFN_xcb_connect)(dlsym(xcb_library, "xcb_connect"));
cube_xcb_connection_has_error = TYPE_CONVERSION(PFN_xcb_connection_has_error)(dlsym(xcb_library, "xcb_connection_has_error"));
cube_xcb_get_setup = TYPE_CONVERSION(PFN_xcb_get_setup)(dlsym(xcb_library, "xcb_get_setup"));
cube_xcb_setup_roots_iterator = TYPE_CONVERSION(PFN_xcb_setup_roots_iterator)(dlsym(xcb_library, "xcb_setup_roots_iterator"));
cube_xcb_screen_next = TYPE_CONVERSION(PFN_xcb_screen_next)(dlsym(xcb_library, "xcb_screen_next"));
return xcb_library;
}