• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <X11/Xlib.h>
12 #include <GL/glx.h>
13 #include "../Window.h"
14 #include "SkChecksum.h"
15 #include "SkTDynamicHash.h"
16 
17 typedef Window XWindow;
18 
19 namespace sk_app {
20 
21 class Window_unix : public Window {
22 public:
Window_unix()23     Window_unix() : Window()
24                   , fDisplay(nullptr)
25                   , fWindow(0)
26                   , fGC(nullptr)
27                   , fFBConfig(nullptr)
28                   , fVisualInfo(nullptr)
29                   , fMSAASampleCount(0) {}
~Window_unix()30     ~Window_unix() override { this->closeWindow(); }
31 
32     bool initWindow(Display* display);
33 
34     void setTitle(const char*) override;
35     void show() override;
36 
37     bool attach(BackendType) override;
38 
39     void onInval() override;
40 
41     bool handleEvent(const XEvent& event);
42 
GetKey(const Window_unix & w)43     static const XWindow& GetKey(const Window_unix& w) {
44         return w.fWindow;
45     }
46 
Hash(const XWindow & w)47     static uint32_t Hash(const XWindow& w) {
48         return SkChecksum::Mix(w);
49     }
50 
51     static SkTDynamicHash<Window_unix, XWindow> gWindowMap;
52 
markPendingPaint()53     void markPendingPaint() { fPendingPaint = true; }
finishPaint()54     void finishPaint() {
55         if (fPendingPaint) {
56             this->onPaint();
57             fPendingPaint = false;
58         }
59     }
60 
markPendingResize(int width,int height)61     void markPendingResize(int width, int height) {
62         if (width != this->width() || height != this->height()){
63             fPendingResize = true;
64             fPendingWidth = width;
65             fPendingHeight = height;
66         }
67     }
finishResize()68     void finishResize() {
69         if (fPendingResize) {
70             this->onResize(fPendingWidth, fPendingHeight);
71             fPendingResize = false;
72         }
73     }
74 
75 private:
76     void closeWindow();
77 
78     Display*     fDisplay;
79     XWindow      fWindow;
80     GC           fGC;
81     GLXFBConfig* fFBConfig;
82     XVisualInfo* fVisualInfo;
83     int          fMSAASampleCount;
84 
85     Atom     fWmDeleteMessage;
86 
87     bool     fPendingPaint;
88     int      fPendingWidth;
89     int      fPendingHeight;
90     bool     fPendingResize;
91 };
92 
93 }   // namespace sk_app
94 
95 #endif
96