# Dialog that pops up when window busy

**URL:** <https://www.ruby-forum.com/t/dialog-that-pops-up-when-window-busy/52119>\
**Category:** Ruby\
**Created:** [January 11, 2006, 2:57am UTC](https://www.ruby-forum.com/t/dialog-that-pops-up-when-window-busy/52119 "2006-01-11T02:57:16Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![joe-dumoulin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9dc877/32.png) [@joe-dumoulin](https://www.ruby-forum.com/u/joe-dumoulin)\
**Post date:** [January 11, 2006, 2:57am UTC](https://www.ruby-forum.com/t/dialog-that-pops-up-when-window-busy/52119/1 "2006-01-11T02:57:16Z")

</div>

Hi,

In my window, I sometimes want to prevent the user from doing anything  
while an action is occuring. So I want to disable the window (using  
Gtk::Widget#sensitive).

But I also want to popup a little dialog saying why the window is  
being disabled (and perhaps have a little progress indicator on it).

Are there any Gtk widgets that could help me, or do I need to make a  
custom dialog box for this?

---

<div class="post-metadata">

**Author:** ![joe-dumoulin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9dc877/32.png) [@joe-dumoulin](https://www.ruby-forum.com/u/joe-dumoulin)\
**Post date:** [January 11, 2006, 6:10am UTC](https://www.ruby-forum.com/t/dialog-that-pops-up-when-window-busy/52119/2 "2006-01-11T06:10:15Z")

</div>

Joe Van D. wrote:

> custom dialog box for this?

A custom progress dialog should not be hard to implement. If you pop it  
up as a modal dialog, you’ll also avoid having to desentivize the window  
by hand. You’ll definitely need a separate thread for a progress dialog,  
and possibly wrap whatever you’re doing that requires waiting in some  
sort of ProgressingTask object to get things completely done.

That said, I do have a weird hunch I saw some existing implementations  
of the problem around, but can’t for the heck of it figure out in what  
context. Brief googling would indicate that indeed Gtk has a “progress  
bar” widget, the documentation to that might provide some insights as to  
what you’re looking at. And embedding one in a pop-up modal progress  
dialog should then be trivial.

David V.

---

<div class="post-metadata">

**Author:** ![joe-dumoulin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9dc877/32.png) [@joe-dumoulin](https://www.ruby-forum.com/u/joe-dumoulin)\
**Post date:** [January 11, 2006, 2:18pm UTC](https://www.ruby-forum.com/t/dialog-that-pops-up-when-window-busy/52119/3 "2006-01-11T14:18:30Z")

</div>

On 1/10/06, David V. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > 
> 
> That said, I do have a weird hunch I saw some existing implementations  
> of the problem around, but can’t for the heck of it figure out in what  
> context. Brief googling would indicate that indeed Gtk has a “progress  
> bar” widget, the documentation to that might provide some insights as to  
> what you’re looking at. And embedding one in a pop-up modal progress  
> dialog should then be trivial.

Bleh, meant to send this to ruby-gnome2, not ruby-talk. ☹

Anyway, here’s how I solved it. If there’s a cleaner way to do it,  
I’d love to hear about it.

class App  
def initialize  
Gtk::init  
@window = Gtk::Window.new “Joe’s Crazy Application”  
@window.set\_default\_size 300, 300

```
vbox = Gtk::VBox.new
@window << vbox

vbox << Gtk::Label.new("Stuff")
vbox << Gtk::Label.new("More Stuff")
vbox << Gtk::Button.new("Useless button")
vbox << Gtk::Button.new("Another Useless button")

lock_button = Gtk::Button.new "Lock window for three seconds"
vbox << lock_button

lock_button.signal_connect("clicked") do
  # Window gets locked while doing stuff
  @window.lock do
    start_time = Time.now
    # computationally heavy thing there
    loop do
      Gtk::process_gui_events # Any way I can get rid of this?
      rand 100000000
      break if Time.now - start_time >= 3
    end
  end
end

@window.signal_connect("delete-event") { Gtk::main_quit }
@window.show_all
Gtk::main

```

end  
end

module Gtk

# Makes sure that Gtk has a change to draw stuff

def self.process\_gui\_events  
while Gtk::events\_pending?  
Gtk::main\_iteration  
end  
end  
end

class Gtk::Window

# Locks the window

def lock reason = “hold on there buddy”, &block  
self.sensitive = false  
display\_locking\_dialog(reason) do  
block.call  
end  
self.sensitive = true  
end

# Displays a locking dialog box with a

# pulsing progress bar over the window

def display\_locking\_dialog reason, &block  
dialog = Gtk::Dialog.new “”, self, Gtk::Dialog::MODAL  
dialog.decorated = false  
vbox = Gtk::VBox.new  
reason\_label = Gtk::Label.new reason  
progress\_bar = Gtk::ProgressBar.new  
thread\_id = Gtk::timeout\_add(100) { progress\_bar.pulse }  
vbox \<\< reason\_label \<\< progress\_bar  
dialog.action\_area \<\< vbox  
dialog.show\_all  
block.call  
Gtk::timeout\_remove(thread\_id)  
dialog.destroy  
end

end

App.new if **FILE** == $0
