/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */

#ifndef META_COMPOSITOR_PRIVATE_H
#define META_COMPOSITOR_PRIVATE_H

#include <X11/extensions/Xfixes.h>

#include "clutter/clutter.h"
#include "compositor/meta-plugin-manager.h"
#include "compositor/meta-window-actor-private.h"
#include "meta/compositor.h"
#include "meta/display.h"

struct _MetaCompositor
{
  MetaDisplay    *display;

  guint           pre_paint_func_id;
  guint           post_paint_func_id;

  guint           stage_presented_id;
  guint           stage_after_paint_id;

  gint64          server_time_query_time;
  gint64          server_time_offset;

  int             glx_opcode;
  guint           stereo_tree_ext : 1;
  guint           have_stereo_windows : 1;

  guint           server_time_is_monotonic_time : 1;

  ClutterActor          *stage, *window_group, *top_window_group, *feedback_group;
  ClutterActor          *background_actor;
  GList                 *windows;
  Window                 output;

  CoglContext           *context;

  MetaWindowActor       *top_window_actor;

  /* Used for unredirecting fullscreen windows */
  guint                  disable_unredirect_count;
  MetaWindow            *unredirected_window;

  gint                   switch_workspace_in_progress;

  MetaPluginManager *plugin_mgr;

  gboolean frame_has_updated_xsurfaces;
  gboolean have_x11_sync_object;
};

/* Wait 2ms after vblank before starting to draw next frame */
#define META_SYNC_DELAY 2

void meta_switch_workspace_completed (MetaCompositor *compositor);

gboolean meta_begin_modal_for_plugin (MetaCompositor   *compositor,
                                      MetaPlugin       *plugin,
                                      MetaModalOptions  options,
                                      guint32           timestamp);
void     meta_end_modal_for_plugin   (MetaCompositor   *compositor,
                                      MetaPlugin       *plugin,
                                      guint32           timestamp);

gint64 meta_compositor_monotonic_time_to_server_time (MetaDisplay *display,
                                                      gint64       monotonic_time);

gboolean meta_compositor_window_is_stereo     (MetaDisplay *display,
                                               Window       xwindow);
void     meta_compositor_select_stereo_notify (MetaDisplay *display,
                                               Window       xwindow);

void meta_compositor_flash_window (MetaCompositor *compositor,
                                   MetaWindow     *window);

MetaCloseDialog * meta_compositor_create_close_dialog (MetaCompositor *compositor,
                                                       MetaWindow     *window);

MetaInhibitShortcutsDialog * meta_compositor_create_inhibit_shortcuts_dialog (MetaCompositor *compositor,
                                                                              MetaWindow     *window);

#endif /* META_COMPOSITOR_PRIVATE_H */
