Blame uwac/libuwac/uwac-output.c

Packit 1fb8d4
/*
Packit 1fb8d4
 * Copyright © 2014 David FORT <contact@hardening-consulting.com>
Packit 1fb8d4
 *
Packit 1fb8d4
 * Permission to use, copy, modify, distribute, and sell this software and its
Packit 1fb8d4
 * documentation for any purpose is hereby granted without fee, provided that
Packit 1fb8d4
 * the above copyright notice appear in all copies and that both that copyright
Packit 1fb8d4
 * notice and this permission notice appear in supporting documentation, and
Packit 1fb8d4
 * that the name of the copyright holders not be used in advertising or
Packit 1fb8d4
 * publicity pertaining to distribution of the software without specific,
Packit 1fb8d4
 * written prior permission.  The copyright holders make no representations
Packit 1fb8d4
 * about the suitability of this software for any purpose.  It is provided "as
Packit 1fb8d4
 * is" without express or implied warranty.
Packit 1fb8d4
 *
Packit 1fb8d4
 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
Packit 1fb8d4
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
Packit 1fb8d4
 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
Packit 1fb8d4
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
Packit 1fb8d4
 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
Packit 1fb8d4
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
Packit 1fb8d4
 * OF THIS SOFTWARE.
Packit 1fb8d4
 */
Packit 1fb8d4
#include "uwac-priv.h"
Packit 1fb8d4
#include "uwac-utils.h"
Packit 1fb8d4
Packit 1fb8d4
#include <stdio.h>
Packit 1fb8d4
#include <stdlib.h>
Packit 1fb8d4
#include <string.h>
Packit 1fb8d4
#include <assert.h>
Packit 1fb8d4
Packit Service 5a9772
#define TARGET_OUTPUT_INTERFACE 2U
Packit 1fb8d4
Packit Service 5a9772
static void output_handle_geometry(void* data, struct wl_output* wl_output, int x, int y,
Packit Service 5a9772
                                   int physical_width, int physical_height, int subpixel,
Packit Service 5a9772
                                   const char* make, const char* model, int transform)
Packit 1fb8d4
{
Packit Service 5a9772
	UwacOutput* output = data;
Packit 1fb8d4
Packit Service 5a9772
	output->position.x = x;
Packit Service 5a9772
	output->position.y = y;
Packit 1fb8d4
	output->transform = transform;
Packit 1fb8d4
Packit 1fb8d4
	if (output->make)
Packit 1fb8d4
		free(output->make);
Packit 1fb8d4
	output->make = strdup(make);
Packit Service 5a9772
	if (!output->make)
Packit Service 5a9772
	{
Packit Service 5a9772
		assert(uwacErrorHandler(output->display, UWAC_ERROR_NOMEMORY, "%s: unable to strdup make\n",
Packit Service 5a9772
		                        __FUNCTION__));
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (output->model)
Packit 1fb8d4
		free(output->model);
Packit 1fb8d4
	output->model = strdup(model);
Packit Service 5a9772
	if (!output->model)
Packit Service 5a9772
	{
Packit Service 5a9772
		assert(uwacErrorHandler(output->display, UWAC_ERROR_NOMEMORY,
Packit Service 5a9772
		                        "%s: unable to strdup model\n", __FUNCTION__));
Packit 1fb8d4
	}
Packit Service 5a9772
Packit Service 5a9772
	UwacEvent* event = UwacDisplayNewEvent(output->display, UWAC_EVENT_OUTPUT_GEOMETRY);
Packit Service 5a9772
	event->output_geometry.output = output;
Packit Service 5a9772
	event->output_geometry.x = x;
Packit Service 5a9772
	event->output_geometry.y = y;
Packit Service 5a9772
	event->output_geometry.physical_width = physical_width;
Packit Service 5a9772
	event->output_geometry.physical_height = physical_height;
Packit Service 5a9772
	event->output_geometry.subpixel = subpixel;
Packit Service 5a9772
	event->output_geometry.make = output->make;
Packit Service 5a9772
	event->output_geometry.model = output->model;
Packit Service 5a9772
	event->output_geometry.transform = transform;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
static void output_handle_done(void* data, struct wl_output* wl_output)
Packit 1fb8d4
{
Packit Service 5a9772
	UwacOutput* output = data;
Packit 1fb8d4
Packit 1fb8d4
	output->doneReceived = true;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
static void output_handle_scale(void* data, struct wl_output* wl_output, int32_t scale)
Packit 1fb8d4
{
Packit Service 5a9772
	UwacOutput* output = data;
Packit 1fb8d4
Packit 1fb8d4
	output->scale = scale;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
static void output_handle_mode(void* data, struct wl_output* wl_output, uint32_t flags, int width,
Packit Service 5a9772
                               int height, int refresh)
Packit 1fb8d4
{
Packit Service 5a9772
	UwacOutput* output = data;
Packit Service 5a9772
	// UwacDisplay *display = output->display;
Packit 1fb8d4
Packit Service 5a9772
	if (output->doneNeeded && output->doneReceived)
Packit Service 5a9772
	{
Packit 1fb8d4
		/* TODO: we should clear the mode list */
Packit 1fb8d4
	}
Packit 1fb8d4
Packit Service 5a9772
	if (flags & WL_OUTPUT_MODE_CURRENT)
Packit Service 5a9772
	{
Packit 1fb8d4
		output->resolution.width = width;
Packit 1fb8d4
		output->resolution.height = height;
Packit Service 5a9772
		/*	output->allocation.width = width;
Packit Service 5a9772
		    output->allocation.height = height;
Packit Service 5a9772
		    if (display->output_configure_handler)
Packit Service 5a9772
		        (*display->output_configure_handler)(
Packit Service 5a9772
		                    output, display->user_data);*/
Packit 1fb8d4
	}
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
static const struct wl_output_listener output_listener = { output_handle_geometry,
Packit Service 5a9772
	                                                       output_handle_mode, output_handle_done,
Packit Service 5a9772
	                                                       output_handle_scale };
Packit 1fb8d4
Packit Service 5a9772
UwacOutput* UwacCreateOutput(UwacDisplay* d, uint32_t id, uint32_t version)
Packit Service 5a9772
{
Packit Service 5a9772
	UwacOutput* o;
Packit 1fb8d4
Packit Service 5a9772
	o = xzalloc(sizeof *o);
Packit 1fb8d4
	if (!o)
Packit 1fb8d4
		return NULL;
Packit 1fb8d4
Packit 1fb8d4
	o->display = d;
Packit 1fb8d4
	o->server_output_id = id;
Packit 1fb8d4
	o->doneNeeded = (version > 1);
Packit 1fb8d4
	o->doneReceived = false;
Packit Service 5a9772
	o->output = wl_registry_bind(d->registry, id, &wl_output_interface,
Packit Service 5a9772
	                             min(TARGET_OUTPUT_INTERFACE, version));
Packit 1fb8d4
	wl_output_add_listener(o->output, &output_listener, o);
Packit 1fb8d4
Packit 1fb8d4
	wl_list_insert(d->outputs.prev, &o->link);
Packit 1fb8d4
	return o;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
int UwacDestroyOutput(UwacOutput* output)
Packit Service 5a9772
{
Packit 1fb8d4
	free(output->make);
Packit 1fb8d4
	free(output->model);
Packit 1fb8d4
Packit 1fb8d4
	wl_output_destroy(output->output);
Packit 1fb8d4
	wl_list_remove(&output->link);
Packit 1fb8d4
	free(output);
Packit 1fb8d4
Packit 1fb8d4
	return UWAC_SUCCESS;
Packit 1fb8d4
}