/* Waimea.hh

Copyright © 2003 David Reveman.

This file is part of Waimea.

Waimea 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, or (at your option) any later
version.

Waimea 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 Waimea; see the file COPYING. If not, write to the Free
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA. */

#ifndef __Waimea_hh
#define __Waimea_hh

extern "C" {
#include <X11/Xlib.h>

#ifdef    HAVE_SIGNAL_H
#  include <signal.h>
#endif // HAVE_SIGNAL_H
    
#ifdef    HAVE_ICONV
#  include <iconv.h>
#endif // HAVE_ICONV

#ifdef    THREAD
#  define _MULTI_THREADED
#  ifdef    HAVE_PTHREAD_H
#    include <pthread.h>
#  endif // HAVE_PTHREAD_H
#endif // THREAD
    
}

#ifdef    HAVE_ICONV
#  define INTERNALCODE "UTF-8"
#endif // HAVE_ICONV

class Waimea;

extern char *waimea_pathenv;

#define FOCUS_HISTORY_SIZE 64

enum {
    ARG_DISPLAY = 0,
    ARG_RCFILE,
    ARG_SCREENMASK,
    ARG_SCRIPTDIR,
    ARG_DOUBLECLICK,
    ARG_CLIENTSIDE,

#ifdef    RENDER
    ARG_ARGBVISUAL,
#endif // RENDER
    
#ifdef    THREAD
    ARG_THREADS,
    ARG_THREADPRIO,
#endif // THREAD
    
    ARG_ACTIONFILE,
    ARG_STYLEFILE,
    ARG_MENUFILE,
    ARG_NRDESKTOPS,
    ARG_DESKTOPNAMES,
    ARG_VIRTUALSIZE,
    ARG_MENUSTACKING,
    ARG_DOCKAPPHOLDERSTACKING,
    ARG_TRANSIENTABOVE,
    ARG_FOCUSREVERTTOWINDOW,
    ARG_EXTERNALBG,
    ARG_INFOCOMMAND,
    ARG_WARNINGCOMMAND
};

struct ModifierMap {
    char *name;
    long int modifier;
};

#include "Util.hh"
#include "Screen.hh"
#include "Timer.hh"
#include "Net.hh"
#include "Style.hh"
#include "Event.hh"
#include "Cursor.hh"

class Waimea {
public:
    Waimea(char **, char **);
    ~Waimea(void);

    WindowObject *findWin(Window, long int);
    void getModifierMappings(void);

    char **options;
    Display *display;
    ResourceHandler *rh;
    EventHandler *eh;
    NetHandler *net;
    Timer *timer;
    WaCursor *cursor;
    unsigned long double_click, screenmask;
    bool wmerr, running;
    bool quit_signal, restart_signal, unknown_signal;
    
    map<Window, WindowObject *> window_table;
    list<WaScreen *> wascreen_list;
    int min_key, max_key;
    list<ModifierMap *> modmaps;

    char config_info[256];

#ifdef    THREAD
    int render_thread_prio;
#endif // THREAD

#ifdef    HAVE_ICONV
	iconv_t utf8conv;
#endif // HAVE_ICONV

#ifdef    SHAPE
    int shape, shape_event;
#endif // SHAPE

#ifdef    XINERAMA
    int xinerama;
    XineramaScreenInfo *xinerama_info;
    int xinerama_info_num;
#endif // XINERAMA

#ifdef    RENDER
    int argb_visual;
#endif // RENDER

#ifdef    RANDR
    int randr, randr_event;
#endif // RANDR

    bool client_side_rendering;

    bool focusNew(Window, bool = false);
    void addToFocusHistory(Window);
    void removeFromFocusHistory(Window);
    void focusRevertFrom(WaScreen *, Window);
    
    Window prefocus;
    list<Window> focus_history;
};

void wa_grab_server(void);
void wa_ungrab_server(void);
bool validate_drawable(Drawable, unsigned int * = NULL, unsigned int * = NULL);
const bool validate_window_mapped(Window);
int xerrorhandler(Display *, XErrorEvent *);
int wmrunningerror(Display *, XErrorEvent *);
void signalhandler(int);
void restart(char *);
void quit(int);
char *expand(char *, WaWindow *, MenuItem *, const char * = NULL,
             char * = NULL, MenuItem * = NULL);
char *preexpand(char *, bool *);
char *wa_locale_to_utf8(const char *);

extern list<DWindowObject *> __render_list;

extern Tst<char *> _waimea_static_variables;

#ifdef    THREAD
extern unsigned int __render_thread_count;

extern pthread_mutex_t __render_mutex;
extern pthread_cond_t  __render_cond;
extern unsigned int    __render_count;

extern pthread_mutex_t __render_list_mutex;
extern pthread_cond_t  __render_list_cond;

#  define RENDER_LOCK { \
      pthread_mutex_lock(&__render_mutex); \
  }
#  define RENDER_RELEASE { \
      pthread_mutex_unlock(&__render_mutex); \
  }
#  define RENDER_GET { \
      pthread_mutex_lock(&__render_mutex); \
      while (__render_count) \
          pthread_cond_wait(&__render_cond, &__render_mutex); \
  }
#  define RENDER_GET_ONE { \
      pthread_mutex_lock(&__render_mutex); \
      while (__render_count > 1) \
          pthread_cond_wait(&__render_cond, &__render_mutex); \
  }
#  define RENDER_BROADCAST { \
      pthread_mutex_unlock(&__render_mutex); \
      pthread_cond_broadcast(&__render_cond); \
  }

#  define RENDER_LIST_LOCK { \
      pthread_mutex_lock(&__render_list_mutex); \
  }
#  define RENDER_LIST_RELEASE { \
      pthread_mutex_unlock(&__render_list_mutex); \
  }
#  define RENDER_LIST_GET { \
      pthread_mutex_lock(&__render_list_mutex); \
      while (__render_list.empty()) \
          pthread_cond_wait(&__render_list_cond, &__render_list_mutex); \
  }
#  define RENDER_LIST_SIGNAL { \
      pthread_mutex_unlock(&__render_list_mutex); \
      pthread_cond_signal(&__render_list_cond); \
  }

void *render_thread_func(void *);
#else  // !THREAD
#  define RENDER_LOCK
#  define RENDER_RELEASE
#  define RENDER_GET
#  define RENDER_GET_ONE
#  define RENDER_BROADCAST
#  define RENDER_LIST_LOCK
#  define RENDER_LIST_RELEASE
#  define RENDER_LIST_GET
#  define RENDER_LIST_SIGNAL
#endif // THREAD

#endif // __Waimea_hh


syntax highlighted by Code2HTML, v. 0.9.1