1 /*
2  * Copyright 2006 The Android Open Source Project
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 SkOSWindow_Unix_DEFINED
9 #define SkOSWindow_Unix_DEFINED
10 
11 #include <GL/glx.h>
12 #include <X11/Xlib.h>
13 
14 #include "SkWindow.h"
15 
16 class SkEvent;
17 
18 struct SkUnixWindow {
19   Display* fDisplay;
20   Window fWin;
21   size_t fOSWin;
22   GC fGc;
23   GLXContext fGLContext;
24 };
25 
26 class SkOSWindow : public SkWindow {
27 public:
28     SkOSWindow(void*);
29     ~SkOSWindow();
30 
getHWND()31     void* getHWND() const { return (void*)fUnixWindow.fWin; }
getDisplay()32     void* getDisplay() const { return (void*)fUnixWindow.fDisplay; }
getUnixWindow()33     void* getUnixWindow() const { return (void*)&fUnixWindow; }
34     void loop();
35 
36     enum SkBackEndTypes {
37         kNone_BackEndType,
38         kNativeGL_BackEndType,
39 #if SK_ANGLE
40         kANGLE_BackEndType,
41 #endif // SK_ANGLE
42 #if SK_COMMAND_BUFFER
43         kCommandBufferES2_BackEndType,
44 #endif // SK_COMMAND_BUFFER
45     };
46 
47     bool attach(SkBackEndTypes attachType, int msaaSampleCount, AttachmentInfo*);
48     void detach();
49     void present();
50 
getMSAASampleCount()51     int getMSAASampleCount() const { return fMSAASampleCount; }
52 
53     //static bool PostEvent(SkEvent* evt, SkEventSinkID, SkMSec delay);
54 
55     bool makeFullscreen();
56     void setVsync(bool);
57     void closeWindow();
58 
59 protected:
60     // Overridden from from SkWindow:
61     void onSetTitle(const char title[]) override;
62 
63 private:
64     enum NextXEventResult {
65         kContinue_NextXEventResult,
66         kQuitRequest_NextXEventResult,
67         kPaintRequest_NextXEventResult
68     };
69 
70     NextXEventResult nextXEvent();
71     void doPaint();
72     void mapWindowAndWait();
73 
74     // Forcefully closes the window.  If a graceful shutdown is desired then call the public
75     // closeWindow method
76     void internalCloseWindow();
77     void initWindow(int newMSAASampleCount, AttachmentInfo* info);
78 
79     SkUnixWindow fUnixWindow;
80 
81     // Needed for GL
82     XVisualInfo* fVi;
83     // we recreate the underlying xwindow if this changes
84     int fMSAASampleCount;
85 
86     typedef SkWindow INHERITED;
87 };
88 
89 #endif
90