mirror of https://github.com/cy384/ssheven.git
add menu/shortcut capability to connect/disconnect/reconnect
This commit is contained in:
parent
1521e6f852
commit
29c27221a5
|
@ -839,6 +839,40 @@ void font_size_change()
|
||||||
ForeColor(save_font_fg);
|
ForeColor(save_font_fg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void reset_console(void)
|
||||||
|
{
|
||||||
|
short save_fg = qd.thePort->fgColor;
|
||||||
|
short save_bg = qd.thePort->bkColor;
|
||||||
|
|
||||||
|
ForeColor(prefs.fg_color);
|
||||||
|
BackColor(prefs.bg_color);
|
||||||
|
|
||||||
|
EraseRect(&con.win->portRect);
|
||||||
|
|
||||||
|
ForeColor(save_fg);
|
||||||
|
BackColor(save_bg);
|
||||||
|
|
||||||
|
con.cursor_x = 0;
|
||||||
|
con.cursor_y = 0;
|
||||||
|
|
||||||
|
VTermState* vtermstate = vterm_obtain_state(con.vterm);
|
||||||
|
vterm_state_reset(vtermstate, 1);
|
||||||
|
|
||||||
|
VTermColor fg = { .type = VTERM_COLOR_INDEXED };
|
||||||
|
fg.indexed.idx = qd2idx(prefs.fg_color);
|
||||||
|
|
||||||
|
VTermColor bg = { .type = VTERM_COLOR_INDEXED };
|
||||||
|
bg.indexed.idx = qd2idx(prefs.bg_color);
|
||||||
|
|
||||||
|
vterm_state_set_default_colors(vtermstate, &fg, &bg);
|
||||||
|
|
||||||
|
vterm_output_set_callback(con.vterm, output_callback, NULL);
|
||||||
|
|
||||||
|
con.vts = vterm_obtain_screen(con.vterm);
|
||||||
|
vterm_screen_reset(con.vts, 1);
|
||||||
|
vterm_screen_set_callbacks(con.vts, &vtscrcb, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
void console_setup(void)
|
void console_setup(void)
|
||||||
{
|
{
|
||||||
// don't clobber font settings
|
// don't clobber font settings
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
#include "MacTypes.h"
|
#include "MacTypes.h"
|
||||||
|
|
||||||
|
void reset_console(void);
|
||||||
void console_setup(void);
|
void console_setup(void);
|
||||||
|
|
||||||
void draw_screen(Rect* r);
|
void draw_screen(Rect* r);
|
||||||
|
|
|
@ -579,7 +579,6 @@ void* read_thread(void* arg)
|
||||||
}
|
}
|
||||||
else printf_i("unexpected failure: %s\r\n", libssh2_error_string(rc));
|
else printf_i("unexpected failure: %s\r\n", libssh2_error_string(rc));
|
||||||
ok = 0;
|
ok = 0;
|
||||||
process_login();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
84
ssheven.c
84
ssheven.c
|
@ -30,7 +30,7 @@ struct ssheven_ssh_connection ssh_con = { NULL, NULL, kOTInvalidEndpointRef, NUL
|
||||||
struct preferences prefs;
|
struct preferences prefs;
|
||||||
|
|
||||||
enum THREAD_COMMAND read_thread_command = WAIT;
|
enum THREAD_COMMAND read_thread_command = WAIT;
|
||||||
enum THREAD_STATE read_thread_state = UNINTIALIZED;
|
enum THREAD_STATE read_thread_state = UNINITIALIZED;
|
||||||
|
|
||||||
const uint8_t ascii_to_control_code[256] = {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 27, 28, 29, 30, 31, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255};
|
const uint8_t ascii_to_control_code[256] = {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 27, 28, 29, 30, 31, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255};
|
||||||
|
|
||||||
|
@ -488,8 +488,13 @@ int process_menu_select(int32_t result)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MENU_FILE:
|
case MENU_FILE:
|
||||||
if (item == 1) preferences_window();
|
if (item == 1)
|
||||||
if (item == 3) exit = 1;
|
{
|
||||||
|
if (connect() == 0) disconnect();
|
||||||
|
}
|
||||||
|
if (item == 2) disconnect();
|
||||||
|
if (item == 4) preferences_window();
|
||||||
|
if (item == 6) exit = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MENU_EDIT:
|
case MENU_EDIT:
|
||||||
|
@ -552,6 +557,15 @@ int handle_keypress(EventRecord* event)
|
||||||
{
|
{
|
||||||
switch (c)
|
switch (c)
|
||||||
{
|
{
|
||||||
|
case 'k':
|
||||||
|
if (read_thread_state == UNINITIALIZED || read_thread_state == DONE)
|
||||||
|
{
|
||||||
|
if (connect() == 0) disconnect();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
if (read_thread_state == OPEN) disconnect();
|
||||||
|
break;
|
||||||
case 'q':
|
case 'q':
|
||||||
return 1;
|
return 1;
|
||||||
break;
|
break;
|
||||||
|
@ -1151,13 +1165,16 @@ int safety_checks(void)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void process_login(void)
|
int connect(void)
|
||||||
{
|
{
|
||||||
OSStatus err = noErr;
|
OSStatus err = noErr;
|
||||||
int ok = 1;
|
int ok = 1;
|
||||||
|
|
||||||
ok = safety_checks();
|
ok = safety_checks();
|
||||||
|
|
||||||
|
// reset the console if we have any crap from earlier
|
||||||
|
if (read_thread_state == DONE) reset_console();
|
||||||
|
|
||||||
BeginUpdate(con.win);
|
BeginUpdate(con.win);
|
||||||
draw_screen(&(con.win->portRect));
|
draw_screen(&(con.win->portRect));
|
||||||
EndUpdate(con.win);
|
EndUpdate(con.win);
|
||||||
|
@ -1205,13 +1222,23 @@ void process_login(void)
|
||||||
// if we got the thread, tell it to begin operation
|
// if we got the thread, tell it to begin operation
|
||||||
if (ok) read_thread_command = READ;
|
if (ok) read_thread_command = READ;
|
||||||
|
|
||||||
// procede into our main event loop
|
// allow disconnecting if we're ok
|
||||||
event_loop();
|
if (ok)
|
||||||
|
{
|
||||||
|
void* menu = GetMenuHandle(MENU_FILE);
|
||||||
|
DisableItem(menu, 1);
|
||||||
|
EnableItem(menu, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
void disconnect(void)
|
||||||
|
{
|
||||||
// tell the read thread to finish, then let it run to actually do so
|
// tell the read thread to finish, then let it run to actually do so
|
||||||
read_thread_command = EXIT;
|
read_thread_command = EXIT;
|
||||||
|
|
||||||
if (read_thread_state != UNINTIALIZED)
|
if (read_thread_state != UNINITIALIZED)
|
||||||
{
|
{
|
||||||
while (read_thread_state != DONE)
|
while (read_thread_state != DONE)
|
||||||
{
|
{
|
||||||
|
@ -1222,19 +1249,28 @@ void process_login(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ssh_con.recv_buffer != NULL) OTFreeMem(ssh_con.recv_buffer);
|
if (ssh_con.recv_buffer != NULL)
|
||||||
if (ssh_con.send_buffer != NULL) OTFreeMem(ssh_con.send_buffer);
|
{
|
||||||
|
OTFreeMem(ssh_con.recv_buffer);
|
||||||
if (prefs.pubkey_path != NULL && prefs.pubkey_path[0] != '\0') free(prefs.pubkey_path);
|
ssh_con.recv_buffer = NULL;
|
||||||
if (prefs.privkey_path != NULL && prefs.privkey_path[0] != '\0') free(prefs.privkey_path);
|
}
|
||||||
|
if (ssh_con.send_buffer != NULL)
|
||||||
if (con.vterm != NULL) vterm_free(con.vterm);
|
{
|
||||||
|
OTFreeMem(ssh_con.send_buffer);
|
||||||
|
ssh_con.send_buffer = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (ssh_con.endpoint != kOTInvalidEndpointRef)
|
if (ssh_con.endpoint != kOTInvalidEndpointRef)
|
||||||
{
|
{
|
||||||
err = OTCancelSynchronousCalls(ssh_con.endpoint, kOTCanceledErr);
|
OTCancelSynchronousCalls(ssh_con.endpoint, kOTCanceledErr);
|
||||||
CloseOpenTransport();
|
CloseOpenTransport();
|
||||||
|
ssh_con.endpoint = kOTInvalidEndpointRef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// allow connecting if we're disconnected
|
||||||
|
void* menu = GetMenuHandle(MENU_FILE);
|
||||||
|
EnableItem(menu, 1);
|
||||||
|
DisableItem(menu, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
|
@ -1274,6 +1310,11 @@ int main(int argc, char** argv)
|
||||||
DisableItem(menu, 7);
|
DisableItem(menu, 7);
|
||||||
DisableItem(menu, 9);
|
DisableItem(menu, 9);
|
||||||
|
|
||||||
|
// disable connect and disconnect
|
||||||
|
menu = GetMenuHandle(MENU_FILE);
|
||||||
|
DisableItem(menu, 1);
|
||||||
|
DisableItem(menu, 2);
|
||||||
|
|
||||||
DrawMenuBar();
|
DrawMenuBar();
|
||||||
|
|
||||||
generate_key_mapping();
|
generate_key_mapping();
|
||||||
|
@ -1300,5 +1341,16 @@ int main(int argc, char** argv)
|
||||||
draw_screen(&(con.win->portRect));
|
draw_screen(&(con.win->portRect));
|
||||||
EndUpdate(con.win);
|
EndUpdate(con.win);
|
||||||
|
|
||||||
process_login();
|
int ok = connect();
|
||||||
|
|
||||||
|
if (!ok) disconnect();
|
||||||
|
|
||||||
|
event_loop();
|
||||||
|
|
||||||
|
if (read_thread_command != EXIT) disconnect();
|
||||||
|
|
||||||
|
if (con.vterm != NULL) vterm_free(con.vterm);
|
||||||
|
|
||||||
|
if (prefs.pubkey_path != NULL && prefs.pubkey_path[0] != '\0') free(prefs.pubkey_path);
|
||||||
|
if (prefs.privkey_path != NULL && prefs.privkey_path[0] != '\0') free(prefs.privkey_path);
|
||||||
}
|
}
|
||||||
|
|
|
@ -99,7 +99,7 @@ extern struct preferences prefs;
|
||||||
extern char key_to_vterm[256];
|
extern char key_to_vterm[256];
|
||||||
|
|
||||||
enum THREAD_COMMAND { WAIT, READ, EXIT };
|
enum THREAD_COMMAND { WAIT, READ, EXIT };
|
||||||
enum THREAD_STATE { UNINTIALIZED, OPEN, CLEANUP, DONE };
|
enum THREAD_STATE { UNINITIALIZED, OPEN, CLEANUP, DONE };
|
||||||
|
|
||||||
extern enum THREAD_COMMAND read_thread_command;
|
extern enum THREAD_COMMAND read_thread_command;
|
||||||
extern enum THREAD_STATE read_thread_state;
|
extern enum THREAD_STATE read_thread_state;
|
||||||
|
@ -110,4 +110,6 @@ void set_window_title(WindowPtr w, const char* c_name);
|
||||||
OSErr FSpPathFromLocation(FSSpec* spec, int* length, Handle* fullPath);
|
OSErr FSpPathFromLocation(FSSpec* spec, int* length, Handle* fullPath);
|
||||||
|
|
||||||
pascal void ButtonFrameProc(DialogRef dlg, DialogItemIndex itemNo);
|
pascal void ButtonFrameProc(DialogRef dlg, DialogItemIndex itemNo);
|
||||||
void process_login(void);
|
|
||||||
|
int connect(void);
|
||||||
|
void disconnect(void);
|
||||||
|
|
|
@ -454,6 +454,9 @@ resource 'MENU' (MENU_FILE) {
|
||||||
allEnabled, enabled;
|
allEnabled, enabled;
|
||||||
"File";
|
"File";
|
||||||
{
|
{
|
||||||
|
"Connect...", noIcon, "K", noMark, plain;
|
||||||
|
"Disconnect", noIcon, "D", noMark, plain;
|
||||||
|
"-", noIcon, noKey, noMark, plain;
|
||||||
"Preferences...", noIcon, noKey, noMark, plain;
|
"Preferences...", noIcon, noKey, noMark, plain;
|
||||||
"-", noIcon, noKey, noMark, plain;
|
"-", noIcon, noKey, noMark, plain;
|
||||||
"Quit", noIcon, "Q", noMark, plain;
|
"Quit", noIcon, "Q", noMark, plain;
|
||||||
|
|
Loading…
Reference in New Issue