SoEventCallback(3)

πŸ“¦ version 2.5.0, in fedora 43, fedora 44

ok so this is SoEventCallback(3) from the Library Functions Manual ✨ bestie we're gonna get through this together, part one of two, no biggie πŸ’…

🌸 NAME 🌸

SoEventCallback β€” the class that provides functionality for catching events. That's the whole job description, and honestly? iconic. πŸ‘‘


✨ SYNOPSIS ✨

#include <Inventor/nodes/SoEventCallback.h>

Inherits SoNode.

πŸ’– Public Member Functions πŸ’–

  • virtual SoType getTypeId (void) const β€” hands you the type id, the classic Coin move πŸŽ€
  • SoEventCallback (void) β€” the constructor, aka where it all begins
  • void setPath (SoPath *path) β€” set that path
  • const SoPath * getPath (void) β€” get that path back
  • void addEventCallback (SoType eventtype, SoEventCallbackCB *f, void *userdata=NULL) β€” attach a callback for a given event type, with optional userdata riding along
  • void removeEventCallback (SoType eventtype, SoEventCallbackCB *f, void *userdata=NULL) β€” and take it back off again
  • SoHandleEventAction * getAction (void) const β€” grab the action
  • const SoEvent * getEvent (void) const β€” grab the event
  • const SoPickedPoint * getPickedPoint (void) const β€” grab the picked point
  • void setHandled (void) β€” mark it handled βœ‹
  • SbBool isHandled (void) const β€” is it handled though? πŸ‘€
  • void grabEvents (void) β€” grab the events
  • void releaseEvents (void) β€” release the events

🫢 Public Member Functions inherited from SoNode 🫢

  • void setOverride (const SbBool state)
  • SbBool isOverride (void) const
  • void setNodeType (const NodeType type)
  • NodeType getNodeType (void) const
  • virtual SoNode * copy (SbBool copyconnections=0) const
  • virtual SbBool affectsState (void) const
  • virtual void doAction (SoAction *action)
  • virtual void GLRender (SoGLRenderAction *action)
  • virtual void GLRenderBelowPath (SoGLRenderAction *action)
  • virtual void GLRenderInPath (SoGLRenderAction *action)
  • virtual void GLRenderOffPath (SoGLRenderAction *action)
  • virtual void callback (SoCallbackAction *action)
  • virtual void getBoundingBox (SoGetBoundingBoxAction *action)
  • virtual void getMatrix (SoGetMatrixAction *action)
  • virtual void pick (SoPickAction *action)
  • virtual void rayPick (SoRayPickAction *action)
  • virtual void search (SoSearchAction *action)
  • virtual void write (SoWriteAction *action)
  • virtual void audioRender (SoAudioRenderAction *action)
  • virtual void getPrimitiveCount (SoGetPrimitiveCountAction *action)
  • virtual void grabEventsSetup (void)
  • virtual void grabEventsCleanup (void)
  • virtual void startNotify (void)
  • virtual void notify (SoNotList *l)
  • uint32_t getNodeId (void) const
  • virtual SoChildList * getChildren (void) const
  • virtual void writeInstance (SoOutput *out)
  • virtual SoNode * addToCopyDict (void) const
  • virtual void copyContents (const SoFieldContainer *from, SbBool copyconnections)
  • virtual SoFieldContainer * copyThroughConnection (void) const

πŸ’œ Public Member Functions inherited from SoFieldContainer πŸ’œ

  • void setToDefaults (void)
  • SbBool hasDefaultValues (void) const
  • SbBool fieldsAreEqual (const SoFieldContainer *container) const
  • void copyFieldValues (const SoFieldContainer *container, SbBool copyconnections=0)
  • SbBool set (const char *const fielddata)
  • void get (SbString &fielddata)
  • virtual int getFields (SoFieldList &l) const
  • virtual int getAllFields (SoFieldList &l) const
  • virtual SoField * getField (const SbName &name) const
  • virtual SoField * getEventIn (const SbName &name) const
  • virtual SoField * getEventOut (const SbName &name) const
  • SbBool getFieldName (const SoField *const field, SbName &name) const
  • SbBool enableNotify (const SbBool flag)
  • SbBool isNotifyEnabled (void) const
  • SbBool set (const char *fielddata, SoInput *in)
  • void get (SbString &fielddata, SoOutput *out)
  • virtual SbBool validateNewFieldValue (SoField *field, void *newval)
  • virtual void addWriteReference (SoOutput *out, SbBool isfromfield=0)
  • SbBool getIsBuiltIn (void) const
  • void setUserData (void *userdata) const
  • void * getUserData (void) const

