Files

301 lines
18 KiB
C

/**
* FreeRDP: A Remote Desktop Protocol Implementation
* X11 helper utilities
*
* Copyright 2023 Armin Novak <armin.novak@thincast.com>
* Copyringht 2023 Thincast Technologies GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <winpr/wlog.h>
#include <winpr/wtypes.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include "xfreerdp.h"
const char* x11_error_to_string(xfContext* xfc, int error, char* buffer, size_t size);
#define X_GET_ATOM_VAR_NAME(x) #x
#define Safe_XGetAtomName(log, display, atom) \
Safe_XGetAtomNameEx((log), (display), (atom), X_GET_ATOM_VAR_NAME(atom))
char* Safe_XGetAtomNameEx(wLog* log, Display* display, Atom atom, const char* varname);
Atom Logging_XInternAtom(wLog* log, Display* display, _Xconst char* atom_name, Bool only_if_exists);
typedef BOOL (*fn_action_script_run)(xfContext* xfc, const char* buffer, size_t size, void* user,
const char* what, const char* arg);
BOOL run_action_script(xfContext* xfc, const char* what, const char* arg, fn_action_script_run fkt,
void* user);
#define LogDynAndXCreatePixmap(log, display, d, width, height, depth) \
LogDynAndXCreatePixmap_ex((log), __FILE__, __func__, __LINE__, (display), (d), (width), \
(height), (depth))
Pixmap LogDynAndXCreatePixmap_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Drawable d, unsigned int width,
unsigned int height, unsigned int depth);
#define LogDynAndXFreePixmap(log, display, pixmap) \
LogDynAndXFreePixmap_ex(log, __FILE__, __func__, __LINE__, (display), (pixmap))
int LogDynAndXFreePixmap_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Pixmap pixmap);
#define LogDynAndXCreateWindow(log, display, parent, x, y, width, height, border_width, depth, \
class, visual, valuemask, attributes) \
LogDynAndXCreateWindow_ex((log), __FILE__, __func__, __LINE__, (display), (parent), (x), (y), \
(width), (height), (border_width), (depth), (class), (visual), \
(valuemask), (attributes))
Window LogDynAndXCreateWindow_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Window parent, int x, int y, unsigned int width,
unsigned int height, unsigned int border_width, int depth,
unsigned int c_class, Visual* visual, unsigned long valuemask,
XSetWindowAttributes* attributes);
#define LogDynAndXRaiseWindow(log, display, w) \
LogDynAndXRaiseWindow_ex((log), __FILE__, __func__, __LINE__, (display), (w))
int LogDynAndXRaiseWindow_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Window w);
#define LogDynAndXMapWindow(log, display, w) \
LogDynAndXMapWindow_ex((log), __FILE__, __func__, __LINE__, (display), (w))
int LogDynAndXMapWindow_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Window w);
#define LogDynAndXUnmapWindow(log, display, w) \
LogDynAndXUnmapWindow_ex((log), __FILE__, __func__, __LINE__, (display), (w))
int LogDynAndXUnmapWindow_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Window w);
#define LogDynAndXMoveResizeWindow(log, display, w, x, y, width, height) \
LogDynAndXMoveResizeWindow_ex((log), __FILE__, __func__, __LINE__, (display), (w), (x), (y), \
(width), (height))
int LogDynAndXMoveResizeWindow_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Window w, int x, int y, unsigned int width,
unsigned int height);
#define LogDynAndXWithdrawWindow(log, display, w, screen_number) \
LogDynAndXWithdrawWindow_ex((log), __FILE__, __func__, __LINE__, (display), (w), \
(screen_number))
Status LogDynAndXWithdrawWindow_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Window w, int screen_number);
#define LogDynAndXMoveWindow(log, display, w, x, y) \
LogDynAndXMoveWindow_ex((log), __FILE__, __func__, __LINE__, (display), (w), (x), (y))
int LogDynAndXMoveWindow_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Window w, int x, int y);
#define LogDynAndXResizeWindow(log, display, w, width, height) \
LogDynAndXResizeWindow_ex((log), __FILE__, __func__, __LINE__, (display), (w), (width), \
(height))
int LogDynAndXResizeWindow_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Window w, unsigned int width, unsigned int height);
#define LogDynAndXClearWindow(log, display, w) \
LogDynAndXClearWindow_ex((log), __FILE__, __func__, __LINE__, (display), (w))
int LogDynAndXClearWindow_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Window w);
#define LogDynAndXGetWindowProperty(log, display, w, property, long_offset, long_length, delete, \
req_type, actual_type_return, actual_format_return, \
nitems_return, bytes_after_return, prop_return) \
LogDynAndXGetWindowProperty_ex((log), __FILE__, __func__, __LINE__, (display), (w), \
(property), (long_offset), (long_length), (delete), (req_type), \
(actual_type_return), (actual_format_return), (nitems_return), \
(bytes_after_return), (prop_return))
int LogDynAndXGetWindowProperty_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Window w, Atom property, long long_offset,
long long_length, Bool c_delete, Atom req_type,
Atom* actual_type_return, int* actual_format_return,
unsigned long* nitems_return, unsigned long* bytes_after_return,
unsigned char** prop_return);
#define LogDynAndXReparentWindow(log, display, w, parent, x, y) \
LogDynAndXReparentWindow_ex((log), __FILE__, __func__, __LINE__, (display), (w), (parent), \
(x), (y))
int LogDynAndXReparentWindow_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Window w, Window parent, int x, int y);
#define LogDynAndXChangeProperty(log, display, w, property, type, format, mode, data, nelements) \
LogDynAndXChangeProperty_ex((log), __FILE__, __func__, __LINE__, (display), (w), (property), \
(type), (format), (mode), (data), (nelements))
int LogDynAndXChangeProperty_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Window w, Atom property, Atom type, int format,
int mode, _Xconst unsigned char* data, int nelements);
#define LogDynAndXDeleteProperty(log, display, w, property) \
LogDynAndXDeleteProperty_ex((log), __FILE__, __func__, __LINE__, (display), (w), (property))
int LogDynAndXDeleteProperty_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Window w, Atom property);
#define LogDynAndXConvertSelection(log, display, selection, target, property, requestor, time) \
LogDynAndXConvertSelection_ex((log), __FILE__, __func__, __LINE__, (display), (selection), \
(target), (property), (requestor), (time))
int LogDynAndXConvertSelection_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Atom selection, Atom target, Atom property,
Window requestor, Time time);
#define LogDynAndXCreateGC(log, display, d, valuemask, values) \
LogDynAndXCreateGC_ex(log, __FILE__, __func__, __LINE__, (display), (d), (valuemask), (values))
GC LogDynAndXCreateGC_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Drawable d, unsigned long valuemask, XGCValues* values);
#define LogDynAndXFreeGC(log, display, gc) \
LogDynAndXFreeGC_ex(log, __FILE__, __func__, __LINE__, (display), (gc))
int LogDynAndXFreeGC_ex(wLog* log, const char* file, const char* fkt, size_t line, Display* display,
GC gc);
#define LogDynAndXCreateImage(log, display, visual, depth, format, offset, data, width, height, \
bitmap_pad, bytes_per_line) \
LogDynAndXCreateImage_ex(log, __FILE__, __func__, __LINE__, (display), (visual), (depth), \
(format), (offset), (data), (width), (height), (bitmap_pad), \
(bytes_per_line))
XImage* LogDynAndXCreateImage_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Visual* visual, unsigned int depth, int format,
int offset, char* data, unsigned int width, unsigned int height,
int bitmap_pad, int bytes_per_line);
#define LogDynAndXPutImage(log, display, d, gc, image, src_x, src_y, dest_x, dest_y, width, \
height) \
LogDynAndXPutImage_ex(log, __FILE__, __func__, __LINE__, (display), (d), (gc), (image), \
(src_x), (src_y), (dest_x), (dest_y), (width), (height))
int LogDynAndXPutImage_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Drawable d, GC gc, XImage* image, int src_x, int src_y,
int dest_x, int dest_y, unsigned int width, unsigned int height);
#define LogDynAndXCopyArea(log, display, src, dest, gc, src_x, src_y, width, height, dest_x, \
dest_y) \
LogDynAndXCopyArea_ex(log, __FILE__, __func__, __LINE__, (display), (src), (dest), (gc), \
(src_x), (src_y), (width), (height), (dest_x), (dest_y))
extern int LogDynAndXCopyArea_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Pixmap src, Window dest, GC gc, int src_x,
int src_y, unsigned int width, unsigned int height, int dest_x,
int dest_y);
#define LogDynAndXSendEvent(log, display, w, propagate, event_mask, event_send) \
LogDynAndXSendEvent_ex(log, __FILE__, __func__, __LINE__, (display), (w), (propagate), \
(event_mask), (event_send))
extern Status LogDynAndXSendEvent_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Window w, Bool propagate, long event_mask,
XEvent* event_send);
#define LogDynAndXFlush(log, display) \
LogDynAndXFlush_ex(log, __FILE__, __func__, __LINE__, (display))
extern Status LogDynAndXFlush_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display);
#define LogDynAndXSync(log, display, discard) \
LogDynAndXSync_ex(log, __FILE__, __func__, __LINE__, (display), (discard))
extern int LogDynAndXSync_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Bool discard);
#define LogDynAndXGetSelectionOwner(log, display, selection) \
LogDynAndXGetSelectionOwner_ex(log, __FILE__, __func__, __LINE__, (display), (selection))
extern Window LogDynAndXGetSelectionOwner_ex(wLog* log, const char* file, const char* fkt,
size_t line, Display* display, Atom selection);
#define LogDynAndXSetSelectionOwner(log, display, selection, owner, time) \
LogDynAndXSetSelectionOwner_ex(log, __FILE__, __func__, __LINE__, (display), (selection), \
(owner), (time))
extern int LogDynAndXSetSelectionOwner_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Atom selection, Window owner,
Time time);
#define LogDynAndXDestroyWindow(log, display, window) \
LogDynAndXDestroyWindow_ex(log, __FILE__, __func__, __LINE__, (display), (window))
extern int LogDynAndXDestroyWindow_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Window window);
#define LogDynAndXChangeWindowAttributes(log, display, window, valuemask, attributes) \
LogDynAndXChangeWindowAttributes_ex(log, __FILE__, __func__, __LINE__, (display), (window), \
(valuemask), (attributes))
extern int LogDynAndXChangeWindowAttributes_ex(wLog* log, const char* file, const char* fkt,
size_t line, Display* display, Window window,
unsigned long valuemask,
XSetWindowAttributes* attributes);
#define LogDynAndXSetTransientForHint(log, display, window, prop_window) \
LogDynAndXSetTransientForHint_ex(log, __FILE__, __func__, __LINE__, (display), (window), \
(prop_window))
extern int LogDynAndXSetTransientForHint_ex(wLog* log, const char* file, const char* fkt,
size_t line, Display* display, Window window,
Window prop_window);
#define LogDynAndXCloseDisplay(log, display) \
LogDynAndXCloseDisplay_ex(log, __FILE__, __func__, __LINE__, (display))
extern int LogDynAndXCloseDisplay_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display);
#define LogDynAndXSetClipMask(log, display, gc, pixmap) \
LogDynAndXSetClipMask_ex(log, __FILE__, __func__, __LINE__, (display), (gc), (pixmap))
extern int LogDynAndXSetClipMask_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, GC gc, Pixmap pixmap);
#define LogDynAndXSetRegion(log, display, gc, r) \
LogDynAndXSetRegion_ex(log, __FILE__, __func__, __LINE__, (display), (gc), (r))
extern int LogDynAndXSetRegion_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, GC gc, Region r);
#define LogDynAndXSetBackground(log, display, gc, background) \
LogDynAndXSetBackground_ex(log, __FILE__, __func__, __LINE__, (display), (gc), (background))
extern int LogDynAndXSetBackground_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, GC gc, unsigned long background);
#define LogDynAndXSetForeground(log, display, gc, foreground) \
LogDynAndXSetForeground_ex(log, __FILE__, __func__, __LINE__, (display), (gc), (foreground))
extern int LogDynAndXSetForeground_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, GC gc, unsigned long foreground);
#define LogDynAndXSetFillStyle(log, display, gc, fill_style) \
LogDynAndXSetFillStyle_ex(log, __FILE__, __func__, __LINE__, (display), (gc), (fill_style))
extern int LogDynAndXSetFillStyle_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, GC gc, int fill_style);
#define LogDynAndXFillRectangle(log, display, w, gc, x, y, width, height) \
LogDynAndXFillRectangle_ex(log, __FILE__, __func__, __LINE__, (display), (w), (gc), (x), (y), \
(width), (height))
extern int LogDynAndXFillRectangle_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Window w, GC gc, int x, int y,
unsigned int width, unsigned int height);
#define LogDynAndXSetFunction(log, display, gc, function) \
LogDynAndXSetFunction_ex(log, __FILE__, __func__, __LINE__, (display), (gc), (function))
extern int LogDynAndXSetFunction_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, GC gc, int function);
#define LogDynAndXRestackWindows(log, display, windows, count) \
LogDynAndXRestackWindows_ex(log, __FILE__, __func__, __LINE__, (display), (windows), (count))
extern int LogDynAndXRestackWindows_ex(wLog* log, const char* file, const char* fkt, size_t line,
Display* display, Window* windows, int nwindows);
BOOL IsGnome(void);
char* getConfigOption(BOOL system, const char* option);
const char* request_code_2_str(int code);