Replaced the SSH library + IO thread + intermediate PTY bridge with
vte_terminal_spawn_sync(). This eliminates the broken terminal behavior
(backspace, Ctrl+C, copy/paste, bash completion) caused by the
intermediate PTY with no process on the slave side.
- SshTerminal now spawns 'ssh' as a VTE subprocess
- Removed libssh dependency from terminal (still used for key validation)
- Removed IO thread, manual PTY creation, and thread synchronization
- VTE now handles all terminal I/O, line discipline, resize, etc.
- Password saved: uses sshpass -e with SSHPASS env var if available
- Password not saved: ssh prompts interactively in the terminal
- Removed show_password_dialog (no longer needed)
- Simplified connect flow in ssh_client.cpp
- Replace openpty() with posix_openpt()+grantpt()+unlockpt()+ptsname()
to fix segfault on PTY creation
- Add out_error parameter to SshTerminal::connect() to propagate error
- Password dialog now shows red error message on auth failure
- Password dialog re-opens automatically on failed password auth
so user can retry without restarting
The signal 'size-changed' does not exist in VTE 2.91. This caused a
GLib-GObject-CRITICAL warning followed by a segfault when connecting.
Fixed by replacing the VTE signal with GTK's 'size-allocate' signal
on the terminal widget, which correctly detects terminal size changes
and resizes the remote PTY accordingly.
- Fix sidebar disappearing after edit: add gtk_widget_show_all after rebuild
- Fix crash on connect: flush pending GLib idle callbacks in disconnect()
- Fix single-click: explicitly set activate_on_single_click to FALSE
- Add live log output when started from terminal (stderr + ~/.config/sshclient/x3-ssh.log)
- Add logging to SSH connect, auth, and key operations
- Add uninstall.sh script to remove system-wide installation
- Added server list sidebar (GtkPaned) showing saved servers with
name, user@host:port detail. Double-click to connect.
- Added '+' button in sidebar to add new servers
- Added notification bar (animated GtkRevealer) for status messages:
'Server saved', 'Server connected', 'Server disconnected',
'Server removed', 'Key generated', 'Key imported', 'Key deleted'
Auto-hides after 4 seconds.
- Changed icon to terminal-style PNG + SVG (scalable)
- Server list updates automatically when servers are added/removed
Layout: [Sidebar: Servers] | [Notebook: Terminal Tabs]
The build_toolbar() method created a local GtkBox (hbox) and packed all
buttons into it, but never added hbox to the window's vbox. The toolbar
was created then immediately garbage collected.
Fix: Inline all UI construction directly into build_ui() and pack the
toolbar box into the vbox with gtk_box_pack_start().
Bug fixes:
- Fixed PTY bridge: IO thread now uses pty_slave_ instead of pty_master_
(remote output was never reaching the terminal)
- Fixed double-delete crash on tab close by removing page-removed callback
- Fixed port being ignored in password dialog (always used port 22)
- Added EINTR handling in select() for IO thread
- Added mutex for thread-safe cleanup
- Added try/catch for std::stoi in server config parsing
- VtePty lifecycle now managed properly (no double-close)
- Redundant ssh_channel_poll_timeout call removed
New:
- Added .desktop file for system-wide application menu entry
- Makefile.am installs desktop file to $(datadir)/applications
- Makefile.am installs icon to $(datadir)/icons/hicolor/256x256/apps