libdecor: add recent upstream changes in GTK plugin (31 may 2022 - d4f16da1)

This commit is contained in:
ManoloFLTK 2022-06-04 14:44:41 +02:00
parent a7de80d6f7
commit 831d8b5a58
1 changed files with 30 additions and 62 deletions

View File

@ -1,6 +1,6 @@
/*
* Copyright © 2018 Jonas Ådahl
* Copyright © 2019 Christian Rauch
* Copyright © 2021 Christian Rauch
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
@ -1380,6 +1380,8 @@ draw_title_bar(struct libdecor_frame_gtk *frame_gtk)
GtkAllocation allocation = {0, 0, frame_gtk->content_width, 0};
enum libdecor_window_state state;
GtkStyleContext *style;
int pref_width;
int current_min_w, current_min_h, W, H;
state = libdecor_frame_get_window_state((struct libdecor_frame*)frame_gtk);
style = gtk_widget_get_style_context(frame_gtk->window);
@ -1398,59 +1400,30 @@ draw_title_bar(struct libdecor_frame_gtk *frame_gtk)
gtk_widget_show_all(frame_gtk->window);
gtk_header_bar_set_title(GTK_HEADER_BAR(frame_gtk->header), libdecor_frame_get_title(&frame_gtk->frame));
/* set default width, using an empty title to estimate its smallest admissible value */
gtk_header_bar_set_title(GTK_HEADER_BAR(frame_gtk->header), "");
gtk_widget_get_preferred_width(frame_gtk->header, NULL, &pref_width);
gtk_header_bar_set_title(GTK_HEADER_BAR(frame_gtk->header),
libdecor_frame_get_title(&frame_gtk->frame));
libdecor_frame_get_min_content_size(&frame_gtk->frame, &current_min_w, &current_min_h);
if (current_min_w < pref_width) {
current_min_w = pref_width;
libdecor_frame_set_min_content_size(&frame_gtk->frame, current_min_w, current_min_h);
}
W = libdecor_frame_get_content_width(&frame_gtk->frame);
H = libdecor_frame_get_content_height(&frame_gtk->frame);
if (W < current_min_w) {
W = current_min_w;
struct libdecor_state *libdecor_state = libdecor_state_new(W, H);
libdecor_frame_commit(&frame_gtk->frame, libdecor_state, NULL);
libdecor_state_free(libdecor_state);
return;
}
/* set default height */
gtk_widget_get_preferred_height(frame_gtk->header, NULL, &allocation.height);
#if ! APPLY_FLTK_CHANGES
int pref_width;
gtk_widget_get_preferred_width(frame_gtk->header, NULL, &pref_width);
libdecor_frame_set_min_content_size(&frame_gtk->frame, pref_width, 1);
gtk_widget_size_allocate(frame_gtk->header, &allocation);
#else // new code for FLTK
//int min_GTK_width = 15;
// Comment out to remove need for hiding (see below) warnings sent to stderr
// just enough space not to create: Gtk-WARNING **: Negative content width ……
int min_GTK_width = 134;
if (!libdecor_frame_has_capability(&frame_gtk->frame, LIBDECOR_ACTION_FULLSCREEN))
min_GTK_width = 100; // no maximize button, window can be narrower
int current_min_w, current_min_h;
libdecor_frame_get_min_content_size(&frame_gtk->frame, &current_min_w, &current_min_h);
bool need_change = false;
if (current_min_w < min_GTK_width) {
current_min_w = min_GTK_width;
need_change = true;
}
if (current_min_h < 1) {
current_min_h = 1;
need_change = true;
}
if (need_change) {
libdecor_frame_set_min_content_size(&frame_gtk->frame, current_min_w, current_min_h);
if (!libdecor_frame_has_capability(&frame_gtk->frame, LIBDECOR_ACTION_FULLSCREEN)) {
libdecor_frame_set_max_content_size(&frame_gtk->frame, current_min_w, current_min_h);
}
}
int W = libdecor_frame_get_content_width(&frame_gtk->frame);
int H = libdecor_frame_get_content_height(&frame_gtk->frame);
need_change = false;
if (W < current_min_w) {W = current_min_w; need_change=true;}
if (H < current_min_h) {H = current_min_h; need_change=true;}
if (need_change) {
struct libdecor_state *libdecor_state = libdecor_state_new(W, H);
libdecor_frame_commit(&frame_gtk->frame, libdecor_state, NULL);
libdecor_state_free(libdecor_state);
return;
}
// hack to hide "Gtk-WARNING **: Negative content width" sent to stderr
/*static FILE *null_stderr = NULL;
if (!null_stderr) null_stderr = fopen("/dev/null", "w+");
FILE *old_stderr = stderr;
stderr = null_stderr;*/
gtk_widget_size_allocate(frame_gtk->header, &allocation); // warnings are sent here
//stderr = old_stderr;
#endif // end of new code for FLTK
gtk_widget_size_allocate(frame_gtk->header, &allocation);
draw_border_component(frame_gtk, &frame_gtk->headerbar, HEADER);
}
@ -2284,22 +2257,18 @@ pointer_button(void *data,
break;
case HEADER_CLOSE:
if (closeable(frame_gtk))
#if APPLY_FLTK_CHANGES
{libdecor_frame_close(&frame_gtk->frame);
frame_gtk->header = NULL; // marks deletion
return;
}
#else
libdecor_frame_close(&frame_gtk->frame);
#endif
libdecor_frame_close(
&frame_gtk->frame);
break;
default:
break;
}
/* unset active/clicked state once released */
frame_gtk->hdr_focus.state &= ~GTK_STATE_FLAG_ACTIVE;
draw_title_bar(frame_gtk);
libdecor_frame_toplevel_commit(&frame_gtk->frame);
if (GTK_IS_WIDGET(frame_gtk->header)) {
draw_title_bar(frame_gtk);
libdecor_frame_toplevel_commit(&frame_gtk->frame);
}
break;
default:
break;
@ -2663,7 +2632,6 @@ libdecor_plugin_new(struct libdecor *context)
"GTK cannot connect to Wayland compositor");
return NULL;
}
gtk_init(NULL, NULL);
return &plugin_gtk->plugin;
}