summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2024-01-21 08:30:49 +0100
committerManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2024-01-21 08:30:49 +0100
commit2fbf5bed0db2aec0ef6462d58150a40064f0333b (patch)
tree91b35518e8ee3abecf2c11125d3ea28124e576ed /src
parentb5b839e4f00f5cb0dde2de165ebb7c4bcbf65c3c (diff)
Fix "Wayland: crash with set_menu_window()" (#892)
Fixes also a similar crash occuring after use of set_tooltip_window(). Two bool member variables are added to class Fl_Window_Driver to indicate true FLTK menu windows (i.e., created by Fl_Menu_Item::pulldown()) and true FLTK tooltip windows (i.e., Fl_Tooltip).
Diffstat (limited to 'src')
-rw-r--r--src/Fl_Menu.cxx7
-rw-r--r--src/Fl_Tooltip.cxx2
-rw-r--r--src/Fl_Window_Driver.H2
-rw-r--r--src/Fl_Window_Driver.cxx2
-rw-r--r--src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx3
5 files changed, 12 insertions, 4 deletions
diff --git a/src/Fl_Menu.cxx b/src/Fl_Menu.cxx
index 3a3e70708..115e69fe7 100644
--- a/src/Fl_Menu.cxx
+++ b/src/Fl_Menu.cxx
@@ -115,6 +115,7 @@ protected:
Fl_Menu_Window(X, Y, W, H, 0) {
menu = m;
set_menu_window();
+ Fl_Window_Driver::driver(this)->fltk_menu_window = true;
end();
set_modal();
clear_border();
@@ -183,13 +184,13 @@ Fl_Window *Fl_Window_Driver::menu_parent(int *display_height) {
}
static menuwindow *to_menuwindow(Fl_Window *win) {
- if (!win->menu_window()) return NULL;
+ if (!Fl_Window_Driver::driver(win)->fltk_menu_window) return false;
return ((window_with_items*)win)->as_menuwindow();
}
/** Returns whether win is a menutitle window */
bool Fl_Window_Driver::is_menutitle(Fl_Window *win) {
- if (!win->menu_window()) return false;
+ if (!Fl_Window_Driver::driver(win)->fltk_menu_window) return false;
return (((window_with_items*)win)->as_menuwindow() == NULL);
}
@@ -233,7 +234,7 @@ int *Fl_Window_Driver::menu_offset_y(Fl_Window *win) {
/** Returns whether win is a non-menubar menutitle */
bool Fl_Window_Driver::is_floating_title(Fl_Window *win) {
- if (!win->menu_window()) return false;
+ if (!Fl_Window_Driver::driver(win)->fltk_menu_window) return false;
Fl_Window *mwin = ((window_with_items*)win)->as_menuwindow();
return !mwin && !((menutitle*)win)->in_menubar;
}
diff --git a/src/Fl_Tooltip.cxx b/src/Fl_Tooltip.cxx
index f77b668e9..1be2078bf 100644
--- a/src/Fl_Tooltip.cxx
+++ b/src/Fl_Tooltip.cxx
@@ -20,6 +20,7 @@
#include <FL/Fl.H>
#include <FL/fl_string_functions.h>
#include "Fl_System_Driver.H"
+#include "Fl_Window_Driver.H"
#include <stdio.h>
@@ -50,6 +51,7 @@ public:
Fl_TooltipBox() : Fl_Menu_Window(0, 0) {
set_override();
set_tooltip_window();
+ Fl_Window_Driver::driver(this)->fltk_tooltip_window = true;
end();
}
void draw() FL_OVERRIDE;
diff --git a/src/Fl_Window_Driver.H b/src/Fl_Window_Driver.H
index 43eee2227..5892a3a31 100644
--- a/src/Fl_Window_Driver.H
+++ b/src/Fl_Window_Driver.H
@@ -65,6 +65,8 @@ public:
static fl_uintptr_t xid(const Fl_Window *win);
static Fl_Window *find(fl_uintptr_t xid);
int wait_for_expose_value;
+ bool fltk_menu_window; // true for FLTK menu window
+ bool fltk_tooltip_window; // true for FLTK tooltip window
Fl_Image_Surface *other_xid; // offscreen bitmap (overlay and double-buffered windows)
int screen_num();
void screen_num(int n) { screen_num_ = n; }
diff --git a/src/Fl_Window_Driver.cxx b/src/Fl_Window_Driver.cxx
index c09581625..d4ca4647d 100644
--- a/src/Fl_Window_Driver.cxx
+++ b/src/Fl_Window_Driver.cxx
@@ -43,6 +43,8 @@ Fl_Window_Driver::Fl_Window_Driver(Fl_Window *win)
wait_for_expose_value = 0;
other_xid = 0;
screen_num_ = 0;
+ fltk_menu_window = false;
+ fltk_tooltip_window = false;
}
diff --git a/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx b/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
index 9b04779cb..7bdf30f2b 100644
--- a/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
+++ b/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
@@ -1394,12 +1394,13 @@ void Fl_Wayland_Window_Driver::makeWindow()
// put transient scale win at center of top window by making it a tooltip of top
Fl_Screen_Driver::transient_scale_parent = Fl::first_window();
pWindow->set_tooltip_window();
+ fltk_tooltip_window = true;
pWindow->position(
(Fl_Screen_Driver::transient_scale_parent->w() - pWindow->w())/2 ,
(Fl_Screen_Driver::transient_scale_parent->h() - pWindow->h())/2);
}
- if (pWindow->menu_window() || pWindow->tooltip_window()) { // a menu window or tooltip
+ if (fltk_menu_window || fltk_tooltip_window) { // a menu window or tooltip
is_floatingtitle = process_menu_or_tooltip(new_window);
} else if (pWindow->border() && !pWindow->parent() ) { // a decorated window