Open_dialog with a transient parent

question

#1

How exactly do I use Gtk.open_dialog from Gtk with a parent, and avoid this:

Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.

Any MWE would be great, thanks!


#2

How do you user open_dialog right now?
https://developer.gnome.org/gtk3/stable/GtkWindow.html
has a paragraph about
gtk_window_set_transient_for ()
and i’d guess this should be used to give a modal window like the dialog a parent.


#3

Thanks for the tip, but I’m still not sure how I can specify that there is no parent window. What I do now is:

txtfile = open_dialog("Pick a `.txt` file", Null(), ("*.txt",))

#4

and open_dialog is from where?


#5

OMG, sorry: Gtk.


#6

https://github.com/JuliaGraphics/Gtk.jl/blob/5d12682c9ffa75f7ff5e24d352643e61d9ce10ba/docs/src/manual/filedialogs.md says the second argument is the parent container.


#7

Yea, but if I use their example, I still get that warning:

julia> using Gtk

julia> open_dialog("title", GtkNullContainer(), String[])
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.

Maybe there is no way to circumvent that warning?


#8

The warning is there, because a Null container is somehow a non-window and therefore the parent is missing. Digging a little bit deeper: the warning shows up to inform you, that with a setup like this your window manager might not be able to manage the dialog window which can have strange side effects like sticking on your screen (happens a lot with tool tips from Gtk on windows).


#9

I see. So it’s there to stick, unless I give it a real parent. But is there a clean simple way to do that? Like what would be the correct way to use open_dialog if that is the only need we have to communication with the user?


#10

Afair (i haven’t done gtk application development for some time), a well behaving gtk GUI application should have an top-level application window to which you add menu, dialogs etc. If you only call open_dialog to ask for input and your application is terminal only, i’d guess you can live with the warning.


#11

yes, this is the way I do this as well. The advantage when passing the top-level window is that one can set the dialog to be modal.


#12

It makes sense. I guess one way “around it” is to open a transparent window as a default parent and kill it with the dialog.


#13

I‘ve got a similar (same) problem when I carry out the following steps:
Step 1
Loading the main program. Opening the main GtkWindow.

Step 2
Try to open a file via a button (→ load a file) which opens the dialog box:
as a result: the loading action sticks with a message:

Gtk-Message: 14:40:16.416: GtkDialog mapped without a transient parent. This is discouraged.

Step 3
Now loading the file from console without closing the GtkWindow:

julia> file = open_dialog(“Pick a file”, Null(), ("*.jld2",))
Gtk-Message: 14:43:52.239: GtkDialog mapped without a transient parent. This is discouraged.
“D:\WORK\ResultsNew\233=010.jld2”
julia> load_para1(file)
load_profilemodel_type(): >>>>>>>>>>>>> 233=010
load_para1(file): >>>>>>>>>>>>>>>>>>> done
julia>

All parameter loaded!

Step 4
Set the focus on the main GtkWindow. Repeat the loading process via button and the open_dialog box. Now, all data are loaded without a message:

Gtk-Message: 14:43:52.239: GtkDialog mapped without a transient parent. This is discouraged.

What‘s wrong? Is there a workaround to get rid of the Gtk-WARNING message?

Same behavior if I apply:

file = open_dialog("Choose a file", GtkNullContainer(), ("*.jld2, *.jl",), select_multiple=false)

(btw. What the difference between Null() vs GtkNullContainer() ?)


#14

you should pass the GtkWindow from your main program as the second argument to the open_dialog. Then you won’t get the warning.


#15

:clap:


#16
# Test of Julia-Gtk messaging
using Gtk
win = GtkWindow("Test")
res = ask_dialog("Hello", win, "OK", "No") && println("Done.")
# This gives the fatal error
#=(<unknown>:2724): Gtk-CRITICAL **: 20:46:30.936: gtk_message_dialog_new: assertion 'parent == NULL || GTK_IS_WINDOW (parent)' failed
ERROR: LoadError: Cannot construct GtkMessageDialogLeaf with a NULL pointer
=#
res = ask_dialog("Hello", "OK", "No") && println("Done.")
# This works but gives the warning
# Gtk-Message: 20:47:24.154: GtkDialog mapped without a transient parent. This is discouraged.

How should the first one be modified to work?