Re: [gtk-list] Modality




On Tue, 10 Aug 1999, Timothy M. Shead wrote:
> 
> ... so my intent here is that window2 should capture all input / prevent you
> from bringing window1 to the top of the Z order, etc.  But it doesn't work.
> Do I have the wrong technique, or does "modal" mean something different in
> Gtk?
> 

Lee has it right that to make a window modal you want to use
gtk_window_set_modal(). Modality in Gtk means that the window is the only
one that can receive input; try clicking widgets in the other window, they
won't respond.

You will also want to tell the window manager that the modal dialog is a
"child" of the window the user was previously interacting with; call
gtk_window_set_transient_for() to do this. Most window managers will then
keep the window on top of the parent, maybe center the child window, etc;
this is all up to the window manager though. Just don't worry about the
exact behavior since it's not your problem if the user runs a sucky WM.

You can "stack" dialogs with transient for relationships; that is, say you
pop up a dialog from the main app window, make it transient for the main
window; if the dialog causes a new dialog to appear, make the new dialog
transient for the first dialog; etc. Gtk keeps a "Modal widget stack" so
if you set a second window modal, it will get exclusive input until you
unset it, then the previous modal window will become the active one, etc.

Another useful thing to do is call gtk_widget_set_sensitive(window, FALSE)
on the non-active windows, so the user can tell they won't accept input. 

A nice way to code all this I thought of the other day is:

 static GSList* modal_stack = NULL;

 void my_app_push_modal(GtkWindow* win)
 {
   GtkWindow* parent = modal_stack ? modal_stack->data : NULL;
   modal_stack = g_slist_prepend(modal_stack, win);

   if (parent)
    gtk_window_set_transient_for(win, parent);

   gtk_window_set_modal(win, TRUE);
   gtk_window_set_sensitive(win, FALSE);
 }

 void my_app_pop_modal()
 {
  /* undo all the above, you can guess */

 }

Haven't tried that in practice but I think it might be nice. If you wanted
you could associate one "modal stack" with each main app window.

Havoc




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]