| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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. |
| */ |
| |
| #ifndef GUAC_RDP_CHANNELS_RDPEI_H |
| #define GUAC_RDP_CHANNELS_RDPEI_H |
| |
| #include "settings.h" |
| |
| #include <freerdp/client/rdpei.h> |
| #include <freerdp/freerdp.h> |
| #include <guacamole/client.h> |
| #include <guacamole/timestamp.h> |
| |
| /** |
| * The maximum number of simultaneously-tracked touches. |
| */ |
| #define GUAC_RDP_RDPEI_MAX_TOUCHES 10 |
| |
| /** |
| * A single, tracked touch contact. |
| */ |
| typedef struct guac_rdp_rdpei_touch { |
| |
| /** |
| * Whether this touch is active (1) or inactive (0). An active touch is |
| * being tracked, while an inactive touch is simple an empty space awaiting |
| * use by some future touch event. |
| */ |
| int active; |
| |
| /** |
| * The unique ID representing this touch contact. |
| */ |
| int id; |
| |
| /** |
| * The X-coordinate of this touch, in pixels. |
| */ |
| int x; |
| |
| /** |
| * The Y-coordinate of this touch, in pixels. |
| */ |
| int y; |
| |
| } guac_rdp_rdpei_touch; |
| |
| /** |
| * Multi-touch input module. |
| */ |
| typedef struct guac_rdp_rdpei { |
| |
| /** |
| * RDPEI control interface. |
| */ |
| RdpeiClientContext* rdpei; |
| |
| /** |
| * All currently-tracked touches. |
| */ |
| guac_rdp_rdpei_touch touch[GUAC_RDP_RDPEI_MAX_TOUCHES]; |
| |
| } guac_rdp_rdpei; |
| |
| /** |
| * Allocates a new RDPEI module, which will ultimately control the RDPEI |
| * channel once connected. The RDPEI channel allows multi-touch input |
| * events to be sent to the RDP server. |
| * |
| * @return |
| * A newly-allocated RDPEI module. |
| */ |
| guac_rdp_rdpei* guac_rdp_rdpei_alloc(); |
| |
| /** |
| * Frees the resources associated with support for the RDPEI channel. Only |
| * resources specific to Guacamole are freed. Resources specific to FreeRDP's |
| * handling of the RDPEI channel will be freed by FreeRDP. If no resources are |
| * currently allocated for RDPEI, this function has no effect. |
| * |
| * @param rdpei |
| * The RDPEI module to free. |
| */ |
| void guac_rdp_rdpei_free(guac_rdp_rdpei* rdpei); |
| |
| /** |
| * Adds FreeRDP's "rdpei" plugin to the list of dynamic virtual channel plugins |
| * to be loaded by FreeRDP's "drdynvc" plugin. The context of the plugin will |
| * automatically be assicated with the guac_rdp_rdpei instance pointed to by the |
| * current guac_rdp_client. The plugin will only be loaded once the "drdynvc" |
| * plugin is loaded. The "rdpei" plugin ultimately adds support for multi-touch |
| * input via the RDPEI channel. |
| * |
| * If failures occur, messages noting the specifics of those failures will be |
| * logged, and the RDP side of multi-touch support will not be functional. |
| * |
| * This MUST be called within the PreConnect callback of the freerdp instance |
| * for multi-touch support to be loaded. |
| * |
| * @param context |
| * The rdpContext associated with the active RDP session. |
| */ |
| void guac_rdp_rdpei_load_plugin(rdpContext* context); |
| |
| /** |
| * Reports to the RDP server that the status of a single touch contact has |
| * changed. Depending on the amount of force associated with the touch and |
| * whether the touch has been encountered before, this will result a new touch |
| * contact, updates to an existing contact, or removal of an existing contact. |
| * If the RDPEI channel has not yet been connected, touches will be ignored and |
| * dropped until it is connected. |
| * |
| * @param rdpei |
| * The RDPEI module associated with the RDP session. |
| * |
| * @param id |
| * An arbitrary integer ID unique to the touch being updated. |
| * |
| * @param x |
| * The X-coordinate of the touch, in pixels. |
| * |
| * @param y |
| * The Y-coordinate of the touch, in pixels. |
| * |
| * @param force |
| * The amount of force currently being exerted on the device by the touch |
| * contact in question, where 1.0 is the maximum amount of force |
| * representable and 0.0 indicates the contact has been lifted. |
| * |
| * @return |
| * Zero if the touch event was successfully processed, non-zero if the |
| * touch event had to be dropped. |
| */ |
| int guac_rdp_rdpei_touch_update(guac_rdp_rdpei* rdpei, int id, int x, int y, |
| double force); |
| |
| #endif |
| |