From: Scott James Remnant Date: Thu, 18 Mar 2010 04:29:36 +0000 (+0000) Subject: [terminal] don't keep track of active vt, just if vt is active X-Git-Tag: 0.8.0~53^2~13 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c51a141345f149e79786a2d24f1abe724038e4d2;p=thirdparty%2Fplymouth.git [terminal] don't keep track of active vt, just if vt is active 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. --- diff --git a/src/libply-splash-core/ply-terminal.c b/src/libply-splash-core/ply-terminal.c index 771f2bc9..e0baf2e0 100644 --- a/src/libply-splash-core/ply-terminal.c +++ b/src/libply-splash-core/ply-terminal.c @@ -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)) diff --git a/src/libply-splash-core/ply-terminal.h b/src/libply-splash-core/ply-terminal.h index d3ac89bf..8ac47c6c 100644 --- a/src/libply-splash-core/ply-terminal.h +++ b/src/libply-splash-core/ply-terminal.h @@ -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, diff --git a/src/plugins/renderers/drm/plugin.c b/src/plugins/renderers/drm/plugin.c index 549955d7..21d727da 100644 --- a/src/plugins/renderers/drm/plugin.c +++ b/src/plugins/renderers/drm/plugin.c @@ -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); diff --git a/src/plugins/renderers/frame-buffer/plugin.c b/src/plugins/renderers/frame-buffer/plugin.c index 1c0e34b8..3152bf73 100644 --- a/src/plugins/renderers/frame-buffer/plugin.c +++ b/src/plugins/renderers/frame-buffer/plugin.c @@ -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