Radek Chalupa   konzultace a školení programování, vývoj software na zakázku

Vytvoření vlastního screenshot serveru pro Linux

9.10.2019

Ukážeme si jak vytvořit vlastní jednoduchý server pro opis obrazovky pro Linux v C++ (s použitím GTK) a PHP.

Aplikace v C++ a její sestavení

Nejprve si v C++ vytvoříme aplikaci které s využitím objektů GdkWindow a GdkPixbuf při spuštění uloží aktuální snímek celé obrazovky do souboru screenshot.jpeg.

Následující kód samozřejmě implementuje pouze základní funkčnost, tj. např. bez volby jména souboru a kvality komprese (zde je nastavena na 95) a také nevypisuje ani neloguje případné běhové chyby.

#include <stdlib.h>
#include <gtk/gtk.h>

int main(int argc, char** argv)
{
	gtk_init(&argc, &argv);
	GdkPixbuf* pixbuf;
	GdkWindow* root_window;
	GError* err = NULL;
	gint x, y, width, height;
	root_window = gdk_get_default_root_window();
	if (!root_window)
		return EXIT_FAILURE;
	gdk_window_get_geometry(root_window, &x, &y, &width, &height);
	pixbuf = gdk_pixbuf_get_from_window(root_window, x, y, width, height);
	if (NULL == pixbuf)
		return EXIT_FAILURE;
	if (FALSE == gdk_pixbuf_save(pixbuf, "screenshot.jpeg",
		"jpeg", &err, "quality", "95", NULL))
	{
		g_object_unref(pixbuf);
		return EXIT_FAILURE;
	}
	g_object_unref(pixbuf);
	return EXIT_SUCCESS;
}

Pro překlad a sestavení potřebujeme mít nainstalovaný překladač jazyka C++, tj. v Debianu (a na něm založených distribucích) balíček g++. Dále potřebujeme vývojářský balíček knihovny GTK, tj. v Debianu balíček libgtk-3-dev. Uvedený kód lze sestavit následujícím příkazem:

g++ -O2 -Wall rc-screenshot.cpp `pkg-config --cflags --libs gtk+-3.0` -orc-screenshot

PHP skript a jeho spuštění jako server

První část máme hotovou a nyní zbývá napsat PHP skript, který při svém spuštění (na serveru) nejprve zavolá náš program a následně načte právě uložený opis obrazovky a odešle jej klientovi. Celý skript v souboru index.php (opět zjednodušený bez ošetření a reakce na případné chyby) může vypadat takto:

<?php
exec("./rc-screenshot");
$cesta = 'screenshot.jpeg';
$data = file_get_contents($cesta);
header('Content-type: image/jpeg');
echo($data);

Pro spuštění serveru je potřeba samozřejmě mít nainstalovaný balík php. Server pak můžeme spustit jako tzv. "vestavěný server" (build-in server) tak že ve složce kde máme vlastní aplikaci rc-screenshot a PHP skript index.php zavoláme:

php -S xxx.xxx.xxx.xxx:8000

kde xxx.xxx.xxx.xxx je konkrétní IP adresa počítače na kterém je server.

Projekt najdete také na github, kde si jej můžete prohlédnout, stáhnout a libovolně upravit podle svých potřeb.