Blame rdtk/sample/rdtk_x11.c

Packit Service fa4841
/**
Packit Service fa4841
 * RdTk: Remote Desktop Toolkit
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 <freerdp/log.h>
Packit Service fa4841
#include <rdtk/rdtk.h>
Packit Service fa4841
Packit Service fa4841
#include <X11/Xlib.h>
Packit Service fa4841
#include <X11/Xutil.h>
Packit Service fa4841
Packit Service fa4841
#define TAG "rdtk.sample"
Packit Service fa4841
Packit Service fa4841
int main(int argc, char** argv)
Packit Service fa4841
{
Packit Service fa4841
	GC gc;
Packit Service fa4841
	int index;
Packit Service fa4841
	int depth;
Packit Service fa4841
	int x, y;
Packit Service fa4841
	int width;
Packit Service fa4841
	int height;
Packit Service fa4841
	BYTE* buffer;
Packit Service fa4841
	int scanline;
Packit Service fa4841
	int pf_count;
Packit Service fa4841
	XEvent event;
Packit Service fa4841
	XImage* image;
Packit Service fa4841
	Pixmap pixmap;
Packit Service fa4841
	Screen* screen;
Packit Service fa4841
	Visual* visual;
Packit Service fa4841
	int scanline_pad;
Packit Service fa4841
	int screen_number;
Packit Service fa4841
	Display* display;
Packit Service fa4841
	Window window;
Packit Service fa4841
	Window root_window;
Packit Service fa4841
	rdtkEngine* engine;
Packit Service fa4841
	rdtkSurface* surface;
Packit Service fa4841
	unsigned long border;
Packit Service fa4841
	unsigned long background;
Packit Service fa4841
	XPixmapFormatValues* pf;
Packit Service fa4841
	XPixmapFormatValues* pfs;
Packit Service fa4841
Packit Service fa4841
	display = XOpenDisplay(NULL);
Packit Service fa4841
Packit Service fa4841
	if (!display)
Packit Service fa4841
	{
Packit Service fa4841
		WLog_ERR(TAG, "Cannot open display");
Packit Service fa4841
		return 1;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	x = 10;
Packit Service fa4841
	y = 10;
Packit Service fa4841
	width = 640;
Packit Service fa4841
	height = 480;
Packit Service fa4841
Packit Service fa4841
	screen_number = DefaultScreen(display);
Packit Service fa4841
	screen = ScreenOfDisplay(display, screen_number);
Packit Service fa4841
	visual = DefaultVisual(display, screen_number);
Packit Service fa4841
	gc = DefaultGC(display, screen_number);
Packit Service fa4841
	depth = DefaultDepthOfScreen(screen);
Packit Service fa4841
	root_window = RootWindow(display, screen_number);
Packit Service fa4841
	border = BlackPixel(display, screen_number);
Packit Service fa4841
	background = WhitePixel(display, screen_number);
Packit Service fa4841
Packit Service fa4841
	scanline_pad = 0;
Packit Service fa4841
Packit Service fa4841
	pfs = XListPixmapFormats(display, &pf_count);
Packit Service fa4841
Packit Service fa4841
	for (index = 0; index < pf_count; index++)
Packit Service fa4841
	{
Packit Service fa4841
		pf = &pfs[index];
Packit Service fa4841
Packit Service fa4841
		if (pf->depth == depth)
Packit Service fa4841
		{
Packit Service fa4841
			scanline_pad = pf->scanline_pad;
Packit Service fa4841
			break;
Packit Service fa4841
		}
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	XFree(pfs);
Packit Service fa4841
Packit Service fa4841
	engine = rdtk_engine_new();
Packit Service fa4841
	if (!engine)
Packit Service fa4841
		return 1;
Packit Service fa4841
Packit Service fa4841
	scanline = width * 4;
Packit Service fa4841
	buffer = (BYTE*)calloc(height, scanline);
Packit Service fa4841
	if (!buffer)
Packit Service fa4841
		return 1;
Packit Service fa4841
Packit Service fa4841
	surface = rdtk_surface_new(engine, buffer, width, height, scanline);
Packit Service fa4841
Packit Service fa4841
	rdtk_surface_fill(surface, 0, 0, width, height, 0x3BB9FF);
Packit Service fa4841
	rdtk_label_draw(surface, 16, 16, 128, 32, NULL, "label", 0, 0);
Packit Service fa4841
	rdtk_button_draw(surface, 16, 64, 128, 32, NULL, "button");
Packit Service fa4841
	rdtk_text_field_draw(surface, 16, 128, 128, 32, NULL, "text field");
Packit Service fa4841
Packit Service fa4841
	window = XCreateSimpleWindow(display, root_window, x, y, width, height, 1, border, background);
Packit Service fa4841
Packit Service fa4841
	XSelectInput(display, window, ExposureMask | KeyPressMask);
Packit Service fa4841
	XMapWindow(display, window);
Packit Service fa4841
Packit Service fa4841
	XSetFunction(display, gc, GXcopy);
Packit Service fa4841
	XSetFillStyle(display, gc, FillSolid);
Packit Service fa4841
Packit Service fa4841
	pixmap = XCreatePixmap(display, window, width, height, depth);
Packit Service fa4841
Packit Service fa4841
	image = XCreateImage(display, visual, depth, ZPixmap, 0, (char*)buffer, width, height,
Packit Service fa4841
	                     scanline_pad, 0);
Packit Service fa4841
Packit Service fa4841
	while (1)
Packit Service fa4841
	{
Packit Service fa4841
		XNextEvent(display, &event);
Packit Service fa4841
Packit Service fa4841
		if (event.type == Expose)
Packit Service fa4841
		{
Packit Service fa4841
			XPutImage(display, pixmap, gc, image, 0, 0, 0, 0, width, height);
Packit Service fa4841
			XCopyArea(display, pixmap, window, gc, 0, 0, width, height, 0, 0);
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		if (event.type == KeyPress)
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		if (event.type == ClientMessage)
Packit Service fa4841
			break;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	XFlush(display);
Packit Service fa4841
Packit Service fa4841
	XDestroyImage(image);
Packit Service fa4841
	XCloseDisplay(display);
Packit Service fa4841
Packit Service fa4841
	rdtk_surface_free(surface);
Packit Service fa4841
	free(buffer);
Packit Service fa4841
Packit Service fa4841
	rdtk_engine_free(engine);
Packit Service fa4841
Packit Service fa4841
	return 0;
Packit Service fa4841
}