98d1cbb1723e0df732bba75ddc09461c08a2deba
1 /* Copyright (c) 2008 Sadrul Habib Chowdhury (sadrul@users.sf.net)
2 * 2009 Rui Guo (firemeteor.guo@gmail.com)
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 3, or (at your option)
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program (see the file COPYING); if not, write to the
16 * Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
19 ****************************************************************
26 /*Binding structure & functions*/
28 struct binding
*bindings
= NULL
;
31 register_binding (struct binding
*new_binding
)
33 if (!new_binding
->registered
)
35 new_binding
->b_next
= bindings
;
36 bindings
= new_binding
;
37 new_binding
->registered
= 1;
42 extern struct binding lua_binding
;
45 void LoadBindings(void)
48 register_binding(&lua_binding
);
53 FinalizeBindings (void)
55 struct binding
*binding
=bindings
;
60 binding
= binding
->b_next
;
65 ScriptSource(int argc
, const char **argv
)
69 const char *bd_select
= 0, *script
;
70 struct binding
*binding
= bindings
;
72 /* Parse the commandline options
73 * sourcescript [-async|-a] [-binding|-b <binding>] script
75 while (*argv
&& **argv
== '-') {
76 // check for (-a | -async)
77 if ((*argv
[1] == 'a' && !*argv
[2])
78 || strcmp(*argv
, "-async") == 0)
80 // check for (-b | -binding)
81 else if ((*argv
[1] == 'b' && !*argv
[2])
82 || strcmp(*argv
, "-binding") == 0) {
91 if (!bd_select
|| strcmp(bd_select
, binding
->name
) == 0) {
92 //dynamically initialize the binding
96 //and source the script
97 if (ret
= binding
->bd_Source(script
, async
))
100 binding
= binding
->b_next
;
103 LMsg(1, "Could not source specified script %s", script
);
106 /* Event notification handling */
109 struct script_event cmdexecuted
;
112 /* To add new event, introduce a filed for that event to the object in
113 * question, don't forget to put a name, offset pair here. NOTE: keep the
114 * name field sorted in alphabet order, the searching relies on it.
121 {"global_cmdexecuted", offsetof(struct gevents
, cmdexecuted
)},
122 {"window_resize", offsetof(struct win
, resize
)},
123 {"window_can_resize", offsetof(struct win
, canresize
)}
126 struct script_event
*
127 get_object_event_queue(char *name
, char *obj
) {
130 obj
= (char *)&globalevents
;
133 n
= hi
= sizeof(event_table
);
136 half
= (lo
+ hi
) >> 1;
137 cmp
= strcmp(name
, event_table
[half
].name
);
144 if (lo
>= n
|| strcmp(name
, event_table
[lo
].name
))
147 return (struct event
*)(obj
+ event_table
[lo
].offset
);
151 register_listener(struct script_event
* event
, struct listener
*listener
)
155 #define ALL_SCRIPTS(fn, params, stop) do { \
156 struct binding *iter; \
157 for (iter = bindings; iter; iter = iter->b_next) \
159 if (iter->fns->fn && (ret = (iter->fns->fn params)) && stop) \
164 void ScriptForeWindowChanged(void)
167 ALL_SCRIPTS(sf_ForeWindowChanged
, (), 0);
170 int ScriptProcessCaption(const char *str
, struct win
*win
, int len
)
173 ALL_SCRIPTS(sf_ProcessCaption
, (str
, win
, len
), 1);
177 int ScriptCommandExecuted(const char *command
, const char **args
, int argc
)
180 ALL_SCRIPTS(sf_CommandExecuted
, (command
, args
, argc
), 0);