mirror of
https://github.com/fltk/fltk.git
synced 2026-05-31 22:04:26 +08:00
Wayland: use GTK Shell also with system libdecor
This commit is contained in:
@@ -31,14 +31,27 @@
|
|||||||
# define HAVE_GTK 0
|
# define HAVE_GTK 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_GTK
|
||||||
|
# include "gtk-shell-client-protocol.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if USE_SYSTEM_LIBDECOR
|
#if USE_SYSTEM_LIBDECOR
|
||||||
#include "../src/libdecor-plugin.h"
|
#include "../src/libdecor-plugin.h"
|
||||||
|
#if HAVE_GTK
|
||||||
|
#include <linux/input.h>
|
||||||
|
#include "gtk-shell-protocol.c"
|
||||||
|
#endif
|
||||||
|
|
||||||
enum zxdg_toplevel_decoration_v1_mode {
|
enum zxdg_toplevel_decoration_v1_mode {
|
||||||
ZXDG_TOPLEVEL_DECORATION_V1_MODE_CLIENT_SIDE = 1,
|
ZXDG_TOPLEVEL_DECORATION_V1_MODE_CLIENT_SIDE = 1,
|
||||||
ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE = 2,
|
ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum component {NONE};
|
enum component {
|
||||||
|
NONE = 0,
|
||||||
|
SHADOW,
|
||||||
|
HEADER,
|
||||||
|
};
|
||||||
enum decoration_type {DECORATION_TYPE_NONE};
|
enum decoration_type {DECORATION_TYPE_NONE};
|
||||||
|
|
||||||
struct buffer { // identical in libdecor-cairo.c and libdecor-gtk.c
|
struct buffer { // identical in libdecor-cairo.c and libdecor-gtk.c
|
||||||
@@ -171,7 +184,15 @@ struct libdecor_frame_cairo {
|
|||||||
/* Definitions derived from libdecor-gtk.c */
|
/* Definitions derived from libdecor-gtk.c */
|
||||||
|
|
||||||
typedef struct _GtkWidget GtkWidget;
|
typedef struct _GtkWidget GtkWidget;
|
||||||
enum header_element { HDR_NONE };
|
enum header_element {
|
||||||
|
HEADER_NONE,
|
||||||
|
HEADER_FULL, /* entire header bar */
|
||||||
|
HEADER_TITLE, /* label */
|
||||||
|
HEADER_MIN,
|
||||||
|
HEADER_MAX,
|
||||||
|
HEADER_CLOSE,
|
||||||
|
};
|
||||||
|
|
||||||
typedef enum { GTK_STATE_FLAG_NORMAL = 0 } GtkStateFlags;
|
typedef enum { GTK_STATE_FLAG_NORMAL = 0 } GtkStateFlags;
|
||||||
|
|
||||||
struct border_component_gtk {
|
struct border_component_gtk {
|
||||||
@@ -216,6 +237,55 @@ struct libdecor_frame_gtk {
|
|||||||
struct wl_list link;
|
struct wl_list link;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if USE_SYSTEM_LIBDECOR
|
||||||
|
struct libdecor_plugin_gtk {
|
||||||
|
struct libdecor_plugin plugin;
|
||||||
|
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;
|
||||||
|
struct wl_shm *wl_shm;
|
||||||
|
struct wl_callback *shm_callback;
|
||||||
|
bool has_argb;
|
||||||
|
struct wl_list visible_frame_list;
|
||||||
|
struct wl_list seat_list;
|
||||||
|
struct wl_list output_list;
|
||||||
|
char *cursor_theme_name;
|
||||||
|
int cursor_size;
|
||||||
|
int double_click_time_ms;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct seat {
|
||||||
|
struct libdecor_plugin_gtk *plugin_gtk;
|
||||||
|
char *name;
|
||||||
|
struct wl_seat *wl_seat;
|
||||||
|
struct wl_pointer *wl_pointer;
|
||||||
|
struct wl_touch *wl_touch;
|
||||||
|
struct wl_surface *cursor_surface;
|
||||||
|
struct wl_cursor *current_cursor;
|
||||||
|
int cursor_scale;
|
||||||
|
struct wl_list cursor_outputs;
|
||||||
|
struct wl_cursor_theme *cursor_theme;
|
||||||
|
struct wl_cursor *cursors[8]; // 8 replaces ARRAY_LENGTH(cursor_names)
|
||||||
|
struct wl_cursor *cursor_left_ptr;
|
||||||
|
struct wl_surface *pointer_focus;
|
||||||
|
struct wl_surface *touch_focus;
|
||||||
|
int pointer_x, pointer_y;
|
||||||
|
uint32_t pointer_button_time_stamp;
|
||||||
|
uint32_t touch_down_time_stamp;
|
||||||
|
uint32_t serial;
|
||||||
|
bool grabbed;
|
||||||
|
struct wl_list link;
|
||||||
|
};
|
||||||
|
|
||||||
|
static bool own_surface(struct wl_surface *surface)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif // USE_SYSTEM_LIBDECOR
|
||||||
|
|
||||||
#endif // USE_SYSTEM_LIBDECOR || !HAVE_GTK
|
#endif // USE_SYSTEM_LIBDECOR || !HAVE_GTK
|
||||||
|
|
||||||
|
|
||||||
@@ -324,9 +394,7 @@ unsigned char *fl_libdecor_titlebar_buffer(struct libdecor_frame *frame,
|
|||||||
|
|
||||||
|
|
||||||
/* === Beginning of code to add support of GTK Shell to libdecor-gtk === */
|
/* === Beginning of code to add support of GTK Shell to libdecor-gtk === */
|
||||||
#if HAVE_GTK && !USE_SYSTEM_LIBDECOR
|
#if HAVE_GTK
|
||||||
|
|
||||||
# include "gtk-shell-client-protocol.h"
|
|
||||||
|
|
||||||
static struct gtk_shell1 *gtk_shell = NULL;
|
static struct gtk_shell1 *gtk_shell = NULL;
|
||||||
static uint32_t doubleclick_time = 250;
|
static uint32_t doubleclick_time = 250;
|
||||||
@@ -382,6 +450,19 @@ static void fltk_pointer_button(void *data,
|
|||||||
decor_pointer_button(data, wl_pointer, serial, time, button, state);
|
decor_pointer_button(data, wl_pointer, serial, time, button, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if USE_SYSTEM_LIBDECOR
|
||||||
|
static struct border_component_gtk *
|
||||||
|
get_component_for_surface(struct libdecor_frame_gtk *frame_gtk,
|
||||||
|
const struct wl_surface *surface)
|
||||||
|
{
|
||||||
|
if (frame_gtk->shadow.wl_surface == surface)
|
||||||
|
return &frame_gtk->shadow;
|
||||||
|
if (frame_gtk->headerbar.wl_surface == surface)
|
||||||
|
return &frame_gtk->headerbar;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// libdecor's touch_down member of wl_touch_listener objects
|
// libdecor's touch_down member of wl_touch_listener objects
|
||||||
void (*decor_touch_down)(void *data, struct wl_touch *wl_touch, uint32_t serial,
|
void (*decor_touch_down)(void *data, struct wl_touch *wl_touch, uint32_t serial,
|
||||||
@@ -424,12 +505,12 @@ struct wl_object { // copied from wayland-private.h
|
|||||||
uint32_t id;
|
uint32_t id;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // HAVE_GTK && !USE_SYSTEM_LIBDECOR
|
#endif // HAVE_GTK
|
||||||
|
|
||||||
|
|
||||||
// replace libdecor's pointer_button by FLTK's
|
// replace libdecor's pointer_button by FLTK's
|
||||||
void use_FLTK_pointer_button(struct libdecor_frame *frame) {
|
void use_FLTK_pointer_button(struct libdecor_frame *frame) {
|
||||||
#if HAVE_GTK && !USE_SYSTEM_LIBDECOR
|
#if HAVE_GTK
|
||||||
static struct wl_pointer_listener *fltk_listener = NULL;
|
static struct wl_pointer_listener *fltk_listener = NULL;
|
||||||
if (!gtk_shell || fltk_listener) return;
|
if (!gtk_shell || fltk_listener) return;
|
||||||
struct libdecor_frame_gtk *lfg = (struct libdecor_frame_gtk *)frame;
|
struct libdecor_frame_gtk *lfg = (struct libdecor_frame_gtk *)frame;
|
||||||
@@ -479,15 +560,15 @@ void use_FLTK_pointer_button(struct libdecor_frame *frame) {
|
|||||||
|
|
||||||
// get gnome's double_click_time_ms value
|
// get gnome's double_click_time_ms value
|
||||||
doubleclick_time = lfg->plugin_gtk->double_click_time_ms;
|
doubleclick_time = lfg->plugin_gtk->double_click_time_ms;
|
||||||
#endif // HAVE_GTK && !USE_SYSTEM_LIBDECOR
|
#endif // HAVE_GTK
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void bind_to_gtk_shell(struct wl_registry *wl_registry, uint32_t id) {
|
void bind_to_gtk_shell(struct wl_registry *wl_registry, uint32_t id) {
|
||||||
#if HAVE_GTK && !USE_SYSTEM_LIBDECOR
|
#if HAVE_GTK
|
||||||
gtk_shell = (struct gtk_shell1*)wl_registry_bind(wl_registry, id,
|
gtk_shell = (struct gtk_shell1*)wl_registry_bind(wl_registry, id,
|
||||||
>k_shell1_interface, 5);
|
>k_shell1_interface, 5);
|
||||||
#endif // HAVE_GTK && !USE_SYSTEM_LIBDECOR
|
#endif // HAVE_GTK
|
||||||
}
|
}
|
||||||
|
|
||||||
/* === End of code to add support of GTK Shell to libdecor-gtk === */
|
/* === End of code to add support of GTK Shell to libdecor-gtk === */
|
||||||
|
|||||||
@@ -525,6 +525,9 @@ if (OPTION_USE_WAYLAND)
|
|||||||
set (LIBDECOR_PLUGIN_DIR "\\\"${PATH_TO_SHARED_LIBS}/libdecor/plugins-1\\\" " )
|
set (LIBDECOR_PLUGIN_DIR "\\\"${PATH_TO_SHARED_LIBS}/libdecor/plugins-1\\\" " )
|
||||||
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DLIBDECOR_PLUGIN_DIR=${LIBDECOR_PLUGIN_DIR} ")
|
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DLIBDECOR_PLUGIN_DIR=${LIBDECOR_PLUGIN_DIR} ")
|
||||||
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_SYSTEM_LIBDECOR")
|
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_SYSTEM_LIBDECOR")
|
||||||
|
if (GTK_FOUND)
|
||||||
|
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DHAVE_GTK")
|
||||||
|
endif (GTK_FOUND)
|
||||||
else()
|
else()
|
||||||
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}/../libdecor/src -I${CMAKE_CURRENT_SOURCE_DIR}/../libdecor/src/plugins -DLIBDECOR_PLUGIN_API_VERSION=1 -DLIBDECOR_PLUGIN_DIR=\\\"\\\" ")
|
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}/../libdecor/src -I${CMAKE_CURRENT_SOURCE_DIR}/../libdecor/src/plugins -DLIBDECOR_PLUGIN_API_VERSION=1 -DLIBDECOR_PLUGIN_DIR=\\\"\\\" ")
|
||||||
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_SYSTEM_LIBDECOR=0 -DHAVE_MEMFD_CREATE -DHAVE_MKOSTEMP -DHAVE_POSIX_FALLOCATE")
|
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_SYSTEM_LIBDECOR=0 -DHAVE_MEMFD_CREATE -DHAVE_MKOSTEMP -DHAVE_POSIX_FALLOCATE")
|
||||||
|
|||||||
Reference in New Issue
Block a user