1 /* 2 * Copyright 2016 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef Window_unix_DEFINED 9 #define Window_unix_DEFINED 10 11 #include "include/private/SkChecksum.h" 12 #include "src/core/SkTDynamicHash.h" 13 #include "tools/sk_app/Window.h" 14 15 #include <GL/glx.h> 16 #include <X11/Xlib.h> 17 18 #include <string> 19 20 typedef Window XWindow; 21 22 namespace sk_app { 23 24 class Window_unix : public Window { 25 public: Window_unix()26 Window_unix() 27 : Window() 28 , fDisplay(nullptr) 29 , fWindow(0) 30 , fGC(nullptr) 31 , fFBConfig(nullptr) 32 , fVisualInfo(nullptr) 33 , fMSAASampleCount(1) {} ~Window_unix()34 ~Window_unix() override { this->closeWindow(); } 35 36 bool initWindow(Display* display); 37 38 void setTitle(const char*) override; 39 void show() override; 40 41 const char* getClipboardText() override; 42 void setClipboardText(const char*) override; 43 44 bool attach(BackendType) override; 45 46 void onInval() override; 47 48 bool handleEvent(const XEvent& event); 49 GetKey(const Window_unix & w)50 static const XWindow& GetKey(const Window_unix& w) { 51 return w.fWindow; 52 } 53 Hash(const XWindow & w)54 static uint32_t Hash(const XWindow& w) { 55 return SkChecksum::Mix(w); 56 } 57 58 static SkTDynamicHash<Window_unix, XWindow> gWindowMap; 59 markPendingPaint()60 void markPendingPaint() { fPendingPaint = true; } finishPaint()61 void finishPaint() { 62 if (fPendingPaint) { 63 this->onPaint(); 64 fPendingPaint = false; 65 } 66 } 67 markPendingResize(int width,int height)68 void markPendingResize(int width, int height) { 69 if (width != this->width() || height != this->height()){ 70 fPendingResize = true; 71 fPendingWidth = width; 72 fPendingHeight = height; 73 } 74 } finishResize()75 void finishResize() { 76 if (fPendingResize) { 77 this->onResize(fPendingWidth, fPendingHeight); 78 fPendingResize = false; 79 } 80 } 81 82 void setRequestedDisplayParams(const DisplayParams&, bool allowReattach) override; 83 84 private: 85 void closeWindow(); 86 87 Display* fDisplay; 88 XWindow fWindow; 89 GC fGC; 90 GLXFBConfig* fFBConfig; 91 XVisualInfo* fVisualInfo; 92 int fMSAASampleCount; 93 94 Atom fWmDeleteMessage; 95 96 bool fPendingPaint; 97 int fPendingWidth; 98 int fPendingHeight; 99 bool fPendingResize; 100 101 BackendType fBackend = BackendType::kRaster_BackendType; 102 103 std::string fClipboardText; 104 105 using INHERITED = Window; 106 }; 107 108 } // namespace sk_app 109 110 #endif 111