This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

488 lines
23 KiB
C++

//====== Copyright 1996-2013, Valve Corporation, All rights reserved. =======
//
// Purpose: interface to display html pages in a texture
//
//=============================================================================
#ifndef ISTEAMHTMLSURFACE_H
#define ISTEAMHTMLSURFACE_H
#ifdef _WIN32
#pragma once
#endif
#include "isteamclient.h"
typedef uint32 HHTMLBrowser;
const uint32 INVALID_HTMLBROWSER = 0;
//-----------------------------------------------------------------------------
// Purpose: Functions for displaying HTML pages and interacting with them
//-----------------------------------------------------------------------------
class ISteamHTMLSurface {
public:
virtual ~ISteamHTMLSurface() {}
// Must call init and shutdown when starting/ending use of the interface
virtual bool Init() = 0;
virtual bool Shutdown() = 0;
// Create a browser object for display of a html page, when creation is
// complete the call handle will return a HTML_BrowserReady_t callback for
// the HHTMLBrowser of your new browser.
// The user agent string is a substring to be added to the general user
// agent string so you can
// identify your client on web servers.
// The userCSS string lets you apply a CSS style sheet to every displayed
// page, leave null if
// you do not require this functionality.
virtual SteamAPICall_t CreateBrowser(const char *pchUserAgent,
const char *pchUserCSS) = 0;
// Call this when you are done with a html surface, this lets us free the
// resources being used by it
virtual void RemoveBrowser(HHTMLBrowser unBrowserHandle) = 0;
// Navigate to this URL, results in a HTML_StartRequest_t as the request
// commences
virtual void LoadURL(HHTMLBrowser unBrowserHandle, const char *pchURL,
const char *pchPostData) = 0;
// Tells the surface the size in pixels to display the surface
virtual void SetSize(HHTMLBrowser unBrowserHandle, uint32 unWidth,
uint32 unHeight) = 0;
// Stop the load of the current html page
virtual void StopLoad(HHTMLBrowser unBrowserHandle) = 0;
// Reload (most likely from local cache) the current page
virtual void Reload(HHTMLBrowser unBrowserHandle) = 0;
// navigate back in the page history
virtual void GoBack(HHTMLBrowser unBrowserHandle) = 0;
// navigate forward in the page history
virtual void GoForward(HHTMLBrowser unBrowserHandle) = 0;
// add this header to any url requests from this browser
virtual void AddHeader(HHTMLBrowser unBrowserHandle, const char *pchKey,
const char *pchValue) = 0;
// run this javascript script in the currently loaded page
virtual void ExecuteJavascript(HHTMLBrowser unBrowserHandle,
const char *pchScript) = 0;
enum EHTMLMouseButton {
eHTMLMouseButton_Left = 0,
eHTMLMouseButton_Right = 1,
eHTMLMouseButton_Middle = 2,
};
// Mouse click and mouse movement commands
virtual void MouseUp(HHTMLBrowser unBrowserHandle,
EHTMLMouseButton eMouseButton) = 0;
virtual void MouseDown(HHTMLBrowser unBrowserHandle,
EHTMLMouseButton eMouseButton) = 0;
virtual void MouseDoubleClick(HHTMLBrowser unBrowserHandle,
EHTMLMouseButton eMouseButton) = 0;
// x and y are relative to the HTML bounds
virtual void MouseMove(HHTMLBrowser unBrowserHandle, int x, int y) = 0;
// nDelta is pixels of scroll
virtual void MouseWheel(HHTMLBrowser unBrowserHandle, int32 nDelta) = 0;
enum EMouseCursor {
dc_user = 0,
dc_none,
dc_arrow,
dc_ibeam,
dc_hourglass,
dc_waitarrow,
dc_crosshair,
dc_up,
dc_sizenw,
dc_sizese,
dc_sizene,
dc_sizesw,
dc_sizew,
dc_sizee,
dc_sizen,
dc_sizes,
dc_sizewe,
dc_sizens,
dc_sizeall,
dc_no,
dc_hand,
dc_blank, // don't show any custom cursor, just use your default
dc_middle_pan,
dc_north_pan,
dc_north_east_pan,
dc_east_pan,
dc_south_east_pan,
dc_south_pan,
dc_south_west_pan,
dc_west_pan,
dc_north_west_pan,
dc_alias,
dc_cell,
dc_colresize,
dc_copycur,
dc_verticaltext,
dc_rowresize,
dc_zoomin,
dc_zoomout,
dc_help,
dc_custom,
dc_last, // custom cursors start from this value and up
};
enum EHTMLKeyModifiers {
k_eHTMLKeyModifier_None = 0,
k_eHTMLKeyModifier_AltDown = 1 << 0,
k_eHTMLKeyModifier_CtrlDown = 1 << 1,
k_eHTMLKeyModifier_ShiftDown = 1 << 2,
};
// keyboard interactions, native keycode is the virtual key code value from
// your OS
virtual void KeyDown(HHTMLBrowser unBrowserHandle, uint32 nNativeKeyCode,
EHTMLKeyModifiers eHTMLKeyModifiers) = 0;
virtual void KeyUp(HHTMLBrowser unBrowserHandle, uint32 nNativeKeyCode,
EHTMLKeyModifiers eHTMLKeyModifiers) = 0;
// cUnicodeChar is the unicode character point for this keypress (and
// potentially multiple chars per press)
virtual void KeyChar(HHTMLBrowser unBrowserHandle, uint32 cUnicodeChar,
EHTMLKeyModifiers eHTMLKeyModifiers) = 0;
// programmatically scroll this many pixels on the page
virtual void SetHorizontalScroll(HHTMLBrowser unBrowserHandle,
uint32 nAbsolutePixelScroll) = 0;
virtual void SetVerticalScroll(HHTMLBrowser unBrowserHandle,
uint32 nAbsolutePixelScroll) = 0;
// tell the html control if it has key focus currently, controls showing the
// I-beam cursor in text controls amongst other things
virtual void SetKeyFocus(HHTMLBrowser unBrowserHandle,
bool bHasKeyFocus) = 0;
// open the current pages html code in the local editor of choice, used for
// debugging
virtual void ViewSource(HHTMLBrowser unBrowserHandle) = 0;
// copy the currently selected text on the html page to the local clipboard
virtual void CopyToClipboard(HHTMLBrowser unBrowserHandle) = 0;
// paste from the local clipboard to the current html page
virtual void PasteFromClipboard(HHTMLBrowser unBrowserHandle) = 0;
// find this string in the browser, if bCurrentlyInFind is true then instead
// cycle to the next matching element
virtual void Find(HHTMLBrowser unBrowserHandle, const char *pchSearchStr,
bool bCurrentlyInFind, bool bReverse) = 0;
// cancel a currently running find
virtual void StopFind(HHTMLBrowser unBrowserHandle) = 0;
// return details about the link at position x,y on the current page
virtual void GetLinkAtPosition(HHTMLBrowser unBrowserHandle, int x,
int y) = 0;
// set a webcookie for the hostname in question
virtual void SetCookie(const char *pchHostname, const char *pchKey,
const char *pchValue, const char *pchPath = "/",
RTime32 nExpires = 0, bool bSecure = false,
bool bHTTPOnly = false) = 0;
// Zoom the current page by flZoom ( from 0.0 to 2.0, so to zoom to 120%
// use 1.2 ), zooming around point X,Y in the page (use 0,0 if you don't
// care)
virtual void SetPageScaleFactor(HHTMLBrowser unBrowserHandle, float flZoom,
int nPointX, int nPointY) = 0;
// Enable/disable low-resource background mode, where javascript and repaint
// timers are throttled, resources are more aggressively purged from memory,
// and audio/video elements are paused. When background mode is enabled, all
// HTML5 video and audio objects will execute ".pause()" and gain the
// property "._steam_background_paused = 1". When background mode is
// disabled, any video or audio objects with that property will resume with
// ".play()".
virtual void SetBackgroundMode(HHTMLBrowser unBrowserHandle,
bool bBackgroundMode) = 0;
// CALLBACKS
//
// These set of functions are used as responses to callback requests
//
// You MUST call this in response to a HTML_StartRequest_t callback
// Set bAllowed to true to allow this navigation, false to cancel it and
// stay
// on the current page. You can use this feature to limit the valid pages
// allowed in your HTML surface.
virtual void AllowStartRequest(HHTMLBrowser unBrowserHandle,
bool bAllowed) = 0;
// You MUST call this in response to a HTML_JSAlert_t or HTML_JSConfirm_t
// callback
// Set bResult to true for the OK option of a confirm, use false otherwise
virtual void JSDialogResponse(HHTMLBrowser unBrowserHandle,
bool bResult) = 0;
// You MUST call this in response to a HTML_FileOpenDialog_t callback
virtual void FileLoadDialogResponse(HHTMLBrowser unBrowserHandle,
const char **pchSelectedFiles) = 0;
};
#define STEAMHTMLSURFACE_INTERFACE_VERSION \
"STEAMHTMLSURFACE_INTERFACE_VERSION_003"
// callbacks
#if defined(VALVE_CALLBACK_PACK_SMALL)
#pragma pack(push, 4)
#elif defined(VALVE_CALLBACK_PACK_LARGE)
#pragma pack(push, 8)
#else
#error isteamclient.h must be included
#endif
//-----------------------------------------------------------------------------
// Purpose: The browser is ready for use
//-----------------------------------------------------------------------------
DEFINE_CALLBACK(HTML_BrowserReady_t, k_iSteamHTMLSurfaceCallbacks + 1)
CALLBACK_MEMBER(0, HHTMLBrowser,
unBrowserHandle) // this browser is now fully created and ready
// to navigate to pages
END_DEFINE_CALLBACK_1()
//-----------------------------------------------------------------------------
// Purpose: the browser has a pending paint
//-----------------------------------------------------------------------------
DEFINE_CALLBACK(HTML_NeedsPaint_t, k_iSteamHTMLSurfaceCallbacks + 2)
CALLBACK_MEMBER(0, HHTMLBrowser,
unBrowserHandle) // the browser that needs the paint
CALLBACK_MEMBER(1, const char *,
pBGRA) // a pointer to the B8G8R8A8 data for this surface,
// valid until SteamAPI_RunCallbacks is next called
CALLBACK_MEMBER(2, uint32, unWide) // the total width of the pBGRA texture
CALLBACK_MEMBER(3, uint32, unTall) // the total height of the pBGRA texture
CALLBACK_MEMBER(
4, uint32,
unUpdateX) // the offset in X for the damage rect for this update
CALLBACK_MEMBER(
5, uint32,
unUpdateY) // the offset in Y for the damage rect for this update
CALLBACK_MEMBER(6, uint32,
unUpdateWide) // the width of the damage rect for this update
CALLBACK_MEMBER(7, uint32,
unUpdateTall) // the height of the damage rect for this update
CALLBACK_MEMBER(8, uint32, unScrollX) // the page scroll the browser was at
// when this texture was rendered
CALLBACK_MEMBER(9, uint32, unScrollY) // the page scroll the browser was at
// when this texture was rendered
CALLBACK_MEMBER(
10, float, flPageScale) // the page scale factor on this page when rendered
CALLBACK_MEMBER(
11, uint32,
unPageSerial) // incremented on each new page load, you can use this to
// reject draws while navigating to new pages
END_DEFINE_CALLBACK_12()
//-----------------------------------------------------------------------------
// Purpose: The browser wanted to navigate to a new page
// NOTE - you MUST call AllowStartRequest in response to this callback
//-----------------------------------------------------------------------------
DEFINE_CALLBACK(HTML_StartRequest_t, k_iSteamHTMLSurfaceCallbacks + 3)
CALLBACK_MEMBER(0, HHTMLBrowser,
unBrowserHandle) // the handle of the surface navigating
CALLBACK_MEMBER(1, const char *, pchURL) // the url they wish to navigate to
CALLBACK_MEMBER(2, const char *, pchTarget) // the html link target type (i.e
// _blank, _self, _parent, _top )
CALLBACK_MEMBER(3, const char *,
pchPostData) // any posted data for the request
CALLBACK_MEMBER(4, bool, bIsRedirect) // true if this was a http/html redirect
// from the last load request
END_DEFINE_CALLBACK_5()
//-----------------------------------------------------------------------------
// Purpose: The browser has been requested to close due to user interaction
// (usually from a javascript window.close() call)
//-----------------------------------------------------------------------------
DEFINE_CALLBACK(HTML_CloseBrowser_t, k_iSteamHTMLSurfaceCallbacks + 4)
CALLBACK_MEMBER(0, HHTMLBrowser, unBrowserHandle) // the handle of the surface
END_DEFINE_CALLBACK_1()
//-----------------------------------------------------------------------------
// Purpose: the browser is navigating to a new url
//-----------------------------------------------------------------------------
DEFINE_CALLBACK(HTML_URLChanged_t, k_iSteamHTMLSurfaceCallbacks + 5)
CALLBACK_MEMBER(0, HHTMLBrowser,
unBrowserHandle) // the handle of the surface navigating
CALLBACK_MEMBER(1, const char *, pchURL) // the url they wish to navigate to
CALLBACK_MEMBER(2, const char *,
pchPostData) // any posted data for the request
CALLBACK_MEMBER(3, bool, bIsRedirect) // true if this was a http/html redirect
// from the last load request
CALLBACK_MEMBER(4, const char *, pchPageTitle) // the title of the page
CALLBACK_MEMBER(5, bool, bNewNavigation) // true if this was from a fresh tab
// and not a click on an existing page
END_DEFINE_CALLBACK_6()
//-----------------------------------------------------------------------------
// Purpose: A page is finished loading
//-----------------------------------------------------------------------------
DEFINE_CALLBACK(HTML_FinishedRequest_t, k_iSteamHTMLSurfaceCallbacks + 6)
CALLBACK_MEMBER(0, HHTMLBrowser, unBrowserHandle) // the handle of the surface
CALLBACK_MEMBER(1, const char *, pchURL) //
CALLBACK_MEMBER(2, const char *, pchPageTitle) //
END_DEFINE_CALLBACK_3()
//-----------------------------------------------------------------------------
// Purpose: a request to load this url in a new tab
//-----------------------------------------------------------------------------
DEFINE_CALLBACK(HTML_OpenLinkInNewTab_t, k_iSteamHTMLSurfaceCallbacks + 7)
CALLBACK_MEMBER(0, HHTMLBrowser, unBrowserHandle) // the handle of the surface
CALLBACK_MEMBER(1, const char *, pchURL) //
END_DEFINE_CALLBACK_2()
//-----------------------------------------------------------------------------
// Purpose: the page has a new title now
//-----------------------------------------------------------------------------
DEFINE_CALLBACK(HTML_ChangedTitle_t, k_iSteamHTMLSurfaceCallbacks + 8)
CALLBACK_MEMBER(0, HHTMLBrowser, unBrowserHandle) // the handle of the surface
CALLBACK_MEMBER(1, const char *, pchTitle) //
END_DEFINE_CALLBACK_2()
//-----------------------------------------------------------------------------
// Purpose: results from a search
//-----------------------------------------------------------------------------
DEFINE_CALLBACK(HTML_SearchResults_t, k_iSteamHTMLSurfaceCallbacks + 9)
CALLBACK_MEMBER(0, HHTMLBrowser, unBrowserHandle) // the handle of the surface
CALLBACK_MEMBER(1, uint32, unResults) //
CALLBACK_MEMBER(2, uint32, unCurrentMatch) //
END_DEFINE_CALLBACK_3()
//-----------------------------------------------------------------------------
// Purpose: page history status changed on the ability to go backwards and
// forward
//-----------------------------------------------------------------------------
DEFINE_CALLBACK(HTML_CanGoBackAndForward_t, k_iSteamHTMLSurfaceCallbacks + 10)
CALLBACK_MEMBER(0, HHTMLBrowser, unBrowserHandle) // the handle of the surface
CALLBACK_MEMBER(1, bool, bCanGoBack) //
CALLBACK_MEMBER(2, bool, bCanGoForward) //
END_DEFINE_CALLBACK_3()
//-----------------------------------------------------------------------------
// Purpose: details on the visibility and size of the horizontal scrollbar
//-----------------------------------------------------------------------------
DEFINE_CALLBACK(HTML_HorizontalScroll_t, k_iSteamHTMLSurfaceCallbacks + 11)
CALLBACK_MEMBER(0, HHTMLBrowser, unBrowserHandle) // the handle of the surface
CALLBACK_MEMBER(1, uint32, unScrollMax) //
CALLBACK_MEMBER(2, uint32, unScrollCurrent) //
CALLBACK_MEMBER(3, float, flPageScale) //
CALLBACK_MEMBER(4, bool, bVisible) //
CALLBACK_MEMBER(5, uint32, unPageSize) //
END_DEFINE_CALLBACK_6()
//-----------------------------------------------------------------------------
// Purpose: details on the visibility and size of the vertical scrollbar
//-----------------------------------------------------------------------------
DEFINE_CALLBACK(HTML_VerticalScroll_t, k_iSteamHTMLSurfaceCallbacks + 12)
CALLBACK_MEMBER(0, HHTMLBrowser, unBrowserHandle) // the handle of the surface
CALLBACK_MEMBER(1, uint32, unScrollMax) //
CALLBACK_MEMBER(2, uint32, unScrollCurrent) //
CALLBACK_MEMBER(3, float, flPageScale) //
CALLBACK_MEMBER(4, bool, bVisible) //
CALLBACK_MEMBER(5, uint32, unPageSize) //
END_DEFINE_CALLBACK_6()
//-----------------------------------------------------------------------------
// Purpose: response to GetLinkAtPosition call
//-----------------------------------------------------------------------------
DEFINE_CALLBACK(HTML_LinkAtPosition_t, k_iSteamHTMLSurfaceCallbacks + 13)
CALLBACK_MEMBER(0, HHTMLBrowser, unBrowserHandle) // the handle of the surface
CALLBACK_MEMBER(1, uint32, x) // NOTE - Not currently set
CALLBACK_MEMBER(2, uint32, y) // NOTE - Not currently set
CALLBACK_MEMBER(3, const char *, pchURL) //
CALLBACK_MEMBER(4, bool, bInput) //
CALLBACK_MEMBER(5, bool, bLiveLink) //
END_DEFINE_CALLBACK_6()
//-----------------------------------------------------------------------------
// Purpose: show a Javascript alert dialog, call JSDialogResponse
// when the user dismisses this dialog (or right away to ignore it)
//-----------------------------------------------------------------------------
DEFINE_CALLBACK(HTML_JSAlert_t, k_iSteamHTMLSurfaceCallbacks + 14)
CALLBACK_MEMBER(0, HHTMLBrowser, unBrowserHandle) // the handle of the surface
CALLBACK_MEMBER(1, const char *, pchMessage) //
END_DEFINE_CALLBACK_2()
//-----------------------------------------------------------------------------
// Purpose: show a Javascript confirmation dialog, call JSDialogResponse
// when the user dismisses this dialog (or right away to ignore it)
//-----------------------------------------------------------------------------
DEFINE_CALLBACK(HTML_JSConfirm_t, k_iSteamHTMLSurfaceCallbacks + 15)
CALLBACK_MEMBER(0, HHTMLBrowser, unBrowserHandle) // the handle of the surface
CALLBACK_MEMBER(1, const char *, pchMessage) //
END_DEFINE_CALLBACK_2()
//-----------------------------------------------------------------------------
// Purpose: when received show a file open dialog
// then call FileLoadDialogResponse with the file(s) the user selected.
//-----------------------------------------------------------------------------
DEFINE_CALLBACK(HTML_FileOpenDialog_t, k_iSteamHTMLSurfaceCallbacks + 16)
CALLBACK_MEMBER(0, HHTMLBrowser, unBrowserHandle) // the handle of the surface
CALLBACK_MEMBER(1, const char *, pchTitle) //
CALLBACK_MEMBER(2, const char *, pchInitialFile) //
END_DEFINE_CALLBACK_3()
//-----------------------------------------------------------------------------
// Purpose: a new html window has been created
//-----------------------------------------------------------------------------
DEFINE_CALLBACK(HTML_NewWindow_t, k_iSteamHTMLSurfaceCallbacks + 21)
CALLBACK_MEMBER(0, HHTMLBrowser,
unBrowserHandle) // the handle of the current surface
CALLBACK_MEMBER(1, const char *, pchURL) // the page to load
CALLBACK_MEMBER(2, uint32, unX) // the x pos into the page to display the popup
CALLBACK_MEMBER(3, uint32, unY) // the y pos into the page to display the popup
CALLBACK_MEMBER(4, uint32, unWide) // the total width of the pBGRA texture
CALLBACK_MEMBER(5, uint32, unTall) // the total height of the pBGRA texture
CALLBACK_MEMBER(
6, HHTMLBrowser,
unNewWindow_BrowserHandle) // the handle of the new window surface
END_DEFINE_CALLBACK_7()
//-----------------------------------------------------------------------------
// Purpose: change the cursor to display
//-----------------------------------------------------------------------------
DEFINE_CALLBACK(HTML_SetCursor_t, k_iSteamHTMLSurfaceCallbacks + 22)
CALLBACK_MEMBER(0, HHTMLBrowser, unBrowserHandle) // the handle of the surface
CALLBACK_MEMBER(1, uint32, eMouseCursor) // the EMouseCursor to display
END_DEFINE_CALLBACK_2()
//-----------------------------------------------------------------------------
// Purpose: informational message from the browser
//-----------------------------------------------------------------------------
DEFINE_CALLBACK(HTML_StatusText_t, k_iSteamHTMLSurfaceCallbacks + 23)
CALLBACK_MEMBER(0, HHTMLBrowser, unBrowserHandle) // the handle of the surface
CALLBACK_MEMBER(1, const char *, pchMsg) // the EMouseCursor to display
END_DEFINE_CALLBACK_2()
//-----------------------------------------------------------------------------
// Purpose: show a tooltip
//-----------------------------------------------------------------------------
DEFINE_CALLBACK(HTML_ShowToolTip_t, k_iSteamHTMLSurfaceCallbacks + 24)
CALLBACK_MEMBER(0, HHTMLBrowser, unBrowserHandle) // the handle of the surface
CALLBACK_MEMBER(1, const char *, pchMsg) // the EMouseCursor to display
END_DEFINE_CALLBACK_2()
//-----------------------------------------------------------------------------
// Purpose: update the text of an existing tooltip
//-----------------------------------------------------------------------------
DEFINE_CALLBACK(HTML_UpdateToolTip_t, k_iSteamHTMLSurfaceCallbacks + 25)
CALLBACK_MEMBER(0, HHTMLBrowser, unBrowserHandle) // the handle of the surface
CALLBACK_MEMBER(1, const char *, pchMsg) // the EMouseCursor to display
END_DEFINE_CALLBACK_2()
//-----------------------------------------------------------------------------
// Purpose: hide the tooltip you are showing
//-----------------------------------------------------------------------------
DEFINE_CALLBACK(HTML_HideToolTip_t, k_iSteamHTMLSurfaceCallbacks + 26)
CALLBACK_MEMBER(0, HHTMLBrowser, unBrowserHandle) // the handle of the surface
END_DEFINE_CALLBACK_1()
#pragma pack(pop)
#endif // ISTEAMHTMLSURFACE_H