all repos — openbox @ f26f23de50cb7941a7702198e3b4d1b2f9de062e

openbox fork - make it a bit more like ryudo

openbox/config.c (raw)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include "config.h"
#include "parse.h"

gboolean config_focus_new;
gboolean config_focus_follow;
gboolean config_focus_last;
gboolean config_focus_last_on_desktop;
gboolean config_focus_popup;

char *config_theme;

int config_desktops_num;
GSList *config_desktops_names;

static void parse_focus(char *name, ParseToken *value)
{
    if (!g_ascii_strcasecmp(name, "focusnew")) {
        if (value->type != TOKEN_BOOL)
            yyerror("invalid value");
        else {
            config_focus_new = value->data.bool;
        }
    } else if (!g_ascii_strcasecmp(name, "followmouse")) {
        if (value->type != TOKEN_BOOL)
            yyerror("invalid value");
        else {
            config_focus_follow = value->data.bool;
        }
    } else if (!g_ascii_strcasecmp(name, "focuslast")) {
        if (value->type != TOKEN_BOOL)
            yyerror("invalid value");
        else {
            config_focus_last = value->data.bool;
        }
    } else if (!g_ascii_strcasecmp(name, "focuslastondesktop")) {
        if (value->type != TOKEN_BOOL)
            yyerror("invalid value");
        else {
            config_focus_last_on_desktop = value->data.bool;
        }
    } else if (!g_ascii_strcasecmp(name, "cyclingdialog")) {
        if (value->type != TOKEN_BOOL)
            yyerror("invalid value");
        else {
            config_focus_popup = value->data.bool;
        }
    } else
        yyerror("invalid option");
    parse_free_token(value);
}

static void parse_theme(char *name, ParseToken *value)
{
    if (!g_ascii_strcasecmp(name, "theme")) {
        if (value->type != TOKEN_STRING)
            yyerror("invalid value");
        else {
            g_free(config_theme);
            config_theme = g_strdup(value->data.string);
        }
    } else
        yyerror("invalid option");
    parse_free_token(value);
}

static void parse_desktops(char *name, ParseToken *value)
{
    GList *it;

    if (!g_ascii_strcasecmp(name, "number")) {
        if (value->type != TOKEN_INTEGER)
            yyerror("invalid value");
        else {
            config_desktops_num = value->data.integer;
        }
    } else if (!g_ascii_strcasecmp(name, "names")) {
        if (value->type == TOKEN_LIST) {
            for (it = value->data.list; it; it = it->next)
                if (((ParseToken*)it->data)->type != TOKEN_STRING) break;
            if (it == NULL) {
                /* build a string list */
                g_free(config_desktops_names);
                for (it = value->data.list; it; it = it->next)
                    config_desktops_names =
                        g_slist_append(config_desktops_names,
                                       g_strdup
                                       (((ParseToken*)it->data)->data.string));
            } else {
                yyerror("invalid string in names list");
            }
        } else {
            yyerror("syntax error (expected list of strings)");
        }
    } else
        yyerror("invalid option");
    parse_free_token(value);
}

void config_startup()
{
    config_focus_new = TRUE;
    config_focus_follow = FALSE;
    config_focus_last = TRUE;
    config_focus_last_on_desktop = TRUE;
    config_focus_popup = TRUE;

    parse_reg_section("focus", NULL, parse_focus);

    config_theme = NULL;

    parse_reg_section("theme", NULL, parse_theme);

    config_desktops_num = 4;
    config_desktops_names = NULL;

    parse_reg_section("desktops", NULL, parse_desktops);
}

void config_shutdown()
{
    GSList *it;

    g_free(config_theme);

    for (it = config_desktops_names; it; it = it->next)
        g_free(it->data);
    g_slist_free(config_desktops_names);
}