rename cursor setting functions to make modal set/restore more clearly related functions.
[blender-staging.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 "UI_interface.h"
49 #include "BKE_context.h"
50
51 static wmKeyMap *rna_keymap_active(wmKeyMap *km, bContext *C)
52 {
53         wmWindowManager *wm = CTX_wm_manager(C);
54         return WM_keymap_active(wm, km);
55 }
56
57 static void rna_keymap_restore_item_to_default(wmKeyMap *km, bContext *C, wmKeyMapItem *kmi)
58 {
59         WM_keymap_restore_item_to_default(C, km, kmi);
60 }
61
62 static void rna_Operator_report(wmOperator *op, int type, const char *msg)
63 {
64         BKE_report(op->reports, type, msg);
65 }
66
67 /* since event isn't needed... */
68 static void rna_Operator_enum_search_invoke(bContext *C, wmOperator *op)
69 {
70         WM_enum_search_invoke(C, op, NULL);
71         
72 }
73
74 static int rna_event_modal_handler_add(struct bContext *C, struct wmOperator *operator)
75 {
76         return WM_event_add_modal_handler(C, operator) != NULL;
77 }
78
79 /* XXX, need a way for python to know event types, 0x0110 is hard coded */
80 static wmTimer *rna_event_timer_add(struct wmWindowManager *wm, float time_step, wmWindow *win)
81 {
82         return WM_event_add_timer(wm, win, 0x0110, time_step);
83 }
84
85 static void rna_event_timer_remove(struct wmWindowManager *wm, wmTimer *timer)
86 {
87         WM_event_remove_timer(wm, timer->win, timer);
88 }
89
90 /* placeholder data for final implementation of a true progressbar */
91 struct wmStaticProgress {
92         float min;
93         float max;
94         bool  is_valid;
95 } wm_progress_state = {0, 0, false};
96
97
98 static void rna_progress_begin(struct wmWindowManager *wm, float min, float max)
99 {
100         float range = max - min;
101         if (range != 0) {
102                 wm_progress_state.min = min;
103                 wm_progress_state.max = max;
104                 wm_progress_state.is_valid = true;
105         }
106         else {
107                 wm_progress_state.is_valid = false;
108         }
109 }
110
111 static void rna_progress_update(struct wmWindowManager *wm, float value)
112 {
113         if (wm_progress_state.is_valid) {
114                 /* Map to cursor_time range [0,9999] */
115                 int val = (int)(10000 * (value - wm_progress_state.min) / (wm_progress_state.max - wm_progress_state.min));
116                 WM_cursor_time(wm->winactive, val);
117         }
118 }
119
120 static void rna_progress_end(struct wmWindowManager *wm)
121 {
122         if (wm_progress_state.is_valid) {
123                 WM_cursor_modal_restore(wm->winactive);
124                 wm_progress_state.is_valid = false;
125         }
126 }
127
128 /* wrap these because of 'const wmEvent *' */
129 static int rna_Operator_confirm(bContext *C, wmOperator *op, wmEvent *event)
130 {
131         return WM_operator_confirm(C, op, event);
132 }
133 static int rna_Operator_props_popup(bContext *C, wmOperator *op, wmEvent *event)
134 {
135         return WM_operator_props_popup(C, op, event);
136 }
137
138 static wmKeyMapItem *rna_KeyMap_item_new(wmKeyMap *km, ReportList *reports, const char *idname, int type, int value,
139                                          int any, int shift, int ctrl, int alt, int oskey, int keymodifier, int head)
140 {
141 /*      wmWindowManager *wm = CTX_wm_manager(C); */
142         wmKeyMapItem *kmi = NULL;
143         char idname_bl[OP_MAX_TYPENAME];
144         int modifier = 0;
145
146         /* only on non-modal maps */
147         if (km->flag & KEYMAP_MODAL) {
148                 BKE_report(reports, RPT_ERROR, "Not a non-modal keymap");
149                 return NULL;
150         }
151
152         WM_operator_bl_idname(idname_bl, idname);
153
154         if (shift) modifier |= KM_SHIFT;
155         if (ctrl) modifier |= KM_CTRL;
156         if (alt) modifier |= KM_ALT;
157         if (oskey) modifier |= KM_OSKEY;
158
159         if (any) modifier = KM_ANY;
160         
161         /* create keymap item */
162         kmi = WM_keymap_add_item(km, idname_bl, type, value, modifier, keymodifier);
163         
164         /* [#32437] allow scripts to define hotkeys that get added to start of keymap 
165          *          so that they stand a chance against catch-all defines later on
166          */
167         if (head) {
168                 BLI_remlink(&km->items, kmi);
169                 BLI_addhead(&km->items, kmi);
170         }
171         
172         return kmi;
173 }
174
175 static wmKeyMapItem *rna_KeyMap_item_new_modal(wmKeyMap *km, ReportList *reports, const char *propvalue_str,
176                                                int type, int value, int any, int shift, int ctrl, int alt,
177                                                int oskey, int keymodifier)
178 {
179         int modifier = 0;
180         int propvalue = 0;
181
182         /* only modal maps */
183         if ((km->flag & KEYMAP_MODAL) == 0) {
184                 BKE_report(reports, RPT_ERROR, "Not a modal keymap");
185                 return NULL;
186         }
187
188         if (shift) modifier |= KM_SHIFT;
189         if (ctrl) modifier |= KM_CTRL;
190         if (alt) modifier |= KM_ALT;
191         if (oskey) modifier |= KM_OSKEY;
192
193         if (any) modifier = KM_ANY;
194
195         /* not initialized yet, do delayed lookup */
196         if (!km->modal_items)
197                 return WM_modalkeymap_add_item_str(km, type, value, modifier, keymodifier, propvalue_str);
198
199         if (RNA_enum_value_from_id(km->modal_items, propvalue_str, &propvalue) == 0)
200                 BKE_report(reports, RPT_WARNING, "Property value not in enumeration");
201
202         return WM_modalkeymap_add_item(km, type, value, modifier, keymodifier, propvalue);
203 }
204
205 static void rna_KeyMap_item_remove(wmKeyMap *km, ReportList *reports, PointerRNA *kmi_ptr)
206 {
207         wmKeyMapItem *kmi = kmi_ptr->data;
208
209         if (WM_keymap_remove_item(km, kmi) == FALSE) {
210                 BKE_reportf(reports, RPT_ERROR, "KeyMapItem '%s' cannot be removed from '%s'", kmi->idname, km->idname);
211                 return;
212         }
213
214         RNA_POINTER_INVALIDATE(kmi_ptr);
215 }
216
217 static wmKeyMap *rna_keymap_new(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid, int modal)
218 {
219         if (modal == 0) {
220                 return WM_keymap_find(keyconf, idname, spaceid, regionid);
221         }
222         else {
223                 return WM_modalkeymap_add(keyconf, idname, NULL); /* items will be lazy init */
224         }
225 }
226
227 static wmKeyMap *rna_keymap_find(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid)
228 {
229         return WM_keymap_list_find(&keyconf->keymaps, idname, spaceid, regionid);
230 }
231
232 static wmKeyMap *rna_keymap_find_modal(wmKeyConfig *UNUSED(keyconf), const char *idname)
233 {
234         wmOperatorType *ot = WM_operatortype_find(idname, 0);
235
236         if (!ot)
237                 return NULL;
238         else
239                 return ot->modalkeymap;
240 }
241
242 static void rna_KeyConfig_remove(wmWindowManager *wm, ReportList *reports, PointerRNA *keyconf_ptr)
243 {
244         wmKeyConfig *keyconf = keyconf_ptr->data;
245
246         if (WM_keyconfig_remove(wm, keyconf) == FALSE) {
247                 BKE_reportf(reports, RPT_ERROR, "KeyConfig '%s' cannot be removed", keyconf->idname);
248                 return;
249         }
250
251         RNA_POINTER_INVALIDATE(keyconf_ptr);
252 }
253
254 /* popup menu wrapper */
255 static PointerRNA rna_PupMenuBegin(bContext *C, const char *title, int icon)
256 {
257         PointerRNA r_ptr;
258         void *data;
259
260         data = (void *)uiPupMenuBegin(C, title, icon);
261
262         RNA_pointer_create(NULL, &RNA_UIPopupMenu, data, &r_ptr);
263
264         return r_ptr;
265 }
266
267 static void rna_PupMenuEnd(bContext *C, PointerRNA *handle)
268 {
269         uiPupMenuEnd(C, handle->data);
270 }
271
272 #else
273
274 #define WM_GEN_INVOKE_EVENT (1 << 0)
275 #define WM_GEN_INVOKE_SIZE (1 << 1)
276 #define WM_GEN_INVOKE_RETURN (1 << 2)
277
278 static void rna_generic_op_invoke(FunctionRNA *func, int flag)
279 {
280         PropertyRNA *parm;
281
282         RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_USE_CONTEXT);
283         parm = RNA_def_pointer(func, "operator", "Operator", "", "Operator to call");
284         RNA_def_property_flag(parm, PROP_REQUIRED);
285
286         if (flag & WM_GEN_INVOKE_EVENT) {
287                 parm = RNA_def_pointer(func, "event", "Event", "", "Event");
288                 RNA_def_property_flag(parm, PROP_REQUIRED);
289         }
290
291         if (flag & WM_GEN_INVOKE_SIZE) {
292                 RNA_def_int(func, "width", 300, 0, INT_MAX, "", "Width of the popup", 0, INT_MAX);
293                 RNA_def_int(func, "height", 20, 0, INT_MAX, "", "Height of the popup", 0, INT_MAX);
294         }
295
296         if (flag & WM_GEN_INVOKE_RETURN) {
297                 parm = RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", "");
298                 RNA_def_function_return(func, parm);
299         }
300 }
301
302 void RNA_api_wm(StructRNA *srna)
303 {
304         FunctionRNA *func;
305         PropertyRNA *parm;
306
307         func = RNA_def_function(srna, "fileselect_add", "WM_event_add_fileselect");
308         RNA_def_function_ui_description(func, "Opens a file selector with an operator. "
309                                         "The string properties 'filepath', 'filename', 'directory' and a 'files' "
310                                         "collection are assigned when present in the operator");
311         rna_generic_op_invoke(func, 0);
312
313         func = RNA_def_function(srna, "modal_handler_add", "rna_event_modal_handler_add");
314         RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_USE_CONTEXT);
315         parm = RNA_def_pointer(func, "operator", "Operator", "", "Operator to call");
316         RNA_def_property_flag(parm, PROP_REQUIRED);
317         RNA_def_function_return(func, RNA_def_boolean(func, "handle", 1, "", ""));
318
319
320         func = RNA_def_function(srna, "event_timer_add", "rna_event_timer_add");
321         parm = RNA_def_property(func, "time_step", PROP_FLOAT, PROP_NONE);
322         RNA_def_property_flag(parm, PROP_REQUIRED);
323         RNA_def_property_range(parm, 0.0, FLT_MAX);
324         RNA_def_property_ui_text(parm, "Time Step", "Interval in seconds between timer events");
325         RNA_def_pointer(func, "window", "Window", "", "Window to attach the timer to or None");
326         parm = RNA_def_pointer(func, "result", "Timer", "", "");
327         RNA_def_function_return(func, parm);
328
329
330         func = RNA_def_function(srna, "event_timer_remove", "rna_event_timer_remove");
331         parm = RNA_def_pointer(func, "timer", "Timer", "", "");
332         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
333
334         /* Progress bar interface */
335         func = RNA_def_function(srna, "progress_begin", "rna_progress_begin");
336         RNA_def_function_ui_description(func, "Start Progress bar");
337
338         parm = RNA_def_property(func, "min", PROP_FLOAT, PROP_NONE);
339         RNA_def_property_ui_text(parm, "min", "any value in range [0,9999]");
340         RNA_def_property_flag(parm, PROP_REQUIRED);
341
342         parm = RNA_def_property(func, "max", PROP_FLOAT, PROP_NONE);
343         RNA_def_property_flag(parm, PROP_REQUIRED);
344         RNA_def_property_ui_text(parm, "max", "any value in range [min+1,9998]");
345
346         func = RNA_def_function(srna, "progress_update", "rna_progress_update");
347         parm = RNA_def_property(func, "value", PROP_FLOAT, PROP_NONE);
348         RNA_def_property_flag(parm, PROP_REQUIRED);
349         RNA_def_property_ui_text(parm, "value", "any value between min and max as set in progress_begin()");
350
351         func = RNA_def_function(srna, "progress_end", "rna_progress_end");
352         RNA_def_function_ui_description(func, "Terminate Progress bar");
353
354         /* invoke functions, for use with python */
355         func = RNA_def_function(srna, "invoke_props_popup", "rna_Operator_props_popup");
356         RNA_def_function_ui_description(func, "Operator popup invoke");
357         rna_generic_op_invoke(func, WM_GEN_INVOKE_EVENT | WM_GEN_INVOKE_RETURN);
358
359         /* invoked dialog opens popup with OK button, does not auto-exec operator. */
360         func = RNA_def_function(srna, "invoke_props_dialog", "WM_operator_props_dialog_popup");
361         RNA_def_function_ui_description(func, "Operator dialog (non-autoexec popup) invoke");
362         rna_generic_op_invoke(func, WM_GEN_INVOKE_SIZE | WM_GEN_INVOKE_RETURN);
363
364         /* invoke enum */
365         func = RNA_def_function(srna, "invoke_search_popup", "rna_Operator_enum_search_invoke");
366         rna_generic_op_invoke(func, 0);
367
368         /* invoke functions, for use with python */
369         func = RNA_def_function(srna, "invoke_popup", "WM_operator_ui_popup");
370         RNA_def_function_ui_description(func, "Operator popup invoke");
371         rna_generic_op_invoke(func, WM_GEN_INVOKE_SIZE | WM_GEN_INVOKE_RETURN);
372
373         func = RNA_def_function(srna, "invoke_confirm", "rna_Operator_confirm");
374         RNA_def_function_ui_description(func, "Operator confirmation");
375         rna_generic_op_invoke(func, WM_GEN_INVOKE_EVENT | WM_GEN_INVOKE_RETURN);
376
377
378         /* wrap uiPupMenuBegin */
379         func = RNA_def_function(srna, "pupmenu_begin__internal", "rna_PupMenuBegin");
380         RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_USE_CONTEXT);
381         parm = RNA_def_string(func, "title", "", 0, "", "");
382         RNA_def_property_flag(parm, PROP_REQUIRED);
383         parm = RNA_def_property(func, "icon", PROP_ENUM, PROP_NONE);
384         RNA_def_property_enum_items(parm, icon_items);
385         /* return */
386         parm = RNA_def_pointer(func, "menu", "UIPopupMenu", "", "");
387         RNA_def_property_flag(parm, PROP_RNAPTR | PROP_NEVER_NULL);
388         RNA_def_function_return(func, parm);
389
390         /* wrap uiPupMenuEnd */
391         func = RNA_def_function(srna, "pupmenu_end__internal", "rna_PupMenuEnd");
392         RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_USE_CONTEXT);
393         parm = RNA_def_pointer(func, "menu", "UIPopupMenu", "", "");
394         RNA_def_property_flag(parm, PROP_RNAPTR | PROP_NEVER_NULL);
395 }
396
397 void RNA_api_operator(StructRNA *srna)
398 {
399         FunctionRNA *func;
400         PropertyRNA *parm;
401
402         /* utility, not for registering */
403         func = RNA_def_function(srna, "report", "rna_Operator_report");
404         parm = RNA_def_enum_flag(func, "type", wm_report_items, 0, "Type", "");
405         RNA_def_property_flag(parm, PROP_REQUIRED);
406         parm = RNA_def_string(func, "message", "", 0, "Report Message", "");
407         RNA_def_property_flag(parm, PROP_REQUIRED);
408
409
410         /* Registration */
411
412         /* poll */
413         func = RNA_def_function(srna, "poll", NULL);
414         RNA_def_function_ui_description(func, "Test if the operator can be called or not");
415         RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_REGISTER_OPTIONAL);
416         RNA_def_function_return(func, RNA_def_boolean(func, "visible", 1, "", ""));
417         parm = RNA_def_pointer(func, "context", "Context", "", "");
418         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
419
420         /* exec */
421         func = RNA_def_function(srna, "execute", NULL);
422         RNA_def_function_ui_description(func, "Execute the operator");
423         RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
424         parm = RNA_def_pointer(func, "context", "Context", "", "");
425         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
426
427         /* better name? */
428         parm = RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", "");
429         RNA_def_function_return(func, parm);
430
431         /* check */
432         func = RNA_def_function(srna, "check", NULL);
433         RNA_def_function_ui_description(func, "Check the operator settings, return True to signal a change to redraw");
434         RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
435         parm = RNA_def_pointer(func, "context", "Context", "", "");
436         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
437
438         parm = RNA_def_boolean(func, "result", 0, "result", ""); /* better name? */
439         RNA_def_function_return(func, parm);
440         
441         /* invoke */
442         func = RNA_def_function(srna, "invoke", NULL);
443         RNA_def_function_ui_description(func, "Invoke the operator");
444         RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
445         parm = RNA_def_pointer(func, "context", "Context", "", "");
446         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
447         parm = RNA_def_pointer(func, "event", "Event", "", "");
448         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
449
450         /* better name? */
451         parm = RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", "");
452         RNA_def_function_return(func, parm);
453
454         func = RNA_def_function(srna, "modal", NULL); /* same as invoke */
455         RNA_def_function_ui_description(func, "Modal operator function");
456         RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
457         parm = RNA_def_pointer(func, "context", "Context", "", "");
458         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
459         parm = RNA_def_pointer(func, "event", "Event", "", "");
460         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
461
462         /* better name? */
463         parm = RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", "");
464         RNA_def_function_return(func, parm);
465
466         /* draw */
467         func = RNA_def_function(srna, "draw", NULL);
468         RNA_def_function_ui_description(func, "Draw function for the operator");
469         RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
470         parm = RNA_def_pointer(func, "context", "Context", "", "");
471         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
472
473         /* cancel */
474         func = RNA_def_function(srna, "cancel", NULL);
475         RNA_def_function_ui_description(func, "Called when the operator is canceled");
476         RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
477         parm = RNA_def_pointer(func, "context", "Context", "", "");
478         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
479
480         /* better name? */
481         parm = RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", "");
482         RNA_def_function_return(func, parm);
483 }
484
485 void RNA_api_macro(StructRNA *srna)
486 {
487         FunctionRNA *func;
488         PropertyRNA *parm;
489
490         /* utility, not for registering */
491         func = RNA_def_function(srna, "report", "rna_Operator_report");
492         parm = RNA_def_enum_flag(func, "type", wm_report_items, 0, "Type", "");
493         RNA_def_property_flag(parm, PROP_REQUIRED);
494         parm = RNA_def_string(func, "message", "", 0, "Report Message", "");
495         RNA_def_property_flag(parm, PROP_REQUIRED);
496
497
498         /* Registration */
499
500         /* poll */
501         func = RNA_def_function(srna, "poll", NULL);
502         RNA_def_function_ui_description(func, "Test if the operator can be called or not");
503         RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_REGISTER_OPTIONAL);
504         RNA_def_function_return(func, RNA_def_boolean(func, "visible", 1, "", ""));
505         parm = RNA_def_pointer(func, "context", "Context", "", "");
506         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
507
508         /* draw */
509         func = RNA_def_function(srna, "draw", NULL);
510         RNA_def_function_ui_description(func, "Draw function for the operator");
511         RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
512         parm = RNA_def_pointer(func, "context", "Context", "", "");
513         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
514 }
515
516 void RNA_api_keyconfig(StructRNA *UNUSED(srna))
517 {
518         /* FunctionRNA *func; */
519         /* PropertyRNA *parm; */
520 }
521
522 void RNA_api_keymap(StructRNA *srna)
523 {
524         FunctionRNA *func;
525         PropertyRNA *parm;
526
527         func = RNA_def_function(srna, "active", "rna_keymap_active");
528         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
529         parm = RNA_def_pointer(func, "keymap", "KeyMap", "Key Map", "Active key map");
530         RNA_def_function_return(func, parm);
531
532         func = RNA_def_function(srna, "restore_to_default", "WM_keymap_restore_to_default");
533         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
534
535         func = RNA_def_function(srna, "restore_item_to_default", "rna_keymap_restore_item_to_default");
536         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
537         parm = RNA_def_pointer(func, "item", "KeyMapItem", "Item", "");
538         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
539 }
540
541 void RNA_api_keymapitem(StructRNA *srna)
542 {
543         FunctionRNA *func;
544         PropertyRNA *parm;
545
546         func = RNA_def_function(srna, "compare", "WM_keymap_item_compare");
547         parm = RNA_def_pointer(func, "item", "KeyMapItem", "Item", "");
548         RNA_def_property_flag(parm, PROP_REQUIRED);
549         parm = RNA_def_boolean(func, "result", 0, "Comparison result", "");
550         RNA_def_function_return(func, parm);
551 }
552
553 void RNA_api_keymapitems(StructRNA *srna)
554 {
555         FunctionRNA *func;
556         PropertyRNA *parm;
557
558         func = RNA_def_function(srna, "new", "rna_KeyMap_item_new");
559         RNA_def_function_flag(func, FUNC_USE_REPORTS);
560         parm = RNA_def_string(func, "idname", "", 0, "Operator Identifier", "");
561         RNA_def_property_flag(parm, PROP_REQUIRED);
562         parm = RNA_def_enum(func, "type", event_type_items, 0, "Type", "");
563         RNA_def_property_flag(parm, PROP_REQUIRED);
564         parm = RNA_def_enum(func, "value", event_value_items, 0, "Value", "");
565         RNA_def_property_flag(parm, PROP_REQUIRED);
566         RNA_def_boolean(func, "any", 0, "Any", "");
567         RNA_def_boolean(func, "shift", 0, "Shift", "");
568         RNA_def_boolean(func, "ctrl", 0, "Ctrl", "");
569         RNA_def_boolean(func, "alt", 0, "Alt", "");
570         RNA_def_boolean(func, "oskey", 0, "OS Key", "");
571         RNA_def_enum(func, "key_modifier", event_type_items, 0, "Key Modifier", "");
572         RNA_def_boolean(func, "head", 0, "At Head", 
573                         "Force item to be added at start (not end) of key map so that "
574                         "it doesn't get blocked by an existing key map item");
575         parm = RNA_def_pointer(func, "item", "KeyMapItem", "Item", "Added key map item");
576         RNA_def_function_return(func, parm);
577
578         func = RNA_def_function(srna, "new_modal", "rna_KeyMap_item_new_modal");
579         RNA_def_function_flag(func, FUNC_USE_REPORTS);
580         parm = RNA_def_string(func, "propvalue", "", 0, "Property Value", "");
581         RNA_def_property_flag(parm, PROP_REQUIRED);
582         parm = RNA_def_enum(func, "type", event_type_items, 0, "Type", "");
583         RNA_def_property_flag(parm, PROP_REQUIRED);
584         parm = RNA_def_enum(func, "value", event_value_items, 0, "Value", "");
585         RNA_def_property_flag(parm, PROP_REQUIRED);
586         RNA_def_boolean(func, "any", 0, "Any", "");
587         RNA_def_boolean(func, "shift", 0, "Shift", "");
588         RNA_def_boolean(func, "ctrl", 0, "Ctrl", "");
589         RNA_def_boolean(func, "alt", 0, "Alt", "");
590         RNA_def_boolean(func, "oskey", 0, "OS Key", "");
591         RNA_def_enum(func, "key_modifier", event_type_items, 0, "Key Modifier", "");
592         parm = RNA_def_pointer(func, "item", "KeyMapItem", "Item", "Added key map item");
593         RNA_def_function_return(func, parm);
594         
595         func = RNA_def_function(srna, "remove", "rna_KeyMap_item_remove");
596         RNA_def_function_flag(func, FUNC_USE_REPORTS);
597         parm = RNA_def_pointer(func, "item", "KeyMapItem", "Item", "");
598         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
599         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
600
601         func = RNA_def_function(srna, "from_id", "WM_keymap_item_find_id");
602         parm = RNA_def_property(func, "id", PROP_INT, PROP_NONE);
603         RNA_def_property_flag(parm, PROP_REQUIRED);
604         RNA_def_property_ui_text(parm, "id", "ID of the item");
605         parm = RNA_def_pointer(func, "item", "KeyMapItem", "Item", "");
606         RNA_def_function_return(func, parm);
607 }
608
609 void RNA_api_keymaps(StructRNA *srna)
610 {
611         FunctionRNA *func;
612         PropertyRNA *parm;
613
614         func = RNA_def_function(srna, "new", "rna_keymap_new"); /* add_keymap */
615         parm = RNA_def_string(func, "name", "", 0, "Name", "");
616         RNA_def_property_flag(parm, PROP_REQUIRED);
617         RNA_def_enum(func, "space_type", space_type_items, SPACE_EMPTY, "Space Type", "");
618         RNA_def_enum(func, "region_type", region_type_items, RGN_TYPE_WINDOW, "Region Type", "");
619         RNA_def_boolean(func, "modal", 0, "Modal", "");
620         parm = RNA_def_pointer(func, "keymap", "KeyMap", "Key Map", "Added key map");
621         RNA_def_function_return(func, parm);
622
623         func = RNA_def_function(srna, "find", "rna_keymap_find"); /* find_keymap */
624         parm = RNA_def_string(func, "name", "", 0, "Name", "");
625         RNA_def_property_flag(parm, PROP_REQUIRED);
626         RNA_def_enum(func, "space_type", space_type_items, SPACE_EMPTY, "Space Type", "");
627         RNA_def_enum(func, "region_type", region_type_items, RGN_TYPE_WINDOW, "Region Type", "");
628         parm = RNA_def_pointer(func, "keymap", "KeyMap", "Key Map", "Corresponding key map");
629         RNA_def_function_return(func, parm);
630
631         func = RNA_def_function(srna, "find_modal", "rna_keymap_find_modal"); /* find_keymap_modal */
632         parm = RNA_def_string(func, "name", "", 0, "Operator Name", "");
633         RNA_def_property_flag(parm, PROP_REQUIRED);
634         parm = RNA_def_pointer(func, "keymap", "KeyMap", "Key Map", "Corresponding key map");
635         RNA_def_function_return(func, parm);
636 }
637
638 void RNA_api_keyconfigs(StructRNA *srna)
639 {
640         FunctionRNA *func;
641         PropertyRNA *parm;
642
643         func = RNA_def_function(srna, "new", "WM_keyconfig_new_user"); /* add_keyconfig */
644         parm = RNA_def_string(func, "name", "", 0, "Name", "");
645         RNA_def_property_flag(parm, PROP_REQUIRED);
646         parm = RNA_def_pointer(func, "keyconfig", "KeyConfig", "Key Configuration", "Added key configuration");
647         RNA_def_function_return(func, parm);
648
649         func = RNA_def_function(srna, "remove", "rna_KeyConfig_remove"); /* remove_keyconfig */
650         RNA_def_function_flag(func, FUNC_USE_REPORTS);
651         parm = RNA_def_pointer(func, "keyconfig", "KeyConfig", "Key Configuration", "Removed key configuration");
652         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
653         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
654 }
655
656 #endif