/**
 * @file   Resources.hh
 * @author David Reveman <david@waimea.org>
 * @date   18-Jul-2001 00:31:06
 *
 * @brief Definition of ResourceHandler and StrComp classes
 *
 * Function declarations and variable definitions for ResourceHandler and
 * and StrComp classes.
 *
 * Copyright (C) David Reveman. All rights reserved.
 *
 */

#ifndef __Resources_hh
#define __Resources_hh

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

#ifdef    HAVE_STDIO_H
#  include <stdio.h>
#endif // HAVE_STDIO_H
}

class ResourceHandler;
class Define;
class WaActionExtList;
class StrComp;

typedef struct _WaAction WaAction;
typedef struct _DockStyle DockStyle;
typedef struct _ButtonStyle ButtonStyle;

#include "Window.hh"
#include "Menu.hh"
#include "Waimea.hh"
#include "Regex.hh"

#define IS_ENV_CHAR(ch) (isalnum(ch) || ch == '_')

#define ACTLISTCLEAR(list) \
    while (! list.empty()) { \
        if (list.back()->exec) \
            delete [] list.back()->exec; \
        if (list.back()->param) \
            delete [] list.back()->param; \
        delete list.back(); \
        list.pop_back(); \
    }

#define ACTLISTPTRCLEAR(list) \
    while (! list->empty()) { \
        if (list->back()->exec) \
            delete [] list->back()->exec; \
        if (list->back()->param) \
            delete [] list->back()->param; \
        delete list->back(); \
        list->pop_back(); \
    }


struct _WaAction {
    WwActionFn winfunc;
    RootActionFn rootfunc;
    MenuActionFn menufunc;
    char *exec;
    char *param;
    unsigned int type, detail, mod, nmod;
    bool replay;
    struct timeval delay;
    list<int> *delay_breaks;
};

typedef struct {
    WaColor border_color;
    WaTexture texture;
    unsigned int border_width;
} DockholderStyle;

struct _DockStyle {
    int x;
    int y;
    int geometry;
    int direction;
    int stacking;
    long int desktop_mask;
    unsigned int gridspace;
    list<Regex *> order;
    list<int> order_type;
    bool centered;
    bool inworkspace;
    DockholderStyle style;
};

struct _ButtonStyle {
    int x, id, cb, autoplace;
    bool fg;
    WaTexture t_focused, t_unfocused, t_pressed;
    WaTexture t_focused2, t_unfocused2, t_pressed2;
    WaColor c_focused, c_unfocused, c_pressed;
    WaColor c_focused2, c_unfocused2, c_pressed2;
    Pixmap p_focused, p_unfocused, p_pressed;
    Pixmap p_focused2, p_unfocused2, p_pressed2;
    GC g_focused, g_unfocused, g_pressed;
    GC g_focused2, g_unfocused2, g_pressed2;
};

enum {
    LeftJustify,
    RightJustify,
    CenterJustify
};

enum {
    VerticalDock,
    HorizontalDock,
    AlwaysOnTop,
    AlwaysAtBottom,
    NormalStacking
};

enum {
    NameMatchType,
    ClassMatchType,
    TitleMatchType
};

class ResourceHandler {
public:
    ResourceHandler(Waimea *, struct waoptions *);
    virtual ~ResourceHandler(void);

    void LoadConfig(Waimea *);
    void LoadConfig(WaScreen *);
    void LoadStyle(WaScreen *);
    void LoadMenus(WaScreen *);
    void LoadActions(WaScreen *);
    WaMenu *ParseMenu(WaMenu *, FILE *, WaScreen *);

    char *rc_file, *style_file, *menu_file, *action_file;
    bool rc_forced, style_forced, action_forced, menu_forced;
    int linenr;
    
private:
    void ReadActions(char *, list<Define *> *, list<StrComp *> *,
                     list<WaAction *> *, WaScreen *);
    void ReadDatabaseColor(char *, char *, WaColor *, unsigned long,
                           WaImageControl *);
    void ReadDatabaseTexture(char *, char *, WaTexture *, unsigned long,
                             WaImageControl *);
    void ReadDatabaseFont(char *, char *, WaFont *, WaFont *);
    void ParseAction(const char *, list<StrComp *> *, list<WaAction *> *,
                     WaScreen *);

    Waimea *waimea;
    Display *display;
    XrmDatabase database;
    char *homedir;
    list<StrComp *> wacts;
    list<StrComp *> racts;
    list<StrComp *> macts;
    list<StrComp *> types;
    list<StrComp *> bdetails;
    list<StrComp *> mods;
};

#define WindowFuncMask (1L << 0)
#define RootFuncMask   (1L << 1)
#define MenuFuncMask   (1L << 2)

class Define {
public:
    inline Define(char *n, char *v) {
        char *__m_wastrdup_tmp;
        name = __m_wastrdup(n); value = __m_wastrdup(v);
    }
    inline ~Define(void) { delete [] name; delete [] value; }
    
    char *name;
    char *value;
};

class WaActionExtList {
public:
    inline WaActionExtList(char *n, char *c, char *t) {
        name = new Regex(n);
        cl = new Regex(c);
        title = new Regex(t);
    }
    inline ~WaActionExtList(void) {
        delete name;
        delete cl;
        delete title;
        ACTLISTCLEAR(list);
    }
    
    Regex *name;
    Regex *cl;
    Regex *title;
    list<WaAction *> list;
};

class StrComp {
public:
    StrComp(char *, unsigned long); 
    StrComp(char *, WwActionFn);
    StrComp(char *, RootActionFn);
    StrComp(char *, MenuActionFn);
    
    bool Comp(char *);

    char *str;
    unsigned long value;
    int type;
    WwActionFn winfunc;
    RootActionFn rootfunc;
    MenuActionFn menufunc;
};

char *strtrim(char *);
char *strwithin(char *, char, char, bool = false);
char *environment_expansion(char *s);
char *param_eval(char *, char *, WaScreen *);

#endif // __Resources_hh


syntax highlighted by Code2HTML, v. 0.9.1