πŸ¦‹ Public Member Functions inherited from SoBase πŸ¦‹

  • void ref (void) const
  • void unref (void) const
  • void unrefNoDelete (void) const
  • int32_t getRefCount (void) const
  • void touch (void)
  • SbBool isOfType (SoType type) const
  • virtual SbName getName (void) const
  • virtual void setName (const SbName &newname)
  • void addAuditor (void *const auditor, const SoNotRec::Type type)
  • void removeAuditor (void *const auditor, const SoNotRec::Type type)
  • const SoAuditorList & getAuditors (void) const
  • SbBool shouldWrite (void)
  • void assertAlive (void) const

🌟 Static Public Member Functions 🌟

  • static SoType getClassTypeId (void)
  • static void initClass (void)

🌈 Static Public Member Functions inherited from SoNode 🌈

  • static uint32_t getCompatibilityTypes (const SoType &nodetype)
  • static SoType getClassTypeId (void)
  • static SoNode * getByName (const SbName &name)
  • static int getByName (const SbName &name, SoNodeList &l)
  • static void initClass (void)
  • static void initClasses (void)
  • static uint32_t getNextNodeId (void)
  • static int getActionMethodIndex (const SoType type)
  • static void getBoundingBoxS (SoAction *action, SoNode *node)
  • static void GLRenderS (SoAction *action, SoNode *node)
  • static void callbackS (SoAction *action, SoNode *node)
  • static void getMatrixS (SoAction *action, SoNode *node)
  • static void handleEventS (SoAction *action, SoNode *node)
  • static void pickS (SoAction *action, SoNode *node)
  • static void rayPickS (SoAction *action, SoNode *node)
  • static void searchS (SoAction *action, SoNode *node)
  • static void writeS (SoAction *action, SoNode *node)
  • static void audioRenderS (SoAction *action, SoNode *node)
  • static void getPrimitiveCountS (SoAction *action, SoNode *node)

πŸŽ€ Static Public Member Functions inherited from SoFieldContainer πŸŽ€

  • static void initClass (void)
  • static SoType getClassTypeId (void)
  • static void initCopyDict (void)
  • static void addCopy (const SoFieldContainer *orig, const SoFieldContainer *copy)
  • static SoFieldContainer * checkCopy (const SoFieldContainer *orig)
  • static SoFieldContainer * findCopy (const SoFieldContainer *orig, const SbBool copyconnections)
  • static void copyDone (void)

πŸ“ Static Public Member Functions inherited from SoBase πŸ“

  • static void initClass (void)
  • static SoType getClassTypeId (void)
  • static void addName (SoBase *const base, const char *const name)
  • static void removeName (SoBase *const base, const char *const name)
  • static void incrementCurrentWriteCounter (void)
  • static void decrementCurrentWriteCounter (void)
  • static SoBase * getNamedBase (const SbName &name, SoType type)
  • static int getNamedBases (const SbName &name, SoBaseList &baselist, SoType type)
  • static SbBool read (SoInput *in, SoBase *&base, SoType expectedtype)
  • static void setInstancePrefix (const SbString &c)
  • static void setTraceRefs (SbBool trace)
  • static SbBool getTraceRefs (void)
  • static SbBool connectRoute (SoInput *in, const SbName &fromnodename, const SbName &fromfieldname, const SbName &tonodename, const SbName &tofieldname)
  • static SbBool readRoute (SoInput *in)

πŸ”₯ Protected Member Functions πŸ”₯

  • virtual const SoFieldData * getFieldData (void) const β€” the protected one, only for the inner circle
  • virtual ~SoEventCallback () β€” the destructor, protected and virtual, as one does
  • virtual void handleEvent (SoHandleEventAction *action) β€” this is the one that actually catches the event 🫑

πŸ’« Protected Member Functions inherited from SoNode πŸ’«

  • SoNode (void)
  • virtual ~SoNode ()
  • virtual SbBool readInstance (SoInput *in, unsigned short flags)

🧚 Protected Member Functions inherited from SoFieldContainer 🧚

  • SoFieldContainer (void)
  • ~SoFieldContainer ()

πŸ’€ Protected Member Functions inherited from SoBase πŸ’€

  • SoBase (void)
  • virtual ~SoBase ()
  • virtual void destroy (void)
  • SbBool hasMultipleWriteRefs (void) const
  • SbBool writeHeader (SoOutput *out, SbBool isgroup, SbBool isengine) const
  • void writeFooter (SoOutput *out) const
  • virtual const char * getFileFormatName (void) const

⭐ Static Protected Member Functions ⭐

  • static const SoFieldData ** getFieldDataPtr (void)

