static E_Rdp_Config_Data *g_rdp_config;
static E_Rdp_Backend *g_rdp_backend;
static unsigned int refresh_raw_frame_id;
+static E_Pointer_Hook *pointer_hook = NULL;
struct _E_Rdp_Output
{
uint32_t prev_x;
uint32_t prev_y;
+ Eina_Bool frame_changed;
+ Eina_Bool cursor_changed;
double refresh_time;
+ int refresh_count;
struct wl_list peers;
};
freerdp_listener *listener;
struct wl_event_source *listener_events[MAX_FREERDP_FDS];
E_Rdp_Output *output;
+ Eina_List *handlers;
char *server_cert;
char *server_key;
int no_clients_resize;
int force_no_compression;
int motionless;
+
+ int client_count;
};
struct _E_Rdp_Peer_Item
output = (E_Rdp_Output *)data;
+ output->refresh_count--;
+ if (output->refresh_count < 0)
+ {
+ output->frame_timer = NULL;
+ output->refresh_count = 0;
+ return ECORE_CALLBACK_CANCEL;
+ }
+
tbm_surface = _e_rdp_tbm_image_create(output, output->w, output->h, 0x00000000);
if (tbm_surface == NULL)
{
}
}
+static Eina_Bool
+_e_rdp_cb_client_buffer_change(void *data, int type, void *event)
+{
+ E_Rdp_Backend *b = NULL;
+ E_Rdp_Output *output = NULL;
+ E_Event_Client *ev = event;
+ E_Client *ec = NULL;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(ev, ECORE_CALLBACK_PASS_ON);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(ev->ec, ECORE_CALLBACK_PASS_ON);
+
+ ec = ev->ec;
+ EINA_SAFETY_ON_TRUE_RETURN_VAL(e_object_is_del(E_OBJECT(ec)), ECORE_CALLBACK_PASS_ON);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(ec->pixmap, ECORE_CALLBACK_PASS_ON);
+
+ b = g_rdp_backend;
+ EINA_SAFETY_ON_NULL_RETURN_VAL(b, ECORE_CALLBACK_PASS_ON);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(b->output, ECORE_CALLBACK_PASS_ON);
+ output = b->output;
+ if (b->client_count == 0)
+ return ECORE_CALLBACK_PASS_ON;
+
+ if (!output->frame_timer)
+ {
+ output->refresh_count = 5;
+ output->frame_timer = ecore_timer_add(output->refresh_time, _e_rdp_frame_timer, output);
+ }
+ else
+ output->refresh_count = 5;
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+static void
+_e_rdp_cb_pointer_mouse_move(void *data, E_Pointer *ptr)
+{
+ E_Rdp_Backend *b = NULL;
+ E_Rdp_Output *output = NULL;
+
+ EINA_SAFETY_ON_TRUE_RETURN(e_object_is_del(E_OBJECT(ptr)));
+ EINA_SAFETY_ON_FALSE_RETURN(e_comp->pointer);
+
+ b = g_rdp_backend;
+ EINA_SAFETY_ON_NULL_RETURN(b);
+ EINA_SAFETY_ON_NULL_RETURN(b->output);
+ output = b->output;
+
+ if (b->client_count == 0)
+ return;
+
+ if (!output->frame_timer)
+ {
+ output->refresh_count = 5;
+ output->frame_timer = ecore_timer_add(output->refresh_time, _e_rdp_frame_timer, output);
+ }
+ else
+ output->refresh_count = 5;
+}
+
static double
_e_rdp_refresh_time_set(uint32_t w, uint32_t h)
{
settings->KeyboardLayout, settings->KeyboardType, settings->KeyboardSubType, settings->KeyboardFunctionKey);
peersItem->flags |= RDP_PEER_ACTIVATED;
+ b->client_count++;
/* disable pointer on the client side */
pointer = client->update->pointer;
if (output->frame_timer != NULL)
ecore_timer_del(output->frame_timer);
output->refresh_time = _e_rdp_refresh_time_set(output->w, output->h);
+ output->refresh_count = 5;
output->frame_timer = ecore_timer_add(output->refresh_time, _e_rdp_frame_timer, output);
return TRUE;
b = peerCtx->rdpBackend;
EINA_SAFETY_ON_NULL_GOTO(b, out_clean);
+ if (peerCtx->item.flags & RDP_PEER_ACTIVATED)
+ b->client_count--;
+
output = b->output;
- if (output->frame_timer)
+ if (output && output->frame_timer)
{
ecore_timer_del(output->frame_timer);
output->frame_timer = NULL;
}
+
out_clean:
freerdp_peer_context_free(client);
freerdp_peer_free(client);
{
E_Rdp_Backend *b = NULL;
E_Rdp_Peer_Item *rdp_peer, *tmp;
+ Ecore_Event_Handler *h = NULL;
int i;
b = g_rdp_backend;
EINA_SAFETY_ON_NULL_RETURN(b);
+ if (pointer_hook)
+ {
+ e_pointer_hook_del(pointer_hook);
+ pointer_hook = NULL;
+ }
+ if (b->handlers)
+ {
+ EINA_LIST_FREE(b->handlers, h)
+ ecore_event_handler_del(h);
+ b->handlers = NULL;
+ }
+
if (b->output->frame_timer)
{
ecore_timer_del(b->output->frame_timer);
if (e_rdp_implant_listener(b, b->listener) == EINA_FALSE)
goto err_listener;
+ E_LIST_HANDLER_APPEND(b->handlers, E_EVENT_CLIENT_BUFFER_CHANGE, _e_rdp_cb_client_buffer_change, g_rdp_backend);
+ pointer_hook = e_pointer_hook_add(E_POINTER_HOOK_MOUSE_MOVE, _e_rdp_cb_pointer_mouse_move, g_rdp_backend);
+
g_rdp_backend = b;
return EINA_TRUE;