gnunn1 / tilix

A tiling terminal emulator for Linux using GTK+ 3
https://gnunn1.github.io/tilix-web
Mozilla Public License 2.0
5.4k stars 294 forks source link

Drag and drop new window in wayland broken #1906

Open stefabat opened 4 years ago

stefabat commented 4 years ago

As described by the title, the expected behavior is (recorded in a GNOME Xorg session)

tilix_Xorg

It does not work in wayland, instead tilix just hangs and after a while I get the typical prompt where I can either wait or force-quit it.

OS: Manjaro Gnome 3.36.2 Kernel 5.6.15 Tilix 1.9.1 Wayland 1.18.0

rcgoodfellow commented 3 years ago

Same issue here. This is a deal breaker for tilix. When I've got days worth of terminal sessions going and tilix locks up - I have to go retrace several days worth of what I was doing which is extremely aggravating.

OS: Fedora 33 Gnome: 3.38.1 Kernel: 5.9.8 Tilix: 1.9.3 Wayland: 1.18.0

luk1337 commented 2 years ago

If someone is looking for quick/lazy hack for this issue:

diff --git a/source/gx/tilix/terminal/terminal.d b/source/gx/tilix/terminal/terminal.d
index d5678ce6..8a69f058 100644
--- a/source/gx/tilix/terminal/terminal.d
+++ b/source/gx/tilix/terminal/terminal.d
@@ -3168,8 +3168,7 @@ private:
         vte.dragDestSet(DestDefaults.ALL, targets, DragAction.COPY | DragAction.MOVE);

         // This is required to be able to drop on root window in Wayland, see gtknotebook.c
-        TargetEntry rootEntry = new TargetEntry("application/x-rootwindow-drop", 0, 0);
-        dragSourceSet(ModifierType.BUTTON1_MASK, [vteEntry, rootEntry], DragAction.MOVE);
+        dragSourceSet(ModifierType.BUTTON1_MASK, [vteEntry], DragAction.MOVE);

         //Title bar events
         addOnDragBegin(&onTitleDragBegin);
@@ -3270,11 +3269,9 @@ private:
                 dragImage = null;
             }
         }
-        if (dr == GtkDragResult.NO_TARGET) {
-            //Only allow detach if whole hierarchy agrees (application, window, session)
-            if (notifyIsActionAllowed(ActionType.DETACH_TERMINAL)) {
-                if (detachTerminalOnDrop(dc)) return true;
-            }
+        //Only allow detach if whole hierarchy agrees (application, window, session)
+        if (notifyIsActionAllowed(ActionType.DETACH_TERMINAL)) {
+            if (detachTerminalOnDrop(dc)) return true;
         }
         return false;
     }
luk1337 commented 2 years ago

FYI: I opened a pull request that drops GtkDragResult check as that makes sense, but I don't quite understand why rootEntry has to be removed from targetList.