2025-05-17 14:17:42 -04:00
//===== Copyright © 1996-2005, Valve Corporation, All rights reserved. ======//
2010-07-22 01:46:14 -05:00
//
// Purpose:
//
// $NoKeywords: $
//===========================================================================//
# ifndef VGUI_IINPUT_H
# define VGUI_IINPUT_H
# ifdef _WIN32
# pragma once
# endif
# include <vgui/VGUI.h>
# include "tier1/interface.h"
# include "vgui/MouseCode.h"
# include "vgui/KeyCode.h"
namespace vgui
{
class Cursor ;
typedef unsigned long HCursor ;
# define VGUI_GCS_COMPREADSTR 0x0001
# define VGUI_GCS_COMPREADATTR 0x0002
# define VGUI_GCS_COMPREADCLAUSE 0x0004
# define VGUI_GCS_COMPSTR 0x0008
# define VGUI_GCS_COMPATTR 0x0010
# define VGUI_GCS_COMPCLAUSE 0x0020
# define VGUI_GCS_CURSORPOS 0x0080
# define VGUI_GCS_DELTASTART 0x0100
# define VGUI_GCS_RESULTREADSTR 0x0200
# define VGUI_GCS_RESULTREADCLAUSE 0x0400
# define VGUI_GCS_RESULTSTR 0x0800
# define VGUI_GCS_RESULTCLAUSE 0x1000
// style bit flags for WM_IME_COMPOSITION
# define VGUI_CS_INSERTCHAR 0x2000
# define VGUI_CS_NOMOVECARET 0x4000
# define MESSAGE_CURSOR_POS -1
# define MESSAGE_CURRENT_KEYFOCUS -2
class IInput : public IBaseInterface
{
public :
virtual void SetMouseFocus ( VPANEL newMouseFocus ) = 0 ;
virtual void SetMouseCapture ( VPANEL panel ) = 0 ;
// returns the string name of a scan code
virtual void GetKeyCodeText ( KeyCode code , char * buf , int buflen ) = 0 ;
// focus
virtual VPANEL GetFocus ( ) = 0 ;
virtual VPANEL GetCalculatedFocus ( ) = 0 ; // to handle cases where the focus changes inside a frame.
virtual VPANEL GetMouseOver ( ) = 0 ; // returns the panel the mouse is currently over, ignoring mouse capture
// mouse state
virtual void SetCursorPos ( int x , int y ) = 0 ;
virtual void GetCursorPos ( int & x , int & y ) = 0 ;
virtual bool WasMousePressed ( MouseCode code ) = 0 ;
virtual bool WasMouseDoublePressed ( MouseCode code ) = 0 ;
virtual bool IsMouseDown ( MouseCode code ) = 0 ;
// cursor override
virtual void SetCursorOveride ( HCursor cursor ) = 0 ;
virtual HCursor GetCursorOveride ( ) = 0 ;
// key state
virtual bool WasMouseReleased ( MouseCode code ) = 0 ;
virtual bool WasKeyPressed ( KeyCode code ) = 0 ;
virtual bool IsKeyDown ( KeyCode code ) = 0 ;
virtual bool WasKeyTyped ( KeyCode code ) = 0 ;
virtual bool WasKeyReleased ( KeyCode code ) = 0 ;
virtual VPANEL GetAppModalSurface ( ) = 0 ;
// set the modal dialog panel.
// all events will go only to this panel and its children.
virtual void SetAppModalSurface ( VPANEL panel ) = 0 ;
// release the modal dialog panel
// do this when your modal dialog finishes.
virtual void ReleaseAppModalSurface ( ) = 0 ;
virtual void GetCursorPosition ( int & x , int & y ) = 0 ;
virtual void SetIMEWindow ( void * hwnd ) = 0 ;
virtual void * GetIMEWindow ( ) = 0 ;
virtual void OnChangeIME ( bool forward ) = 0 ;
virtual int GetCurrentIMEHandle ( ) = 0 ;
virtual int GetEnglishIMEHandle ( ) = 0 ;
// Returns the Language Bar label (Chinese, Korean, Japanese, Russion, Thai, etc.)
virtual void GetIMELanguageName ( wchar_t * buf , int unicodeBufferSizeInBytes ) = 0 ;
// Returns the short code for the language (EN, CH, KO, JP, RU, TH, etc. ).
virtual void GetIMELanguageShortCode ( wchar_t * buf , int unicodeBufferSizeInBytes ) = 0 ;
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
} ;
// Call with NULL dest to get item count
virtual int GetIMELanguageList ( LanguageItem * dest , int destcount ) = 0 ;
virtual int GetIMEConversionModes ( ConversionModeItem * dest , int destcount ) = 0 ;
virtual int GetIMESentenceModes ( SentenceModeItem * dest , int destcount ) = 0 ;
virtual void OnChangeIMEByHandle ( int handleValue ) = 0 ;
virtual void OnChangeIMEConversionModeByHandle ( int handleValue ) = 0 ;
virtual void OnChangeIMESentenceModeByHandle ( int handleValue ) = 0 ;
virtual void OnInputLanguageChanged ( ) = 0 ;
virtual void OnIMEStartComposition ( ) = 0 ;
virtual void OnIMEComposition ( int flags ) = 0 ;
virtual void OnIMEEndComposition ( ) = 0 ;
virtual void OnIMEShowCandidates ( ) = 0 ;
virtual void OnIMEChangeCandidates ( ) = 0 ;
virtual void OnIMECloseCandidates ( ) = 0 ;
virtual void OnIMERecomputeModes ( ) = 0 ;
virtual int GetCandidateListCount ( ) = 0 ;
virtual void GetCandidate ( int num , wchar_t * dest , int destSizeBytes ) = 0 ;
virtual int GetCandidateListSelectedItem ( ) = 0 ;
virtual int GetCandidateListPageSize ( ) = 0 ;
virtual int GetCandidateListPageStart ( ) = 0 ;
//NOTE: We render our own candidate lists most of the time...
virtual void SetCandidateWindowPos ( int x , int y ) = 0 ;
virtual bool GetShouldInvertCompositionString ( ) = 0 ;
virtual bool CandidateListStartsAtOne ( ) = 0 ;
virtual void SetCandidateListPageStart ( int start ) = 0 ;
// Passes in a keycode which allows hitting other mouse buttons w/o cancelling capture mode
virtual void SetMouseCaptureEx ( VPANEL panel , MouseCode captureStartMouseCode ) = 0 ;
// Because OnKeyCodeTyped uses CallParentFunction and is therefore message based, there's no way
// to know if handler actually swallowed the specified keycode. To get around this, I set a global before calling the
// kb focus OnKeyCodeTyped function and if we ever get to a Panel::OnKeyCodeTypes we know that nobody handled the message
// and in that case we can post a message to any "unhandled keycode" listeners
// This will generate an MESSAGE_FUNC_INT( "KeyCodeUnhandled" "code" code ) message to each such listener
virtual void RegisterKeyCodeUnhandledListener ( VPANEL panel ) = 0 ;
virtual void UnregisterKeyCodeUnhandledListener ( VPANEL panel ) = 0 ;
// Posts unhandled message to all interested panels
virtual void OnKeyCodeUnhandled ( int keyCode ) = 0 ;
// Assumes subTree is a child panel of the root panel for the vgui contect
// if restrictMessagesToSubTree is true, then mouse and kb messages are only routed to the subTree and it's children and mouse/kb focus
// can only be on one of the subTree children, if a mouse click occurs outside of the subtree, and "UnhandledMouseClick" message is sent to unhandledMouseClickListener panel
// if it's set
// if restrictMessagesToSubTree is false, then mouse and kb messages are routed as normal except that they are not routed down into the subtree
// however, if a mouse click occurs outside of the subtree, and "UnhandleMouseClick" message is sent to unhandledMouseClickListener panel
// if it's set
virtual void SetModalSubTree ( VPANEL subTree , VPANEL unhandledMouseClickListener , bool restrictMessagesToSubTree = true ) = 0 ;
virtual void ReleaseModalSubTree ( ) = 0 ;
virtual VPANEL GetModalSubTree ( ) = 0 ;
// These toggle whether the modal subtree is exclusively receiving messages or conversely whether it's being excluded from receiving messages
// Sends a "ModalSubTree", state message
virtual void SetModalSubTreeReceiveMessages ( bool state ) = 0 ;
virtual bool ShouldModalSubTreeReceiveMessages ( ) const = 0 ;
virtual VPANEL GetMouseCapture ( ) = 0 ;
virtual VPANEL GetMouseFocus ( ) = 0 ;
} ;
} // namespace vgui
# endif // VGUI_IINPUT_H