/*
   Copyright (C) 2002-2010 Karl J. Runge <runge@karlrunge.com> 
   All rights reserved.

This file is part of x11vnc.

x11vnc is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.

x11vnc is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with x11vnc; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA
or see <http://www.gnu.org/licenses/>.

In addition, as a special exception, Karl J. Runge
gives permission to link the code of its release of x11vnc with the
OpenSSL project's "OpenSSL" library (or with modified versions of it
that use the same license as the "OpenSSL" library), and distribute
the linked executables.  You must obey the GNU General Public License
in all respects for all of the code used other than "OpenSSL".  If you
modify this file, you may extend this exception to your version of the
file, but you are not obligated to do so.  If you do not wish to do
so, delete this exception statement from your version.
*/

#ifndef _X11VNC_XRECORD_H
#define _X11VNC_XRECORD_H

/* -- xrecord.h -- */
#include "scrollevent_t.h"
#include "winattr_t.h"

extern scroll_event_t scr_ev[];
extern int scr_ev_cnt;
extern int xrecording;
extern int xrecord_set_by_keys;
extern int xrecord_set_by_mouse;
extern Window xrecord_focus_window;
extern Window xrecord_wm_window;
extern Window xrecord_ptr_window;
extern KeySym xrecord_keysym;
extern char xrecord_name_info[];

extern winattr_t scr_attr_cache[];

extern Display *rdpy_data;
extern Display *rdpy_ctrl;

extern Display *gdpy_ctrl;
extern int xserver_grabbed;

extern void initialize_xrecord(void);
extern void zerodisp_xrecord(void);
extern void shutdown_xrecord(void);
extern int xrecord_skip_keysym(rfbKeySym keysym);
extern int xrecord_skip_button(int newb, int old);
extern int xrecord_scroll_keysym(rfbKeySym keysym);
extern void check_xrecord_reset(int force);
extern void xrecord_watch(int start, int setby);

#endif /* _X11VNC_XRECORD_H */
