Sticky key not being sticky



  • On 01/07/2018 at 09:59, xxxxxxxx wrote:

    User Information:
    Cinema 4D Version:   R19 
    Platform:   Windows  ;   
    Language(s) :     C++  ;

    ---------
    Hi,

    I was experimenting with a CommandData plugin and shortcuts (as sequel on previous question).

    Registering a CommandData using the PLUGINFLAG_COMMAND_STICKY, according to the documentation I should be able to detect the user pressing the shortcut key, and releasing it.
    In both cases CommandData::Execute would be called.

    This, however, is only the case when the user keeps the shortcut pressed long enough.
    If the shortcut is pressed shortly and released, only a single Execute is performed on the "down-stroke". The "up-stroke" (release) is never detected.

      
    #include "c4d.h"  
      
    // Dummy IDs - for demonstration purposes only  
    #define COMMAND_PLUGIN_ID        1999999
      
    Bool gShowWidget = FALSE;
      
    class MyCommand : public CommandData  
    {  
      INSTANCEOF(MyCommand, CommandData)  
      
    public:  
      virtual Bool Execute(BaseDocument* doc);  
    };  
      
    Bool MyCommand::Execute(BaseDocument* doc)  
    {  
      gShowWidget = !gShowWidget;  
      String txt = gShowWidget ? "On" : "Off";  
      GePrint("Widget is " + txt);  
      return TRUE;  
    }  
      
    Bool RegisterMyCommand(void)  
    {  
      return RegisterCommandPlugin(COMMAND_PLUGIN_ID, "Testing", PLUGINFLAG_COMMAND_STICKY, AutoBitmap("icon.png"), "Test", NewObjClear(MyCommand));  
    }  
      
      
      
    // ====================================  
    // Plugin Main   
    // ====================================  
    Bool PluginStart(void)  
    {  
      RegisterMyCommand();  
      return TRUE;  
    }  
    void PluginEnd(void)   
    {  
    }  
    Bool PluginMessage(Int32 id, void * data)  
    {  
      switch (id) {  
      case C4DPL_INIT_SYS:  
          if (!resource.Init())  
              return FALSE;  
          return TRUE;  
      case C4DMSG_PRIORITY:  
          return TRUE;  
      case C4DPL_BUILDMENU:  
          break;  
      case C4DPL_ENDACTIVITY:  
          return TRUE;  
      }  
      return FALSE;  
    }  
    
    


  • On 03/07/2018 at 00:46, xxxxxxxx wrote:

    Hi C4D,

    thanks for making us aware.

    I filled a bug report.



  • On 03/07/2018 at 09:45, xxxxxxxx wrote:

    Thanks for confirming.

    I suppose there's no workaround other than to use a SceneHook and check for keystrokes in KeyboardInput ... as has been mentioned by Andreas here



  • On 04/07/2018 at 00:27, xxxxxxxx wrote:

    Hi C4DS,

    You are right, SceneHook or a ToolData depending on the context is the way to go.
    But as you already discover they got some limitation.

    Hope it's a working workaround for you.
    Cheers,
    Maxime