diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/polkitagent/polkitagenttextlistener.c | 8 | ||||
-rw-r--r-- | src/programs/pkttyagent.c | 14 |
2 files changed, 21 insertions, 1 deletions
diff --git a/src/polkitagent/polkitagenttextlistener.c b/src/polkitagent/polkitagenttextlistener.c index 0ba0352..99af1d1 100644 --- a/src/polkitagent/polkitagenttextlistener.c +++ b/src/polkitagent/polkitagenttextlistener.c @@ -205,6 +205,12 @@ polkit_agent_text_listener_class_init (PolkitAgentTextListenerClass *klass) g_param_spec_uint ("delay", "", "", 0, G_MAXUINT, 1, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + g_signal_new("tty_attrs_changed", + G_TYPE_FROM_CLASS(gobject_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, + 0, NULL, NULL, NULL, + G_TYPE_NONE, 1, G_TYPE_BOOLEAN); } /** @@ -359,6 +365,7 @@ on_request (PolkitAgentSession *session, * the problem. */ + g_signal_emit_by_name(listener, "tty_attrs_changed", TRUE); tcgetattr (fileno (listener->tty), &ts); ots = ts; ts.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL); @@ -387,6 +394,7 @@ on_request (PolkitAgentSession *session, } } tcsetattr (fileno (listener->tty), TCSAFLUSH, &ots); + g_signal_emit_by_name(listener, "tty_attrs_changed", FALSE); putc ('\n', listener->tty); polkit_agent_session_response (session, str->str); diff --git a/src/programs/pkttyagent.c b/src/programs/pkttyagent.c index 8028f2d..ccb5754 100644 --- a/src/programs/pkttyagent.c +++ b/src/programs/pkttyagent.c @@ -34,6 +34,7 @@ static volatile sig_atomic_t tty_flags_saved; +static volatile sig_atomic_t tty_flags_changed; struct termios ts; FILE *tty = NULL; struct sigaction savesigterm, savesigint, savesigtstp; @@ -54,7 +55,7 @@ static void tty_handler(int signal) break; } - if (tty_flags_saved) + if (tty_flags_saved && tty_flags_changed) { tcsetattr (fileno (tty), TCSADRAIN, &ts); } @@ -63,6 +64,14 @@ static void tty_handler(int signal) } +static void tty_attrs_changed(PolkitAgentListener *listener G_GNUC_UNUSED, + gboolean changed, + gpointer user_data G_GNUC_UNUSED) +{ + tty_flags_changed = changed; +} + + int main (int argc, char *argv[]) { @@ -221,6 +230,9 @@ main (int argc, char *argv[]) ret = 127; goto out; } + g_signal_connect(G_OBJECT(listener), "tty_attrs_changed", + G_CALLBACK(tty_attrs_changed), NULL); + local_agent_handle = polkit_agent_listener_register_with_options (listener, POLKIT_AGENT_REGISTER_FLAGS_RUN_IN_THREAD, subject, |