120 self.black_white = wx.stc.STC_STYLE_DEFAULT |
120 self.black_white = wx.stc.STC_STYLE_DEFAULT |
121 self.output = output |
121 self.output = output |
122 self.risecall = risecall |
122 self.risecall = risecall |
123 # to prevent rapid fire on rising log panel |
123 # to prevent rapid fire on rising log panel |
124 self.rising_timer = 0 |
124 self.rising_timer = 0 |
125 self.lock = Lock() |
125 self.StackLock = Lock() |
126 self.YieldLock = Lock() |
126 self.YieldLock = Lock() |
127 self.RefreshLock = Lock() |
127 self.RefreshLock = Lock() |
128 self.TimerAccessLock = Lock() |
128 self.TimerAccessLock = Lock() |
129 self.stack = [] |
129 self.stack = [] |
130 self.LastRefreshTime = gettime() |
130 self.LastRefreshTime = gettime() |
131 self.LastRefreshTimer = None |
131 self.LastRefreshTimer = None |
132 |
132 |
133 def write(self, s, style=None): |
133 def write(self, s, style=None): |
134 if self.lock.acquire(): |
134 self.StackLock.acquire() |
135 self.stack.append((s, style)) |
135 self.stack.append((s, style)) |
136 self.lock.release() |
136 self.StackLock.release() |
137 current_time = gettime() |
137 current_time = gettime() |
|
138 with self.TimerAccessLock: |
|
139 if self.LastRefreshTimer is not None: |
|
140 self.LastRefreshTimer.cancel() |
|
141 self.LastRefreshTimer = None |
|
142 elapsed = current_time - self.LastRefreshTime |
|
143 if elapsed > REFRESH_PERIOD: |
|
144 self._should_write() |
|
145 else: |
138 with self.TimerAccessLock: |
146 with self.TimerAccessLock: |
139 if self.LastRefreshTimer is not None: |
147 if self.LastRefreshTimer is None: |
140 self.LastRefreshTimer.cancel() |
148 self.LastRefreshTimer = Timer(REFRESH_PERIOD - elapsed, self._timer_expired) |
141 self.LastRefreshTimer = None |
149 self.LastRefreshTimer.start() |
142 elapsed = current_time - self.LastRefreshTime |
|
143 if elapsed > REFRESH_PERIOD: |
|
144 self._should_write() |
|
145 else: |
|
146 with self.TimerAccessLock: |
|
147 if self.LastRefreshTimer is None: |
|
148 self.LastRefreshTimer = Timer(REFRESH_PERIOD - elapsed, self._timer_expired) |
|
149 self.LastRefreshTimer.start() |
|
150 |
150 |
151 def _timer_expired(self): |
151 def _timer_expired(self): |
152 self._should_write() |
152 self._should_write() |
153 with self.TimerAccessLock: |
153 with self.TimerAccessLock: |
154 self.LastRefreshTimer = None |
154 self.LastRefreshTimer = None |
169 |
169 |
170 def _write(self): |
170 def _write(self): |
171 if self.output: |
171 if self.output: |
172 with self.RefreshLock: |
172 with self.RefreshLock: |
173 self.output.Freeze() |
173 self.output.Freeze() |
174 self.lock.acquire() |
174 self.output.AnnotationClearAll() |
|
175 self.StackLock.acquire() |
175 for s, style in self.stack: |
176 for s, style in self.stack: |
176 if style is None: |
177 if style is None: |
177 style = self.black_white |
178 style = self.black_white |
178 if style != self.black_white: |
179 if style != self.black_white: |
179 self.output.StartStyling(self.output.GetLength(), 0xff) |
180 self.output.StartStyling(self.output.GetLength(), 0xff) |
189 text_len = self.output.GetLength() - start_pos |
190 text_len = self.output.GetLength() - start_pos |
190 |
191 |
191 if style != self.black_white: |
192 if style != self.black_white: |
192 self.output.SetStyling(text_len, style) |
193 self.output.SetStyling(text_len, style) |
193 self.stack = [] |
194 self.stack = [] |
194 self.lock.release() |
195 self.StackLock.release() |
195 self.output.Thaw() |
196 self.output.Thaw() |
196 self.LastRefreshTime = gettime() |
197 self.LastRefreshTime = gettime() |
197 newtime = time.time() |
198 newtime = time.time() |
198 if newtime - self.rising_timer > 1: |
199 if newtime - self.rising_timer > 1: |
199 self.risecall(self.output) |
200 self.risecall(self.output) |