Revision: 17750
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17750
Author:   ianwill
Date:     2008-12-09 01:18:30 +0100 (Tue, 09 Dec 2008)

Log Message:
-----------
== Python Space Handlers ==

- Old feature request: now space handlers can report release events, too. For 
that a new space handler type was added, here's the header for it:

# SPACEHANDLER.VIEW3D.EVENT.ALL

These scripts report both "presses and releases". For release events, 
Blender.eventValue is zero and Blender.link == 
Blender.SpaceHandlers.VIEW3D_EVENT_RELEASE. Check the API_related bpy doc for 
more info.

- Bug fix: left mouse clicks could be reported twice.

Important: for both the feature and the fix, to make the code nicer and to let 
space handlers become available in more situations, I moved the check for space 
handlers in space.c. Now it happens before checks for grease pencil, sculpt and 
left/right mouse button swapping. If this causes any problem (it shouldn't), 
please report.

PS: Thanks to Steven Truppe, who asked for this and even sent me a patch, but 
to preserve compatibility with existing event space handler scripts I did 
things in a different way.

Modified Paths:
--------------
    trunk/blender/source/blender/makesdna/DNA_scriptlink_types.h
    trunk/blender/source/blender/python/BPY_interface.c
    trunk/blender/source/blender/python/api2_2x/Blender.c
    trunk/blender/source/blender/python/api2_2x/doc/API_related.py
    trunk/blender/source/blender/src/header_view3d.c
    trunk/blender/source/blender/src/space.c

Modified: trunk/blender/source/blender/makesdna/DNA_scriptlink_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_scriptlink_types.h        
2008-12-08 19:16:47 UTC (rev 17749)
+++ trunk/blender/source/blender/makesdna/DNA_scriptlink_types.h        
2008-12-09 00:18:30 UTC (rev 17750)
@@ -65,10 +65,12 @@
 /* these are special scriptlinks that can be assigned to
  * a given space in a given ScrArea to:
  * - (EVENT type) handle events sent to that space;
- * - (DRAW type) draw on the space after its own drawing function finishes
+ * - (EVENT_ALL type): handle release events, too;
+ * - (DRAW type) draw on the space after its own drawing function finishes.
  */
-#define SPACEHANDLER_VIEW3D_EVENT 1
-#define SPACEHANDLER_VIEW3D_DRAW 2
+#define SPACEHANDLER_VIEW3D_DRAW 1
+#define SPACEHANDLER_VIEW3D_EVENT 2
+#define SPACEHANDLER_VIEW3D_EVENT_ALL 3
 
 
 #ifdef __cplusplus

Modified: trunk/blender/source/blender/python/BPY_interface.c
===================================================================
--- trunk/blender/source/blender/python/BPY_interface.c 2008-12-08 19:16:47 UTC 
(rev 17749)
+++ trunk/blender/source/blender/python/BPY_interface.c 2008-12-09 00:18:30 UTC 
(rev 17750)
@@ -2403,7 +2403,7 @@
                char *line = tline->line;
 
                /* Expected format: # SPACEHANDLER.SPACE.TYPE
-                * Ex: # SPACEHANDLER.VIEW3D.DRAW
+                * Exs: # SPACEHANDLER.VIEW3D.DRAW
                 * The actual checks are forgiving, so slight variations also 
work. */
                if (line && line[0] == '#' && strstr(line, "HANDLER")) {
                        line++; /* skip '#' */
@@ -2411,11 +2411,19 @@
                        /* only done for 3D View right now, trivial to add for 
others: */
                        switch (spacetype) {
                                case SPACE_VIEW3D:
-                                       if (strstr(line, "3D")) { /* VIEW3D, 
3DVIEW */
+                                       line = strstr(line, "3D"); /* VIEW3D, 
3DVIEW */
+                                       if (line) {
                                                if (strstr(line, "DRAW")) type 
= SPACEHANDLER_VIEW3D_DRAW;
-                                               else if (strstr(line, "EVENT")) 
type = SPACEHANDLER_VIEW3D_EVENT;
+                                               else {
+                                                       line = strstr(line, 
"EVENT");
+                                                       if (line) {
+                                                               if 
(strstr(line, "ALL")) {
+                                                                       type = 
SPACEHANDLER_VIEW3D_EVENT_ALL;
+                                                               } else { type = 
SPACEHANDLER_VIEW3D_EVENT; }
+                                                       }
+                                               }
                                        }
-                                       break;
+                               break;
                        }
                }
        }
@@ -2464,7 +2472,6 @@
        if (handlertype) {
                ScriptLink *slink = &sa->scriptlink;
                void *stmp, *ftmp;
-               unsigned short space_event = SPACEHANDLER_VIEW3D_EVENT;
 
                /* extend slink */
 
@@ -2484,17 +2491,8 @@
                        MEM_freeN(ftmp);
                }
 
-               switch (spacetype) {
-                       case SPACE_VIEW3D:
-                               if (handlertype == 1) space_event = 
SPACEHANDLER_VIEW3D_EVENT;
-                               else space_event = SPACEHANDLER_VIEW3D_DRAW;
-                               break;
-                       default:
-                               break;
-               }
-
                slink->scripts[slink->totscript] = (ID *)text;
-               slink->flag[slink->totscript]= space_event;
+               slink->flag[slink->totscript]= handlertype;
 
                slink->totscript++;
                slink->actscript = slink->totscript;
@@ -2508,6 +2506,7 @@
 {
        ScriptLink *scriptlink;
        int retval = 0;
+       short slink_event, spacehandlers_match;
        PyGILState_STATE gilstate;
        
        if (!sa || !(G.f & G_DOSCRIPTLINKS)) return 0;
@@ -2549,7 +2548,16 @@
                EXPP_dict_set_item_str(g_blenderdict, "eventValue", 
PyInt_FromLong(eventValue));
                /* now run all assigned space handlers for this space and 
space_event */
                for( index = 0; index < scriptlink->totscript; index++ ) {
-                       
+
+                       spacehandlers_match = 0;
+
+                       slink_event = scriptlink->flag[index];
+                       if( slink_event == space_event )
+                               spacehandlers_match = 1;
+                       else if( ( space_event == SPACEHANDLER_VIEW3D_EVENT ) &&
+                                       ( slink_event == 
SPACEHANDLER_VIEW3D_EVENT_ALL ) )
+                               spacehandlers_match = 1;
+
                        /* for DRAW handlers: */
                        if (event == 0) {
                                glPushAttrib(GL_ALL_ATTRIB_BITS);
@@ -2558,8 +2566,8 @@
                                glMatrixMode(GL_MODELVIEW);
                                glPushMatrix();
                        }
-                       
-                       if( ( scriptlink->flag[index] == space_event ) &&
+
+                       if( spacehandlers_match &&
                            ( scriptlink->scripts[index] != NULL ) ) {
                                dict = CreateGlobalDictionary();
                                ret = RunPython( ( Text * ) 
scriptlink->scripts[index], dict );

Modified: trunk/blender/source/blender/python/api2_2x/Blender.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/Blender.c       2008-12-08 
19:16:47 UTC (rev 17749)
+++ trunk/blender/source/blender/python/api2_2x/Blender.c       2008-12-09 
00:18:30 UTC (rev 17750)
@@ -1047,8 +1047,11 @@
        if (SpaceHandlers) {
                BPy_constant *d = (BPy_constant *)SpaceHandlers;
 
+               /* EVENT_ALL are reported as EVENT on key presses
+                * and EVENT_RELEASE on key releases */
+               PyConstant_Insert(d,"VIEW3D_DRAW", 
PyInt_FromLong(SPACEHANDLER_VIEW3D_DRAW));
                
PyConstant_Insert(d,"VIEW3D_EVENT",PyInt_FromLong(SPACEHANDLER_VIEW3D_EVENT));
-               PyConstant_Insert(d,"VIEW3D_DRAW", 
PyInt_FromLong(SPACEHANDLER_VIEW3D_DRAW));
+               
PyConstant_Insert(d,"VIEW3D_EVENT_RELEASE",PyInt_FromLong(SPACEHANDLER_VIEW3D_EVENT_ALL));
 
                PyModule_AddObject(module, "SpaceHandlers", SpaceHandlers);
        }

Modified: trunk/blender/source/blender/python/api2_2x/doc/API_related.py
===================================================================
--- trunk/blender/source/blender/python/api2_2x/doc/API_related.py      
2008-12-08 19:16:47 UTC (rev 17749)
+++ trunk/blender/source/blender/python/api2_2x/doc/API_related.py      
2008-12-09 00:18:30 UTC (rev 17750)
@@ -184,11 +184,11 @@
  Space Handler script links:
  ---------------------------
 
- This is a new kind of script linked to spaces in a given window.  Right now
- only the 3D View has the necessary hooks, but the plan is to add access to
- other types, too.  Just to clarify naming conventions: in Blender, a screen
- is partitioned in windows (also called areas) and each window can show any
- space.  Spaces are: 3D View, Text Editor, Scripts, Buttons, User Preferences,
+ These are scripts linked to spaces in a given window.  Right now
+ only the 3D View has the necessary hooks.  Just to clarify naming
+ conventions: in Blender, a screen is partitioned in windows (also
+ called areas) and each window can show any space.
+ Spaces are: 3D View, Text Editor, Scripts, Buttons, User Preferences,
  Oops, etc. 
 
  Space handlers are texts in the Text Editor, like other script links, but they
@@ -196,12 +196,16 @@
  text file}} must inform:
   1. that they are space handlers;
   2. the space they belong to;
-  3. whether they are EVENT or DRAW handlers.
+  3. whether they are EVENT, EVENT_RELEASE (EVENT ones reporting key release 
events) or DRAW handlers.
 
  Example header for a 3D View EVENT handler::
 
   # SPACEHANDLER.VIEW3D.EVENT
 
+ Example header for a 3D View EVENT handler that also receives release events::
+
+  # SPACEHANDLER.VIEW3D.EVENT.ALL
+
  Example header for a 3D View DRAW handler::
 
   # SPACEHANDLER.VIEW3D.DRAW
@@ -216,6 +220,10 @@
   - process it (the script must set Blender.event to None then);
   - ignore it.
 
+ EVENT ALL space handlers (header: # SPACEHANDLER.VIEW3D.EVENT.ALL) are 
executed
+ both for key presses (Blender.event = Blender.SpaceHandlers.VIEW3D_EVENT) and
+ for key releases (Blender.event = Blender.SpaceHandlers.VIEW3D_EVENT_RELEASE).
+
  Setting C{Blender.event = None} tells Blender not to go on processing itself
  the event, because it was grabbed by the script.
 
@@ -248,7 +256,7 @@
   - B{bylink} is the same: True if the script is running as a script link;
   - B{link}: integer from the L{Blender}.SpaceHandlers constant dictionary,
     tells what space this handler belongs to and the handler's type
-    (EVENT, DRAW);
+    (EVENT, EVENT_RELEASE, DRAW);
   - B{event}:
      - EVENT handlers: an input event (check keys and mouse events in
        L{Draw}) to be processed or ignored;
@@ -258,6 +266,7 @@
        presses (since we don't pass releases) as 1 and mouse movements
        (Draw.MOUSE.X and Draw.MOUSE.Y) as the current x or y coordinate,
        for example;
+     - EVENT_RELEASE handlers (EVENT handlers executed during key release 
events): 0;
      - DRAW handlers: 0 always.
 
  B{Guidelines (important)}:

Modified: trunk/blender/source/blender/src/header_view3d.c
===================================================================
--- trunk/blender/source/blender/src/header_view3d.c    2008-12-08 19:16:47 UTC 
(rev 17749)
+++ trunk/blender/source/blender/src/header_view3d.c    2008-12-09 00:18:30 UTC 
(rev 17750)
@@ -517,6 +517,8 @@
 
                        if (handlertype == SPACEHANDLER_VIEW3D_EVENT)
                                BLI_strncpy(menustr, "Event: ", 8);
+                       else if (handlertype == SPACEHANDLER_VIEW3D_EVENT_ALL)
+                               BLI_strncpy(menustr, "Event+: ", 8);
                        else
                                BLI_strncpy(menustr, "Draw:  ", 8);
                        BLI_strncpy(menustr+7, text->id.name+2, 22);

Modified: trunk/blender/source/blender/src/space.c
===================================================================
--- trunk/blender/source/blender/src/space.c    2008-12-08 19:16:47 UTC (rev 
17749)
+++ trunk/blender/source/blender/src/space.c    2008-12-09 00:18:30 UTC (rev 
17750)
@@ -1247,18 +1247,19 @@
                if( uiDoBlocks(&curarea->uiblocks, event, 1)!=UI_NOTHING ) 
event= 0;
                
                if(event==UI_BUT_EVENT) do_butspace(val); /* temporal, view3d 
deserves own queue? */
-               
+
+#ifndef DISABLE_PYTHON
+                       /* run any view3d event handler script links */
+               if(sa->scriptlink.totscript) {
+                       if(BPY_do_spacehandlers(sa, event, val, 
SPACEHANDLER_VIEW3D_EVENT))
+                               return; /* return if event was processed 
(swallowed) by handler(s) */
+               }
+#endif
+
                /* - we consider manipulator a button, defaulting to leftmouse 
                 * - grease-pencil also defaults to leftmouse
                 */
                if(event==LEFTMOUSE) {
-#ifndef DISABLE_PYTHON
-                       /* run any view3d event handler script links */
-                       if (sa->scriptlink.totscript) {
-                               if (BPY_do_spacehandlers(sa, event, val, 
SPACEHANDLER_VIEW3D_EVENT))
-                                       return; /* return if event was 
processed (swallowed) by handler(s) */
-                       }
-#endif
                        if(gpencil_do_paint(sa, L_MOUSE)) return;
                        if(BIF_do_manipulator(sa)) return;
                }
@@ -2955,7 +2956,17 @@
                        }
                }
        }
-       
+
+#ifndef DISABLE_PYTHON
+       else { /* val= 0 */
+               /* run any view3d release event handler script links */
+               if(sa->scriptlink.totscript) {
+                       if(BPY_do_spacehandlers(sa, event, 0, 
SPACEHANDLER_VIEW3D_EVENT_ALL))
+                               return; /* return if event was processed 
(swallowed) by handler(s) */
+               }
+       }
+#endif
+
        if(doredraw) {
                scrarea_queue_winredraw(curarea);
                scrarea_queue_headredraw(curarea);


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to