| OLD | NEW |
| 1 # -*- coding: utf-8 -*- | 1 # -*- coding: utf-8 -*- |
| 2 # | 2 # |
| 3 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 3 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
| 5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
| 6 | 6 |
| 7 | 7 |
| 8 # DESCRIPTION : | 8 # DESCRIPTION : |
| 9 # | 9 # |
| 10 # Intended for use during manufacturing to validate that all keyboard | 10 # Intended for use during manufacturing to validate that all keyboard |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 from gtk import gdk | 25 from gtk import gdk |
| 26 | 26 |
| 27 from autotest_lib.client.bin import factory | 27 from autotest_lib.client.bin import factory |
| 28 from autotest_lib.client.bin import factory_ui_lib as ful | 28 from autotest_lib.client.bin import factory_ui_lib as ful |
| 29 from autotest_lib.client.bin import test | 29 from autotest_lib.client.bin import test |
| 30 from autotest_lib.client.common_lib import error | 30 from autotest_lib.client.common_lib import error |
| 31 | 31 |
| 32 | 32 |
| 33 class KeyboardTest: | 33 class KeyboardTest: |
| 34 | 34 |
| 35 def __init__(self, kbd_image, bindings, ft_state): | 35 def __init__(self, kbd_image, bindings): |
| 36 self._kbd_image = kbd_image | 36 self._kbd_image = kbd_image |
| 37 self._bindings = bindings | 37 self._bindings = bindings |
| 38 self._ft_state = ft_state | |
| 39 self._pressed_keys = set() | 38 self._pressed_keys = set() |
| 40 self._deadline = None | 39 self._deadline = None |
| 41 self.successful_keys = set() | 40 self.successful_keys = set() |
| 42 | 41 |
| 43 def calc_missing_string(self): | 42 def calc_missing_string(self): |
| 44 missing_keys = sorted(gdk.keyval_name(k) for k in | 43 missing_keys = sorted(gdk.keyval_name(k) for k in |
| 45 set(self._bindings) - self.successful_keys) | 44 set(self._bindings) - self.successful_keys) |
| 46 if not missing_keys: | 45 if not missing_keys: |
| 47 return '' | 46 return '' |
| 48 return 'Missing following keys\n' \ | 47 return ('Missing following keys\n' + |
| 49 '沒有偵測到下列按鍵,鍵盤可能故障,請檢修: %s' % ', '.join(missing_keys) | 48 '沒有偵測到下列按鍵,鍵盤可能故障,請檢修: %s' % |
| 49 ', '.join(missing_keys)) |
| 50 | 50 |
| 51 def timer_event(self, countdown_label): | 51 def timer_event(self, countdown_label): |
| 52 if not self._deadline: # Ignore timer with no countdown in progress. | 52 if not self._deadline: # Ignore timer with no countdown in progress. |
| 53 return True | 53 return True |
| 54 time_remaining = max(0, self._deadline - time.time()) | 54 time_remaining = max(0, self._deadline - time.time()) |
| 55 if time_remaining == 0: | 55 if time_remaining == 0: |
| 56 factory.log('deadline reached') | 56 factory.log('deadline reached') |
| 57 gtk.main_quit() | 57 gtk.main_quit() |
| 58 countdown_label.set_text('%d' % time_remaining) | 58 countdown_label.set_text('%d' % time_remaining) |
| 59 countdown_label.queue_draw() | 59 countdown_label.queue_draw() |
| (...skipping 13 matching lines...) Expand all Loading... |
| 73 context.fill() | 73 context.fill() |
| 74 for key in self._pressed_keys: | 74 for key in self._pressed_keys: |
| 75 coords = self._bindings[key] | 75 coords = self._bindings[key] |
| 76 context.rectangle(*coords) | 76 context.rectangle(*coords) |
| 77 context.set_source_rgba(*ful.RGBA_YELLOW_OVERLAY) | 77 context.set_source_rgba(*ful.RGBA_YELLOW_OVERLAY) |
| 78 context.fill() | 78 context.fill() |
| 79 | 79 |
| 80 return True | 80 return True |
| 81 | 81 |
| 82 def key_press_event(self, widget, event): | 82 def key_press_event(self, widget, event): |
| 83 if self._ft_state.exit_on_trigger(event): | |
| 84 return True | |
| 85 if ('GDK_MOD1_MASK' in event.state.value_names | 83 if ('GDK_MOD1_MASK' in event.state.value_names |
| 86 and event.keyval == gtk.keysyms.q): | 84 and event.keyval == gtk.keysyms.q): |
| 87 # Alt-q for early exit. | 85 # Alt-q for early exit. |
| 88 gtk.main_quit() | 86 gtk.main_quit() |
| 89 return True | 87 return True |
| 90 if event.keyval in self.successful_keys: | 88 if event.keyval in self.successful_keys: |
| 91 # Ignore keys already found to work successfully. | 89 # Ignore keys already found to work successfully. |
| 92 return True | 90 return True |
| 93 if event.state != 0: | 91 if event.state != 0: |
| 94 factory.log('key (0x%x) ignored because modifier applied (state=%d)' | 92 factory.log('key (0x%x) ignored because modifier applied (state=%d)' |
| (...skipping 28 matching lines...) Expand all Loading... |
| 123 def register_callbacks(self, window): | 121 def register_callbacks(self, window): |
| 124 window.connect('key-press-event', self.key_press_event) | 122 window.connect('key-press-event', self.key_press_event) |
| 125 window.connect('key-release-event', self.key_release_event) | 123 window.connect('key-release-event', self.key_release_event) |
| 126 window.add_events(gdk.KEY_PRESS_MASK | gdk.KEY_RELEASE_MASK) | 124 window.add_events(gdk.KEY_PRESS_MASK | gdk.KEY_RELEASE_MASK) |
| 127 | 125 |
| 128 | 126 |
| 129 class factory_Keyboard(test.test): | 127 class factory_Keyboard(test.test): |
| 130 version = 1 | 128 version = 1 |
| 131 preserve_srcdir = True | 129 preserve_srcdir = True |
| 132 | 130 |
| 133 def run_once(self, | 131 def run_once(self, layout=None): |
| 134 test_widget_size=None, | |
| 135 trigger_set=None, | |
| 136 layout=None): | |
| 137 | 132 |
| 138 factory.log('%s run_once' % self.__class__) | 133 factory.log('%s run_once' % self.__class__) |
| 139 | 134 |
| 140 ft_state = ful.State(trigger_set) | |
| 141 | |
| 142 os.chdir(self.srcdir) | 135 os.chdir(self.srcdir) |
| 143 kbd_image = cairo.ImageSurface.create_from_png('%s.png' % layout) | 136 kbd_image = cairo.ImageSurface.create_from_png('%s.png' % layout) |
| 144 image_size = (kbd_image.get_width(), kbd_image.get_height()) | 137 image_size = (kbd_image.get_width(), kbd_image.get_height()) |
| 145 | 138 |
| 146 with open('%s.bindings' % layout, 'r') as file: | 139 with open('%s.bindings' % layout, 'r') as file: |
| 147 bindings = eval(file.read()) | 140 bindings = eval(file.read()) |
| 148 | 141 |
| 149 test = KeyboardTest(kbd_image, bindings, ft_state) | 142 test = KeyboardTest(kbd_image, bindings) |
| 150 | 143 |
| 151 drawing_area = gtk.DrawingArea() | 144 drawing_area = gtk.DrawingArea() |
| 152 drawing_area.set_size_request(*image_size) | 145 drawing_area.set_size_request(*image_size) |
| 153 drawing_area.connect('expose_event', test.expose_event) | 146 drawing_area.connect('expose_event', test.expose_event) |
| 154 drawing_area.add_events(gdk.EXPOSURE_MASK) | 147 drawing_area.add_events(gdk.EXPOSURE_MASK) |
| 155 | 148 |
| 156 countdown_widget, countdown_label = ful.make_countdown_widget() | 149 countdown_widget, countdown_label = ful.make_countdown_widget() |
| 157 gobject.timeout_add(1000, test.timer_event, countdown_label) | 150 gobject.timeout_add(1000, test.timer_event, countdown_label) |
| 158 | 151 |
| 159 test_widget = gtk.VBox() | 152 test_widget = gtk.VBox() |
| 160 test_widget.set_spacing(20) | 153 test_widget.set_spacing(20) |
| 161 test_widget.pack_start(drawing_area, False, False) | 154 test_widget.pack_start(drawing_area, False, False) |
| 162 test_widget.pack_start(countdown_widget, False, False) | 155 test_widget.pack_start(countdown_widget, False, False) |
| 163 | 156 |
| 164 ft_state.run_test_widget( | 157 ful.run_test_widget(self.job, test_widget, |
| 165 test_widget=test_widget, | |
| 166 test_widget_size=test_widget_size, | |
| 167 window_registration_callback=test.register_callbacks) | 158 window_registration_callback=test.register_callbacks) |
| 168 | 159 |
| 169 missing = test.calc_missing_string() | 160 missing = test.calc_missing_string() |
| 170 if missing: | 161 if missing: |
| 171 raise error.TestFail(missing) | 162 raise error.TestFail(missing) |
| 172 | 163 |
| 173 factory.log('%s run_once finished' % self.__class__) | 164 factory.log('%s run_once finished' % self.__class__) |
| OLD | NEW |