static bool map_to_device (ply_renderer_backend_t *backend) { ply_list_node_t *node; bool head_mapped; head_mapped = false; node = ply_list_get_first_node (backend->heads); while (node != NULL) { ply_list_node_t *next_node; ply_renderer_head_t *head; head = (ply_renderer_head_t *) ply_list_node_get_data (node); next_node = ply_list_get_next_node (backend->heads, node); if (ply_renderer_head_map (backend, head)) head_mapped = true; node = next_node; } if (ply_terminal_is_active (backend->terminal)) activate (backend); else ply_terminal_activate_vt (backend->terminal); return head_mapped; }
static bool reset_scan_out_buffer_if_needed (ply_renderer_backend_t *backend, ply_renderer_head_t *head) { drmModeCrtc *controller; bool did_reset = false; if (!ply_terminal_is_active (backend->terminal)) return false; controller = drmModeGetCrtc (backend->device_fd, head->controller_id); if (controller == NULL) return false; if (controller->buffer_id != head->scan_out_buffer_id) { ply_renderer_head_set_scan_out_buffer (backend, head, head->scan_out_buffer_id); did_reset = true; } drmModeFreeCrtc (controller); return did_reset; }
bool ply_terminal_deactivate_vt (ply_terminal_t *terminal) { int old_vt_number; assert (terminal != NULL); if (!ply_terminal_is_vt (terminal)) { ply_trace ("terminal is not for a VT"); return false; } if (terminal->initial_vt_number < 0) { ply_trace ("Don't know where to jump to"); return false; } if (terminal->initial_vt_number == terminal->vt_number) { ply_trace ("can't deactivate initial VT"); return false; } /* Otherwise we'd close and free the terminal before handling the * "leaving the VT" signal. */ ply_terminal_stop_watching_for_vt_changes (terminal); old_vt_number = terminal->vt_number; if (ply_terminal_is_active (terminal)) { ply_trace ("Attempting to set active vt back to %d from %d", terminal->initial_vt_number, old_vt_number); if (!set_active_vt (terminal, terminal->initial_vt_number)) { ply_trace ("Couldn't move console to initial vt: %m"); return false; } if (!wait_for_vt_to_become_active (terminal, terminal->initial_vt_number)) { ply_trace ("Error while waiting for vt %d to become active: %m", terminal->initial_vt_number); return false; } } else { ply_trace ("terminal for vt %d is inactive", terminal->vt_number); } if (!deallocate_vt (terminal, old_vt_number)) { ply_trace ("couldn't deallocate vt %d: %m", old_vt_number); return false; } return true; }
static void on_active_vt_changed (ply_renderer_backend_t *backend) { if (ply_terminal_is_active (backend->terminal)) { ply_trace ("activating on vt change"); activate (backend); } else { ply_trace ("deactivating on vt change"); deactivate (backend); } }
static void reset_scan_out_buffer_if_needed (ply_renderer_backend_t *backend, ply_renderer_head_t *head) { drmModeCrtc *controller; if (!ply_terminal_is_active (backend->terminal)) return; controller = drmModeGetCrtc (backend->device_fd, head->controller_id); if (controller == NULL) return; if (controller->buffer_id != head->scan_out_buffer_id) { ply_trace ("Something stole the monitor"); ply_renderer_head_set_scan_out_buffer (backend, head, head->scan_out_buffer_id); } drmModeFreeCrtc (controller); }