🌸 Static Protected Member Functions inherited from SoNode 🌸

  • static const SoFieldData ** getFieldDataPtr (void)
  • static void setNextActionMethodIndex (int index)
  • static int getNextActionMethodIndex (void)
  • static void incNextActionMethodIndex (void)
  • static void setCompatibilityTypes (const SoType &nodetype, const uint32_t bitmask)

🌺 Static Protected Member Functions inherited from SoBase 🌺

  • static uint32_t getCurrentWriteCounter (void)
  • static void staticDataLock (void)
  • static void staticDataUnlock (void)

πŸ‘‘ Additional Inherited Members πŸ‘‘

Public Types inherited from SoNode

enum NodeType { INVENTOR = 0x0000, VRML1 = 0x0001, VRML2 = 0x0002, INVENTOR_1 = 0x0004, INVENTOR_2_0 = 0x0008, INVENTOR_2_1 = 0x0010, INVENTOR_2_5 = 0x0020, INVENTOR_2_6 = 0x0040, COIN_1_0 = 0x0080, COIN_2_0 = 0x0100, EXTENSION = 0x0200, COIN_2_2 = 0x0400, COIN_2_3 = 0x0800, COIN_2_4 = 0x1000, INVENTOR_5_0 = 0x2000, COIN_2_5 = 0x4000 }

Protected Types inherited from SoBase

enum BaseFlags { IS_ENGINE = 0x01, IS_GROUP = 0x02 }

Protected Attributes inherited from SoNode

uint32_t uniqueId

Protected Attributes inherited from SoFieldContainer

SbBool isBuiltIn

Static Protected Attributes inherited from SoNode

  • static uint32_t nextUniqueId = 0
  • static int nextActionMethodIndex = 0

🌈 Detailed Description 🌈

ok so the vibe is this: SoEventCallback provides functionality for catching events. That's it. That's the whole thing. πŸ’…

You use SoEventCallback nodes in the scenegraph for catching user interaction events with the scenegraph's render canvas. Simple as. πŸ‘‘

Now here's how event handling actually works in Coin, bestie, because it's giving pipeline:

When the user interacts with the render canvas β€” like using the mouse pointer, or hitting the keyboard β€” the GUI interface toolkit (ie SoQt, SoWin, SoXt, Sc21 ...) will catch the event and translate it from a windowsystem-specific event to a generic Coin event. (Wanna see the types of generic Coin events? Go look at the classes derived from SoEvent.) That event then gets wrapped inside a SoHandleEventAction and applied to the scenegraph. All this happens within the So[Qt|Xt|Win|...] toolkit. ✨

The SoHandleEventAction then traverses the scenegraph, delivering the event to any node type which "is interested" in it. The SoEventCallback nodetype catches the action and forwards the event to a callback function set up by the application programmer. πŸŽ€

⚠️ big warning energy, do not skip this: be careful about which position in the scenegraph you insert SoEventCallback nodes if you are also using any of the built-in Coin library elements which are interested in user interaction events (like for instance the dragger and manipulator classes and the SoSelection nodes). These Coin elements might catch the event for themselves, short-circuiting the SoHandleEventAction traversal so the event will never reach the SoEventCallback node(s) you insert. 😭 literally the event will just ghost you.

FILE FORMAT/DEFAULTS:

EventCallback {
}

πŸŽ€ Constructor & Destructor Documentation πŸŽ€

SoEventCallback::SoEventCallback (void )

Constructor. 🫢

References SoEventCallback().

Referenced by getFieldData(), and SoEventCallback().

SoEventCallback::~SoEventCallback () [protected], [virtual]

Destructor. πŸ₯²


πŸ’– Member Function Documentation πŸ’–

okay bestie, this is the part where we go through every single member function one by one. no skipping, we're thorough here. πŸ’…


🌟 SoType SoEventCallback::getTypeId (void ) const 🌟 [virtual]

This one hands you the type ID of any object that inherits from SoBase. it's literally how you do run-time type checking and "downward" casting. no cap. 🫢

Usage example, and yes you're getting the whole thing verbatim:

void foo(SoNode * node)
{
  if (node->getTypeId() == SoFile::getClassTypeId()) {
    SoFile * filenode = (SoFile *)node;  // safe downward cast, knows the type
  }
  else if (node->getTypeId().isOfType(SoGroup::getClassTypeId())) {
    SoGroup * group = (SoGroup *)node;  // safe downward cast, knows the type
  }
}

