static void dialog_response(GtkWidget *dialog, gint response_id, gpointer user_data) { switch(response_id) { case CONNECT_TO_WORLD: { GtkWidget *tree = user_data; GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree)); GList *selected_rows = gtk_tree_selection_get_selected_rows(selection, NULL); GtkTreePath *path = selected_rows->data; //gint *path_ind = gtk_tree_path_get_indices(path); GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(tree)); GtkTreeIter iter; gtk_tree_model_get_iter(model, &iter, path); GValue hostname_value = {0}; GValue port_value = {0}; gtk_tree_model_get_value(model, &iter, WORLD_HOSTNAME, &hostname_value); gtk_tree_model_get_value(model, &iter, WORLD_PORT, &port_value); char *hostname = strdup(g_value_get_string(&hostname_value)); unsigned short port = g_value_get_int(&port_value); g_value_unset(&hostname_value); g_value_unset(&port_value); /* save off old tab_completion file */ tab_complete_save(); /* set up the tab completion file */ char *home_dir = getenv("HOME"); int len = strlen(home_dir) + MAX_LINE_LEN + 18 + 1; char *tab_complete_name = malloc(sizeof(*tab_complete_name) * len); /* create each level of the directory structure since a -p * type option doesn't exist AFAIK */ snprintf(tab_complete_name, len, "%s/.mudc/worlds/%s", home_dir, hostname); mkdir(tab_complete_name, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); snprintf(tab_complete_name, len, "%s/.mudc/worlds/%s/tab", home_dir, hostname); FILE *tmp_file = fopen(tab_complete_name, "r"); if( !tmp_file ) tmp_file = fopen(tab_complete_name, "w"); fclose(tmp_file); tab_complete_set_wordlist_file(tab_complete_name); /* load macro definitions */ len = strlen(home_dir) + MAX_LINE_LEN + 21 + 1; char *macros_filename = malloc(sizeof(*macros_filename) * len); snprintf(macros_filename, len, "%s/.mudc/worlds/%s/macros", home_dir, hostname); tmp_file = fopen(tab_complete_name, "r"); if( !tmp_file ) tmp_file = fopen(tab_complete_name, "w"); fclose(tmp_file); macros_load(macros_filename); /* disconnect from current telnet connection */ telnet_close(MUDC.telnet); MUDC.telnet = NULL; /* clear text buffer */ GtkTextIter start, end; gtk_text_buffer_get_start_iter(MUDC.widgets.text_buffer, &start); gtk_text_buffer_get_end_iter(MUDC.widgets.text_buffer, &end); gtk_text_buffer_delete(MUDC.widgets.text_buffer, &start, &end); /* fire up the telnet connection */ MUDC.telnet = telnet_connect(hostname, port); if(MUDC.telnet == NULL) { GtkWidget * dialog2 = gtk_message_dialog_new(GTK_WINDOW(dialog), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "Error connecting to %s:%d", hostname, port); gtk_dialog_run(GTK_DIALOG(dialog2)); gtk_widget_destroy(dialog2); } free(hostname); gtk_widget_destroy(dialog); break; } case ADD_WORLD: { GtkWidget *dialog2 = gtk_dialog_new_with_buttons("Add World", GTK_WINDOW(MUDC.widgets.main_window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, "Add", ADD_WORLD, "Cancel", CANCEL, NULL); gtk_window_set_default_size(GTK_WINDOW(dialog2), 320, 200); GtkWidget *content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog2)); GtkWidget *ts1 = gtk_table_new(3, 2, FALSE); gtk_table_set_row_spacings(GTK_TABLE(ts1), 10); gtk_table_set_col_spacings(GTK_TABLE(ts1), 10); gtk_box_pack_start(GTK_BOX(content_area), ts1, TRUE, FALSE, 0); gtk_table_attach_defaults(GTK_TABLE(ts1), gtk_label_new("World Name"), 0, 1, 0, 1); gtk_table_attach_defaults(GTK_TABLE(ts1), gtk_label_new("Hostname"), 0, 1, 1, 2); gtk_table_attach_defaults(GTK_TABLE(ts1), gtk_label_new("Port"), 0, 1, 2, 3); GtkWidget *name_entry = gtk_entry_new(); gtk_table_attach_defaults(GTK_TABLE(ts1), name_entry, 1, 2, 0, 1); GtkWidget *hostname_entry = gtk_entry_new(); gtk_table_attach_defaults(GTK_TABLE(ts1), hostname_entry, 1, 2, 1, 2); GtkWidget *port_entry = gtk_entry_new(); gtk_table_attach_defaults(GTK_TABLE(ts1), port_entry, 1, 2, 2, 3); GtkWidget *widgets[] = {user_data, name_entry, hostname_entry, port_entry}; g_signal_connect(dialog2, "response", G_CALLBACK(add_world_response), widgets); gtk_widget_show_all(dialog2); gtk_dialog_run(GTK_DIALOG(dialog2)); gtk_widget_destroy(dialog2); break; } case REMOVE_WORLD: { GtkWidget *tree = user_data; GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree)); GList *selected_rows = gtk_tree_selection_get_selected_rows(selection, NULL); GtkTreePath *path = selected_rows->data; GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(tree)); GtkTreeIter iter; gtk_tree_model_get_iter(model, &iter, path); gtk_list_store_remove(GTK_LIST_STORE(model), &iter); write_to_config(GTK_LIST_STORE(model)); break; } }; }
/*-----------------------------------------------------------------------------------*/ PROCESS_THREAD(simpletelnet_process, ev, data) { struct ctk_widget *w; int sendlen; PROCESS_BEGIN(); ctk_window_new(&telnetwindow, TELNET_WINDOW_WIDTH, TELNET_WINDOW_HEIGHT, "Simple telnet"); strcpy(telnetport, "23"); CTK_WIDGET_ADD(&telnetwindow, &telnethostlabel); CTK_WIDGET_ADD(&telnetwindow, &telnetportlabel); CTK_WIDGET_ADD(&telnetwindow, &telnethosttextentry); CTK_WIDGET_ADD(&telnetwindow, &telnetporttextentry); CTK_WIDGET_ADD(&telnetwindow, &telnetconnectbutton); CTK_WIDGET_ADD(&telnetwindow, &telnetdisconnectbutton); CTK_WIDGET_ADD(&telnetwindow, &telnetlinetextentry); CTK_WIDGET_ADD(&telnetwindow, &telnetsendbutton); CTK_WIDGET_ADD(&telnetwindow, &telnetsep1); CTK_WIDGET_ADD(&telnetwindow, &telnettextarea); CTK_WIDGET_ADD(&telnetwindow, &telnetsep2); CTK_WIDGET_ADD(&telnetwindow, &telnetstatus); CTK_WIDGET_FOCUS(&telnetwindow, &telnethosttextentry); ctk_window_open(&telnetwindow); while(1) { PROCESS_WAIT_EVENT(); if(ev == ctk_signal_button_activate) { w = (struct ctk_widget *)data; if(w == (struct ctk_widget *)&telnetsendbutton) { strcpy(sendline, telnetline); sendlen = (int)strlen(sendline); petsciiconv_toascii(sendline, sendlen); sendline[sendlen++] = ISO_CR; sendline[sendlen++] = ISO_NL; if(telnet_send(&ts_appstate, sendline, sendlen)) { /* Could not send. */ ctk_label_set_text(&telnetstatus, "Could not send"); ctk_window_redraw(&telnetwindow); /* } else {*/ /* Could send */ } } else if(w == (struct ctk_widget *)&telnetdisconnectbutton) { telnet_close(&ts_appstate); show("Closing..."); } else if(w == (struct ctk_widget *)&telnetconnectbutton) { connect(); ctk_window_redraw(&telnetwindow); } #if UIP_UDP } else if(ev == resolv_event_found) { if(strcmp(data, telnethost) == 0) { if(resolv_lookup(telnethost) != NULL) { connect(); } else { show("Host not found"); } } #endif /* UIP_UDP */ } else if( #if CTK_CONF_WINDOWCLOSE ev == ctk_signal_window_close || #endif /* CTK_CONF_WINDOWCLOSE */ ev == PROCESS_EVENT_EXIT) { process_exit(&simpletelnet_process); ctk_window_close(&telnetwindow); LOADER_UNLOAD(); } else if(ev == tcpip_event) { telnet_app(data); } } PROCESS_END(); }