2021-06-06 01:26:18 +00:00
|
|
|
/**
|
|
|
|
* Looking Glass
|
2021-08-04 09:48:32 +00:00
|
|
|
* Copyright © 2017-2021 The Looking Glass Authors
|
2021-06-06 01:26:18 +00:00
|
|
|
* https://looking-glass.io
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
|
|
* under the terms of the GNU General Public License as published by the Free
|
|
|
|
* Software Foundation; either version 2 of the License, or (at your option)
|
|
|
|
* any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
|
|
* more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License along
|
|
|
|
* with this program; if not, write to the Free Software Foundation, Inc., 59
|
|
|
|
* Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
*/
|
2021-01-15 09:30:03 +00:00
|
|
|
|
2021-01-25 15:33:28 +00:00
|
|
|
#ifndef _H_LG_APP_
|
|
|
|
#define _H_LG_APP_
|
|
|
|
|
2021-01-15 09:30:03 +00:00
|
|
|
#include <stdbool.h>
|
2021-01-25 15:33:28 +00:00
|
|
|
#include <linux/input.h>
|
2021-01-15 09:30:03 +00:00
|
|
|
|
2021-07-18 02:31:11 +00:00
|
|
|
#include "common/ringbuffer.h"
|
2021-01-25 11:23:53 +00:00
|
|
|
#include "common/types.h"
|
2021-01-15 09:30:03 +00:00
|
|
|
#include "interface/displayserver.h"
|
2021-07-22 07:27:30 +00:00
|
|
|
#include "interface/overlay.h"
|
2021-01-15 09:30:03 +00:00
|
|
|
|
2021-01-25 15:33:28 +00:00
|
|
|
typedef enum LG_MsgAlert
|
|
|
|
{
|
|
|
|
LG_ALERT_INFO ,
|
|
|
|
LG_ALERT_SUCCESS,
|
|
|
|
LG_ALERT_WARNING,
|
|
|
|
LG_ALERT_ERROR
|
|
|
|
}
|
|
|
|
LG_MsgAlert;
|
|
|
|
|
2021-01-26 23:40:39 +00:00
|
|
|
bool app_isRunning(void);
|
2021-01-15 09:30:03 +00:00
|
|
|
bool app_inputEnabled(void);
|
2021-05-03 20:35:36 +00:00
|
|
|
bool app_isCaptureMode(void);
|
2021-05-04 00:16:51 +00:00
|
|
|
bool app_isCaptureOnlyMode(void);
|
|
|
|
bool app_isFormatValid(void);
|
2021-01-15 09:30:03 +00:00
|
|
|
void app_updateCursorPos(double x, double y);
|
|
|
|
void app_updateWindowPos(int x, int y);
|
2021-02-21 05:08:52 +00:00
|
|
|
void app_handleResizeEvent(int w, int h, double scale, const struct Border border);
|
2021-08-04 20:47:36 +00:00
|
|
|
void app_invalidateWindow(bool full);
|
2021-01-28 18:13:26 +00:00
|
|
|
|
2021-01-29 04:02:29 +00:00
|
|
|
void app_handleMouseRelative(double normx, double normy,
|
2021-01-28 18:13:26 +00:00
|
|
|
double rawx, double rawy);
|
|
|
|
|
2021-01-16 09:59:05 +00:00
|
|
|
void app_handleMouseBasic(void);
|
[client] spice/wayland: improve cursor tracking logic
One of the major issues with the old tracking code is a data race
between the cursor thread updating g_cursor.guest and the
app_handleMouseBasic function. Specifically, the latter may have
sent mouse input via spice that has not been processed by the guest
and updated g_cursor.guest, but the guest may overwrite g_cursor.guest
to a previous state before the input is processed. This causes some
movements to be doubled. Eventually, the cursor positions will
synchronize, but this nevertheless causes a lot of jitter.
In this commit, we introduce a new field g_cursor.projected, which
is unambiguously the position of the cursor after taking into account
all the input already sent via spice. This is synced up to the guest
cursor upon entering the window and when the host restarts. Afterwards,
all mouse movements will be based on this position. This eliminates
all cursor jitter as far as I could tell.
Also, the cursor is now synced to the host position when exiting
capture mode.
A downside of this commit is that if the 1:1 movement patch is not
correctly applied, the cursor position would be wildly off instead
of simply jittering, but that is an unsupported configuration and
should not matter.
Also unsupported is when an application in guest moves the cursor
programmatically and bypassing spice. When using those applications,
capture mode must be on. Before this commit, we try to move the guest
cursor back to where it should be, but it's inherently fragile and
may lead to scenarios such as wild movements in first-person shooters.
2021-01-21 02:05:50 +00:00
|
|
|
void app_resyncMouseBasic(void);
|
2021-01-28 18:13:26 +00:00
|
|
|
|
2021-01-17 03:23:51 +00:00
|
|
|
void app_handleButtonPress(int button);
|
|
|
|
void app_handleButtonRelease(int button);
|
2021-07-30 11:01:37 +00:00
|
|
|
void app_handleWheelMotion(double motion);
|
2021-01-18 02:20:42 +00:00
|
|
|
void app_handleKeyPress(int scancode);
|
|
|
|
void app_handleKeyRelease(int scancode);
|
2021-01-25 08:58:36 +00:00
|
|
|
void app_handleEnterEvent(bool entered);
|
2021-01-17 02:33:23 +00:00
|
|
|
void app_handleFocusEvent(bool focused);
|
2021-01-17 02:36:37 +00:00
|
|
|
void app_handleCloseEvent(void);
|
2021-02-25 23:21:56 +00:00
|
|
|
void app_handleRenderEvent(const uint64_t timeUs);
|
2021-01-15 09:30:03 +00:00
|
|
|
|
2021-01-26 10:46:30 +00:00
|
|
|
void app_setFullscreen(bool fs);
|
2021-01-27 00:11:53 +00:00
|
|
|
bool app_getFullscreen(void);
|
2021-01-26 23:40:39 +00:00
|
|
|
bool app_getProp(LG_DSProperty prop, void * ret);
|
2021-01-26 10:46:30 +00:00
|
|
|
|
2021-01-27 08:20:13 +00:00
|
|
|
#ifdef ENABLE_EGL
|
2021-01-26 23:40:39 +00:00
|
|
|
EGLDisplay app_getEGLDisplay(void);
|
|
|
|
EGLNativeWindowType app_getEGLNativeWindow(void);
|
2021-05-11 20:49:39 +00:00
|
|
|
void app_eglSwapBuffers(EGLDisplay display, EGLSurface surface, const struct Rect * damage, int count);
|
2021-01-27 08:20:13 +00:00
|
|
|
#endif
|
|
|
|
|
2021-01-27 20:13:35 +00:00
|
|
|
#ifdef ENABLE_OPENGL
|
2021-01-27 10:27:26 +00:00
|
|
|
LG_DSGLContext app_glCreateContext(void);
|
|
|
|
void app_glDeleteContext(LG_DSGLContext context);
|
|
|
|
void app_glMakeCurrent(LG_DSGLContext context);
|
|
|
|
void app_glSetSwapInterval(int interval);
|
2021-01-26 10:46:30 +00:00
|
|
|
void app_glSwapBuffers(void);
|
2021-01-27 20:13:35 +00:00
|
|
|
#endif
|
2021-01-26 10:46:30 +00:00
|
|
|
|
2021-07-22 09:43:16 +00:00
|
|
|
#define MAX_OVERLAY_RECTS 10
|
2021-08-04 20:40:06 +00:00
|
|
|
void app_registerOverlay(const struct LG_OverlayOps * ops, const void * params);
|
|
|
|
void app_initOverlays(void);
|
2021-07-31 10:51:38 +00:00
|
|
|
void app_setOverlay(bool enable);
|
2021-08-01 11:13:59 +00:00
|
|
|
bool app_overlayNeedsRender(void);
|
2021-07-22 08:33:50 +00:00
|
|
|
/**
|
|
|
|
* render the overlay
|
|
|
|
* returns:
|
2021-07-22 08:53:21 +00:00
|
|
|
* -1 for full output damage
|
|
|
|
* 0 for no overlay
|
2021-07-22 08:33:50 +00:00
|
|
|
* >0 number of rects written into rects
|
|
|
|
*/
|
2021-07-22 07:27:30 +00:00
|
|
|
int app_renderOverlay(struct Rect * rects, int maxRects);
|
2021-07-22 08:33:50 +00:00
|
|
|
|
2021-07-22 07:27:30 +00:00
|
|
|
void app_freeOverlays(void);
|
|
|
|
|
|
|
|
struct OverlayGraph;
|
|
|
|
typedef struct OverlayGraph * GraphHandle;
|
|
|
|
|
2021-07-29 01:56:50 +00:00
|
|
|
GraphHandle app_registerGraph(const char * name, RingBuffer buffer, float min, float max);
|
2021-07-18 02:31:11 +00:00
|
|
|
void app_unregisterGraph(GraphHandle handle);
|
2021-07-08 01:45:54 +00:00
|
|
|
|
2021-08-04 14:55:51 +00:00
|
|
|
void app_overlayConfigRegister(const char * title,
|
|
|
|
void (*callback)(void * udata), void * udata);
|
|
|
|
|
2021-01-15 09:30:03 +00:00
|
|
|
void app_clipboardRelease(void);
|
2021-05-30 01:37:15 +00:00
|
|
|
void app_clipboardNotifyTypes(const LG_ClipboardData types[], int count);
|
|
|
|
void app_clipboardNotifySize(const LG_ClipboardData type, size_t size);
|
2021-01-15 09:30:03 +00:00
|
|
|
void app_clipboardData(const LG_ClipboardData type, uint8_t * data, size_t size);
|
|
|
|
void app_clipboardRequest(const LG_ClipboardReplyFn replyFn, void * opaque);
|
2021-01-25 15:33:28 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Show an alert on screen
|
|
|
|
* @param type The alert type
|
|
|
|
* param fmt The alert message format
|
|
|
|
@ param ... formatted message values
|
|
|
|
*/
|
|
|
|
void app_alert(LG_MsgAlert type, const char * fmt, ...);
|
|
|
|
|
2021-01-25 15:51:03 +00:00
|
|
|
typedef struct KeybindHandle * KeybindHandle;
|
|
|
|
typedef void (*KeybindFn)(int sc, void * opaque);
|
|
|
|
|
2021-01-25 15:33:28 +00:00
|
|
|
/**
|
|
|
|
* Register a handler for the <super>+<key> combination
|
|
|
|
* @param sc The scancode to register
|
|
|
|
* @param callback The function to be called when the combination is pressed
|
|
|
|
* @param opaque A pointer to be passed to the callback, may be NULL
|
|
|
|
* @retval A handle for the binding or NULL on failure.
|
|
|
|
* The caller is required to release the handle via `app_releaseKeybind` when it is no longer required
|
|
|
|
*/
|
2021-01-31 03:48:24 +00:00
|
|
|
KeybindHandle app_registerKeybind(int sc, KeybindFn callback, void * opaque, const char * description);
|
2021-01-25 15:33:28 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Release an existing key binding
|
|
|
|
* @param handle A pointer to the keybind handle to release, may be NULL
|
|
|
|
*/
|
|
|
|
void app_releaseKeybind(KeybindHandle * handle);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Release all keybindings
|
|
|
|
*/
|
|
|
|
void app_releaseAllKeybinds(void);
|
|
|
|
|
|
|
|
#endif
|