Skip to content

Commit 9898146

Browse files
vtyrtovTurboGit
authored andcommitted
colorlabels: use GtkPopover for rename popup on Wayland; keep GtkWindow on other backends
1 parent 4589cd1 commit 9898146

File tree

1 file changed

+46
-25
lines changed

1 file changed

+46
-25
lines changed

src/libs/tools/colorlabels.c

Lines changed: 46 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@
3030
#include "osx/osx.h"
3131
#endif
3232

33+
#ifdef GDK_WINDOWING_WAYLAND
34+
#include <gdk/gdkwayland.h>
35+
#endif
36+
3337
DT_MODULE(1)
3438

3539
typedef struct dt_lib_colorlabels_t
@@ -212,37 +216,54 @@ static void _lib_colorlabels_edit(dt_lib_module_t *self,
212216

213217
GtkWidget *window = dt_ui_main_window(darktable.gui->ui);
214218

215-
const gint x = event->x_root;
216-
const gint y = event->y_root - DT_PIXEL_APPLY_DPI(50);
217-
218-
d->floating_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
219-
#ifdef GDK_WINDOWING_QUARTZ
220-
dt_osx_disallow_fullscreen(d->floating_window);
219+
// On Wayland, manual positioning via gtk_window_move() is unreliable and can trigger protocol warnings.
220+
// We instead create a GtkPopover anchored to the clicked color label button. On other backends keep
221+
// the existing lightweight undecorated GtkWindow approach.
222+
gboolean use_popover = FALSE;
223+
#ifdef GDK_WINDOWING_WAYLAND
224+
use_popover = GDK_IS_WAYLAND_DISPLAY(gtk_widget_get_display(window));
221225
#endif
222-
/* stackoverflow.com/questions/1925568/how-to-give-keyboard-focus-to-a-pop-up-gtk-window */
223-
gtk_widget_set_can_focus(d->floating_window, TRUE);
224-
gtk_window_set_decorated(GTK_WINDOW(d->floating_window), FALSE);
225-
gtk_window_set_type_hint(GTK_WINDOW(d->floating_window), GDK_WINDOW_TYPE_HINT_POPUP_MENU);
226-
gtk_window_set_transient_for(GTK_WINDOW(d->floating_window), GTK_WINDOW(window));
227-
gtk_widget_set_opacity(d->floating_window, 0.8);
228-
gtk_window_move(GTK_WINDOW(d->floating_window), x, y);
229226

230227
GtkWidget *entry = gtk_entry_new();
231228
gtk_widget_set_size_request(entry, FLOATING_ENTRY_WIDTH, -1);
232229
gtk_widget_add_events(entry, GDK_FOCUS_CHANGE_MASK);
233-
234230
gtk_editable_select_region(GTK_EDITABLE(entry), 0, -1);
235-
gtk_container_add(GTK_CONTAINER(d->floating_window), entry);
236-
g_signal_connect(entry, "focus-out-event",
237-
G_CALLBACK(_lib_colorlabels_destroy), self);
238-
g_signal_connect(entry, "key-press-event",
239-
G_CALLBACK(_lib_colorlabels_key_press), self);
240-
gtk_widget_set_tooltip_text(entry,
241-
_("enter a description of how you use this color label"));
242-
243-
gtk_widget_show_all(d->floating_window);
244-
gtk_widget_grab_focus(entry);
245-
gtk_window_present(GTK_WINDOW(d->floating_window));
231+
g_signal_connect(entry, "focus-out-event", G_CALLBACK(_lib_colorlabels_destroy), self);
232+
g_signal_connect(entry, "key-press-event", G_CALLBACK(_lib_colorlabels_key_press), self);
233+
gtk_widget_set_tooltip_text(entry, _("enter a description of how you use this color label"));
234+
235+
if(use_popover)
236+
{
237+
// Wayland path: use GtkPopover anchored to the clicked color label button for proper xdg_popup semantics
238+
GtkWidget *button = d->buttons[d->colorlabel];
239+
d->floating_window = gtk_popover_new(button);
240+
gtk_popover_set_modal(GTK_POPOVER(d->floating_window), TRUE);
241+
gtk_popover_set_position(GTK_POPOVER(d->floating_window), GTK_POS_TOP);
242+
gtk_container_add(GTK_CONTAINER(d->floating_window), entry);
243+
gtk_widget_show_all(d->floating_window);
244+
gtk_widget_grab_focus(entry);
245+
}
246+
else
247+
{
248+
// Legacy/X11 path: keep undecorated popup GtkWindow
249+
const gint x = event->x_root;
250+
const gint y = event->y_root - DT_PIXEL_APPLY_DPI(50);
251+
252+
d->floating_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
253+
#ifdef GDK_WINDOWING_QUARTZ
254+
dt_osx_disallow_fullscreen(d->floating_window);
255+
#endif
256+
gtk_widget_set_can_focus(d->floating_window, TRUE);
257+
gtk_window_set_decorated(GTK_WINDOW(d->floating_window), FALSE);
258+
gtk_window_set_type_hint(GTK_WINDOW(d->floating_window), GDK_WINDOW_TYPE_HINT_POPUP_MENU);
259+
gtk_window_set_transient_for(GTK_WINDOW(d->floating_window), GTK_WINDOW(window));
260+
gtk_widget_set_opacity(d->floating_window, 0.8);
261+
gtk_container_add(GTK_CONTAINER(d->floating_window), entry);
262+
gtk_widget_show_all(d->floating_window);
263+
gtk_window_move(GTK_WINDOW(d->floating_window), x, y);
264+
gtk_widget_grab_focus(entry);
265+
gtk_window_present(GTK_WINDOW(d->floating_window));
266+
}
246267
}
247268

248269
static void _lib_colorlabels_button_clicked_callback(GtkWidget *w,

0 commit comments

Comments
 (0)