OLD | NEW |
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 24 matching lines...) Expand all Loading... |
35 SkOSWindow::SkOSWindow(void*) | 35 SkOSWindow::SkOSWindow(void*) |
36 : fVi(NULL) | 36 : fVi(NULL) |
37 , fMSAASampleCount(0) { | 37 , fMSAASampleCount(0) { |
38 fUnixWindow.fDisplay = NULL; | 38 fUnixWindow.fDisplay = NULL; |
39 fUnixWindow.fGLContext = NULL; | 39 fUnixWindow.fGLContext = NULL; |
40 this->initWindow(0, NULL); | 40 this->initWindow(0, NULL); |
41 this->resize(WIDTH, HEIGHT); | 41 this->resize(WIDTH, HEIGHT); |
42 } | 42 } |
43 | 43 |
44 SkOSWindow::~SkOSWindow() { | 44 SkOSWindow::~SkOSWindow() { |
45 this->closeWindow(); | 45 this->internalCloseWindow(); |
46 } | 46 } |
47 | 47 |
48 void SkOSWindow::closeWindow() { | 48 void SkOSWindow::internalCloseWindow() { |
49 if (fUnixWindow.fDisplay) { | 49 if (fUnixWindow.fDisplay) { |
50 this->detach(); | 50 this->detach(); |
51 SkASSERT(fUnixWindow.fGc); | 51 SkASSERT(fUnixWindow.fGc); |
52 XFreeGC(fUnixWindow.fDisplay, fUnixWindow.fGc); | 52 XFreeGC(fUnixWindow.fDisplay, fUnixWindow.fGc); |
53 fUnixWindow.fGc = NULL; | 53 fUnixWindow.fGc = NULL; |
54 XDestroyWindow(fUnixWindow.fDisplay, fUnixWindow.fWin); | 54 XDestroyWindow(fUnixWindow.fDisplay, fUnixWindow.fWin); |
55 fVi = NULL; | 55 fVi = NULL; |
56 XCloseDisplay(fUnixWindow.fDisplay); | 56 XCloseDisplay(fUnixWindow.fDisplay); |
57 fUnixWindow.fDisplay = NULL; | 57 fUnixWindow.fDisplay = NULL; |
58 fMSAASampleCount = 0; | 58 fMSAASampleCount = 0; |
59 } | 59 } |
60 } | 60 } |
61 | 61 |
62 void SkOSWindow::initWindow(int requestedMSAASampleCount, AttachmentInfo* info)
{ | 62 void SkOSWindow::initWindow(int requestedMSAASampleCount, AttachmentInfo* info)
{ |
63 if (fMSAASampleCount != requestedMSAASampleCount) { | 63 if (fMSAASampleCount != requestedMSAASampleCount) { |
64 this->closeWindow(); | 64 this->internalCloseWindow(); |
65 } | 65 } |
66 // presence of fDisplay means we already have a window | 66 // presence of fDisplay means we already have a window |
67 if (fUnixWindow.fDisplay) { | 67 if (fUnixWindow.fDisplay) { |
68 if (info) { | 68 if (info) { |
69 if (fVi) { | 69 if (fVi) { |
70 glXGetConfig(fUnixWindow.fDisplay, fVi, GLX_SAMPLES_ARB, &info->
fSampleCount); | 70 glXGetConfig(fUnixWindow.fDisplay, fVi, GLX_SAMPLES_ARB, &info->
fSampleCount); |
71 glXGetConfig(fUnixWindow.fDisplay, fVi, GLX_STENCIL_SIZE, &info-
>fStencilBits); | 71 glXGetConfig(fUnixWindow.fDisplay, fVi, GLX_STENCIL_SIZE, &info-
>fStencilBits); |
72 } else { | 72 } else { |
73 info->fSampleCount = 0; | 73 info->fSampleCount = 0; |
74 info->fStencilBits = 0; | 74 info->fStencilBits = 0; |
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
454 _NET_WM_STATE_REMOVE =0, | 454 _NET_WM_STATE_REMOVE =0, |
455 _NET_WM_STATE_ADD = 1, | 455 _NET_WM_STATE_ADD = 1, |
456 _NET_WM_STATE_TOGGLE =2 | 456 _NET_WM_STATE_TOGGLE =2 |
457 }; | 457 }; |
458 | 458 |
459 void SkOSWindow::setFullscreen(bool setFullscreen) { | 459 void SkOSWindow::setFullscreen(bool setFullscreen) { |
460 Display* dsp = fUnixWindow.fDisplay; | 460 Display* dsp = fUnixWindow.fDisplay; |
461 if (NULL == dsp) { | 461 if (NULL == dsp) { |
462 return; | 462 return; |
463 } | 463 } |
464 Window win = fUnixWindow.fWin; | |
465 | 464 |
466 // Full screen | 465 // Full screen |
467 Atom wm_state = XInternAtom(dsp, "_NET_WM_STATE", False); | 466 Atom wm_state = XInternAtom(dsp, "_NET_WM_STATE", False); |
468 Atom fullscreen = XInternAtom(dsp, "_NET_WM_STATE_FULLSCREEN", False); | 467 Atom fullscreen = XInternAtom(dsp, "_NET_WM_STATE_FULLSCREEN", False); |
469 | 468 |
470 XEvent evt; | 469 XEvent evt; |
471 sk_bzero(&evt, sizeof(evt)); | 470 sk_bzero(&evt, sizeof(evt)); |
472 evt.type = ClientMessage; | 471 evt.type = ClientMessage; |
473 evt.xclient.window = win; | 472 evt.xclient.window = fUnixWindow.fWin; |
474 evt.xclient.message_type = wm_state; | 473 evt.xclient.message_type = wm_state; |
475 evt.xclient.format = 32; | 474 evt.xclient.format = 32; |
476 evt.xclient.data.l[0] = setFullscreen ? _NET_WM_STATE_ADD : _NET_WM_STATE_RE
MOVE; | 475 evt.xclient.data.l[0] = setFullscreen ? _NET_WM_STATE_ADD : _NET_WM_STATE_RE
MOVE; |
477 evt.xclient.data.l[1] = fullscreen; | 476 evt.xclient.data.l[1] = fullscreen; |
478 evt.xclient.data.l[2] = 0; | 477 evt.xclient.data.l[2] = 0; |
479 | 478 |
480 XSendEvent(dsp, DefaultRootWindow(dsp), False, | 479 XSendEvent(dsp, DefaultRootWindow(dsp), False, |
481 SubstructureRedirectMask | SubstructureNotifyMask, &evt); | 480 SubstructureRedirectMask | SubstructureNotifyMask, &evt); |
482 } | 481 } |
483 | 482 |
484 void SkOSWindow::setVsync(bool vsync) { | 483 void SkOSWindow::setVsync(bool vsync) { |
485 if (fUnixWindow.fDisplay && fUnixWindow.fGLContext && fUnixWindow.fWin) { | 484 if (fUnixWindow.fDisplay && fUnixWindow.fGLContext && fUnixWindow.fWin) { |
486 int swapInterval = vsync ? 1 : 0; | 485 int swapInterval = vsync ? 1 : 0; |
487 glXSwapInterval(fUnixWindow.fDisplay, fUnixWindow.fWin, swapInterval); | 486 glXSwapInterval(fUnixWindow.fDisplay, fUnixWindow.fWin, swapInterval); |
488 } | 487 } |
489 } | 488 } |
490 | 489 |
| 490 void SkOSWindow::closeWindow() { |
| 491 Display* dsp = fUnixWindow.fDisplay; |
| 492 if (NULL == dsp) { |
| 493 return; |
| 494 } |
| 495 |
| 496 XEvent evt; |
| 497 sk_bzero(&evt, sizeof(evt)); |
| 498 evt.type = ClientMessage; |
| 499 evt.xclient.message_type = XInternAtom(dsp, "WM_PROTOCOLS", true); |
| 500 evt.xclient.window = fUnixWindow.fWin; |
| 501 evt.xclient.format = 32; |
| 502 evt.xclient.data.l[0] = XInternAtom(dsp, "WM_DELETE_WINDOW", false); |
| 503 evt.xclient.data.l[1] = CurrentTime; |
| 504 |
| 505 XSendEvent(dsp, fUnixWindow.fWin, false, NoEventMask, &evt); |
| 506 } |
| 507 |
491 /////////////////////////////////////////////////////////////////////////////// | 508 /////////////////////////////////////////////////////////////////////////////// |
492 | 509 |
493 void SkEvent::SignalNonEmptyQueue() { | 510 void SkEvent::SignalNonEmptyQueue() { |
494 // nothing to do, since we spin on our event-queue, polling for XPending | 511 // nothing to do, since we spin on our event-queue, polling for XPending |
495 } | 512 } |
496 | 513 |
497 void SkEvent::SignalQueueTimer(SkMSec delay) { | 514 void SkEvent::SignalQueueTimer(SkMSec delay) { |
498 // just need to record the delay time. We handle waking up for it in | 515 // just need to record the delay time. We handle waking up for it in |
499 // MyXNextEventWithDelay() | 516 // MyXNextEventWithDelay() |
500 gTimerDelay = delay; | 517 gTimerDelay = delay; |
501 } | 518 } |
OLD | NEW |