00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __CS_CSUTIL_EVENTNAMES_H__
00021 #define __CS_CSUTIL_EVENTNAMES_H__
00022
00023 #include "cssysdef.h"
00024 #include "csextern.h"
00025 #include "csutil/scf_implementation.h"
00026 #include "iutil/eventnames.h"
00027 #include "iutil/objreg.h"
00028 #include "csutil/hash.h"
00029 #include "csutil/strset.h"
00030 #include "csutil/csstring.h"
00031
00039 #ifndef CSHASHCOMPUTER_EVENTENGINE_IDS
00040 #define CSHASHCOMPUTER_EVENTENGINE_IDS
00041 template<>
00042 class csHashComputer<const csEventID>
00043 {
00044 public:
00045 static uint ComputeHash (const csEventID eid)
00046 {
00047 return (uint) eid;
00048 }
00049 };
00050 #endif // CSHASHCOMPUTER_EVENTENGINE_IDS
00051
00052
00063 class CS_CRYSTALSPACE_EXPORT csEventNameRegistry :
00064 public scfImplementation1<csEventNameRegistry, iEventNameRegistry>
00065 {
00066 private:
00072 csEventNameRegistry (iObjectRegistry *);
00073 public:
00074 ~csEventNameRegistry ();
00075
00078 csEventID GetID (const char* name);
00079
00080 const char * GetString (const csEventID id);
00081 static const char * GetString (iObjectRegistry *object_reg,
00082 csEventID id);
00083 csEventID GetParentID (const csEventID id);
00084 bool IsImmediateChildOf (const csEventID child,
00085 const csEventID parent);
00086 bool IsKindOf (const csEventID child,
00087 const csEventID parent);
00094 static csRef<iEventNameRegistry> GetRegistry(iObjectRegistry *object_reg);
00095
00096 static inline csEventID GetID (iEventNameRegistry *name_reg,
00097 const char* name)
00098 {
00099 if (name_reg != 0)
00100 return name_reg->GetID (name);
00101 else
00102 return CS_EVENT_INVALID;
00103 }
00104 static inline csEventID GetID (iObjectRegistry *object_reg,
00105 const char* name)
00106 {
00107 csRef<iEventNameRegistry> nameRegistry =
00108 csQueryRegistry<iEventNameRegistry> (object_reg);
00109 CS_ASSERT (nameRegistry);
00110 return nameRegistry->GetID (name);
00111 };
00112
00113 static inline bool IsKindOf (iEventNameRegistry *name_reg,
00114 csEventID name1, csEventID name2)
00115 {
00116 if (name_reg != 0)
00117 return name_reg->IsKindOf(name1, name2);
00118 else
00119 return false;
00120 }
00121 static inline bool IsKindOf (iObjectRegistry *object_reg,
00122 csEventID name1, csEventID name2)
00123 {
00124 csRef<iEventNameRegistry> nameRegistry =
00125 csQueryRegistry<iEventNameRegistry> (object_reg);
00126 CS_ASSERT(nameRegistry);
00127 return nameRegistry->IsKindOf (name1, name2);
00128 };
00129
00130 private:
00131 iObjectRegistry *object_reg;
00132 csHash<csEventID,csEventID> parentage;
00133 csStringSet names;
00134 };
00135
00136
00162 #define csevAllEvents(reg) \
00163 (csEventNameRegistry::GetID((reg), ""))
00164
00170 #define csevFrame(reg) \
00171 (csEventNameRegistry::GetID((reg), "crystalspace.frame"))
00172
00177 #define csevInput(reg) \
00178 (csEventNameRegistry::GetID((reg), "crystalspace.input"))
00179
00185 #define csevKeyboardEvent(reg) \
00186 (csEventNameRegistry::GetID((reg), "crystalspace.input.keyboard"))
00187
00189 #define csevKeyboardDown(reg) \
00190 (csEventNameRegistry::GetID((reg), "crystalspace.input.keyboard.down"))
00191
00193 #define csevKeyboardUp(reg) \
00194 (csEventNameRegistry::GetID((reg), "crystalspace.input.keyboard.up"))
00195
00200 #define csevMouseEvent(reg) \
00201 (csEventNameRegistry::GetID((reg), "crystalspace.input.mouse"))
00202
00203 static inline csEventID csevMouse (
00204 iEventNameRegistry *name_reg, uint x)
00205 {
00206 csString name ("crystalspace.input.mouse.");
00207 name.Append (x);
00208 return name_reg->GetID(name);
00209 }
00210
00211 static inline csEventID csevMouse(
00212 iObjectRegistry *object_reg, uint x)
00213 {
00214 return csevMouse(csEventNameRegistry::GetRegistry(object_reg), x);
00215 }
00216
00217 static inline csEventID csevMouseOp(
00218 iEventNameRegistry *name_reg, uint x, const csString &y)
00219 {
00220 csString name ("crystalspace.input.mouse.");
00221 name.Append (x);
00222 name.Append (".");
00223 name.Append (y);
00224 return name_reg->GetID(name);
00225 }
00226
00227 static inline csEventID csevMouseOp(
00228 iObjectRegistry *object_reg, uint x, const csString &y)
00229 {
00230 return csevMouseOp(csEventNameRegistry::GetRegistry(object_reg), x, y);
00231 }
00232
00238 #define csevMouseButton(reg,x) \
00239 csevMouseOp ((reg), (x), "button")
00240
00244 #define csevMouseDown(reg,x) \
00245 csevMouseOp ((reg), (x), "button.down")
00246
00250 #define csevMouseUp(reg,x) \
00251 csevMouseOp ((reg), (x), "button.up")
00252
00256 #define csevMouseClick(reg,x) \
00257 csevMouseOp ((reg), (x), "button.click")
00258
00262 #define csevMouseDoubleClick(reg,x) \
00263 csevMouseOp((reg), (x), "button.doubleclick")
00264
00268 #define csevMouseMove(reg,x) \
00269 csevMouseOp((reg), (x), "move")
00270
00276 #define csevJoystickEvent(reg) \
00277 (csEventNameRegistry::GetID((reg), "crystalspace.input.joystick"))
00278
00279 static inline csEventID csevJoystick (
00280 iEventNameRegistry *name_reg, uint x)
00281 {
00282 char buffer[64];
00283 cs_snprintf(buffer, sizeof (buffer) - 1, "crystalspace.input.joystick.%d",
00284 x);
00285 return name_reg->GetID(buffer);
00286 }
00287
00288 static inline csEventID csevJoystick (
00289 iObjectRegistry *object_reg, uint x)
00290 {
00291 return csevJoystick(csEventNameRegistry::GetRegistry(object_reg), x);
00292 }
00293
00294 static inline csEventID csevJoystickOp (
00295 iEventNameRegistry *name_reg, uint x, const csString &y)
00296 {
00297 csString name ("crystalspace.input.joystick.");
00298 name.Append (x);
00299 name.Append (".");
00300 name.Append (y);
00301 return name_reg->GetID(name);
00302 }
00303
00304 static inline csEventID csevJoystickOp (
00305 iObjectRegistry *object_reg, uint x, const csString &y)
00306 {
00307 return csevJoystickOp (csEventNameRegistry::GetRegistry(object_reg), x, y);
00308 }
00309
00316 #define csevJoystickButton(reg,x) \
00317 csevJoystickOp((reg),(x),"button")
00318
00320 #define csevJoystickDown(reg,x) \
00321 csevJoystickOp((reg),(x),"button.down")
00322
00324 #define csevJoystickUp(reg,x) \
00325 csevJoystickOp((reg),(x),"button.up")
00326
00328 #define csevJoystickMove(reg,x) \
00329 csevJoystickOp((reg),(x),"move")
00330
00332 #define CS_IS_KEYBOARD_EVENT(reg,e) \
00333 csEventNameRegistry::IsKindOf((reg), ((e).Name), csevKeyboardEvent(reg))
00334
00336 #define CS_IS_MOUSE_EVENT(reg,e) \
00337 csEventNameRegistry::IsKindOf((reg), ((e).Name), csevMouseEvent(reg))
00338
00340 #define CS_IS_MOUSE_BUTTON_EVENT(reg,e,n) \
00341 csEventNameRegistry::IsKindOf((reg), ((e).Name), csevMouseButton((reg),n))
00342
00344 #define CS_IS_MOUSE_MOVE_EVENT(reg,e,n) \
00345 csEventNameRegistry::IsKindOf((reg), ((e).Name), csevMouseMove((reg),n))
00346
00348 #define CS_IS_JOYSTICK_EVENT(reg,e) \
00349 csEventNameRegistry::IsKindOf((reg), ((e).Name), csevJoystickEvent(reg))
00350
00352 #define CS_IS_JOYSTICK_BUTTON_EVENT(reg,e,n) \
00353 csEventNameRegistry::IsKindOf((reg), ((e).Name), csevJoystickButton((reg),n))
00354
00356 #define CS_IS_JOYSTICK_MOVE_EVENT(reg,e,n) \
00357 csEventNameRegistry::IsKindOf((reg), ((e).Name), csevJoystickMove((reg),n))
00358
00360 #define CS_IS_INPUT_EVENT(reg,e) \
00361 csEventNameRegistry::IsKindOf((reg), ((e).Name), csevInput(reg))
00362
00371 #define csevQuit(reg) \
00372 (csEventNameRegistry::GetID((reg), "crystalspace.application.quit"))
00373
00379 #define csevFocusChanged(reg) \
00380 (csEventNameRegistry::GetID((reg), "crystalspace.application.focus"))
00381
00387 #define csevFocusGained(reg) \
00388 (csEventNameRegistry::GetID((reg), "crystalspace.application.focus.gained"))
00389
00395 #define csevFocusLost(reg) \
00396 (csEventNameRegistry::GetID((reg), "crystalspace.application.focus.lost"))
00397
00408 #define csevSystemOpen(reg) \
00409 (csEventNameRegistry::GetID((reg), "crystalspace.application.open"))
00410
00415 #define csevSystemClose(reg) \
00416 (csEventNameRegistry::GetID((reg), "crystalspace.application.close"))
00417
00418 struct iGraphics2D;
00419
00420 CS_CRYSTALSPACE_EXPORT
00421 csEventID csevCanvasOp (csRef<iEventNameRegistry>& reg,
00422 const iGraphics2D* g2d,
00423 const csString &y);
00424 static inline csEventID csevCanvasOp (
00425 iObjectRegistry *object_reg, const iGraphics2D* g2d, const csString &y)
00426 {
00427 csRef<iEventNameRegistry> name_reg = csEventNameRegistry::GetRegistry (object_reg);
00428 return csevCanvasOp(name_reg, g2d, y);
00429 }
00430
00431
00439 #define csevCanvasResize(reg, g2d) \
00440 csevCanvasOp((reg), (g2d), "resize")
00441
00452 #define csevCanvasClose(reg, g2d) \
00453 csevCanvasOp((reg), (g2d), "close")
00454
00460 #define csevCanvasHidden(reg, g2d) \
00461 csevCanvasOp((reg), (g2d), "hidden")
00462
00467 #define csevCanvasExposed(reg, g2d) \
00468 csevCanvasOp((reg), (g2d), "exposed")
00469
00479 #define csevCommandLineHelp(reg) \
00480 (csEventNameRegistry::GetID((reg), "crystalspace.application.commandlinehelp"))
00481
00484 #define CS_DECLARE_SYSTEM_EVENT_SHORTCUTS \
00485 csEventID SystemOpen; \
00486 csEventID SystemClose
00487
00488 #define CS_DECLARE_FRAME_EVENT_SHORTCUTS \
00489 csEventID Frame
00490
00491 #define CS_DECLARE_INPUT_EVENT_SHORTCUTS \
00492 csEventID KeyboardEvent; \
00493 csEventID MouseEvent; \
00494 csEventID JoystickEvent
00495
00501 #define CS_DECLARE_EVENT_SHORTCUTS \
00502 CS_DECLARE_SYSTEM_EVENT_SHORTCUTS; \
00503 CS_DECLARE_FRAME_EVENT_SHORTCUTS; \
00504 CS_DECLARE_INPUT_EVENT_SHORTCUTS
00505
00506 #define CS_INITIALIZE_SYSTEM_EVENT_SHORTCUTS(object_reg) do { \
00507 SystemOpen = csevSystemOpen ((object_reg)); \
00508 SystemClose = csevSystemClose ((object_reg)); \
00509 } while (0)
00510
00511 #define CS_INITIALIZE_FRAME_EVENT_SHORTCUTS(object_reg) do { \
00512 Frame = csevFrame ((object_reg)); \
00513 } while (0)
00514
00515 #define CS_INITIALIZE_INPUT_EVENT_SHORTCUTS(object_reg) do { \
00516 KeyboardEvent = csevKeyboardEvent ((object_reg)); \
00517 MouseEvent = csevMouseEvent ((object_reg)); \
00518 JoystickEvent = csevJoystickEvent ((object_reg)); \
00519 } while (0)
00520
00526 #define CS_INITIALIZE_EVENT_SHORTCUTS(object_reg) do { \
00527 CS_INITIALIZE_SYSTEM_EVENT_SHORTCUTS (object_reg); \
00528 CS_INITIALIZE_FRAME_EVENT_SHORTCUTS (object_reg); \
00529 CS_INITIALIZE_INPUT_EVENT_SHORTCUTS (object_reg); \
00530 } while (0)
00531
00534 #endif // __CS_CSUTIL_EVENTNAMES_H__