
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __gnu_java_awt_peer_gtk_GdkScreenGraphicsDevice__
#define __gnu_java_awt_peer_gtk_GdkScreenGraphicsDevice__

#pragma interface

#include <java/awt/GraphicsDevice.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace classpath
    {
        class Pointer;
    }
    namespace java
    {
      namespace awt
      {
        namespace peer
        {
          namespace gtk
          {
              class GdkGraphicsConfiguration;
              class GdkGraphicsEnvironment;
              class GdkScreenGraphicsDevice;
              class GdkScreenGraphicsDevice$X11DisplayMode;
          }
        }
      }
    }
  }
  namespace java
  {
    namespace awt
    {
        class DisplayMode;
        class GraphicsConfiguration;
        class Rectangle;
        class Window;
    }
  }
}

class gnu::java::awt::peer::gtk::GdkScreenGraphicsDevice : public ::java::awt::GraphicsDevice
{

public: // actually package-private
  static void initIDs();
  GdkScreenGraphicsDevice(::gnu::java::awt::peer::gtk::GdkGraphicsEnvironment *);
  virtual void init();
  virtual ::java::awt::DisplayMode * nativeGetFixedDisplayMode(::gnu::java::awt::peer::gtk::GdkGraphicsEnvironment *);
public:
  virtual jint getType();
  virtual ::java::lang::String * getIDstring();
private:
  ::java::lang::String * nativeGetIDString();
public:
  virtual JArray< ::java::awt::GraphicsConfiguration * > * getConfigurations();
  virtual ::java::awt::GraphicsConfiguration * getDefaultConfiguration();
  virtual ::java::awt::DisplayMode * getDisplayMode();
public: // actually package-private
  virtual jint nativeGetDisplayModeIndex(::gnu::java::awt::peer::gtk::GdkGraphicsEnvironment *);
  virtual jint nativeGetDisplayModeRate(::gnu::java::awt::peer::gtk::GdkGraphicsEnvironment *);
public:
  virtual JArray< ::java::awt::DisplayMode * > * getDisplayModes();
public: // actually package-private
  virtual JArray< ::gnu::java::awt::peer::gtk::GdkScreenGraphicsDevice$X11DisplayMode * > * nativeGetDisplayModes(::gnu::java::awt::peer::gtk::GdkGraphicsEnvironment *);
public:
  virtual jboolean isFullScreenSupported();
  virtual jboolean isDisplayChangeSupported();
  virtual void setDisplayMode(::java::awt::DisplayMode *);
public: // actually package-private
  virtual void nativeSetDisplayMode(::gnu::java::awt::peer::gtk::GdkGraphicsEnvironment *, jint, jshort);
public:
  virtual void setFullScreenWindow(::java::awt::Window *);
  virtual ::java::awt::Window * getFullScreenWindow();
public: // actually package-private
  virtual ::java::awt::Rectangle * getBounds();
  virtual ::java::awt::Rectangle * nativeGetBounds();
private:
  jint __attribute__((aligned(__alignof__( ::java::awt::GraphicsDevice)))) native_state;
  ::java::awt::Window * fullscreenWindow;
  jboolean oldWindowDecorationState;
  ::java::awt::Rectangle * oldWindowBounds;
  ::java::awt::Rectangle * bounds;
  JArray< ::gnu::java::awt::peer::gtk::GdkGraphicsConfiguration * > * configurations;
public: // actually package-private
  ::gnu::java::awt::peer::gtk::GdkGraphicsEnvironment * env;
  ::java::lang::String * idString;
  JArray< ::gnu::java::awt::peer::gtk::GdkScreenGraphicsDevice$X11DisplayMode * > * displayModes;
  ::java::awt::DisplayMode * fixedDisplayMode;
private:
  ::gnu::classpath::Pointer * screen;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_awt_peer_gtk_GdkScreenGraphicsDevice__
