[digesting_libdecor] eliminate the gtk plugin constructor function, lift gtk library init out of the plugin init path
parent
8467af0fd8
commit
63fc21f13a
|
|
@ -74,6 +74,9 @@ const struct wl_callback_listener shm_callback_listener;
|
|||
const struct wl_registry_listener registry_listener;
|
||||
const struct wl_callback_listener globals_callback_listener;
|
||||
|
||||
struct libdecor_plugin_interface gtk_plugin_iface;
|
||||
struct libdecor_plugin_interface fallback_plugin_iface;
|
||||
|
||||
// X(N:name,R:return,P:params)
|
||||
#define GL_FUNCS_XLIST(X)\
|
||||
X(glDrawBuffer, void, (GLenum buf)) \
|
||||
|
|
@ -87,14 +90,6 @@ GL_FUNCS_XLIST(X)
|
|||
|
||||
static Ctx ctx = {0};
|
||||
|
||||
|
||||
/* (1) Appendix A: wl_registry::global
|
||||
** " The event notifies the client that a global object with the given
|
||||
** name is now available "
|
||||
*/
|
||||
static void
|
||||
init_xdg_wm_base(uint32_t id, uint32_t version);
|
||||
|
||||
static void
|
||||
wlevent__wl_registry_global(void *data, struct wl_registry *registry,
|
||||
uint32_t name, const char *interface,
|
||||
|
|
@ -251,7 +246,25 @@ int main(){
|
|||
}
|
||||
}
|
||||
|
||||
/* setup GTK context */
|
||||
int gtk_init_success = 0;
|
||||
enum libdecor_color_scheme color_scheme = 0;
|
||||
if (ctx.wl_display != 0 && ctx.wl_compositor != 0){
|
||||
gdk_set_allowed_backends("wayland");
|
||||
gtk_disable_setlocale();
|
||||
if (gtk_init_check(0, 0)){
|
||||
gtk_init_success = 1;
|
||||
}
|
||||
|
||||
{
|
||||
color_scheme = libdecor_get_color_scheme();
|
||||
g_object_set(gtk_settings_get_default(),
|
||||
"gtk-application-prefer-dark-theme",
|
||||
(color_scheme == LIBDECOR_COLOR_SCHEME_PREFER_DARK), NULL);
|
||||
}
|
||||
}
|
||||
|
||||
if (gtk_init_success){
|
||||
ctx.wl_callback = wl_display_sync(ctx.wl_display);
|
||||
wl_callback_add_listener(ctx.wl_callback,
|
||||
&init_wl_display_callback_listener,
|
||||
|
|
@ -259,7 +272,44 @@ int main(){
|
|||
|
||||
wl_list_init(&ctx.frames);
|
||||
|
||||
ctx.plugin = libdecor_plugin_new();
|
||||
{
|
||||
struct libdecor_plugin_gtk *plugin_gtk;
|
||||
|
||||
plugin_gtk = calloc(1, sizeof *plugin_gtk);
|
||||
libdecor_plugin_init(&plugin_gtk->plugin, >k_plugin_iface);
|
||||
|
||||
wl_list_init(&plugin_gtk->visible_frame_list);
|
||||
wl_list_init(&plugin_gtk->seat_list);
|
||||
wl_list_init(&plugin_gtk->output_list);
|
||||
|
||||
/* fetch cursor theme and size*/
|
||||
if (!libdecor_get_cursor_settings(&plugin_gtk->cursor_theme_name,
|
||||
&plugin_gtk->cursor_size)){
|
||||
plugin_gtk->cursor_theme_name = 0;
|
||||
plugin_gtk->cursor_size = 24;
|
||||
}
|
||||
|
||||
plugin_gtk->color_scheme_setting = color_scheme;
|
||||
|
||||
plugin_gtk->wl_registry = wl_display_get_registry(ctx.wl_display);
|
||||
wl_registry_add_listener(plugin_gtk->wl_registry,
|
||||
®istry_listener, plugin_gtk);
|
||||
|
||||
plugin_gtk->globals_callback = wl_display_sync(ctx.wl_display);
|
||||
wl_callback_add_listener(plugin_gtk->globals_callback,
|
||||
&globals_callback_listener,
|
||||
plugin_gtk);
|
||||
wl_display_roundtrip(ctx.wl_display);
|
||||
|
||||
if (!has_required_globals(plugin_gtk)) {
|
||||
fprintf(stderr, "libdecor-gtk-WARNING: Could not get required globals\n");
|
||||
libdecor_plugin_gtk_destroy(&plugin_gtk->plugin);
|
||||
goto plugin_failed;
|
||||
}
|
||||
|
||||
ctx.plugin = &plugin_gtk->plugin;
|
||||
}
|
||||
plugin_failed:;
|
||||
if (ctx.plugin == 0){
|
||||
fprintf(stderr, "Failed to load static plugin: failed to init\n");
|
||||
exit(1);
|
||||
|
|
@ -1998,7 +2048,7 @@ libdecor_plugin_fallback_frame_get_border_size(struct libdecor_plugin *plugin,
|
|||
return true;
|
||||
}
|
||||
|
||||
static struct libdecor_plugin_interface fallback_plugin_iface = {
|
||||
struct libdecor_plugin_interface fallback_plugin_iface = {
|
||||
.destroy = libdecor_plugin_fallback_destroy,
|
||||
.get_fd = libdecor_plugin_fallback_get_fd,
|
||||
.dispatch = libdecor_plugin_fallback_dispatch,
|
||||
|
|
@ -3949,7 +3999,7 @@ libdecor_plugin_gtk_frame_get_border_size(struct libdecor_plugin *plugin,
|
|||
return true;
|
||||
}
|
||||
|
||||
static struct libdecor_plugin_interface gtk_plugin_iface = {
|
||||
struct libdecor_plugin_interface gtk_plugin_iface = {
|
||||
.destroy = libdecor_plugin_gtk_destroy,
|
||||
.get_fd = libdecor_plugin_gtk_get_fd,
|
||||
.dispatch = libdecor_plugin_gtk_dispatch,
|
||||
|
|
@ -4006,7 +4056,6 @@ struct wl_shm_listener shm_listener = {
|
|||
static void
|
||||
shm_callback(void *user_data, struct wl_callback *callback, uint32_t time){
|
||||
struct libdecor_plugin_gtk *plugin_gtk = user_data;
|
||||
struct libdecor *context = plugin_gtk->context;
|
||||
|
||||
wl_callback_destroy(callback);
|
||||
plugin_gtk->globals_callback_shm = NULL;
|
||||
|
|
@ -4029,7 +4078,6 @@ init_wl_shm(struct libdecor_plugin_gtk *plugin_gtk,
|
|||
uint32_t id,
|
||||
uint32_t version)
|
||||
{
|
||||
struct libdecor *context = plugin_gtk->context;
|
||||
struct wl_display *wl_display = ctx.wl_display;
|
||||
|
||||
plugin_gtk->wl_shm =
|
||||
|
|
@ -5069,70 +5117,6 @@ const struct wl_callback_listener globals_callback_listener = {
|
|||
globals_callback
|
||||
};
|
||||
|
||||
static struct libdecor_plugin *
|
||||
libdecor_plugin_new(void){
|
||||
struct libdecor_plugin_gtk *plugin_gtk;
|
||||
struct wl_display *wl_display;
|
||||
|
||||
#ifdef HAVE_GETTID
|
||||
/* Only support running on the main thread. */
|
||||
if (getpid () != gettid ())
|
||||
return NULL;
|
||||
#endif
|
||||
|
||||
plugin_gtk = calloc(1, sizeof *plugin_gtk);
|
||||
libdecor_plugin_init(&plugin_gtk->plugin, >k_plugin_iface);
|
||||
plugin_gtk->context = 0;
|
||||
|
||||
wl_list_init(&plugin_gtk->visible_frame_list);
|
||||
wl_list_init(&plugin_gtk->seat_list);
|
||||
wl_list_init(&plugin_gtk->output_list);
|
||||
|
||||
/* fetch cursor theme and size*/
|
||||
if (!libdecor_get_cursor_settings(&plugin_gtk->cursor_theme_name,
|
||||
&plugin_gtk->cursor_size)) {
|
||||
plugin_gtk->cursor_theme_name = NULL;
|
||||
plugin_gtk->cursor_size = 24;
|
||||
}
|
||||
|
||||
plugin_gtk->color_scheme_setting = libdecor_get_color_scheme();
|
||||
|
||||
wl_display = ctx.wl_display;
|
||||
plugin_gtk->wl_registry = wl_display_get_registry(wl_display);
|
||||
wl_registry_add_listener(plugin_gtk->wl_registry,
|
||||
®istry_listener,
|
||||
plugin_gtk);
|
||||
|
||||
plugin_gtk->globals_callback = wl_display_sync(wl_display);
|
||||
wl_callback_add_listener(plugin_gtk->globals_callback,
|
||||
&globals_callback_listener,
|
||||
plugin_gtk);
|
||||
wl_display_roundtrip(wl_display);
|
||||
|
||||
if (!has_required_globals(plugin_gtk)) {
|
||||
fprintf(stderr, "libdecor-gtk-WARNING: Could not get required globals\n");
|
||||
libdecor_plugin_gtk_destroy(&plugin_gtk->plugin);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* setup GTK context */
|
||||
gdk_set_allowed_backends("wayland");
|
||||
gtk_disable_setlocale();
|
||||
|
||||
if (!gtk_init_check(NULL, NULL)) {
|
||||
fprintf(stderr, "libdecor-gtk-WARNING: Failed to initialize GTK\n");
|
||||
libdecor_plugin_gtk_destroy(&plugin_gtk->plugin);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
g_object_set(gtk_settings_get_default(),
|
||||
"gtk-application-prefer-dark-theme",
|
||||
plugin_gtk->color_scheme_setting == LIBDECOR_COLOR_SCHEME_PREFER_DARK,
|
||||
NULL);
|
||||
|
||||
return &plugin_gtk->plugin;
|
||||
}
|
||||
|
||||
static struct libdecor_plugin_priority priorities[] = {
|
||||
{ NULL, LIBDECOR_PLUGIN_PRIORITY_HIGH }
|
||||
};
|
||||
|
|
@ -5161,8 +5145,7 @@ get_cursor_settings_from_env(char **theme, int *size)
|
|||
|
||||
static DBusMessage *
|
||||
get_setting_sync(DBusConnection *const connection,
|
||||
const char *key,
|
||||
const char *value)
|
||||
const char *key, const char *value)
|
||||
{
|
||||
DBusError error;
|
||||
dbus_bool_t success;
|
||||
|
|
@ -5203,10 +5186,7 @@ get_setting_sync(DBusConnection *const connection,
|
|||
}
|
||||
|
||||
static bool
|
||||
parse_type(DBusMessage *const reply,
|
||||
const int type,
|
||||
void *value)
|
||||
{
|
||||
parse_type(DBusMessage *const reply, const int type, void *value){
|
||||
DBusMessageIter iter[3];
|
||||
|
||||
dbus_message_iter_init(reply, &iter[0]);
|
||||
|
|
@ -5275,8 +5255,7 @@ libdecor_get_cursor_settings(char **theme, int *size){
|
|||
}
|
||||
|
||||
enum libdecor_color_scheme
|
||||
libdecor_get_color_scheme()
|
||||
{
|
||||
libdecor_get_color_scheme(){
|
||||
static const char name[] = "org.freedesktop.appearance";
|
||||
static const char key_color_scheme[] = "color-scheme";
|
||||
uint32_t color = 0;
|
||||
|
|
@ -5305,17 +5284,18 @@ libdecor_get_color_scheme()
|
|||
|
||||
return color;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
bool
|
||||
libdecor_get_cursor_settings(char **theme, int *size)
|
||||
{
|
||||
libdecor_get_cursor_settings(char **theme, int *size){
|
||||
return get_cursor_settings_from_env(theme, size);
|
||||
}
|
||||
|
||||
uint32_t
|
||||
libdecor_get_color_scheme()
|
||||
{
|
||||
libdecor_get_color_scheme(){
|
||||
return LIBDECOR_COLOR_SCHEME_DEFAULT;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -438,8 +438,6 @@ struct libdecor_plugin_gtk {
|
|||
struct wl_callback *globals_callback;
|
||||
struct wl_callback *globals_callback_shm;
|
||||
|
||||
struct libdecor *context;
|
||||
|
||||
struct wl_registry *wl_registry;
|
||||
struct wl_subcompositor *wl_subcompositor;
|
||||
struct wl_compositor *wl_compositor;
|
||||
|
|
@ -606,9 +604,14 @@ enum libdecor_color_scheme libdecor_get_color_scheme();
|
|||
|
||||
int libdecor_os_create_anonymous_file(off_t size);
|
||||
|
||||
// #include "plugins/gtk/libdecor-gtk.c"
|
||||
// #include "libdecor.c"
|
||||
|
||||
static struct libdecor_plugin * libdecor_plugin_new(void);
|
||||
static void init_xdg_wm_base(uint32_t id, uint32_t version);
|
||||
|
||||
//#include "plugins/gtk/libdecor-gtk.c"
|
||||
|
||||
static bool has_required_globals(struct libdecor_plugin_gtk *plugin_gtk);
|
||||
static void libdecor_plugin_gtk_destroy(struct libdecor_plugin *plugin);
|
||||
|
||||
// digesting_libdecor
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue