Add an example for implementing 'Fit Guest' functionality.
This commit is contained in:
parent
3e3ba62112
commit
64070c7b8e
6
examples/resolution-set/Makefile
Normal file
6
examples/resolution-set/Makefile
Normal file
|
@ -0,0 +1,6 @@
|
|||
TARGET = resolution-set.img
|
||||
|
||||
APP_SOURCES = main.c
|
||||
|
||||
LIB_DIR = ../../lib
|
||||
include $(LIB_DIR)/Makefile.rules
|
98
examples/resolution-set/main.c
Normal file
98
examples/resolution-set/main.c
Normal file
|
@ -0,0 +1,98 @@
|
|||
/*
|
||||
* resolution-set --
|
||||
*
|
||||
* A sample for implementing the "Fit Guest" functionality in VMware
|
||||
* products. This functionality is actually a collaboration between
|
||||
* VMware Tools (in userlevel) and the video driver. So this isn't
|
||||
* how you'd normally implement it in a real operating system- but
|
||||
* for example and testing purposes, it's handy to show how a minimal
|
||||
* version of this functionality could be implemented.
|
||||
*
|
||||
* For a more comprehensive example of the VMware Tools protocol, see
|
||||
* the open-vm-tools project.
|
||||
*/
|
||||
|
||||
#include "intr.h"
|
||||
#include "vmbackdoor.h"
|
||||
#include "timer.h"
|
||||
#include "svga.h"
|
||||
|
||||
void
|
||||
sendCapabilities(void)
|
||||
{
|
||||
VMBackdoor_RPCString("tools.capability.resolution_set 1");
|
||||
VMBackdoor_RPCString("tools.capability.resolution_server toolbox 1");
|
||||
VMBackdoor_RPCString("tools.capability.display_topology_set 1");
|
||||
VMBackdoor_RPCString("tools.capability.color_depth_set 1");
|
||||
VMBackdoor_RPCString("tools.capability.resolution_min 0 0");
|
||||
VMBackdoor_RPCString("tools.capability.unity 1");
|
||||
}
|
||||
|
||||
void
|
||||
resize(int width, int height)
|
||||
{
|
||||
/*
|
||||
* To make it obvious that we're switching modes, alternate colors
|
||||
* each time.
|
||||
*/
|
||||
static uint32 color = 0x888888;
|
||||
|
||||
color ^= 0x004000;
|
||||
|
||||
SVGA_SyncToFence(SVGA_InsertFence());
|
||||
|
||||
SVGA_SetMode(width, height, 32);
|
||||
memset32(gSVGA.fbMem, color, width * height);
|
||||
SVGA_Update(0, 0, width, height);
|
||||
}
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
static VMTCLOState tclo;
|
||||
Bool resendCapabilities = FALSE;
|
||||
|
||||
Intr_Init();
|
||||
Intr_SetFaultHandlers(SVGA_DefaultFaultHandler);
|
||||
SVGA_Init();
|
||||
SVGA_SetMode(640, 480, 32);
|
||||
|
||||
/* Use the PIT to set TCLO polling rate. */
|
||||
Timer_InitPIT(PIT_HZ / 30);
|
||||
Intr_SetMask(0, TRUE);
|
||||
|
||||
sendCapabilities();
|
||||
|
||||
while (1) {
|
||||
Intr_Halt();
|
||||
|
||||
if (!VMBackdoor_PollTCLO(&tclo, FALSE)) {
|
||||
|
||||
if (resendCapabilities) {
|
||||
resendCapabilities = FALSE;
|
||||
sendCapabilities();
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (VMBackdoor_CheckPrefixTCLO(&tclo, "Capabilities_Register")) {
|
||||
/* Send the capabilities after we get a chance to send the reply. */
|
||||
resendCapabilities = TRUE;
|
||||
VMBackdoor_ReplyTCLO(&tclo, TCLO_SUCCESS);
|
||||
|
||||
} else if (VMBackdoor_CheckPrefixTCLO(&tclo, "Resolution_Set")) {
|
||||
int width = VMBackdoor_IntParamTCLO(&tclo, 1);
|
||||
int height = VMBackdoor_IntParamTCLO(&tclo, 2);
|
||||
|
||||
resize(width, height);
|
||||
|
||||
VMBackdoor_ReplyTCLO(&tclo, TCLO_SUCCESS);
|
||||
|
||||
} else {
|
||||
/* Unknown command */
|
||||
VMBackdoor_ReplyTCLO(&tclo, TCLO_UNKNOWN_CMD);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in a new issue