diff options
Diffstat (limited to 'src/plugins/renderers')
-rw-r--r-- | src/plugins/renderers/drm/plugin.c | 47 | ||||
-rw-r--r-- | src/plugins/renderers/frame-buffer/plugin.c | 30 | ||||
-rw-r--r-- | src/plugins/renderers/x11/plugin.c | 19 |
3 files changed, 80 insertions, 16 deletions
diff --git a/src/plugins/renderers/drm/plugin.c b/src/plugins/renderers/drm/plugin.c index 3081ac8f..1115b5cc 100644 --- a/src/plugins/renderers/drm/plugin.c +++ b/src/plugins/renderers/drm/plugin.c @@ -110,6 +110,8 @@ struct _ply_renderer_backend int32_t dither_red; int32_t dither_green; int32_t dither_blue; + + uint32_t is_inactive : 1; }; ply_renderer_plugin_interface_t *ply_renderer_backend_get_interface (void); @@ -367,16 +369,11 @@ find_driver_for_device (const char *device_name) } static void -on_active_vt_changed (ply_renderer_backend_t *backend) +activate (ply_renderer_backend_t *backend) { ply_list_node_t *node; - if (ply_console_get_active_vt (backend->console) != - ply_terminal_get_vt_number (backend->terminal)) - { - drmDropMaster (backend->device_fd); - return; - } + backend->is_inactive = false; drmSetMaster (backend->device_fd); node = ply_list_get_first_node (backend->heads); @@ -396,6 +393,29 @@ on_active_vt_changed (ply_renderer_backend_t *backend) } } +static void +deactivate (ply_renderer_backend_t *backend) +{ + ply_trace ("dropping master"); + drmDropMaster (backend->device_fd); + backend->is_inactive = true; +} + +static void +on_active_vt_changed (ply_renderer_backend_t *backend) +{ + if (ply_console_get_active_vt (backend->console) != + ply_terminal_get_vt_number (backend->terminal)) + { + ply_trace ("deactivating on vt change"); + deactivate (backend); + return; + } + + ply_trace ("activating on vt change"); + activate (backend); +} + static bool load_driver (ply_renderer_backend_t *backend) { @@ -889,8 +909,12 @@ unmap_from_device (ply_renderer_backend_t *backend) head = (ply_renderer_head_t *) ply_list_node_get_data (node); next_node = ply_list_get_next_node (backend->heads, node); - ply_renderer_head_set_scan_out_buffer_to_console (backend, head, - should_set_to_black); + if (!backend->is_inactive) + { + ply_trace ("scanning out directly to console"); + ply_renderer_head_set_scan_out_buffer_to_console (backend, head, + should_set_to_black); + } ply_renderer_head_unmap (backend, head); @@ -935,8 +959,7 @@ flush_head (ply_renderer_backend_t *backend, assert (backend != NULL); - if (ply_console_get_active_vt (backend->console) != - ply_terminal_get_vt_number (backend->terminal)) + if (backend->is_inactive) return; ply_console_set_mode (backend->console, PLY_CONSOLE_MODE_GRAPHICS); @@ -1079,6 +1102,8 @@ ply_renderer_backend_get_interface (void) .query_device = query_device, .map_to_device = map_to_device, .unmap_from_device = unmap_from_device, + .activate = activate, + .deactivate = deactivate, .flush_head = flush_head, .get_heads = get_heads, .get_buffer_for_head = get_buffer_for_head, diff --git a/src/plugins/renderers/frame-buffer/plugin.c b/src/plugins/renderers/frame-buffer/plugin.c index ce42eb3b..80b5973d 100644 --- a/src/plugins/renderers/frame-buffer/plugin.c +++ b/src/plugins/renderers/frame-buffer/plugin.c @@ -108,6 +108,8 @@ struct _ply_renderer_backend unsigned int bytes_per_pixel; unsigned int row_stride; + uint32_t is_inactive : 1; + void (* flush_area) (ply_renderer_backend_t *backend, ply_renderer_head_t *head, ply_rectangle_t *area_to_flush); @@ -301,14 +303,31 @@ destroy_backend (ply_renderer_backend_t *backend) } static void +activate (ply_renderer_backend_t *backend) +{ + backend->is_inactive = false; + + if (backend->head.map_address != MAP_FAILED) + ply_renderer_head_redraw (backend, &backend->head); +} + +static void +deactivate (ply_renderer_backend_t *backend) +{ + backend->is_inactive = true; +} + +static void on_active_vt_changed (ply_renderer_backend_t *backend) { if (ply_console_get_active_vt (backend->console) != ply_terminal_get_vt_number (backend->terminal)) - return; + { + deactivate (backend); + return; + } - if (backend->head.map_address != MAP_FAILED) - ply_renderer_head_redraw (backend, &backend->head); + activate (backend); } static bool @@ -525,8 +544,7 @@ flush_head (ply_renderer_backend_t *backend, assert (backend != NULL); assert (&backend->head == head); - if (ply_console_get_active_vt (backend->console) != - ply_terminal_get_vt_number (backend->terminal)) + if (backend->is_inactive) return; ply_console_set_mode (backend->console, PLY_CONSOLE_MODE_GRAPHICS); @@ -661,6 +679,8 @@ ply_renderer_backend_get_interface (void) .query_device = query_device, .map_to_device = map_to_device, .unmap_from_device = unmap_from_device, + .activate = activate, + .deactivate = deactivate, .flush_head = flush_head, .get_heads = get_heads, .get_buffer_for_head = get_buffer_for_head, diff --git a/src/plugins/renderers/x11/plugin.c b/src/plugins/renderers/x11/plugin.c index 9e78c069..3777b6c2 100644 --- a/src/plugins/renderers/x11/plugin.c +++ b/src/plugins/renderers/x11/plugin.c @@ -86,6 +86,8 @@ struct _ply_renderer_backend ply_console_t *console; ply_fd_watch_t *display_watch; + + uint32_t is_inactive : 1; }; ply_renderer_plugin_interface_t *ply_renderer_backend_get_interface (void); @@ -308,6 +310,18 @@ unmap_from_device (ply_renderer_backend_t *backend) } static void +activate (ply_renderer_backend_t *backend) +{ + backend->is_inactive = false; +} + +static void +deactivate (ply_renderer_backend_t *backend) +{ + backend->is_inactive = true; +} + +static void flush_area_to_device (ply_renderer_backend_t *backend, ply_renderer_head_t *head, ply_rectangle_t *area_to_flush, @@ -338,6 +352,9 @@ flush_head (ply_renderer_backend_t *backend, assert (backend != NULL); + if (backend->is_inactive) + return; + pixel_buffer = head->pixel_buffer; updated_region = ply_pixel_buffer_get_updated_areas (pixel_buffer); areas_to_flush = ply_region_get_rectangle_list (updated_region); @@ -516,6 +533,8 @@ ply_renderer_backend_get_interface (void) .query_device = query_device, .map_to_device = map_to_device, .unmap_from_device = unmap_from_device, + .activate = activate, + .deactivate = deactivate, .flush_head = flush_head, .get_heads = get_heads, .get_buffer_for_head = get_buffer_for_head, |