Index: tools/viewer/sk_app/unix/Window_unix.cpp |
diff --git a/tools/viewer/sk_app/unix/Window_unix.cpp b/tools/viewer/sk_app/unix/Window_unix.cpp |
index 431f1564911d5b752c91cc4ecbf6c1256b550c21..953eb36d74413ea41568de340883f28f6e7e43e5 100644 |
--- a/tools/viewer/sk_app/unix/Window_unix.cpp |
+++ b/tools/viewer/sk_app/unix/Window_unix.cpp |
@@ -9,7 +9,6 @@ |
#include "SkUtils.h" |
#include "Timer.h" |
-#include "../GLWindowContext.h" |
#include "../VulkanWindowContext.h" |
#include "Window_unix.h" |
@@ -27,7 +26,7 @@ |
Display* display = (Display*)platformData; |
Window_unix* window = new Window_unix(); |
- if (!window->initWindow(display, nullptr)) { |
+ if (!window->init(display)) { |
delete window; |
return nullptr; |
} |
@@ -35,87 +34,27 @@ |
return window; |
} |
-const long kEventMask = ExposureMask | StructureNotifyMask | |
- KeyPressMask | KeyReleaseMask | |
- PointerMotionMask | ButtonPressMask | ButtonReleaseMask; |
- |
-bool Window_unix::initWindow(Display* display, const DisplayParams* params) { |
- if (params && params->fMSAASampleCount != fMSAASampleCount) { |
- this->closeWindow(); |
- } |
- // we already have a window |
- if (fDisplay) { |
- return true; |
- } |
+bool Window_unix::init(Display* display) { |
fDisplay = display; |
fWidth = 1280; |
fHeight = 960; |
- |
- // Attempt to create a window that supports GL |
- GLint att[] = { |
- GLX_RGBA, |
- GLX_DEPTH_SIZE, 24, |
- GLX_DOUBLEBUFFER, |
- GLX_STENCIL_SIZE, 8, |
- None |
- }; |
- SkASSERT(nullptr == fVisualInfo); |
- if (params && params->fMSAASampleCount > 0) { |
- static const GLint kAttCount = SK_ARRAY_COUNT(att); |
- GLint msaaAtt[kAttCount + 4]; |
- memcpy(msaaAtt, att, sizeof(att)); |
- SkASSERT(None == msaaAtt[kAttCount - 1]); |
- msaaAtt[kAttCount - 1] = GLX_SAMPLE_BUFFERS_ARB; |
- msaaAtt[kAttCount + 0] = 1; |
- msaaAtt[kAttCount + 1] = GLX_SAMPLES_ARB; |
- msaaAtt[kAttCount + 2] = params->fMSAASampleCount; |
- msaaAtt[kAttCount + 3] = None; |
- fVisualInfo = glXChooseVisual(display, DefaultScreen(display), msaaAtt); |
- fMSAASampleCount = params->fMSAASampleCount; |
- } |
- if (nullptr == fVisualInfo) { |
- fVisualInfo = glXChooseVisual(display, DefaultScreen(display), att); |
- fMSAASampleCount = 0; |
- } |
- |
- if (fVisualInfo) { |
- Colormap colorMap = XCreateColormap(display, |
- RootWindow(display, fVisualInfo->screen), |
- fVisualInfo->visual, |
- AllocNone); |
- XSetWindowAttributes swa; |
- swa.colormap = colorMap; |
- swa.event_mask = kEventMask; |
- fWindow = XCreateWindow(display, |
- RootWindow(display, fVisualInfo->screen), |
- 0, 0, // x, y |
- fWidth, fHeight, |
- 0, // border width |
- fVisualInfo->depth, |
- InputOutput, |
- fVisualInfo->visual, |
- CWEventMask | CWColormap, |
- &swa); |
- } else { |
- // Create a simple window instead. We will not be able to show GL |
- fWindow = XCreateSimpleWindow(display, |
- DefaultRootWindow(display), |
- 0, 0, // x, y |
- fWidth, fHeight, |
- 0, // border width |
- 0, // border value |
- 0); // background value |
- XSelectInput(display, fWindow, kEventMask); |
- } |
- |
- if (!fWindow) { |
+ fHWnd = XCreateSimpleWindow(display, DefaultRootWindow(display), 0, 0, fWidth, fHeight, |
+ 0, BlackPixel(display, DefaultScreen(display)), |
+ BlackPixel(display, DefaultScreen(display))); |
+ |
+ if (!fHWnd) { |
return false; |
} |
+ |
+ // choose the events we care about |
+ XSelectInput(display, fHWnd, |
+ ExposureMask | StructureNotifyMask | KeyPressMask | KeyReleaseMask | |
+ PointerMotionMask | ButtonPressMask | ButtonReleaseMask); |
// set up to catch window delete message |
fWmDeleteMessage = XInternAtom(display, "WM_DELETE_WINDOW", False); |
- XSetWMProtocols(display, fWindow, &fWmDeleteMessage, 1); |
+ XSetWMProtocols(display, fHWnd, &fWmDeleteMessage, 1); |
// add to hashtable of windows |
gWindowMap.add(this); |
@@ -125,21 +64,6 @@ |
fPendingResize = false; |
return true; |
-} |
- |
-void Window_unix::closeWindow() { |
- if (fDisplay) { |
- this->detach(); |
- SkASSERT(fGC); |
- XFreeGC(fDisplay, fGC); |
- fGC = nullptr; |
- gWindowMap.remove(fWindow); |
- XDestroyWindow(fDisplay, fWindow); |
- fWindow = 0; |
- fVisualInfo = nullptr; |
- fDisplay = nullptr; |
- fMSAASampleCount = 0; |
- } |
} |
static Window::Key get_key(KeySym keysym) { |
@@ -184,12 +108,6 @@ |
bool Window_unix::handleEvent(const XEvent& event) { |
switch (event.type) { |
- case MapNotify: |
- if (!fGC) { |
- fGC = XCreateGC(fDisplay, fWindow, 0, nullptr); |
- } |
- break; |
- |
case ClientMessage: |
if ((Atom)event.xclient.data.l[0] == fWmDeleteMessage && |
gWindowMap.count() == 1) { |
@@ -261,28 +179,24 @@ |
void Window_unix::setTitle(const char* title) { |
XTextProperty textproperty; |
XStringListToTextProperty(const_cast<char**>(&title), 1, &textproperty); |
- XSetWMName(fDisplay, fWindow, &textproperty); |
+ XSetWMName(fDisplay, fHWnd, &textproperty); |
} |
void Window_unix::show() { |
- XMapWindow(fDisplay, fWindow); |
+ XMapWindow(fDisplay, fHWnd); |
} |
bool Window_unix::attach(BackendType attachType, const DisplayParams& params) { |
- this->initWindow(fDisplay, ¶ms); |
- |
ContextPlatformData_unix platformData; |
platformData.fDisplay = fDisplay; |
- platformData.fWindow = fWindow; |
- platformData.fVisualInfo = fVisualInfo; |
+ platformData.fHWnd = fHWnd; |
+ XWindowAttributes attribs; |
+ XGetWindowAttributes(fDisplay, fHWnd, &attribs); |
+ platformData.fVisualID = XVisualIDFromVisual(attribs.visual); |
switch (attachType) { |
case kVulkan_BackendType: |
+ default: |
fWindowContext = VulkanWindowContext::Create((void*)&platformData, params); |
- break; |
- |
- case kNativeGL_BackendType: |
- default: |
- fWindowContext = GLWindowContext::Create((void*)&platformData, params); |
break; |
} |
@@ -294,14 +208,14 @@ |
event.type = Expose; |
event.xexpose.send_event = True; |
event.xexpose.display = fDisplay; |
- event.xexpose.window = fWindow; |
+ event.xexpose.window = fHWnd; |
event.xexpose.x = 0; |
event.xexpose.y = 0; |
event.xexpose.width = fWidth; |
event.xexpose.height = fHeight; |
event.xexpose.count = 0; |
- XSendEvent(fDisplay, fWindow, False, 0, &event); |
+ XSendEvent(fDisplay, fHWnd, False, 0, &event); |
} |
} // namespace sk_app |