Esempio n. 1
0
File: worlds.c Progetto: nowl/mudc
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;
    }
    };
}
Esempio n. 2
0
/*-----------------------------------------------------------------------------------*/
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();
}