|
|
//===== Copyright � 1996-2005, Valve Corporation, All rights reserved. ======//
//
// Purpose:
//
// $NoKeywords: $
//===========================================================================//
#ifndef INPUTGAMEUI_H
#define INPUTGAMEUI_H
#ifdef _WIN32
#pragma once
#endif
#if !defined( _GAMECONSOLE )
#include <windows.h>
#include <imm.h>
#endif
#include "vgui/iinput.h"
#include "hitarea.h"
#include "keyrepeat.h"
#include "utlvector.h"
#include "utllinkedlist.h"
#include "keyvalues.h"
#include "inputsystem/buttoncode.h"
#include "vgui/cursor.h"
#include "vstdlib/ieventsystem.h"
enum GameUIMouseCodeState_t { BUTTON_RELEASED = 0, BUTTON_PRESSED, BUTTON_DOUBLECLICKED, };
namespace vgui { typedef unsigned int HInputContext;
#define DEFAULT_INPUT_CONTEXT ((vgui::HInputContext)~0)
}
using namespace vgui;
class CInputGameUI { public: CInputGameUI(); ~CInputGameUI();
struct LanguageItem { wchar_t shortname[ 4 ]; wchar_t menuname[ 128 ]; int handleValue; bool active; // true if this is the active language
};
struct ConversionModeItem { wchar_t menuname[ 128 ]; int handleValue; bool active; // true if this is the active conversion mode
};
struct SentenceModeItem { wchar_t menuname[ 128 ]; int handleValue; bool active; // true if this is the active sentence mode
};
void Init();
void RunFrame(); void ProcessEvents();
void Shutdown();
void SetWindowSize( int width, int height );
void PanelDeleted( CHitArea *panel ); void GraphicHidden( CHitArea *focus ); void ForceInputFocusUpdate();
void UpdateMouseFocus(int x, int y); void SetMouseFocus( CHitArea *newMouseFocus );
// Temp testing until event system can handle destinations.
void OnCursorEnter( CHitArea* const & pTarget ); void OnCursorExit( CHitArea * const & pTarget ); void OnCursorMove( CHitArea * const & pTarget, const int &x, const int &y ); void OnMouseDown( CHitArea * const & pTarget, const ButtonCode_t &code ); void OnMouseUp( CHitArea * const & pTarget, CHitArea * const & pTrap, const ButtonCode_t &code ); void OnMouseDoubleClick( CHitArea * const & pTarget, const ButtonCode_t &code ); void OnMouseWheel( CHitArea * const & pTarget, const int &delta );
void OnKeyDown( CHitArea * const & pTarget, const ButtonCode_t &code ); void OnKeyUp( CHitArea * const & pTarget, const ButtonCode_t &code ); void OnKeyCodeTyped( CHitArea * const & pTarget, const ButtonCode_t &code ); void OnKeyTyped( CHitArea * const & pTarget, const wchar_t &unichar ); void OnLoseKeyFocus( CHitArea * const & pTarget ); void OnGainKeyFocus( CHitArea * const & pTarget );
void SetCursorPos( int x, int y ); void UpdateCursorPosInternal( const int &x, const int &y ); void GetCursorPos( int &x, int &y ); void SetCursorOveride( vgui::HCursor cursor ); vgui::HCursor GetCursorOveride();
void SetKeyFocus( CHitArea *pFocus ); // note this will not post any messages.
CHitArea *GetKeyFocus(); CHitArea *GetCalculatedKeyFocus(); CHitArea *GetMouseOver();
bool WasMousePressed( ButtonCode_t code ); bool WasMouseDoublePressed( ButtonCode_t code ); bool IsMouseDown( ButtonCode_t code ); bool WasMouseReleased( ButtonCode_t code ); bool WasKeyPressed( ButtonCode_t code ); bool IsKeyDown( ButtonCode_t code ); bool WasKeyTyped( ButtonCode_t code ); bool WasKeyReleased( ButtonCode_t code );
void GetKeyCodeText( ButtonCode_t code, char *buf, int buflen );
bool InternalCursorMoved( int x,int y ); //expects input in surface space
bool InternalMousePressed( ButtonCode_t code ); bool InternalMouseDoublePressed( ButtonCode_t code ); bool InternalMouseReleased( ButtonCode_t code ); bool InternalMouseWheeled( int delta ); bool InternalKeyCodePressed( ButtonCode_t code ); void InternalKeyCodeTyped( ButtonCode_t code ); void InternalKeyTyped( wchar_t unichar ); bool InternalKeyCodeReleased( ButtonCode_t code ); void SetKeyCodeState( ButtonCode_t code, bool bPressed ); void SetMouseCodeState( ButtonCode_t code, GameUIMouseCodeState_t state ); void UpdateButtonState( const InputEvent_t &event );
// Creates/ destroys "input" contexts, which contains information
// about which controls have mouse + key focus, for example.
virtual vgui::HInputContext CreateInputContext(); virtual void DestroyInputContext( vgui::HInputContext context );
// Activates a particular input context, use DEFAULT_INPUT_CONTEXT
// to get the one normally used by VGUI
virtual void ActivateInputContext( vgui::HInputContext context ); virtual void PostCursorMessage(); virtual void HandleExplicitSetCursor();
virtual void ResetInputContext( vgui::HInputContext context );
virtual void GetCursorPosition( int &x, int &y );
virtual void SetIMEWindow( void *hwnd ); virtual void *GetIMEWindow();
// Change keyboard layout type
virtual void OnChangeIME( bool forward ); virtual int GetCurrentIMEHandle(); virtual int GetEnglishIMEHandle();
// Returns the Language Bar label (Chinese, Korean, Japanese, Russion, Thai, etc.)
virtual void GetIMELanguageName( wchar_t *buf, int unicodeBufferSizeInBytes ); // Returns the short code for the language (EN, CH, KO, JP, RU, TH, etc. ).
virtual void GetIMELanguageShortCode( wchar_t *buf, int unicodeBufferSizeInBytes );
// Call with NULL dest to get item count
virtual int GetIMELanguageList( LanguageItem *dest, int destcount ); virtual int GetIMEConversionModes( ConversionModeItem *dest, int destcount ); virtual int GetIMESentenceModes( SentenceModeItem *dest, int destcount );
virtual void OnChangeIMEByHandle( int handleValue ); virtual void OnChangeIMEConversionModeByHandle( int handleValue ); virtual void OnChangeIMESentenceModeByHandle( int handleValue );
virtual void OnInputLanguageChanged(); virtual void OnIMEStartComposition(); virtual void OnIMEComposition( int flags ); virtual void OnIMEEndComposition();
virtual void OnIMEShowCandidates(); virtual void OnIMEChangeCandidates(); virtual void OnIMECloseCandidates();
virtual void OnIMERecomputeModes();
virtual int GetCandidateListCount(); virtual void GetCandidate( int num, wchar_t *dest, int destSizeBytes ); virtual int GetCandidateListSelectedItem(); virtual int GetCandidateListPageSize(); virtual int GetCandidateListPageStart();
virtual void SetCandidateWindowPos( int x, int y ); virtual bool GetShouldInvertCompositionString(); virtual bool CandidateListStartsAtOne();
virtual void SetCandidateListPageStart( int start );
// Passes in a keycode which allows hitting other mouse buttons w/o cancelling capture mode
virtual void SetMouseCaptureEx( CHitArea *panel, ButtonCode_t captureStartMouseCode );
// Passes in a keycode which allows hitting other mouse buttons w/o cancelling capture mode
virtual void SetMouseCapture( CHitArea *panel ); virtual CHitArea *GetMouseCapture();
virtual CHitArea *GetMouseFocus(); private:
void InternalSetCompositionString( const wchar_t *compstr ); void InternalShowCandidateWindow(); void InternalHideCandidateWindow(); void InternalUpdateCandidateWindow();
bool PostKeyMessage( KeyValues *message );
void DestroyCandidateList(); void CreateNewCandidateList();
CHitArea *CalculateNewKeyFocus();
void SurfaceSetCursorPos( int x, int y ); void SurfaceGetCursorPos( int &x, int &y );
struct InputContext_t { bool _mousePressed[MOUSE_COUNT]; bool _mouseDoublePressed[MOUSE_COUNT]; bool _mouseDown[MOUSE_COUNT]; bool _mouseReleased[MOUSE_COUNT]; bool _keyPressed[BUTTON_CODE_COUNT]; bool _keyTyped[BUTTON_CODE_COUNT]; bool _keyDown[BUTTON_CODE_COUNT]; bool _keyReleased[BUTTON_CODE_COUNT];
CHitArea *_keyFocus; bool _bKeyTrap; // true if the graphic with keyfocus recieved a down event. Send the up if it got a down.
CHitArea *_oldMouseFocus; CHitArea *_mouseFocus; // the panel that has the current mouse focus - same as _mouseOver unless _mouseCapture is set
CHitArea *_mouseOver; // the panel that the mouse is currently over, NULL if not over any vgui item
CHitArea *_mouseCapture; // the panel that has currently captured mouse focus
ButtonCode_t m_MouseCaptureStartCode; // The Mouse button which was pressed to initiate mouse capture
CHitArea *_mouseLeftTrap; // the panel that should receive the next mouse left up
CHitArea *_mouseMiddleTrap; // the panel that should receive the next mouse middle up
CHitArea *_mouseRightTrap; // the panel that should receive the next mouse right up
int m_nCursorX; int m_nCursorY;
int m_nLastPostedCursorX; int m_nLastPostedCursorY;
int m_nExternallySetCursorX; int m_nExternallySetCursorY; bool m_bSetCursorExplicitly;
CUtlVector< CHitArea * > m_KeyCodeUnhandledListeners;
CHitArea *m_pUnhandledMouseClickListener; bool m_bRestrictMessagesToModalSubTree;
CKeyRepeatHandler m_keyRepeater; };
void InitInputContext( InputContext_t *pContext ); InputContext_t *GetInputContext( vgui::HInputContext context ); void PanelDeleted( CHitArea *focus, InputContext_t &context); void GraphicHidden( CHitArea *focus, InputContext_t &context ); vgui::HCursor _cursorOverride;
char *_keyTrans[KEY_LAST];
InputContext_t m_DefaultInputContext; vgui::HInputContext m_hContext; // current input context
CUtlLinkedList< InputContext_t, vgui::HInputContext > m_Contexts;
#ifndef _GAMECONSOLE
void *_imeWnd; CANDIDATELIST *_imeCandidates; #endif
int m_nDebugMessages;
EventQueue_t m_hEventChannel;
int m_nWindowWidth, m_nWindowHeight; };
extern CInputGameUI *g_pInputGameUI;
bool InputGameUIHandleInputEvent( const InputEvent_t &event );
DEFINE_EVENT1_WITHNAMES( CursorEnterEvent, CHitArea *, pTarget ); DEFINE_EVENT1_WITHNAMES( CursorExitEvent, CHitArea *, pTarget ); DEFINE_EVENT3_WITHNAMES( CursorMoveEvent, CHitArea *, pTarget, int, x, int, y ); DEFINE_EVENT2_WITHNAMES( InternalCursorMoveEvent, int, x, int, y );
DEFINE_EVENT2_WITHNAMES( MouseDownEvent, CHitArea *, pTarget, ButtonCode_t, code ); DEFINE_EVENT3_WITHNAMES( MouseUpEvent, CHitArea *, pTarget, CHitArea *, pTrap, ButtonCode_t, code ); DEFINE_EVENT2_WITHNAMES( MouseDoubleClickEvent, CHitArea *, pTarget, ButtonCode_t, code ); DEFINE_EVENT2_WITHNAMES( MouseWheelEvent, CHitArea *, pTarget, int, delta );
DEFINE_EVENT2_WITHNAMES( KeyDownEvent, CHitArea *, pTarget, ButtonCode_t, code ); DEFINE_EVENT2_WITHNAMES( KeyUpEvent, CHitArea *, pTarget, ButtonCode_t, code ); DEFINE_EVENT2_WITHNAMES( KeyCodeTypedEvent, CHitArea *, pTarget, ButtonCode_t, code ); DEFINE_EVENT2_WITHNAMES( KeyTypedEvent, CHitArea *, pTarget, wchar_t, unichar );
DEFINE_EVENT1_WITHNAMES( GainKeyFocusEvent, CHitArea *, pTarget ); DEFINE_EVENT1_WITHNAMES( LoseKeyFocusEvent, CHitArea *, pTarget );
#endif // INPUTGAMEUI_H
|