Blame server/shadow/shadow_screen.c

Packit Service fa4841
/**
Packit Service fa4841
 * FreeRDP: A Remote Desktop Protocol Implementation
Packit Service fa4841
 *
Packit Service fa4841
 * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit Service fa4841
 *
Packit Service fa4841
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit Service fa4841
 * you may not use this file except in compliance with the License.
Packit Service fa4841
 * You may obtain a copy of the License at
Packit Service fa4841
 *
Packit Service fa4841
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit Service fa4841
 *
Packit Service fa4841
 * Unless required by applicable law or agreed to in writing, software
Packit Service fa4841
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit Service fa4841
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit Service fa4841
 * See the License for the specific language governing permissions and
Packit Service fa4841
 * limitations under the License.
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
#ifdef HAVE_CONFIG_H
Packit Service fa4841
#include "config.h"
Packit Service fa4841
#endif
Packit Service fa4841
Packit Service fa4841
#include "shadow_surface.h"
Packit Service fa4841
Packit Service fa4841
#include "shadow_screen.h"
Packit Service fa4841
#include "shadow_lobby.h"
Packit Service fa4841
Packit Service fa4841
rdpShadowScreen* shadow_screen_new(rdpShadowServer* server)
Packit Service fa4841
{
Packit Service fa4841
	int x, y;
Packit Service fa4841
	int width, height;
Packit Service fa4841
	rdpShadowScreen* screen;
Packit Service fa4841
	rdpShadowSubsystem* subsystem;
Packit Service fa4841
	MONITOR_DEF* primary;
Packit Service fa4841
Packit Service b1ea74
	screen = (rdpShadowScreen*)calloc(1, sizeof(rdpShadowScreen));
Packit Service fa4841
Packit Service fa4841
	if (!screen)
Packit Service fa4841
		goto out_error;
Packit Service fa4841
Packit Service fa4841
	screen->server = server;
Packit Service fa4841
	subsystem = server->subsystem;
Packit Service fa4841
Packit Service fa4841
	if (!InitializeCriticalSectionAndSpinCount(&(screen->lock), 4000))
Packit Service fa4841
		goto out_free;
Packit Service fa4841
Packit Service fa4841
	region16_init(&(screen->invalidRegion));
Packit Service fa4841
Packit Service fa4841
	primary = &(subsystem->monitors[subsystem->selectedMonitor]);
Packit Service fa4841
Packit Service fa4841
	x = primary->left;
Packit Service fa4841
	y = primary->top;
Packit Service fa4841
	width = primary->right - primary->left;
Packit Service fa4841
	height = primary->bottom - primary->top;
Packit Service fa4841
Packit Service fa4841
	screen->width = width;
Packit Service fa4841
	screen->height = height;
Packit Service fa4841
Packit Service fa4841
	screen->primary = shadow_surface_new(server, x, y, width, height);
Packit Service fa4841
Packit Service fa4841
	if (!screen->primary)
Packit Service fa4841
		goto out_free_region;
Packit Service fa4841
Packit Service fa4841
	server->surface = screen->primary;
Packit Service fa4841
Packit Service fa4841
	screen->lobby = shadow_surface_new(server, x, y, width, height);
Packit Service fa4841
Packit Service fa4841
	if (!screen->lobby)
Packit Service fa4841
		goto out_free_primary;
Packit Service fa4841
Packit Service fa4841
	server->lobby = screen->lobby;
Packit Service fa4841
Packit Service fa4841
	shadow_client_init_lobby(server);
Packit Service fa4841
Packit Service fa4841
	return screen;
Packit Service fa4841
Packit Service fa4841
out_free_primary:
Packit Service fa4841
	shadow_surface_free(screen->primary);
Packit Service fa4841
	server->surface = screen->primary = NULL;
Packit Service fa4841
out_free_region:
Packit Service fa4841
	region16_uninit(&(screen->invalidRegion));
Packit Service fa4841
	DeleteCriticalSection(&(screen->lock));
Packit Service fa4841
out_free:
Packit Service fa4841
	free(screen);
Packit Service fa4841
out_error:
Packit Service fa4841
	return NULL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
void shadow_screen_free(rdpShadowScreen* screen)
Packit Service fa4841
{
Packit Service fa4841
	if (!screen)
Packit Service fa4841
		return;
Packit Service fa4841
Packit Service fa4841
	DeleteCriticalSection(&(screen->lock));
Packit Service fa4841
Packit Service fa4841
	region16_uninit(&(screen->invalidRegion));
Packit Service fa4841
Packit Service fa4841
	if (screen->primary)
Packit Service fa4841
	{
Packit Service fa4841
		shadow_surface_free(screen->primary);
Packit Service fa4841
		screen->primary = NULL;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	if (screen->lobby)
Packit Service fa4841
	{
Packit Service fa4841
		shadow_surface_free(screen->lobby);
Packit Service fa4841
		screen->lobby = NULL;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	free(screen);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
BOOL shadow_screen_resize(rdpShadowScreen* screen)
Packit Service fa4841
{
Packit Service fa4841
	int x, y;
Packit Service fa4841
	int width, height;
Packit Service fa4841
	MONITOR_DEF* primary;
Packit Service fa4841
	rdpShadowSubsystem* subsystem;
Packit Service fa4841
Packit Service fa4841
	if (!screen)
Packit Service fa4841
		return FALSE;
Packit Service fa4841
Packit Service fa4841
	subsystem = screen->server->subsystem;
Packit Service fa4841
	primary = &(subsystem->monitors[subsystem->selectedMonitor]);
Packit Service fa4841
Packit Service fa4841
	x = primary->left;
Packit Service fa4841
	y = primary->top;
Packit Service fa4841
	width = primary->right - primary->left;
Packit Service fa4841
	height = primary->bottom - primary->top;
Packit Service fa4841
Packit Service b1ea74
	if (shadow_surface_resize(screen->primary, x, y, width, height) &&
Packit Service b1ea74
	    shadow_surface_resize(screen->lobby, x, y, width, height))
Packit Service fa4841
	{
Packit Service fa4841
		if ((width != screen->width) || (height != screen->height))
Packit Service fa4841
		{
Packit Service fa4841
			/* screen size is changed. Store new size and reinit lobby */
Packit Service fa4841
			screen->width = width;
Packit Service fa4841
			screen->height = height;
Packit Service fa4841
			shadow_client_init_lobby(screen->server);
Packit Service fa4841
		}
Packit Service fa4841
		return TRUE;
Packit Service b1ea74
	}
Packit Service fa4841
Packit Service fa4841
	return FALSE;
Packit Service fa4841
}