]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
[terminal] don't keep track of active vt, just if vt is active
authorScott James Remnant <scott@ubuntu.com>
Thu, 18 Mar 2010 04:29:36 +0000 (04:29 +0000)
committerScott James Remnant <scott@ubuntu.com>
Thu, 18 Mar 2010 19:56:46 +0000 (19:56 +0000)
Trying to keep track of whatever VT is actually active is inherently
racy; instead just keep track of whether our VT is the active one.
Since we guarantee that's the VT in VT_PROCESS now, this is easy.

Rather simplifies the on_vt_changed functions in renderers too.

src/libply-splash-core/ply-terminal.c
src/libply-splash-core/ply-terminal.h
src/plugins/renderers/drm/plugin.c
src/plugins/renderers/frame-buffer/plugin.c

index 771f2bc9dcc7e96fa861e300798cc3dda99b9513..e0baf2e0b11c0a6877cb604abd29ac87cc3dc508 100644 (file)
@@ -65,7 +65,6 @@ struct _ply_terminal
   char *name;
   int   fd;
   int   vt_number;
-  int   active_vt;
   int   next_active_vt;
 
   ply_list_t *vt_change_closures;
@@ -82,6 +81,7 @@ struct _ply_terminal
   uint32_t original_term_attributes_saved : 1;
   uint32_t supports_text_color : 1;
   uint32_t is_open : 1;
+  uint32_t is_active : 1;
   uint32_t is_watching_for_vt_changes : 1;
   uint32_t should_ignore_mode_changes : 1;
 };
@@ -299,15 +299,15 @@ ply_terminal_check_for_vt (ply_terminal_t *terminal)
     terminal->vt_number = -1;
 }
 
-static void
-ply_terminal_look_up_active_vt (ply_terminal_t *terminal)
+static int
+get_active_vt (ply_terminal_t *terminal)
 {
-  struct vt_stat terminal_state = { 0 };
+  struct vt_stat vt_state = { 0 };
 
-  if (ioctl (terminal->fd, VT_GETSTATE, &terminal_state) < 0)
-    return;
+  if (ioctl (terminal->fd, VT_GETSTATE, &vt_state) < 0)
+    return -1;
 
-  terminal->active_vt = terminal_state.v_active;
+  return vt_state.v_active;
 }
 
 static void
@@ -342,7 +342,7 @@ on_leave_vt (ply_terminal_t *terminal)
       terminal->next_active_vt = 0;
     }
 
-  ply_terminal_look_up_active_vt (terminal);
+  terminal->is_active = false;
   do_active_vt_changed (terminal);
 }
 
@@ -351,7 +351,7 @@ on_enter_vt (ply_terminal_t *terminal)
 {
   ioctl (terminal->fd, VT_RELDISP, VT_ACKACQ);
 
-  ply_terminal_look_up_active_vt (terminal);
+  terminal->is_active = true;
   do_active_vt_changed (terminal);
 }
 
@@ -431,7 +431,6 @@ ply_terminal_open_device (ply_terminal_t *terminal)
                                                    terminal);
 
   ply_terminal_check_for_vt (terminal);
-  ply_terminal_look_up_active_vt (terminal);
 
   if (!ply_terminal_set_unbuffered_input (terminal))
     ply_trace ("terminal '%s' will be line buffered", terminal->name);
@@ -466,6 +465,11 @@ ply_terminal_open (ply_terminal_t *terminal)
   if (ply_terminal_is_vt (terminal))
     {
       ply_terminal_watch_for_vt_changes (terminal);
+
+      if (get_active_vt (terminal) == terminal->vt_number)
+        terminal->is_active = true;
+      else
+        terminal->is_active = false;
     }
 
   terminal->is_open = true;
@@ -491,6 +495,12 @@ ply_terminal_is_open (ply_terminal_t *terminal)
   return terminal->is_open;
 }
 
