Image transmission only when the screen is changed 17/270617/1
authorJunkyeong, Kim <jk0430.kim@samsung.com>
Mon, 7 Feb 2022 05:14:09 +0000 (14:14 +0900)
committerJunkyeong, Kim <jk0430.kim@samsung.com>
Mon, 7 Feb 2022 05:14:12 +0000 (14:14 +0900)
set e_client's buffer changed callback to check visible ec's buffer changing.
set e_pointer hook to check mouse moving.
if there is no event, stop transmission after 5 times.

Change-Id: I3812e305a5ddf0118cc16c61062c432197401f77
Signed-off-by: Junkyeong, Kim <jk0430.kim@samsung.com>
src/e_mod_rdp.c

index b257d16..a454995 100644 (file)
@@ -66,6 +66,7 @@ typedef struct _E_Rdp_Peer_Context E_Rdp_Peer_Context;
 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
 {
@@ -85,7 +86,10 @@ 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;
 };
@@ -95,6 +99,7 @@ struct _E_Rdp_Backend
    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;
@@ -103,6 +108,8 @@ struct _E_Rdp_Backend
    int no_clients_resize;
    int force_no_compression;
    int motionless;
+
+   int client_count;
 };
 
 struct _E_Rdp_Peer_Item
@@ -853,6 +860,14 @@ _e_rdp_frame_timer(void *data)
 
    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)
      {
@@ -900,6 +915,65 @@ _e_rdp_free_keyfile(E_Rdp_Backend *b, rdpSettings *settings)
      }
 }
 
+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)
 {
@@ -1013,6 +1087,7 @@ e_rdp_peer_activate(freerdp_peer *client)
        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;
@@ -1047,6 +1122,7 @@ e_rdp_peer_activate(freerdp_peer *client)
    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;
@@ -1223,12 +1299,16 @@ e_rdp_client_activity(int fd, uint32_t mask, void *data)
    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);
@@ -1512,11 +1592,24 @@ e_rdp_backend_destroy(void)
 {
    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);
@@ -1600,6 +1693,9 @@ e_rdp_backend_create(E_Rdp_Conf_Edd *config)
    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;