< prev index next >

src/java.desktop/unix/classes/sun/awt/X11/GtkFileDialogPeer.java

Print this page

        

@@ -40,10 +40,12 @@
 
     private final FileDialog fd;
 
     // A pointer to the native GTK FileChooser widget
     private volatile long widget = 0L;
+    private long standaloneWindow;
+    private volatile boolean quit;
 
     GtkFileDialogPeer(FileDialog fd) {
         super(fd);
         this.fd = fd;
     }

@@ -109,13 +111,15 @@
 
     @Override
     public void setVisible(boolean b) {
         XToolkit.awtLock();
         try {
+            quit = !b;
             if (b) {
                 Runnable task = () -> {
                     showNativeDialog();
+                    standaloneWindow = 0;
                     fd.setVisible(false);
                 };
                 new ManagedLocalsThread(task).start();
             } else {
                 quit();

@@ -126,11 +130,18 @@
         }
     }
 
     @Override
     public void dispose() {
+        XToolkit.awtLock();
+        try {
+            quit = true;
         quit();
+        }
+        finally {
+            XToolkit.awtUnlock();
+        }
         super.dispose();
     }
 
     @Override
     public void setDirectory(String dir) {

@@ -142,10 +153,21 @@
     public void setFile(String file) {
         // We do not implement this method because we
         // have delegated to FileDialog#setFile
     }
 
+    protected void requestXFocus(long time, boolean timeProvided) {
+        if(standaloneWindow == 0) {
+            super.requestXFocus(time, timeProvided);
+            return;
+        }
+        XNETProtocol net_protocol = XWM.getWM().getNETProtocol();
+        if (net_protocol != null) {
+            net_protocol.setActiveWindow(standaloneWindow);
+        }
+    }
+
     @Override
     public void setFilenameFilter(FilenameFilter filter) {
         // We do not implement this method because we
         // have delegated to FileDialog#setFilenameFilter
     }

@@ -168,9 +190,23 @@
                 filename = file.getName();
                 // Directory path for gtk_file_chooser_set_current_folder.
                 dirname = file.getParent();
             }
         }
+        if (!quit) {
         run(fd.getTitle(), fd.getMode(), dirname, filename,
             fd.getFilenameFilter(), fd.isMultipleMode(), fd.getX(), fd.getY());
     }
+    }
+
+    /**
+     * Called by native code when GTK dialog is created.
+     */
+    boolean setWindow(long xid) {
+        if (!quit && widget != 0) {
+            standaloneWindow = xid;
+            requestXFocus();
+            return true;
+        }
+        return false;
+    }
 }
< prev index next >