]> icculus.org git repositories - mikachu/openbox.git/blob - util/epist/parser.cc
Big fat merge for epist.
[mikachu/openbox.git] / util / epist / parser.cc
1 extern "C" {
2 #include <stdio.h>
3 }
4 #include "parser.hh"
5
6 parser::parser(keytree *kt)
7     : _mask(0), _action(Action::noaction), _key(""), _arg(""), _kt(kt)
8 {
9 }
10
11 parser::~parser()
12 {
13     // nothing to see here. move along.
14 }
15
16 void parser::parse(string rc_file)
17 {
18     extern int yyparse(void *);
19     extern FILE *yyin;
20
21     yyin = fopen(rc_file.c_str(), "r");
22
23     yyparse(this);
24
25     fclose(yyin);
26     _kt->reset();
27 }
28
29 void parser::setAction(string act)
30 {
31     struct {
32         string str;
33         Action::ActionType act;
34     }
35     actions[] = {
36         { "noaction", Action::noaction },
37         { "execute", Action::execute },
38         { "iconify", Action::iconify },
39         { "raise", Action::raise },
40         { "lower", Action::lower },
41         { "close", Action::close },
42         { "toggleshade", Action::toggleshade },
43         { "toggleomnipresent", Action::toggleomnipresent },
44         { "moveWindowUp", Action::moveWindowUp },
45         { "moveWindowDown", Action::moveWindowDown },
46         { "moveWindowLeft", Action::moveWindowLeft },
47         { "moveWindowRight", Action::moveWindowRight },
48         { "resizeWindowWidth", Action::resizeWindowWidth },
49         { "resizeWindowHeight", Action::resizeWindowHeight },
50         { "toggleMaximizeFull", Action::toggleMaximizeFull },
51         { "toggleMaximizeVertical", Action::toggleMaximizeVertical },
52         { "toggleMaximizeHorizontal", Action::toggleMaximizeHorizontal },
53         { "sendToWorkspace", Action::sendToWorkspace },
54         { "nextWindow", Action::nextWindow },
55         { "prevWindow", Action::prevWindow },
56         { "nextWindowOnAllWorkspaces", Action::nextWindowOnAllWorkspaces },
57         { "prevWindowOnAllWorkspaces", Action::prevWindowOnAllWorkspaces },
58         { "nextWindowOnAllScreens", Action::nextWindowOnAllScreens },
59         { "prevWindowOnAllScreens", Action::prevWindowOnAllScreens },
60         { "nextWindowOfClass", Action::nextWindowOfClass },
61         { "prevWindowOfClass", Action::prevWindowOfClass },
62         { "nextWindowOfClassOnAllWorkspaces", Action::nextWindowOfClassOnAllWorkspaces },
63         { "prevWindowOfClassOnAllWorkspaces", Action::prevWindowOfClassOnAllWorkspaces },
64         { "changeWorkspace", Action::changeWorkspace },
65         { "nextWorkspace", Action::nextWorkspace },
66         { "prevWorkspace", Action::prevWorkspace },
67         { "nextScreen", Action::nextScreen },
68         { "prevScreen", Action::prevScreen },
69         { "showRootMenu", Action::showRootMenu },
70         { "showWorkspaceMenu", Action::showWorkspaceMenu },
71         { "stringChain", Action::stringChain },
72         { "keyChain", Action::keyChain },
73         { "numberChain", Action::numberChain },
74         { "cancel", Action::cancel },
75         { "", Action::noaction }
76     };
77
78     bool found = false;
79
80     for (int i = 0; actions[i].str != ""; ++i) {
81         if (actions[i].str == act) {
82             _action = actions[i].act;
83             found = true;
84         }
85     }
86
87     if (!found)
88         _action = Action::noaction;
89 }
90
91 void parser::addModifier(string mod)
92 {
93     struct {
94         string str;
95         unsigned int mask;
96     }
97     modifiers[] = {
98         { "Mod1", Mod1Mask },
99         { "Mod2", Mod2Mask },
100         { "Mod3", Mod3Mask },
101         { "Control", ControlMask },
102         { "Shift", ShiftMask },
103         { "", 0 }
104     };
105
106     for (int i = 0; modifiers[i].str != ""; ++i) {
107         if (modifiers[i].str == mod)
108             _mask |= modifiers[i].mask;
109     }
110 }
111
112 void parser::endAction()
113 {
114     _kt->addAction(_action, _mask, _key, _arg);
115     reset();
116 }
117
118 void parser::startChain()
119 {
120     _kt->advanceOnNewNode();
121     setChainBinding();
122     reset();
123 }
124
125 void parser::endChain()
126 {
127     _kt->retract();
128     reset();
129 }
130
131 void parser::setChainBinding()
132 {
133     if (_mask != 0 && _key != "") {
134         _kt->setCurrentNodeProps(Action::noaction, _mask, _key, "");
135         reset();
136     }
137 }
138
139 void parser::reset()
140 {
141     _mask = 0;
142     _action = Action::noaction;
143     _key = "";
144     _arg = "";
145 }