Blame rdtk/sample/rdtk_x11.c

Packit 1fb8d4
/**
Packit 1fb8d4
 * RdTk: Remote Desktop Toolkit
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifdef HAVE_CONFIG_H
Packit 1fb8d4
#include "config.h"
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#include <freerdp/log.h>
Packit 1fb8d4
#include <rdtk/rdtk.h>
Packit 1fb8d4
Packit 1fb8d4
#include <X11/Xlib.h>
Packit 1fb8d4
#include <X11/Xutil.h>
Packit 1fb8d4
Packit 1fb8d4
#define TAG "rdtk.sample"
Packit 1fb8d4
Packit 1fb8d4
int main(int argc, char** argv)
Packit 1fb8d4
{
Packit 1fb8d4
	GC gc;
Packit 1fb8d4
	int index;
Packit 1fb8d4
	int depth;
Packit 1fb8d4
	int x, y;
Packit 1fb8d4
	int width;
Packit 1fb8d4
	int height;
Packit 1fb8d4
	BYTE* buffer;
Packit 1fb8d4
	int scanline;
Packit 1fb8d4
	int pf_count;
Packit 1fb8d4
	XEvent event;
Packit 1fb8d4
	XImage* image;
Packit 1fb8d4
	Pixmap pixmap;
Packit 1fb8d4
	Screen* screen;
Packit 1fb8d4
	Visual* visual;
Packit 1fb8d4
	int scanline_pad;
Packit 1fb8d4
	int screen_number;
Packit 1fb8d4
	Display* display;
Packit 1fb8d4
	Window window;
Packit 1fb8d4
	Window root_window;
Packit 1fb8d4
	rdtkEngine* engine;
Packit 1fb8d4
	rdtkSurface* surface;
Packit 1fb8d4
	unsigned long border;
Packit 1fb8d4
	unsigned long background;
Packit 1fb8d4
	XPixmapFormatValues* pf;
Packit 1fb8d4
	XPixmapFormatValues* pfs;
Packit Service 5a9772
Packit 1fb8d4
	display = XOpenDisplay(NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!display)
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "Cannot open display");
Packit 1fb8d4
		return 1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	x = 10;
Packit 1fb8d4
	y = 10;
Packit 1fb8d4
	width = 640;
Packit 1fb8d4
	height = 480;
Packit 1fb8d4
Packit 1fb8d4
	screen_number = DefaultScreen(display);
Packit 1fb8d4
	screen = ScreenOfDisplay(display, screen_number);
Packit 1fb8d4
	visual = DefaultVisual(display, screen_number);
Packit 1fb8d4
	gc = DefaultGC(display, screen_number);
Packit 1fb8d4
	depth = DefaultDepthOfScreen(screen);
Packit 1fb8d4
	root_window = RootWindow(display, screen_number);
Packit 1fb8d4
	border = BlackPixel(display, screen_number);
Packit 1fb8d4
	background = WhitePixel(display, screen_number);
Packit 1fb8d4
Packit 1fb8d4
	scanline_pad = 0;
Packit 1fb8d4
Packit 1fb8d4
	pfs = XListPixmapFormats(display, &pf_count);
Packit 1fb8d4
Packit 1fb8d4
	for (index = 0; index < pf_count; index++)
Packit 1fb8d4
	{
Packit 1fb8d4
		pf = &pfs[index];
Packit 1fb8d4
Packit 1fb8d4
		if (pf->depth == depth)
Packit 1fb8d4
		{
Packit 1fb8d4
			scanline_pad = pf->scanline_pad;
Packit 1fb8d4
			break;
Packit 1fb8d4
		}
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	XFree(pfs);
Packit 1fb8d4
Packit 1fb8d4
	engine = rdtk_engine_new();
Packit 1fb8d4
	if (!engine)
Packit 1fb8d4
		return 1;
Packit 1fb8d4
Packit 1fb8d4
	scanline = width * 4;
Packit Service 5a9772
	buffer = (BYTE*)calloc(height, scanline);
Packit 1fb8d4
	if (!buffer)
Packit 1fb8d4
		return 1;
Packit 1fb8d4
Packit 1fb8d4
	surface = rdtk_surface_new(engine, buffer, width, height, scanline);
Packit 1fb8d4
Packit 1fb8d4
	rdtk_surface_fill(surface, 0, 0, width, height, 0x3BB9FF);
Packit 1fb8d4
	rdtk_label_draw(surface, 16, 16, 128, 32, NULL, "label", 0, 0);
Packit 1fb8d4
	rdtk_button_draw(surface, 16, 64, 128, 32, NULL, "button");
Packit 1fb8d4
	rdtk_text_field_draw(surface, 16, 128, 128, 32, NULL, "text field");
Packit 1fb8d4
Packit Service 5a9772
	window = XCreateSimpleWindow(display, root_window, x, y, width, height, 1, border, background);
Packit 1fb8d4
Packit 1fb8d4
	XSelectInput(display, window, ExposureMask | KeyPressMask);
Packit 1fb8d4
	XMapWindow(display, window);
Packit 1fb8d4
Packit 1fb8d4
	XSetFunction(display, gc, GXcopy);
Packit 1fb8d4
	XSetFillStyle(display, gc, FillSolid);
Packit 1fb8d4
Packit 1fb8d4
	pixmap = XCreatePixmap(display, window, width, height, depth);
Packit 1fb8d4
Packit Service 5a9772
	image = XCreateImage(display, visual, depth, ZPixmap, 0, (char*)buffer, width, height,
Packit Service 5a9772
	                     scanline_pad, 0);
Packit Service 5a9772
Packit 1fb8d4
	while (1)
Packit 1fb8d4
	{
Packit 1fb8d4
		XNextEvent(display, &event);
Packit 1fb8d4
Packit 1fb8d4
		if (event.type == Expose)
Packit 1fb8d4
		{
Packit 1fb8d4
			XPutImage(display, pixmap, gc, image, 0, 0, 0, 0, width, height);
Packit 1fb8d4
			XCopyArea(display, pixmap, window, gc, 0, 0, width, height, 0, 0);
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		if (event.type == KeyPress)
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		if (event.type == ClientMessage)
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	XFlush(display);
Packit 1fb8d4
Packit 1fb8d4
	XDestroyImage(image);
Packit 1fb8d4
	XCloseDisplay(display);
Packit 1fb8d4
Packit 1fb8d4
	rdtk_surface_free(surface);
Packit 1fb8d4
	free(buffer);
Packit 1fb8d4
Packit 1fb8d4
	rdtk_engine_free(engine);
Packit 1fb8d4
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}