+bool
+ply_terminal_is_active (ply_terminal_t *terminal)
+{
+  return terminal->is_active;
+}
+
 void
 ply_terminal_close (ply_terminal_t *terminal)
 {
@@ -671,12 +681,6 @@ ply_terminal_get_vt_number (ply_terminal_t *terminal)
   return terminal->vt_number;
 }
 
-int
-ply_terminal_get_active_vt (ply_terminal_t *terminal)
-{
-  return terminal->active_vt;
-}
-
 static bool
 set_active_vt (ply_terminal_t *terminal,
                int             vt_number)
@@ -697,7 +701,7 @@ ply_terminal_activate_vt (ply_terminal_t *terminal)
   if (!ply_terminal_is_vt (terminal))
     return false;
 
-  if (terminal->vt_number == terminal->active_vt)
+  if (terminal->is_active)
     return true;
 
   if (!set_active_vt (terminal, terminal->vt_number))
index d3ac89bf4cd2cd2b7609bea84e84c407e138c88c..8ac47c6c06b3e155c5578955b5b8df71cce809b7 100644 (file)
@@ -62,6 +62,7 @@ bool ply_terminal_open (ply_terminal_t *terminal);
 int ply_terminal_get_fd (ply_terminal_t *terminal);
 bool ply_terminal_is_vt (ply_terminal_t *terminal);
 bool ply_terminal_is_open (ply_terminal_t *terminal);
+bool ply_terminal_is_active (ply_terminal_t *terminal);
 void ply_terminal_close (ply_terminal_t *terminal);
 void ply_terminal_reset_colors (ply_terminal_t *terminal);
 
@@ -90,7 +91,6 @@ void ply_terminal_ignore_mode_changes (ply_terminal_t *terminal,
                                        bool            should_ignore);
 
 int ply_terminal_get_vt_number (ply_terminal_t *terminal);
-int ply_terminal_get_active_vt (ply_terminal_t *terminal);
 bool ply_terminal_activate_vt (ply_terminal_t *terminal);
 
 void ply_terminal_watch_for_active_vt_change (ply_terminal_t *terminal,
index 549955d7a47411c24db48a374cdc7c1c7255ae6a..21d727dad8ce9813d33e4c68e0b02d40cf131e48 100644 (file)
@@ -404,16 +404,16 @@ deactivate (ply_renderer_backend_t *backend)
 static void
 on_active_vt_changed (ply_renderer_backend_t *backend)
 {
-  if (ply_terminal_get_active_vt (backend->terminal) !=
-      ply_terminal_get_vt_number (backend->terminal))
+  if (ply_terminal_is_active (backend->terminal))
+    {
+      ply_trace ("activating on vt change");
+      activate (backend);
+    }
+  else
     {
       ply_trace ("deactivating on vt change");
       deactivate (backend);
-      return;
     }
-
-  ply_trace ("activating on vt change");
-  activate (backend);
 }
 
 static bool
@@ -927,8 +927,7 @@ reset_scan_out_buffer_if_needed (ply_renderer_backend_t *backend,
 {
   drmModeCrtc *controller;
 
-  if (ply_terminal_get_active_vt (backend->terminal) !=
-      ply_terminal_get_vt_number (backend->terminal))
+  if (!ply_terminal_is_active (backend->terminal))
     return;
 
   controller = drmModeGetCrtc (backend->device_fd, head->controller_id);
index 1c0e34b869a628938742e053efb70709ad808e3c..3152bf73c8f952532c28cb096bb1097ab04a9048 100644 (file)
@@ -320,14 +320,16 @@ deactivate (ply_renderer_backend_t *backend)
 static void
 on_active_vt_changed (ply_renderer_backend_t *backend)
 {
-  if (ply_terminal_get_active_vt (backend->terminal) !=
-      ply_terminal_get_vt_number (backend->terminal))
+  if (ply_terminal_is_active (backend->terminal))
     {
+      ply_trace ("activating on vt change");
+      activate (backend);
+    }
+  else
+    {
+      ply_trace ("deactivating on vt change");
       deactivate (backend);
-      return;
     }
-
-  activate (backend);
 }
 
 static bool