Now for the application programmers who wanna extend the library with new nodes, engines, nodekits, draggers or whatever β€” this method needs to be overridden in all subclasses. it's typically part of setting up the full type system for extension classes, which is usually done with the pre-defined macros you get from, for instance, Inventor/nodes/SoSubNode.h (that's SO_NODE_INIT_CLASS and SO_NODE_CONSTRUCTOR for node classes), Inventor/engines/SoSubEngine.h (for engine classes) and so on. ✨

Wanna know more about writing Coin extensions? check the class documentation of the toplevel superclasses for the various class groups. 🧚

Implements SoBase.


🌸 const SoFieldData * SoEventCallback::getFieldData (void ) const 🌸 [protected], [virtual]

Returns a pointer to the class-wide field data storage object for this instance. If there are no fields present, it returns NULL. simple as that. πŸ’–

Reimplemented from SoFieldContainer.

References SoEventCallback().


πŸ¦‹ void SoEventCallback::setPath (SoPath * pathptr) πŸ¦‹

Sets the path that has to be picked before the registered callbacks get invoked. If it's NULL, callbacks will be invoked for every event that matches the callback event type.

See also: getPath()

References SoPath::copy(), SoBase::getRefCount(), SoDebugError::postWarning(), and SoBase::ref().


πŸŽ€ const SoPath * SoEventCallback::getPath (void ) πŸŽ€

Returns the path that must be picked before callbacks are invoked. that's it, that's the function. πŸ’…

See also: setPath()


πŸ’… void SoEventCallback::addEventCallback (SoType eventtype, SoEventCallbackCB * f, void * userdata = NULL) πŸ’…

Set up a callback function f which will be invoked for the given eventtype. userdata will be given as the first argument to the function. periodt. πŸ‘‘


🌈 void SoEventCallback::removeEventCallback (SoType eventtype, SoEventCallbackCB * f, void * userdata = NULL) 🌈

Unregister the given callback function f. bye bestie. πŸ‘‹

References SoDebugError::postWarning().


⭐ SoHandleEventAction * SoEventCallback::getAction (void ) const ⭐

Returns the SoHandleEventAction instance that is currently traversing the scene graph with the SoEvent-derived event object.


πŸ“ const SoEvent * SoEventCallback::getEvent (void ) const πŸ“

Returns a pointer to the event object which is currently being sent through the scenegraph.

If your application code handles the event, you probably wanna call SoEventCallback::setHandled() to notify the SoHandleEventAction that it should stop traversing the scenegraph with the event. iykyk. 🧚


πŸ’œ const SoPickedPoint * SoEventCallback::getPickedPoint (void ) const πŸ’œ

Returns the picked point for the current handle event traversal.

This is obviously only related to events which can be considered "pick-style" events, like mousebutton presses.


πŸ”₯ void SoEventCallback::setHandled (void ) πŸ”₯

Use this method from a callback function to notify the node that the event has been handled. main character energy. πŸ’…

The rest of the callbacks registered with the node will still be called, but further SoEventCallback nodes in the scene will not be notified about the event, neither will any other Coin elements in the scenegraph (like for instance SoDragger objects, SoSelection nodes or manipulators).

Since callbacks registered within the same SoEventCallback node will still be invoked after the event has been handled, it's likely that you should use SoEventCallback::isHandled() to check for this condition from your callback functions.

References SoDebugError::postWarning().


πŸ’€ SbBool SoEventCallback::isHandled (void ) const πŸ’€

Check whether or not the event from the SoHandleEventAction has been handled.

References SoDebugError::postWarning().


πŸ‘‘ void SoEventCallback::grabEvents (void ) πŸ‘‘

Set up the node so all future events (until releaseEvents() is called) in Coin will be directly forwarded to this node. no takebacks. πŸ™ˆ

References SoDebugError::postWarning().


πŸ™ˆ void SoEventCallback::releaseEvents (void ) πŸ™ˆ

Do not grab event handling any more.

See also: grabEvents()

References SoDebugError::postWarning().


🌟 void SoEventCallback::handleEvent (SoHandleEventAction * action) 🌟 [protected], [virtual]

Invokes the registered callback functions.

Reimplemented from SoNode.

References SoPath::containsPath(), SoPickedPoint::getPath(), SoHandleEventAction::getPickedPoint(), SoType::isDerivedFrom(), and SoDebugError::postWarning().


🌸 Author 🌸

Generated automatically by Doxygen for Coin from the source code. (yes bestie, the robots did it, and they ate. πŸ’…)


okay and that's the whole page! this was generated automatically by Doxygen for Coin from the source code, and the version is Coin 2.5.0, page SoEventCallback(3). hope you slayed. bye bestie! πŸŽ€βœ¨

πŸ“¦ where this page comes from