code cleanup: use const events for modal and invoke operators.
[blender.git] / source / blender / makesrna / intern / rna_wm_api.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
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.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2009 Blender Foundation.
19  * All rights reserved.
20  *
21  *
22  * Contributor(s): Blender Foundation
23  *
24  * ***** END GPL LICENSE BLOCK *****
25  */
26
27 /** \file blender/makesrna/intern/rna_wm_api.c
28  *  \ingroup RNA
29  */
30
31
32 #include <stdlib.h>
33 #include <stdio.h>
34
35 #include "BLI_utildefines.h"
36
37 #include "RNA_define.h"
38 #include "RNA_enum_types.h"
39
40 #include "DNA_screen_types.h"
41 #include "DNA_space_types.h"
42 #include "DNA_windowmanager_types.h"
43
44 #include "rna_internal.h"  /* own include */
45
46 #ifdef RNA_RUNTIME
47
48 #include "BKE_context.h"
49
50 static wmKeyMap *rna_keymap_active(wmKeyMap *km, bContext *C)
51 {
52         wmWindowManager *wm = CTX_wm_manager(C);
53         return WM_keymap_active(wm, km);
54 }
55
56 static void rna_keymap_restore_item_to_default(wmKeyMap *km, bContext *C, wmKeyMapItem *kmi)
57 {
58         WM_keymap_restore_item_to_default(C, km, kmi);
59 }
60
61 static void rna_Operator_report(wmOperator *op, int type, const char *msg)
62 {
63         BKE_report(op->reports, type, msg);
64 }
65
66 /* since event isn't needed... */
67 static void rna_Operator_enum_search_invoke(bContext *C, wmOperator *op)
68 {
69         WM_enum_search_invoke(C, op, NULL);
70         
71 }
72
73 static int rna_event_modal_handler_add(struct bContext *C, struct wmOperator *operator)
74 {
75         return WM_event_add_modal_handler(C, operator) != NULL;
76 }
77
78 /* XXX, need a way for python to know event types, 0x0110 is hard coded */
79 static wmTimer *rna_event_timer_add(struct wmWindowManager *wm, float time_step, wmWindow *win)
80 {
81         return WM_event_add_timer(wm, win, 0x0110, time_step);
82 }
83
84 static void rna_event_timer_remove(struct wmWindowManager *wm, wmTimer *timer)
85 {
86         WM_event_remove_timer(wm, timer->win, timer);
87 }
88
89 /* wrap these because of 'const wmEvent *' */
90 static int rna_Operator_confirm(bContext *C, wmOperator *op, wmEvent *event)
91 {
92         return WM_operator_confirm(C, op, event);
93 }
94 static int rna_Operator_props_popup(bContext *C, wmOperator *op, wmEvent *event)
95 {
96         return WM_operator_props_popup(C, op, event);
97 }
98
99 static wmKeyMapItem *rna_KeyMap_item_new(wmKeyMap *km, ReportList *reports, const char *idname, int type, int value,
100                                          int any, int shift, int ctrl, int alt, int oskey, int keymodifier, int head)
101 {
102 /*      wmWindowManager *wm = CTX_wm_manager(C); */
103         wmKeyMapItem *kmi = NULL;
104         char idname_bl[OP_MAX_TYPENAME];
105         int modifier = 0;
106
107         /* only on non-modal maps */
108         if (km->flag & KEYMAP_MODAL) {
109                 BKE_report(reports, RPT_ERROR, "Not a non-modal keymap");
110                 return NULL;
111         }
112
113         WM_operator_bl_idname(idname_bl, idname);
114
115         if (shift) modifier |= KM_SHIFT;
116         if (ctrl) modifier |= KM_CTRL;
117         if (alt) modifier |= KM_ALT;
118         if (oskey) modifier |= KM_OSKEY;
119
120         if (any) modifier = KM_ANY;
121         
122         /* create keymap item */
123         kmi = WM_keymap_add_item(km, idname_bl, type, value, modifier, keymodifier);
124         
125         /* [#32437] allow scripts to define hotkeys that get added to start of keymap 
126          *          so that they stand a chance against catch-all defines later on
127          */
128         if (head) {
129                 BLI_remlink(&km->items, kmi);
130                 BLI_addhead(&km->items, kmi);
131         }
132         
133         return kmi;
134 }
135
136 static wmKeyMapItem *rna_KeyMap_item_new_modal(wmKeyMap *km, ReportList *reports, const char *propvalue_str,
137                                                int type, int value, int any, int shift, int ctrl, int alt,
138                                                int oskey, int keymodifier)
139 {
140         int modifier = 0;
141         int propvalue = 0;
142
143         /* only modal maps */
144         if ((km->flag & KEYMAP_MODAL) == 0) {
145                 BKE_report(reports, RPT_ERROR, "Not a modal keymap");
146                 return NULL;
147         }
148
149         if (shift) modifier |= KM_SHIFT;
150         if (ctrl) modifier |= KM_CTRL;
151         if (alt) modifier |= KM_ALT;
152         if (oskey) modifier |= KM_OSKEY;
153
154         if (any) modifier = KM_ANY;
155
156         /* not initialized yet, do delayed lookup */
157         if (!km->modal_items)
158                 return WM_modalkeymap_add_item_str(km, type, value, modifier, keymodifier, propvalue_str);
159
160         if (RNA_enum_value_from_id(km->modal_items, propvalue_str, &propvalue) == 0)
161                 BKE_report(reports, RPT_WARNING, "Property value not in enumeration");
162
163         return WM_modalkeymap_add_item(km, type, value, modifier, keymodifier, propvalue);
164 }
165
166 static void rna_KeyMap_item_remove(wmKeyMap *km, ReportList *reports, PointerRNA *kmi_ptr)
167 {
168         wmKeyMapItem *kmi = kmi_ptr->data;
169
170         if (WM_keymap_remove_item(km, kmi) == FALSE) {
171                 BKE_reportf(reports, RPT_ERROR, "KeyMapItem '%s' cannot be removed from '%s'", kmi->idname, km->idname);
172                 return;
173         }
174
175         RNA_POINTER_INVALIDATE(kmi_ptr);
176 }
177
178 static wmKeyMap *rna_keymap_new(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid, int modal)
179 {
180         if (modal == 0) {
181                 return WM_keymap_find(keyconf, idname, spaceid, regionid);
182         }
183         else {
184                 return WM_modalkeymap_add(keyconf, idname, NULL); /* items will be lazy init */
185         }
186 }
187
188 static wmKeyMap *rna_keymap_find(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid)
189 {
190         return WM_keymap_list_find(&keyconf->keymaps, idname, spaceid, regionid);
191 }
192
193 static wmKeyMap *rna_keymap_find_modal(wmKeyConfig *UNUSED(keyconf), const char *idname)
194 {
195         wmOperatorType *ot = WM_operatortype_find(idname, 0);
196
197         if (!ot)
198                 return NULL;
199         else
200                 return ot->modalkeymap;
201 }
202
203 static void rna_KeyConfig_remove(wmWindowManager *wm, ReportList *reports, PointerRNA *keyconf_ptr)
204 {
205         wmKeyConfig *keyconf = keyconf_ptr->data;
206
207         if (WM_keyconfig_remove(wm, keyconf) == FALSE) {
208                 BKE_reportf(reports, RPT_ERROR, "KeyConfig '%s' cannot be removed", keyconf->idname);
209                 return;
210         }
211
212         RNA_POINTER_INVALIDATE(keyconf_ptr);
213 }
214
215 #else
216
217 #define WM_GEN_INVOKE_EVENT (1 << 0)
218 #define WM_GEN_INVOKE_SIZE (1 << 1)
219 #define WM_GEN_INVOKE_RETURN (1 << 2)
220
221 static void rna_generic_op_invoke(FunctionRNA *func, int flag)
222 {
223         PropertyRNA *parm;
224
225         RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_USE_CONTEXT);
226         parm = RNA_def_pointer(func, "operator", "Operator", "", "Operator to call");
227         RNA_def_property_flag(parm, PROP_REQUIRED);
228
229         if (flag & WM_GEN_INVOKE_EVENT) {
230                 parm = RNA_def_pointer(func, "event", "Event", "", "Event");
231                 RNA_def_property_flag(parm, PROP_REQUIRED);
232         }
233
234         if (flag & WM_GEN_INVOKE_SIZE) {
235                 RNA_def_int(func, "width", 300, 0, INT_MAX, "", "Width of the popup", 0, INT_MAX);
236                 RNA_def_int(func, "height", 20, 0, INT_MAX, "", "Height of the popup", 0, INT_MAX);
237         }
238
239         if (flag & WM_GEN_INVOKE_RETURN) {
240                 parm = RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", "");
241                 RNA_def_function_return(func, parm);
242         }
243 }
244
245 void RNA_api_wm(StructRNA *srna)
246 {
247         FunctionRNA *func;
248         PropertyRNA *parm;
249
250         func = RNA_def_function(srna, "fileselect_add", "WM_event_add_fileselect");
251         RNA_def_function_ui_description(func, "Opens a file selector with an operator. "
252                                         "The string properties 'filepath', 'filename', 'directory' and a 'files' "
253                                         "collection are assigned when present in the operator");
254         rna_generic_op_invoke(func, 0);
255
256         func = RNA_def_function(srna, "modal_handler_add", "rna_event_modal_handler_add");
257         RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_USE_CONTEXT);
258         parm = RNA_def_pointer(func, "operator", "Operator", "", "Operator to call");
259         RNA_def_property_flag(parm, PROP_REQUIRED);
260         RNA_def_function_return(func, RNA_def_boolean(func, "handle", 1, "", ""));
261
262
263         func = RNA_def_function(srna, "event_timer_add", "rna_event_timer_add");
264         parm = RNA_def_property(func, "time_step", PROP_FLOAT, PROP_NONE);
265         RNA_def_property_flag(parm, PROP_REQUIRED);
266         RNA_def_property_range(parm, 0.0, FLT_MAX);
267         RNA_def_property_ui_text(parm, "Time Step", "Interval in seconds between timer events");
268         RNA_def_pointer(func, "window", "Window", "", "Window to attach the timer to or None");
269         parm = RNA_def_pointer(func, "result", "Timer", "", "");
270         RNA_def_function_return(func, parm);
271
272
273         func = RNA_def_function(srna, "event_timer_remove", "rna_event_timer_remove");
274         parm = RNA_def_pointer(func, "timer", "Timer", "", "");
275         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
276
277
278         /* invoke functions, for use with python */
279         func = RNA_def_function(srna, "invoke_props_popup", "rna_Operator_props_popup");
280         RNA_def_function_ui_description(func, "Operator popup invoke");
281         rna_generic_op_invoke(func, WM_GEN_INVOKE_EVENT | WM_GEN_INVOKE_RETURN);
282
283         /* invoked dialog opens popup with OK button, does not auto-exec operator. */
284         func = RNA_def_function(srna, "invoke_props_dialog", "WM_operator_props_dialog_popup");
285         RNA_def_function_ui_description(func, "Operator dialog (non-autoexec popup) invoke");
286         rna_generic_op_invoke(func, WM_GEN_INVOKE_SIZE | WM_GEN_INVOKE_RETURN);
287
288         /* invoke enum */
289         func = RNA_def_function(srna, "invoke_search_popup", "rna_Operator_enum_search_invoke");
290         rna_generic_op_invoke(func, 0);
291
292         /* invoke functions, for use with python */
293         func = RNA_def_function(srna, "invoke_popup", "WM_operator_ui_popup");
294         RNA_def_function_ui_description(func, "Operator popup invoke");
295         rna_generic_op_invoke(func, WM_GEN_INVOKE_SIZE | WM_GEN_INVOKE_RETURN);
296
297         func = RNA_def_function(srna, "invoke_confirm", "rna_Operator_confirm");
298         RNA_def_function_ui_description(func, "Operator confirmation");
299         rna_generic_op_invoke(func, WM_GEN_INVOKE_EVENT | WM_GEN_INVOKE_RETURN);
300         
301 }
302
303 void RNA_api_operator(StructRNA *srna)
304 {
305         FunctionRNA *func;
306         PropertyRNA *parm;
307
308         /* utility, not for registering */
309         func = RNA_def_function(srna, "report", "rna_Operator_report");
310         parm = RNA_def_enum_flag(func, "type", wm_report_items, 0, "Type", "");
311         RNA_def_property_flag(parm, PROP_REQUIRED);
312         parm = RNA_def_string(func, "message", "", 0, "Report Message", "");
313         RNA_def_property_flag(parm, PROP_REQUIRED);
314
315
316         /* Registration */
317
318         /* poll */
319         func = RNA_def_function(srna, "poll", NULL);
320         RNA_def_function_ui_description(func, "Test if the operator can be called or not");
321         RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_REGISTER_OPTIONAL);
322         RNA_def_function_return(func, RNA_def_boolean(func, "visible", 1, "", ""));
323         parm = RNA_def_pointer(func, "context", "Context", "", "");
324         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
325
326         /* exec */
327         func = RNA_def_function(srna, "execute", NULL);
328         RNA_def_function_ui_description(func, "Execute the operator");
329         RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
330         parm = RNA_def_pointer(func, "context", "Context", "", "");
331         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
332
333         /* better name? */
334         parm = RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", "");
335         RNA_def_function_return(func, parm);
336
337         /* check */
338         func = RNA_def_function(srna, "check", NULL);
339         RNA_def_function_ui_description(func, "Check the operator settings, return True to signal a change to redraw");
340         RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
341         parm = RNA_def_pointer(func, "context", "Context", "", "");
342         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
343
344         parm = RNA_def_boolean(func, "result", 0, "result", ""); /* better name? */
345         RNA_def_function_return(func, parm);
346         
347         /* invoke */
348         func = RNA_def_function(srna, "invoke", NULL);
349         RNA_def_function_ui_description(func, "Invoke the operator");
350         RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
351         parm = RNA_def_pointer(func, "context", "Context", "", "");
352         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
353         parm = RNA_def_pointer(func, "event", "Event", "", "");
354         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
355
356         /* better name? */
357         parm = RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", "");
358         RNA_def_function_return(func, parm);
359
360         func = RNA_def_function(srna, "modal", NULL); /* same as invoke */
361         RNA_def_function_ui_description(func, "Modal operator function");
362         RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
363         parm = RNA_def_pointer(func, "context", "Context", "", "");
364         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
365         parm = RNA_def_pointer(func, "event", "Event", "", "");
366         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
367
368         /* better name? */
369         parm = RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", "");
370         RNA_def_function_return(func, parm);
371
372         /* draw */
373         func = RNA_def_function(srna, "draw", NULL);
374         RNA_def_function_ui_description(func, "Draw function for the operator");
375         RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
376         parm = RNA_def_pointer(func, "context", "Context", "", "");
377         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
378
379         /* cancel */
380         func = RNA_def_function(srna, "cancel", NULL);
381         RNA_def_function_ui_description(func, "Called when the operator is canceled");
382         RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
383         parm = RNA_def_pointer(func, "context", "Context", "", "");
384         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
385
386         /* better name? */
387         parm = RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", "");
388         RNA_def_function_return(func, parm);
389 }
390
391 void RNA_api_macro(StructRNA *srna)
392 {
393         FunctionRNA *func;
394         PropertyRNA *parm;
395
396         /* utility, not for registering */
397         func = RNA_def_function(srna, "report", "rna_Operator_report");
398         parm = RNA_def_enum_flag(func, "type", wm_report_items, 0, "Type", "");
399         RNA_def_property_flag(parm, PROP_REQUIRED);
400         parm = RNA_def_string(func, "message", "", 0, "Report Message", "");
401         RNA_def_property_flag(parm, PROP_REQUIRED);
402
403
404         /* Registration */
405
406         /* poll */
407         func = RNA_def_function(srna, "poll", NULL);
408         RNA_def_function_ui_description(func, "Test if the operator can be called or not");
409         RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_REGISTER_OPTIONAL);
410         RNA_def_function_return(func, RNA_def_boolean(func, "visible", 1, "", ""));
411         parm = RNA_def_pointer(func, "context", "Context", "", "");
412         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
413
414         /* draw */
415         func = RNA_def_function(srna, "draw", NULL);
416         RNA_def_function_ui_description(func, "Draw function for the operator");
417         RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
418         parm = RNA_def_pointer(func, "context", "Context", "", "");
419         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
420 }
421
422 void RNA_api_keyconfig(StructRNA *UNUSED(srna))
423 {
424         /* FunctionRNA *func; */
425         /* PropertyRNA *parm; */
426 }
427
428 void RNA_api_keymap(StructRNA *srna)
429 {
430         FunctionRNA *func;
431         PropertyRNA *parm;
432
433         func = RNA_def_function(srna, "active", "rna_keymap_active");
434         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
435         parm = RNA_def_pointer(func, "keymap", "KeyMap", "Key Map", "Active key map");
436         RNA_def_function_return(func, parm);
437
438         func = RNA_def_function(srna, "restore_to_default", "WM_keymap_restore_to_default");
439         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
440
441         func = RNA_def_function(srna, "restore_item_to_default", "rna_keymap_restore_item_to_default");
442         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
443         parm = RNA_def_pointer(func, "item", "KeyMapItem", "Item", "");
444         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
445 }
446
447 void RNA_api_keymapitem(StructRNA *srna)
448 {
449         FunctionRNA *func;
450         PropertyRNA *parm;
451
452         func = RNA_def_function(srna, "compare", "WM_keymap_item_compare");
453         parm = RNA_def_pointer(func, "item", "KeyMapItem", "Item", "");
454         RNA_def_property_flag(parm, PROP_REQUIRED);
455         parm = RNA_def_boolean(func, "result", 0, "Comparison result", "");
456         RNA_def_function_return(func, parm);
457 }
458
459 void RNA_api_keymapitems(StructRNA *srna)
460 {
461         FunctionRNA *func;
462         PropertyRNA *parm;
463
464         func = RNA_def_function(srna, "new", "rna_KeyMap_item_new");
465         RNA_def_function_flag(func, FUNC_USE_REPORTS);
466         parm = RNA_def_string(func, "idname", "", 0, "Operator Identifier", "");
467         RNA_def_property_flag(parm, PROP_REQUIRED);
468         parm = RNA_def_enum(func, "type", event_type_items, 0, "Type", "");
469         RNA_def_property_flag(parm, PROP_REQUIRED);
470         parm = RNA_def_enum(func, "value", event_value_items, 0, "Value", "");
471         RNA_def_property_flag(parm, PROP_REQUIRED);
472         RNA_def_boolean(func, "any", 0, "Any", "");
473         RNA_def_boolean(func, "shift", 0, "Shift", "");
474         RNA_def_boolean(func, "ctrl", 0, "Ctrl", "");
475         RNA_def_boolean(func, "alt", 0, "Alt", "");
476         RNA_def_boolean(func, "oskey", 0, "OS Key", "");
477         RNA_def_enum(func, "key_modifier", event_type_items, 0, "Key Modifier", "");
478         RNA_def_boolean(func, "head", 0, "At Head", 
479                         "Force item to be added at start (not end) of key map so that "
480                         "it doesn't get blocked by an existing key map item");
481         parm = RNA_def_pointer(func, "item", "KeyMapItem", "Item", "Added key map item");
482         RNA_def_function_return(func, parm);
483
484         func = RNA_def_function(srna, "new_modal", "rna_KeyMap_item_new_modal");
485         RNA_def_function_flag(func, FUNC_USE_REPORTS);
486         parm = RNA_def_string(func, "propvalue", "", 0, "Property Value", "");
487         RNA_def_property_flag(parm, PROP_REQUIRED);
488         parm = RNA_def_enum(func, "type", event_type_items, 0, "Type", "");
489         RNA_def_property_flag(parm, PROP_REQUIRED);
490         parm = RNA_def_enum(func, "value", event_value_items, 0, "Value", "");
491         RNA_def_property_flag(parm, PROP_REQUIRED);
492         RNA_def_boolean(func, "any", 0, "Any", "");
493         RNA_def_boolean(func, "shift", 0, "Shift", "");
494         RNA_def_boolean(func, "ctrl", 0, "Ctrl", "");
495         RNA_def_boolean(func, "alt", 0, "Alt", "");
496         RNA_def_boolean(func, "oskey", 0, "OS Key", "");
497         RNA_def_enum(func, "key_modifier", event_type_items, 0, "Key Modifier", "");
498         parm = RNA_def_pointer(func, "item", "KeyMapItem", "Item", "Added key map item");
499         RNA_def_function_return(func, parm);
500         
501         func = RNA_def_function(srna, "remove", "rna_KeyMap_item_remove");
502         RNA_def_function_flag(func, FUNC_USE_REPORTS);
503         parm = RNA_def_pointer(func, "item", "KeyMapItem", "Item", "");
504         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
505         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
506
507         func = RNA_def_function(srna, "from_id", "WM_keymap_item_find_id");
508         parm = RNA_def_property(func, "id", PROP_INT, PROP_NONE);
509         RNA_def_property_flag(parm, PROP_REQUIRED);
510         RNA_def_property_ui_text(parm, "id", "ID of the item");
511         parm = RNA_def_pointer(func, "item", "KeyMapItem", "Item", "");
512         RNA_def_function_return(func, parm);
513 }
514
515 void RNA_api_keymaps(StructRNA *srna)
516 {
517         FunctionRNA *func;
518         PropertyRNA *parm;
519
520         func = RNA_def_function(srna, "new", "rna_keymap_new"); /* add_keymap */
521         parm = RNA_def_string(func, "name", "", 0, "Name", "");
522         RNA_def_property_flag(parm, PROP_REQUIRED);
523         RNA_def_enum(func, "space_type", space_type_items, SPACE_EMPTY, "Space Type", "");
524         RNA_def_enum(func, "region_type", region_type_items, RGN_TYPE_WINDOW, "Region Type", "");
525         RNA_def_boolean(func, "modal", 0, "Modal", "");
526         parm = RNA_def_pointer(func, "keymap", "KeyMap", "Key Map", "Added key map");
527         RNA_def_function_return(func, parm);
528
529         func = RNA_def_function(srna, "find", "rna_keymap_find"); /* find_keymap */
530         parm = RNA_def_string(func, "name", "", 0, "Name", "");
531         RNA_def_property_flag(parm, PROP_REQUIRED);
532         RNA_def_enum(func, "space_type", space_type_items, SPACE_EMPTY, "Space Type", "");
533         RNA_def_enum(func, "region_type", region_type_items, RGN_TYPE_WINDOW, "Region Type", "");
534         parm = RNA_def_pointer(func, "keymap", "KeyMap", "Key Map", "Corresponding key map");
535         RNA_def_function_return(func, parm);
536
537         func = RNA_def_function(srna, "find_modal", "rna_keymap_find_modal"); /* find_keymap_modal */
538         parm = RNA_def_string(func, "name", "", 0, "Operator Name", "");
539         RNA_def_property_flag(parm, PROP_REQUIRED);
540         parm = RNA_def_pointer(func, "keymap", "KeyMap", "Key Map", "Corresponding key map");
541         RNA_def_function_return(func, parm);
542 }
543
544 void RNA_api_keyconfigs(StructRNA *srna)
545 {
546         FunctionRNA *func;
547         PropertyRNA *parm;
548
549         func = RNA_def_function(srna, "new", "WM_keyconfig_new_user"); /* add_keyconfig */
550         parm = RNA_def_string(func, "name", "", 0, "Name", "");
551         RNA_def_property_flag(parm, PROP_REQUIRED);
552         parm = RNA_def_pointer(func, "keyconfig", "KeyConfig", "Key Configuration", "Added key configuration");
553         RNA_def_function_return(func, parm);
554
555         func = RNA_def_function(srna, "remove", "rna_KeyConfig_remove"); /* remove_keyconfig */
556         RNA_def_function_flag(func, FUNC_USE_REPORTS);
557         parm = RNA_def_pointer(func, "keyconfig", "KeyConfig", "Key Configuration", "Removed key configuration");
558         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
559         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
560 }
561
562 #endif