Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(160)

Side by Side Diff: src/views/unix/SkOSWindow_Unix.cpp

Issue 377733002: Handle close button in SkOSWindow_Unix. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2011 Google Inc. 3 * Copyright 2011 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 #include <X11/Xlib.h> 8 #include <X11/Xlib.h>
9 #include <X11/Xatom.h> 9 #include <X11/Xatom.h>
10 #include <X11/XKBlib.h> 10 #include <X11/XKBlib.h>
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 if (!select(x11_fd + 1, &input_fds, NULL, NULL, &tv)) { 193 if (!select(x11_fd + 1, &input_fds, NULL, NULL, &tv)) {
194 if (!XPending(dsp)) { 194 if (!XPending(dsp)) {
195 return false; 195 return false;
196 } 196 }
197 } 197 }
198 } 198 }
199 XNextEvent(dsp, evt); 199 XNextEvent(dsp, evt);
200 return true; 200 return true;
201 } 201 }
202 202
203 static Atom wm_delete_window_message;
204
203 SkOSWindow::NextXEventResult SkOSWindow::nextXEvent() { 205 SkOSWindow::NextXEventResult SkOSWindow::nextXEvent() {
204 XEvent evt; 206 XEvent evt;
205 Display* dsp = fUnixWindow.fDisplay; 207 Display* dsp = fUnixWindow.fDisplay;
206 208
207 if (!MyXNextEventWithDelay(fUnixWindow.fDisplay, &evt)) { 209 if (!MyXNextEventWithDelay(dsp, &evt)) {
208 return kContinue_NextXEventResult; 210 return kContinue_NextXEventResult;
209 } 211 }
210 212
211 switch (evt.type) { 213 switch (evt.type) {
212 case Expose: 214 case Expose:
213 if (0 == evt.xexpose.count) { 215 if (0 == evt.xexpose.count) {
214 return kPaintRequest_NextXEventResult; 216 return kPaintRequest_NextXEventResult;
215 } 217 }
216 break; 218 break;
217 case ConfigureNotify: 219 case ConfigureNotify:
(...skipping 23 matching lines...) Expand all
241 this->handleKey(XKeyToSkKey(keysym)); 243 this->handleKey(XKeyToSkKey(keysym));
242 long uni = keysym2ucs(keysym); 244 long uni = keysym2ucs(keysym);
243 if (uni != -1) { 245 if (uni != -1) {
244 this->handleChar((SkUnichar) uni); 246 this->handleChar((SkUnichar) uni);
245 } 247 }
246 break; 248 break;
247 } 249 }
248 case KeyRelease: 250 case KeyRelease:
249 this->handleKeyUp(XKeyToSkKey(XkbKeycodeToKeysym(dsp, evt.xkey.keyco de, 0, 0))); 251 this->handleKeyUp(XKeyToSkKey(XkbKeycodeToKeysym(dsp, evt.xkey.keyco de, 0, 0)));
250 break; 252 break;
253 case ClientMessage:
254 if ((Atom)evt.xclient.data.l[0] == wm_delete_window_message) {
255 return kQuitRequest_NextXEventResult;
256 }
257 // fallthrough
251 default: 258 default:
252 // Do nothing for other events 259 // Do nothing for other events
253 break; 260 break;
254 } 261 }
255 return kContinue_NextXEventResult; 262 return kContinue_NextXEventResult;
256 } 263 }
257 264
258 void SkOSWindow::loop() { 265 void SkOSWindow::loop() {
259 Display* dsp = fUnixWindow.fDisplay; 266 Display* dsp = fUnixWindow.fDisplay;
260 if (NULL == dsp) { 267 if (NULL == dsp) {
261 return; 268 return;
262 } 269 }
263 Window win = fUnixWindow.fWin; 270 Window win = fUnixWindow.fWin;
264 271
272 wm_delete_window_message = XInternAtom(dsp, "WM_DELETE_WINDOW", False);
273 XSetWMProtocols(dsp, win, &wm_delete_window_message, 1);
274
265 XSelectInput(dsp, win, EVENT_MASK); 275 XSelectInput(dsp, win, EVENT_MASK);
266 276
267 bool sentExposeEvent = false; 277 bool sentExposeEvent = false;
268 278
269 for (;;) { 279 for (;;) {
270 SkEvent::ServiceQueueTimer(); 280 SkEvent::ServiceQueueTimer();
271 281
272 bool moreToDo = SkEvent::ProcessEvent(); 282 bool moreToDo = SkEvent::ProcessEvent();
273 283
274 if (this->isDirty() && !sentExposeEvent) { 284 if (this->isDirty() && !sentExposeEvent) {
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
421 431
422 void SkEvent::SignalNonEmptyQueue() { 432 void SkEvent::SignalNonEmptyQueue() {
423 // nothing to do, since we spin on our event-queue, polling for XPending 433 // nothing to do, since we spin on our event-queue, polling for XPending
424 } 434 }
425 435
426 void SkEvent::SignalQueueTimer(SkMSec delay) { 436 void SkEvent::SignalQueueTimer(SkMSec delay) {
427 // just need to record the delay time. We handle waking up for it in 437 // just need to record the delay time. We handle waking up for it in
428 // MyXNextEventWithDelay() 438 // MyXNextEventWithDelay()
429 gTimerDelay = delay; 439 gTimerDelay = delay;
430 } 440 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698