Fix display test and light sensor test to not using 100% CPU

BUG=chrome-os-partner:11675
TEST=Run tests. Check CPU usage is under 10%.

Change-Id: I1832477fe5402407b6ffc4f2c3c251f48f2126b8
Reviewed-on: https://gerrit.chromium.org/gerrit/28689
Reviewed-by: Jon Salz <jsalz@chromium.org>
Commit-Ready: Vic Yang <victoryang@chromium.org>
Tested-by: Vic Yang <victoryang@chromium.org>
diff --git a/client/site_tests/factory_Display/factory_Display.py b/client/site_tests/factory_Display/factory_Display.py
index 0ca9a60..094b4d9 100644
--- a/client/site_tests/factory_Display/factory_Display.py
+++ b/client/site_tests/factory_Display/factory_Display.py
@@ -149,7 +149,7 @@
             return
         self._current_pattern = self._pattern_queue.pop()
         name, cb_fn = self._current_pattern
-        self._status_map[name] = ful.ACTIVE
+        self.update_status(name, ful.ACTIVE)
         self._current_pattern_shown = False
 
     def key_press_callback(self, widget, event):
@@ -165,28 +165,29 @@
             self._fs_window = None
             self._current_pattern_shown = True
         elif event.keyval == gtk.keysyms.Tab and self._current_pattern_shown:
-            self._status_map[pattern_name] = ful.FAILED
+            self.update_status(pattern_name, ful.FAILED)
             self.goto_next_pattern()
         elif event.keyval == gtk.keysyms.Return and self._current_pattern_shown:
-            self._status_map[pattern_name] = ful.PASSED
+            self.update_status(pattern_name, ful.PASSED)
             self.goto_next_pattern()
         elif event.keyval == ord('Q'):
             gtk.main_quit()
         self._test_widget.queue_draw()
         return True
 
-    def label_status_expose(self, widget, event, name=None):
-        status = self._status_map[name]
-        widget.set_text(status)
-        widget.modify_fg(gtk.STATE_NORMAL, ful.LABEL_COLORS[status])
+    def update_status(self, name, status):
+        self._status_map[name] = status
+        self._label_status[name].set_text(status)
+        self._label_status[name].modify_fg(gtk.STATE_NORMAL,
+                                           ful.LABEL_COLORS[status])
+        self._label_status[name].queue_draw()
 
     def make_pattern_label_box(self, name):
 
         label_status = ful.make_label(
             ful.UNTESTED, size=_LABEL_SIZE,
             alignment=(0, 0.5), fg=_LABEL_UNTESTED_FG)
-        expose_cb = lambda *x: self.label_status_expose(*x, **{'name':name})
-        label_status.connect('expose_event', expose_cb)
+        self._label_status[name] = label_status
 
         label_en = ful.make_label(name, size=_LABEL_SIZE, alignment=(1, 0.5))
         label_sep = ful.make_label(' : ', alignment=(0.5, 0.5))
@@ -213,6 +214,7 @@
 
         self._pattern_queue = [x for x in reversed(_PATTERN_LIST)]
         self._status_map = dict((n, ful.UNTESTED) for n, f in _PATTERN_LIST)
+        self._label_status = dict()
 
         self._prompt_label = ful.make_label(_MESSAGE_STR, alignment=(0.5, 0.5))
 
diff --git a/client/site_tests/factory_LightSensor/factory_LightSensor.py b/client/site_tests/factory_LightSensor/factory_LightSensor.py
index 0ceb5dd..8f0ae51 100644
--- a/client/site_tests/factory_LightSensor/factory_LightSensor.py
+++ b/client/site_tests/factory_LightSensor/factory_LightSensor.py
@@ -128,7 +128,7 @@
             gtk.main_quit()
             return False
         self._active_subtest = self._subtest_list[self._tested]
-        self._status_map[self._active_subtest] = ful.ACTIVE
+        self.update_status(self._active_subtest, ful.ACTIVE)
         self._status_label[self._active_subtest].queue_draw()
         self._deadline = time.time() + self._timeout_per_subtest
         self._current_iter_remained = self._iter_req_per_subtest
@@ -138,7 +138,7 @@
     def timer_event(self, countdown_label):
         time_remaining = max(0, self._deadline - time.time())
         if time_remaining is 0:
-            self._status_map[self._active_subtest] = ful.FAILED
+            self.update_status(self._active_subtest, ful.FAILED)
             self._status_label[self._active_subtest].queue_draw()
             factory.log('Timeout on subtest "%s"' % self._active_subtest)
             if not self.next_subtest():
@@ -155,7 +155,7 @@
         if event.keyval == ord(' ') and not self._started:
             self._started = True
             self._active_subtest = self._subtest_list[0]
-            self._status_map[self._active_subtest] = ful.ACTIVE
+            self.update_status(self._active_subtest, ful.ACTIVE)
             self._status_label[self._active_subtest].queue_draw()
             self._deadline = time.time() + self._timeout_per_subtest
             gobject.timeout_add(1000, self.timer_event, self._countdown_label)
@@ -165,7 +165,7 @@
     def pass_one_iter(self, name):
         self._current_iter_remained -= 1
         if self._current_iter_remained is 0:
-            self._status_map[name] = ful.PASSED
+            self.update_status(name, ful.PASSED)
             self._status_label[name].queue_draw()
             self._current_iter_remained = self._iter_req_per_subtest
             mean_val = self._cumulative_val / self._iter_req_per_subtest
@@ -210,11 +210,12 @@
         sensor_value.queue_draw()
         return True
 
-    def label_status_expose(self, widget, event, name):
-        status = self._status_map[name]
-        widget.set_text(status)
-        widget.modify_fg(gtk.STATE_NORMAL, ful.LABEL_COLORS[status])
-        return False
+    def update_status(self, name, status):
+        self._status_map[name] = status
+        self._label_status[name].set_text(status)
+        self._label_status[name].modify_fg(gtk.STATE_NORMAL,
+                                           ful.LABEL_COLORS[status])
+        self._label_status[name].queue_draw()
 
     def calc_cfg_description(self, cfg):
         if 'above' in cfg:
@@ -232,7 +233,7 @@
         label_status = ful.make_label(ful.UNTESTED, size=_LABEL_STATUS_SIZE,
                                       alignment=(0, 0.5),
                                       fg=ful.LABEL_COLORS[ful.UNTESTED])
-        label_status.connect('expose_event', self.label_status_expose, name)
+        self._label_status[name] = label_status
         label_desc = ful.make_label(self._subtest_instruction[name],
                                     alignment=(0.5, 0.5), fg=ful.WHITE)
         cfg_desc = self.calc_cfg_description(self._subtest_cfg[name])
@@ -292,6 +293,7 @@
         self._cumulative_val = 0
 
         self._status_map = dict((n, ful.UNTESTED) for n in self._subtest_list)
+        self._label_status = dict()
         self._tested = 0
 
         self._started = False