示例#1
0
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;
}
示例#2
0
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;
}
示例#3
0
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;
}
示例#4
0
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);
    }
}
示例#5
0
文件: plugin.c 项目: pkt/pkt-plymouth
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);
}