[digesting_libdecor] commit surface after render
parent
86b3f2b554
commit
5d0ae7d673
|
|
@ -178,7 +178,7 @@ const struct wl_seat_listener seat_listener = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
wl_registry_global(void *data, struct wl_registry *wl_registry,
|
registry_global(void *data, struct wl_registry *wl_registry,
|
||||||
uint32_t name, const char *interface,
|
uint32_t name, const char *interface,
|
||||||
uint32_t version){
|
uint32_t version){
|
||||||
if (strcmp(interface, "wl_compositor") == 0){
|
if (strcmp(interface, "wl_compositor") == 0){
|
||||||
|
|
@ -232,23 +232,22 @@ wl_registry_global(void *data, struct wl_registry *wl_registry,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
wl_registry_global_remove(void *data, struct wl_registry *registry,
|
registry_global_remove(void *data, struct wl_registry *registry,
|
||||||
uint32_t name){}
|
uint32_t name){}
|
||||||
|
|
||||||
const struct wl_registry_listener wl_registry_listener = {
|
const struct wl_registry_listener registry_listener = {
|
||||||
wl_registry_global,
|
registry_global,
|
||||||
wl_registry_global_remove,
|
registry_global_remove,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
xdg_surface_configure(void *user_data, struct xdg_surface *xdg_surface, uint32_t serial){
|
xdg_surface_configure(void *user_data, struct xdg_surface *xdg_surface,
|
||||||
|
uint32_t serial){
|
||||||
ctx.has_cached_config = 1;
|
ctx.has_cached_config = 1;
|
||||||
ctx.cached_config.serial = serial;
|
ctx.cached_config.serial = serial;
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct xdg_surface_listener xdg_surface_listener = {
|
const struct xdg_surface_listener xdg_surface_listener = { xdg_surface_configure, };
|
||||||
xdg_surface_configure,
|
|
||||||
};
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
xdg_toplevel_configure(void *user_data, struct xdg_toplevel *xdg_toplevel,
|
xdg_toplevel_configure(void *user_data, struct xdg_toplevel *xdg_toplevel,
|
||||||
|
|
@ -343,7 +342,48 @@ xdg_toplevel_decoration_configure(void *data, struct zxdg_toplevel_decoration_v1
|
||||||
const struct zxdg_toplevel_decoration_v1_listener
|
const struct zxdg_toplevel_decoration_v1_listener
|
||||||
xdg_toplevel_decoration_listener = { xdg_toplevel_decoration_configure };
|
xdg_toplevel_decoration_listener = { xdg_toplevel_decoration_configure };
|
||||||
|
|
||||||
static GtkWidget* find_widget_by_type(GtkWidget *root, enum header_element type);
|
|
||||||
|
|
||||||
|
struct find_widget_variables{
|
||||||
|
char *name;
|
||||||
|
GtkWidget *widget;
|
||||||
|
} find_widget_variables;
|
||||||
|
|
||||||
|
static void
|
||||||
|
fill_widget_from_name(GtkWidget *widget, void *data){
|
||||||
|
struct find_widget_variables *vars = data;
|
||||||
|
if (vars->widget == 0){
|
||||||
|
bool match = false;
|
||||||
|
if (GTK_IS_WIDGET(widget)){
|
||||||
|
GtkStyleContext *style_context = gtk_widget_get_style_context(widget);
|
||||||
|
char *style_str = gtk_style_context_to_string(style_context, GTK_STYLE_CONTEXT_PRINT_SHOW_STYLE);
|
||||||
|
if (strstr(style_str, vars->name) != 0){
|
||||||
|
vars->widget = widget;
|
||||||
|
match = true;
|
||||||
|
}
|
||||||
|
free(style_str);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!match && GTK_IS_CONTAINER(widget)){
|
||||||
|
gtk_container_forall(GTK_CONTAINER(widget), &fill_widget_from_name, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkWidget*
|
||||||
|
find_widget_by_type(GtkWidget *root, enum header_element type){
|
||||||
|
struct find_widget_variables vars = {0};
|
||||||
|
switch (type){
|
||||||
|
case HEADER_FULL: vars.name = "headerbar.titlebar:"; break;
|
||||||
|
case HEADER_TITLE: vars.name = "label.title:"; break;
|
||||||
|
case HEADER_MIN: vars.name = ".minimize"; break;
|
||||||
|
case HEADER_MAX: vars.name = ".maximize"; break;
|
||||||
|
case HEADER_CLOSE: vars.name = ".close"; break;
|
||||||
|
default:break;
|
||||||
|
}
|
||||||
|
fill_widget_from_name(root, &vars);
|
||||||
|
return(vars.widget);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
border_component_reallocate(struct border_component *component, int w, int h){
|
border_component_reallocate(struct border_component *component, int w, int h){
|
||||||
|
|
@ -382,6 +422,7 @@ border_component_reallocate(struct border_component *component, int w, int h){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int main(){
|
int main(){
|
||||||
/* get desktop settings */
|
/* get desktop settings */
|
||||||
ctx.color_scheme = desktop_settings_get_color_scheme();
|
ctx.color_scheme = desktop_settings_get_color_scheme();
|
||||||
|
|
@ -431,7 +472,7 @@ int main(){
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctx.wl_registry != 0){
|
if (ctx.wl_registry != 0){
|
||||||
wl_registry_add_listener(ctx.wl_registry, &wl_registry_listener, 0);
|
wl_registry_add_listener(ctx.wl_registry, ®istry_listener, 0);
|
||||||
|
|
||||||
wl_display_flush(ctx.wl_display);
|
wl_display_flush(ctx.wl_display);
|
||||||
wl_display_dispatch(ctx.wl_display);
|
wl_display_dispatch(ctx.wl_display);
|
||||||
|
|
@ -1001,12 +1042,6 @@ int main(){
|
||||||
extent.h = csd_size.y[0] + ctx.h + 2*SHADOW_MARGIN;
|
extent.h = csd_size.y[0] + ctx.h + 2*SHADOW_MARGIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct wl_region *input_region = wl_compositor_create_region(ctx.wl_compositor);
|
|
||||||
wl_region_add(input_region, 0, 0, extent.w, extent.h);
|
|
||||||
wl_region_subtract(input_region, -extent.x, -extent.y, ctx.w, ctx.h);
|
|
||||||
wl_surface_set_input_region(cmpnt->wl_surface, input_region);
|
|
||||||
wl_region_destroy(input_region);
|
|
||||||
|
|
||||||
border_component_reallocate(cmpnt, extent.w, extent.h);
|
border_component_reallocate(cmpnt, extent.w, extent.h);
|
||||||
memset(cmpnt->data, 0, cmpnt->data_size);
|
memset(cmpnt->data, 0, cmpnt->data_size);
|
||||||
{
|
{
|
||||||
|
|
@ -1149,11 +1184,9 @@ int main(){
|
||||||
xdg_toplevel_set_max_size(ctx.xdg_toplevel, ctx.w, ctx.h);
|
xdg_toplevel_set_max_size(ctx.xdg_toplevel, ctx.w, ctx.h);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
int csd_added_w = csd_size.x[0] + csd_size.x[1];
|
|
||||||
int csd_added_h = csd_size.y[0] + csd_size.y[1];
|
|
||||||
for (int i = 0; i < 2; i += 1){
|
for (int i = 0; i < 2; i += 1){
|
||||||
int mw = true_size_bounds.x[i] + csd_added_w;
|
int mw = true_size_bounds.x[i] + csd_w;
|
||||||
int mh = true_size_bounds.y[i] + csd_added_h;
|
int mh = true_size_bounds.y[i] + csd_h;
|
||||||
if (i == 0){
|
if (i == 0){
|
||||||
xdg_toplevel_set_min_size(ctx.xdg_toplevel, mw, mh);
|
xdg_toplevel_set_min_size(ctx.xdg_toplevel, mw, mh);
|
||||||
}
|
}
|
||||||
|
|
@ -1163,25 +1196,9 @@ int main(){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
xdg_surface_set_window_geometry(ctx.xdg_surface,
|
||||||
Extent2D extent = {0};
|
-csd_size.x[0], -csd_size.y[0],
|
||||||
extent.w = ctx.w;
|
ctx.w + csd_w, ctx.h + csd_h);
|
||||||
extent.h = ctx.h;
|
|
||||||
if (csd){
|
|
||||||
extent.x = -csd_size.x[0];
|
|
||||||
extent.y = -csd_size.y[0];
|
|
||||||
extent.w += csd_size.x[0] + csd_size.x[1];
|
|
||||||
extent.h += csd_size.y[0] + csd_size.y[1];
|
|
||||||
}
|
|
||||||
xdg_surface_set_window_geometry(ctx.xdg_surface, extent.x, extent.y, extent.w, extent.h);
|
|
||||||
}
|
|
||||||
|
|
||||||
wl_surface_commit(ctx.wl_surface);
|
|
||||||
if (ctx.has_cached_config){
|
|
||||||
ctx.has_cached_config = 0;
|
|
||||||
memset(&ctx.cached_config, 0, sizeof ctx.cached_config);
|
|
||||||
xdg_surface_ack_configure(ctx.xdg_surface, ctx.cached_config.serial);
|
|
||||||
}
|
|
||||||
|
|
||||||
wl_egl_window_resize(ctx.wl_egl_window, ctx.w, ctx.h, 0, 0);
|
wl_egl_window_resize(ctx.wl_egl_window, ctx.w, ctx.h, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
@ -1225,6 +1242,14 @@ int main(){
|
||||||
if (!swap_success){
|
if (!swap_success){
|
||||||
printf("eglSwapBuffers failed\n");
|
printf("eglSwapBuffers failed\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ctx.has_cached_config){
|
||||||
|
ctx.has_cached_config = 0;
|
||||||
|
memset(&ctx.cached_config, 0, sizeof ctx.cached_config);
|
||||||
|
xdg_surface_ack_configure(ctx.xdg_surface, ctx.cached_config.serial);
|
||||||
|
}
|
||||||
|
wl_surface_commit(ctx.wl_surface);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
|
|
@ -1262,33 +1287,6 @@ int main(){
|
||||||
* SOFTWARE.
|
* SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//#include "libdecor.c"
|
|
||||||
|
|
||||||
static Extent2D
|
|
||||||
extent2d_from_component_slot(enum component_slot slot, int title_height){
|
|
||||||
Extent2D result = {0};
|
|
||||||
|
|
||||||
switch (slot){
|
|
||||||
default: case COMPONENT_SLOT_NONE: break;
|
|
||||||
|
|
||||||
case COMPONENT_SLOT_SHADOW: {
|
|
||||||
result.x = -(int)SHADOW_MARGIN;
|
|
||||||
result.y = -(int)(SHADOW_MARGIN + title_height);
|
|
||||||
result.w = ctx.w + 2*SHADOW_MARGIN;
|
|
||||||
result.h = title_height + ctx.h + 2*SHADOW_MARGIN;
|
|
||||||
}break;
|
|
||||||
|
|
||||||
case COMPONENT_SLOT_HEADER: {
|
|
||||||
result.x = 0;
|
|
||||||
result.y = -title_height;
|
|
||||||
result.w = ctx.w;
|
|
||||||
result.h = title_height;
|
|
||||||
}break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
//#include "libdecor-cairo-blur.c"
|
//#include "libdecor-cairo-blur.c"
|
||||||
int
|
int
|
||||||
blur_surface(cairo_surface_t *surface, int margin){
|
blur_surface(cairo_surface_t *surface, int margin){
|
||||||
|
|
@ -1617,56 +1615,6 @@ int os_create_anonymous_file(off_t size){
|
||||||
|
|
||||||
//#include "plugins/gtk/libdecor-gtk.c"
|
//#include "plugins/gtk/libdecor-gtk.c"
|
||||||
|
|
||||||
struct find_widget_variables{
|
|
||||||
char *name;
|
|
||||||
GtkWidget *widget;
|
|
||||||
} find_widget_variables;
|
|
||||||
|
|
||||||
static void
|
|
||||||
fill_widget_from_name(GtkWidget *widget, void *data){
|
|
||||||
struct find_widget_variables *vars = data;
|
|
||||||
if (vars->widget == 0){
|
|
||||||
bool match = false;
|
|
||||||
if (GTK_IS_WIDGET(widget)){
|
|
||||||
GtkStyleContext *style_context = gtk_widget_get_style_context(widget);
|
|
||||||
char *style_str = gtk_style_context_to_string(style_context, GTK_STYLE_CONTEXT_PRINT_SHOW_STYLE);
|
|
||||||
if (strstr(style_str, vars->name) != 0){
|
|
||||||
vars->widget = widget;
|
|
||||||
match = true;
|
|
||||||
}
|
|
||||||
free(style_str);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!match && GTK_IS_CONTAINER(widget)){
|
|
||||||
gtk_container_forall(GTK_CONTAINER(widget), &fill_widget_from_name, data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static GtkWidget*
|
|
||||||
find_widget_by_type(GtkWidget *root, enum header_element type){
|
|
||||||
struct find_widget_variables vars = {0};
|
|
||||||
switch (type){
|
|
||||||
case HEADER_FULL: vars.name = "headerbar.titlebar:"; break;
|
|
||||||
case HEADER_TITLE: vars.name = "label.title:"; break;
|
|
||||||
case HEADER_MIN: vars.name = ".minimize"; break;
|
|
||||||
case HEADER_MAX: vars.name = ".maximize"; break;
|
|
||||||
case HEADER_CLOSE: vars.name = ".close"; break;
|
|
||||||
default:break;
|
|
||||||
}
|
|
||||||
fill_widget_from_name(root, &vars);
|
|
||||||
return(vars.widget);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool
|
|
||||||
own_proxy(void *proxy){
|
|
||||||
bool result = false;
|
|
||||||
if (proxy != 0){
|
|
||||||
result = (wl_proxy_get_tag((struct wl_proxy*)proxy) == &libdecor_gtk_proxy_tag);
|
|
||||||
}
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
toggle_maximized(void){
|
toggle_maximized(void){
|
||||||
if (ctx.frame_window_state & LIBDECOR_WINDOW_STATE_MAXIMIZED){
|
if (ctx.frame_window_state & LIBDECOR_WINDOW_STATE_MAXIMIZED){
|
||||||
|
|
@ -1839,17 +1787,15 @@ edge_from_pos(int x, int y){
|
||||||
|
|
||||||
//#include "desktop-settings.c"
|
//#include "desktop-settings.c"
|
||||||
|
|
||||||
static bool
|
static int
|
||||||
get_cursor_settings_from_env(char **theme, int *size){
|
get_cursor_settings_from_env(char **theme, int *size){
|
||||||
char *env_xtheme = getenv("XCURSOR_THEME");
|
char *env_xtheme = getenv("XCURSOR_THEME");
|
||||||
char *env_xsize = getenv("XCURSOR_SIZE");
|
char *env_xsize = getenv("XCURSOR_SIZE");
|
||||||
bool got_theme = (env_xtheme != 0 && env_xsize != 0);
|
int got_theme = (env_xtheme != 0 && env_xsize != 0);
|
||||||
|
|
||||||
if (got_theme){
|
if (got_theme){
|
||||||
*theme = strdup(env_xtheme);
|
*theme = strdup(env_xtheme);
|
||||||
*size = atoi(env_xsize);
|
*size = atoi(env_xsize);
|
||||||
}
|
}
|
||||||
|
|
||||||
return(got_theme);
|
return(got_theme);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1915,10 +1861,8 @@ desktop_settings_get_cursor_settings(char **theme, int *size){
|
||||||
const char *value_theme = 0;
|
const char *value_theme = 0;
|
||||||
|
|
||||||
DBusError error;
|
DBusError error;
|
||||||
DBusConnection *connection;
|
|
||||||
|
|
||||||
dbus_error_init(&error);
|
dbus_error_init(&error);
|
||||||
connection = dbus_bus_get(DBUS_BUS_SESSION, &error);
|
DBusConnection *connection = dbus_bus_get(DBUS_BUS_SESSION, &error);
|
||||||
|
|
||||||
if (!dbus_error_is_set(&error)){
|
if (!dbus_error_is_set(&error)){
|
||||||
DBusMessage *reply = get_setting_sync(connection, name, key_theme);
|
DBusMessage *reply = get_setting_sync(connection, name, key_theme);
|
||||||
|
|
@ -1954,14 +1898,11 @@ desktop_settings_get_color_scheme(){
|
||||||
uint32_t color = 0;
|
uint32_t color = 0;
|
||||||
|
|
||||||
DBusError error;
|
DBusError error;
|
||||||
DBusConnection *connection;
|
|
||||||
DBusMessage *reply;
|
|
||||||
|
|
||||||
dbus_error_init(&error);
|
dbus_error_init(&error);
|
||||||
connection = dbus_bus_get(DBUS_BUS_SESSION, &error);
|
DBusConnection *connection = dbus_bus_get(DBUS_BUS_SESSION, &error);
|
||||||
|
|
||||||
if (!dbus_error_is_set(&error)){
|
if (!dbus_error_is_set(&error)){
|
||||||
reply = get_setting_sync(connection, name, key_color_scheme);
|
DBusMessage *reply = get_setting_sync(connection, name, key_color_scheme);
|
||||||
if (reply){
|
if (reply){
|
||||||
if (!parse_type(reply, DBUS_TYPE_UINT32, &color)) {
|
if (!parse_type(reply, DBUS_TYPE_UINT32, &color)) {
|
||||||
color = 0;
|
color = 0;
|
||||||
|
|
@ -1969,7 +1910,6 @@ desktop_settings_get_color_scheme(){
|
||||||
dbus_message_unref(reply);
|
dbus_message_unref(reply);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return(color);
|
return(color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -244,29 +244,8 @@ bool desktop_settings_get_cursor_settings(char **theme, in
|
||||||
enum libdecor_color_scheme desktop_settings_get_color_scheme();
|
enum libdecor_color_scheme desktop_settings_get_color_scheme();
|
||||||
|
|
||||||
// #include "os-compatibility.h"
|
// #include "os-compatibility.h"
|
||||||
|
|
||||||
int os_create_anonymous_file(off_t size);
|
int os_create_anonymous_file(off_t size);
|
||||||
|
|
||||||
// #include "libdecor.c"
|
|
||||||
|
|
||||||
static void init_shell_surface(void);
|
|
||||||
|
|
||||||
static void do_map(void);
|
|
||||||
|
|
||||||
// #include "plugins/gtk/libdecor-gtk.c"
|
|
||||||
|
|
||||||
static const char *libdecor_gtk_proxy_tag = "libdecor-gtk";
|
|
||||||
|
|
||||||
static struct wl_cursor* wl_cursor_from_pos(int x, int y);
|
|
||||||
static void draw_header_button(cairo_t *cr, cairo_surface_t *surface, enum header_element button_type);
|
|
||||||
|
|
||||||
static bool own_proxy(void *proxy);
|
|
||||||
static struct header_element_data get_header_focus(const GtkHeaderBar *header_bar, int x, int y);
|
|
||||||
static void draw_title_bar(void);
|
|
||||||
static enum libdecor_resize_edge edge_from_pos(int x, int y);
|
|
||||||
static void toggle_maximized(void);
|
|
||||||
static void update_touch_focus(struct seat *seat, wl_fixed_t x, wl_fixed_t y);
|
|
||||||
|
|
||||||
// digesting_libdecor
|
// digesting_libdecor
|
||||||
|
|
||||||
typedef struct Ctx{
|
typedef struct Ctx{
|
||||||
|
|
@ -365,4 +344,10 @@ typedef struct Ctx{
|
||||||
int csd_show_title_from_state(enum libdecor_window_state state);
|
int csd_show_title_from_state(enum libdecor_window_state state);
|
||||||
int csd_show_shadow_from_state(enum libdecor_window_state state);
|
int csd_show_shadow_from_state(enum libdecor_window_state state);
|
||||||
|
|
||||||
|
static const char *libdecor_gtk_proxy_tag = "libdecor-gtk";
|
||||||
|
|
||||||
|
static void draw_header_button(cairo_t *cr, cairo_surface_t *surface, enum header_element button_type);
|
||||||
|
static enum libdecor_resize_edge edge_from_pos(int x, int y);
|
||||||
|
static void toggle_maximized(void);
|
||||||
|
|
||||||
#endif //DIGESTING_LIBDECOR_H
|
#endif //DIGESTING_LIBDECOR_H
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue