| Index: client/bin/factory_ui_lib.py
 | 
| diff --git a/client/bin/factory_ui_lib.py b/client/bin/factory_ui_lib.py
 | 
| index 7024d72fd12283bea0fc1c02e4e3c7bc3f54addb..6826a2e419b14ac3b12d26250703239c99c6d92a 100644
 | 
| --- a/client/bin/factory_ui_lib.py
 | 
| +++ b/client/bin/factory_ui_lib.py
 | 
| @@ -8,11 +8,9 @@
 | 
|  # DESCRIPTION :
 | 
|  #
 | 
|  # This library provides convenience routines to launch factory tests.
 | 
| -# This includes support for identifying keyboard test switching
 | 
| -# triggers, grabbing control of the keyboard and mouse, and making the
 | 
| -# mouse cursor disappear.  It also manages communication of any found
 | 
| -# keyboard triggers to the control process, via writing data to
 | 
| -# factory.RESULT_FILE_PATH.
 | 
| +# This includes support for drawing the test widget in a window at the
 | 
| +# proper location, grabbing control of the mouse, and making the mouse
 | 
| +# cursor disappear.
 | 
|  
 | 
|  
 | 
|  from autotest_lib.client.bin import factory
 | 
| @@ -34,6 +32,8 @@ WHITE = gtk.gdk.Color(0xFFFF, 0xFFFF, 0xFFFF)
 | 
|  
 | 
|  LIGHT_GREEN = gtk.gdk.color_parse('light green')
 | 
|  
 | 
| +SEP_COLOR = gtk.gdk.color_parse('grey50')
 | 
| +
 | 
|  RGBA_GREEN_OVERLAY = (0, 0.5, 0, 0.6)
 | 
|  RGBA_YELLOW_OVERLAY = (0.6, 0.6, 0, 0.6)
 | 
|  
 | 
| @@ -64,6 +64,20 @@ def make_label(message, font=LABEL_FONT, fg=LIGHT_GREEN,
 | 
|      return l
 | 
|  
 | 
|  
 | 
| +def make_hsep(width=1):
 | 
| +    frame = gtk.EventBox()
 | 
| +    frame.set_size_request(-1, width)
 | 
| +    frame.modify_bg(gtk.STATE_NORMAL, SEP_COLOR)
 | 
| +    return frame
 | 
| +
 | 
| +
 | 
| +def make_vsep(width=1):
 | 
| +    frame = gtk.EventBox()
 | 
| +    frame.set_size_request(width, -1)
 | 
| +    frame.modify_bg(gtk.STATE_NORMAL, SEP_COLOR)
 | 
| +    return frame
 | 
| +
 | 
| +
 | 
|  def make_countdown_widget():
 | 
|      title = make_label('time remaining / 剩餘時間: ', alignment=(1, 0.5))
 | 
|      countdown = make_label('%d' % FAIL_TIMEOUT, alignment=(0, 0.5))
 | 
| @@ -83,59 +97,34 @@ def hide_cursor(gdk_window):
 | 
|      gdk_window.set_cursor(cursor)
 | 
|  
 | 
|  
 | 
| -class State:
 | 
| -
 | 
| -    def __init__(self, trigger_set=set()):
 | 
| -        self._got_trigger = None
 | 
| -        self._trigger_set = [ord(x) for x in trigger_set]
 | 
| -
 | 
| -    def exit_on_trigger(self, event):
 | 
| -        char = event.keyval in range(32,127) and chr(event.keyval) or None
 | 
| -        if ('GDK_CONTROL_MASK' not in event.state.value_names
 | 
| -            or event.keyval not in self._trigger_set):
 | 
| -            return False
 | 
| -        factory.log('got test switch trigger %s(%s)' % (event.keyval, char))
 | 
| -        self._got_trigger = char
 | 
| -        gtk.main_quit()
 | 
| -        return True
 | 
| -
 | 
| -    def run_test_widget(self,
 | 
| -                        test_widget=None,
 | 
| -                        test_widget_size=None,
 | 
| -                        invisible_cursor=True,
 | 
| -                        window_registration_callback=None,
 | 
| -                        cleanup_callback=None):
 | 
| +def run_test_widget(job, test_widget,
 | 
| +                    invisible_cursor=True,
 | 
| +                    window_registration_callback=None,
 | 
| +                    cleanup_callback=None):
 | 
|  
 | 
| -        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
 | 
| -        window.modify_bg(gtk.STATE_NORMAL, BLACK)
 | 
| -        window.set_size_request(*test_widget_size)
 | 
| +    test_widget_size = job.factory_shared_dict.get('test_widget_size')
 | 
|  
 | 
| -        align = gtk.Alignment(xalign=0.5, yalign=0.5)
 | 
| -        align.add(test_widget)
 | 
| +    window = gtk.Window(gtk.WINDOW_TOPLEVEL)
 | 
| +    window.modify_bg(gtk.STATE_NORMAL, BLACK)
 | 
| +    window.set_size_request(*test_widget_size)
 | 
|  
 | 
| -        window.add(align)
 | 
| -        window.show_all()
 | 
| +    align = gtk.Alignment(xalign=0.5, yalign=0.5)
 | 
| +    align.add(test_widget)
 | 
|  
 | 
| -        gtk.gdk.pointer_grab(window.window, confine_to=window.window)
 | 
| -        gtk.gdk.keyboard_grab(window.window)
 | 
| +    window.add(align)
 | 
| +    window.show_all()
 | 
|  
 | 
| -        if invisible_cursor:
 | 
| -            hide_cursor(window.window)
 | 
| +    if window_registration_callback is not None:
 | 
| +        window_registration_callback(window)
 | 
|  
 | 
| -        if window_registration_callback is not None:
 | 
| -            window_registration_callback(window)
 | 
| +    gtk.gdk.pointer_grab(window.window, confine_to=window.window)
 | 
|  
 | 
| -        factory.log('factory_test running gtk.main')
 | 
| -        gtk.main()
 | 
| -        factory.log('factory_test quit gtk.main')
 | 
| +    if invisible_cursor:
 | 
| +        hide_cursor(window.window)
 | 
|  
 | 
| -        if cleanup_callback is not None:
 | 
| -            cleanup_callback()
 | 
| +    gtk.main()
 | 
|  
 | 
| -        gtk.gdk.pointer_ungrab()
 | 
| -        gtk.gdk.keyboard_ungrab()
 | 
| +    gtk.gdk.pointer_ungrab()
 | 
|  
 | 
| -        if self._got_trigger is not None:
 | 
| -            factory.log('run_test_widget returning kbd_shortcut "%s"' %
 | 
| -                        self._got_trigger)
 | 
| -            factory.log_shared_data('activated_kbd_shortcut', self._got_trigger)
 | 
| +    if cleanup_callback is not None:
 | 
| +        cleanup_callback()
 | 
| 
 |