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