18a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project
38a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
68a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkOSWindow_Unix_DEFINED
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkOSWindow_Unix_DEFINED
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
119df214e836f2b897224178676c03017e9190b7e0Scroggo#include <GL/glx.h>
12178b8e0b8c3d423c3fd947776f4b7790a0417582tomhudson@google.com#include <X11/Xlib.h>
13178b8e0b8c3d423c3fd947776f4b7790a0417582tomhudson@google.com
14178b8e0b8c3d423c3fd947776f4b7790a0417582tomhudson@google.com#include "SkWindow.h"
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
16b7e9aee1acf27fc98cb37ed69c05da71b4c3c69bscroggoclass SkEvent;
17b7e9aee1acf27fc98cb37ed69c05da71b4c3c69bscroggo
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstruct SkUnixWindow {
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  Display* fDisplay;
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  Window fWin;
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  size_t fOSWin;
22b7e9aee1acf27fc98cb37ed69c05da71b4c3c69bscroggo  GC fGc;
239df214e836f2b897224178676c03017e9190b7e0Scroggo  GLXContext fGLContext;
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkOSWindow : public SkWindow {
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
28b7e9aee1acf27fc98cb37ed69c05da71b4c3c69bscroggo    SkOSWindow(void*);
29b7e9aee1acf27fc98cb37ed69c05da71b4c3c69bscroggo    ~SkOSWindow();
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
31b7e9aee1acf27fc98cb37ed69c05da71b4c3c69bscroggo    void* getHWND() const { return (void*)fUnixWindow.fWin; }
32b7e9aee1acf27fc98cb37ed69c05da71b4c3c69bscroggo    void* getDisplay() const { return (void*)fUnixWindow.fDisplay; }
33b7e9aee1acf27fc98cb37ed69c05da71b4c3c69bscroggo    void* getUnixWindow() const { return (void*)&fUnixWindow; }
349df214e836f2b897224178676c03017e9190b7e0Scroggo    void loop();
35b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com
36b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com    enum SkBackEndTypes {
37b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com        kNone_BackEndType,
38b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com        kNativeGL_BackEndType,
39b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com    };
40b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com
4164cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com    bool attach(SkBackEndTypes attachType, int msaaSampleCount, AttachmentInfo*);
42b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com    void detach();
43b442a6d5726569364e15c3056bbfb59b9b6e38cerobertphillips@google.com    void present();
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
451195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com    int getMSAASampleCount() const { return fMSAASampleCount; }
461195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com
47b7e9aee1acf27fc98cb37ed69c05da71b4c3c69bscroggo    //static bool PostEvent(SkEvent* evt, SkEventSinkID, SkMSec delay);
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
50178b8e0b8c3d423c3fd947776f4b7790a0417582tomhudson@google.com    // Overridden from from SkWindow:
5136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onSetTitle(const char title[]) override;
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
54acb3d88cf84adf367c173a7a33cd3b0c379291dcreed@google.com    enum NextXEventResult {
55acb3d88cf84adf367c173a7a33cd3b0c379291dcreed@google.com        kContinue_NextXEventResult,
56acb3d88cf84adf367c173a7a33cd3b0c379291dcreed@google.com        kQuitRequest_NextXEventResult,
57acb3d88cf84adf367c173a7a33cd3b0c379291dcreed@google.com        kPaintRequest_NextXEventResult
58acb3d88cf84adf367c173a7a33cd3b0c379291dcreed@google.com    };
59acb3d88cf84adf367c173a7a33cd3b0c379291dcreed@google.com
60acb3d88cf84adf367c173a7a33cd3b0c379291dcreed@google.com    NextXEventResult nextXEvent();
61178b8e0b8c3d423c3fd947776f4b7790a0417582tomhudson@google.com    void doPaint();
62178b8e0b8c3d423c3fd947776f4b7790a0417582tomhudson@google.com    void mapWindowAndWait();
63178b8e0b8c3d423c3fd947776f4b7790a0417582tomhudson@google.com
641195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com    void closeWindow();
6564cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com    void initWindow(int newMSAASampleCount, AttachmentInfo* info);
661195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com
67178b8e0b8c3d423c3fd947776f4b7790a0417582tomhudson@google.com    SkUnixWindow fUnixWindow;
689df214e836f2b897224178676c03017e9190b7e0Scroggo
699df214e836f2b897224178676c03017e9190b7e0Scroggo    // Needed for GL
709df214e836f2b897224178676c03017e9190b7e0Scroggo    XVisualInfo* fVi;
711195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com    // we recreate the underlying xwindow if this changes
721195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com    int fMSAASampleCount;
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkWindow INHERITED;
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
78