📄 config.c
字号:
/***********************************************************************//* config.c *//* -------- *//* GTKTerm Software *//* (c) Julien Schmitt *//* julien@jls-info.com */ /* *//* ------------------------------------------------------------------- *//* *//* Purpose *//* Configuration of the serial port *//* *//* ChangeLog *//* - 0.99.5 : Make the combo list for the device editable *//* - 0.99.3 : Configuration for VTE terminal *//* - 0.99.2 : Internationalization *//* - 0.99.1 : fixed memory management bug *//* test if there are devices found *//* - 0.99.0 : fixed enormous memory management bug ;-) *//* save / read macros *//* - 0.98.5 : font saved in configuration *//* bug fixed in memory management *//* combos set to non editable *//* - 0.98.3 : configuration file *//* - 0.98.2 : autodetect existing devices *//* - 0.98 : added devfs devices *//* *//***********************************************************************/#include <gtk/gtk.h>#include <termios.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#include <vte/vte.h>#include "serie.h"#include "config.h"#include "widgets.h"#include "parsecfg.h"#include "macros.h"#include "gettext.h"#include "i18n.h"#define NUMBER_OF_DEVICES 16gchar *devices_list[NUMBER_OF_DEVICES] = { "/dev/ttyS0", "/dev/ttyS1", "/dev/ttyS2", "/dev/ttyS3", "/dev/tts/0", "/dev/tts/1", "/dev/tts/2", "/dev/tts/3", "/dev/ttyUSB0", "/dev/ttyUSB1", "/dev/ttyUSB2", "/dev/ttyUSB3", "/dev/usb/tts/0", "/dev/usb/tts/1", "/dev/usb/tts/2", "/dev/usb/tts/3"};/* Configuration file variables */gchar **port;gint *speed;gint *bits;gint *stopbits;gchar **parity;gchar **flow;gint *wait_delay;gint *wait_char;gint *echo;gint *crlfauto;cfgList **macro_list = NULL;gchar **font;gint *transparency;gint *show_cursor;gint *rows;gint *columns;gint *visual_bell;gint *foreground_red;gint *foreground_blue;gint *foreground_green;gint *background_red;gint *background_blue;gint *background_green;gdouble *background_saturation;cfgStruct cfg[] = { {"port", CFG_STRING, &port}, {"speed", CFG_INT, &speed}, {"bits", CFG_INT, &bits}, {"stopbits", CFG_INT, &stopbits}, {"parity", CFG_STRING, &parity}, {"flow", CFG_STRING, &flow}, {"wait_delay", CFG_INT, &wait_delay}, {"wait_char", CFG_INT, &wait_char}, {"echo", CFG_BOOL, &echo}, {"crlfauto", CFG_BOOL, &crlfauto}, {"font", CFG_STRING, &font}, {"macros", CFG_STRING_LIST, ¯o_list}, {"term_transparency", CFG_BOOL, &transparency}, {"term_show_cursor", CFG_BOOL, &show_cursor}, {"term_rows", CFG_INT, &rows}, {"term_columns", CFG_INT, &columns}, {"term_visual_bell", CFG_BOOL, &visual_bell}, {"term_foreground_red", CFG_INT, &foreground_red}, {"term_foreground_blue", CFG_INT, &foreground_blue}, {"term_foreground_green", CFG_INT, &foreground_green}, {"term_background_red", CFG_INT, &background_red}, {"term_background_blue", CFG_INT, &background_blue}, {"term_background_green", CFG_INT, &background_green}, {"term_background_saturation", CFG_DOUBLE, &background_saturation}, {NULL, CFG_END, NULL}};gchar *config_file;struct configuration_port config;display_config_t term_conf;GtkWidget *Entry, *Bouton_font = NULL;gint Grise_Degrise(GtkWidget *bouton, gpointer pointeur);gint Lis_Font(GtkFontSelectionDialog *fontsel);void Hard_default_configuration(void);void Copy_configuration(int);static void Select_config(gchar *, void *);static void Save_config_file(void);static void load_config(GtkDialog *, gint, GtkTreeSelection *);static void delete_config(GtkDialog *, gint, GtkTreeSelection *);static void save_config(GtkDialog *, gint, GtkWidget *);static void really_save_config(GtkDialog *, gint, gpointer);static gint remove_section(gchar *, gchar *);static void Curseur_OnOff(GtkWidget *, gpointer);static void Selec_couleur(GdkColor *, gfloat, gfloat, gfloat);static gint config_color_fg(GtkWidget *, gpointer);static gint config_color_bg(GtkWidget *, gpointer);static void Transparency_OnOff(GtkWidget *, gpointer);static void change_scale(GtkRange *, gpointer);extern GtkWidget *display;gint Config_Port_Fenetre(GtkWidget *widget, guint param){ GtkWidget *Table, *Label, *Bouton_OK, *Bouton_annule, *Combo, *Dialogue, *Frame, *CheckBouton, *Spin; static GtkWidget *Combos[8]; GList *liste; gchar *chaine = NULL; GtkObject *adj; struct stat my_stat; int i; liste = NULL; for(i = 0; i < NUMBER_OF_DEVICES; i++) { if(stat(devices_list[i], &my_stat) == 0) liste = g_list_append(liste, devices_list[i]); } if(liste == NULL) { show_message(_("No valid serial device found in /dev, sorry !\nYou should have at least one of these :\n/dev/ttyS*\n/dev/tts/*\n/dev/ttyUSB*\n/dev/usb/tts/*\n"), MSG_ERR); return FALSE; } Dialogue = gtk_dialog_new(); gtk_window_set_title(GTK_WINDOW(Dialogue), _("Configuration")); gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(Dialogue)->vbox), 5); Frame = gtk_frame_new(_("Serial port")); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(Dialogue)->vbox), Frame, FALSE, TRUE, 5); Table = gtk_table_new(4, 3, FALSE); gtk_container_add(GTK_CONTAINER(Frame), Table); Label = gtk_label_new(_("Port :")); gtk_table_attach(GTK_TABLE(Table), Label, 0, 1, 0, 1, 0, 0, 10, 5); Label = gtk_label_new(_("Speed :")); gtk_table_attach(GTK_TABLE(Table), Label, 1, 2, 0, 1, 0, 0, 10, 5); Label = gtk_label_new(_("Parity :")); gtk_table_attach(GTK_TABLE(Table), Label, 2, 3, 0, 1, 0, 0, 10, 5); Combo = gtk_combo_new(); gtk_editable_set_editable(GTK_EDITABLE((GTK_COMBO(Combo)->entry)), TRUE); gtk_combo_set_popdown_strings(GTK_COMBO(Combo), liste); gtk_combo_set_value_in_list(GTK_COMBO(Combo), FALSE, FALSE); chaine = g_strdup(config.port); if(g_list_find_custom(liste, chaine, (GCompareFunc)strcmp) != NULL) gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(Combo)->entry), chaine); gtk_table_attach(GTK_TABLE(Table), Combo, 0, 1, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 5, 5); Combos[0] = Combo; Combo = gtk_combo_new(); gtk_editable_set_editable(GTK_EDITABLE((GTK_COMBO(Combo)->entry)), FALSE); g_list_free(liste); liste = NULL; liste = g_list_append(liste, "300"); liste = g_list_append(liste, "600"); liste = g_list_append(liste, "1200"); liste = g_list_append(liste, "2400"); liste = g_list_append(liste, "4800"); liste = g_list_append(liste, "9600"); liste = g_list_append(liste, "19200"); liste = g_list_append(liste, "38400"); liste = g_list_append(liste, "57600"); liste = g_list_append(liste, "115200"); gtk_combo_set_popdown_strings(GTK_COMBO(Combo), liste); gtk_combo_set_value_in_list(GTK_COMBO(Combo), TRUE, FALSE); g_free(chaine); chaine = g_strdup_printf("%d", config.vitesse); gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(Combo)->entry), chaine); gtk_table_attach(GTK_TABLE(Table), Combo, 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 5, 5); Combos[1] = Combo; Combo = gtk_combo_new(); gtk_editable_set_editable(GTK_EDITABLE((GTK_COMBO(Combo)->entry)), FALSE); g_list_free(liste); liste = NULL; liste = g_list_append(liste, "none"); liste = g_list_append(liste, "even"); liste = g_list_append(liste, "odd"); gtk_combo_set_popdown_strings(GTK_COMBO(Combo), liste); gtk_combo_set_value_in_list(GTK_COMBO(Combo), TRUE, FALSE); switch(config.parite) { case 0: gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(Combo)->entry), "none"); break; case 1: gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(Combo)->entry), "odd"); break; case 2: gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(Combo)->entry), "even"); break; } gtk_table_attach(GTK_TABLE(Table), Combo, 2, 3, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 5, 5); Combos[2] = Combo; Label = gtk_label_new(_("Bits :")); gtk_table_attach(GTK_TABLE(Table), Label, 0, 1, 2, 3, 0, 0, 10, 5); Label = gtk_label_new(_("Stopbits :")); gtk_table_attach(GTK_TABLE(Table), Label, 1, 2, 2, 3, 0, 0, 10, 5); Label = gtk_label_new(_("Flow control :")); gtk_table_attach(GTK_TABLE(Table), Label, 2, 3, 2, 3, 0, 0, 10, 5); Combo = gtk_combo_new(); gtk_editable_set_editable(GTK_EDITABLE((GTK_COMBO(Combo)->entry)), FALSE); g_list_free(liste); liste = NULL; liste = g_list_append(liste, "5"); liste = g_list_append(liste, "6"); liste = g_list_append(liste, "7"); liste = g_list_append(liste, "8"); gtk_combo_set_popdown_strings(GTK_COMBO(Combo), liste); gtk_combo_set_value_in_list(GTK_COMBO(Combo), TRUE, FALSE); g_free(chaine); chaine = g_strdup_printf("%d", config.bits); gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(Combo)->entry), chaine); gtk_table_attach(GTK_TABLE(Table), Combo, 0, 1, 3, 4, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 5, 5); Combos[3] = Combo; Combo = gtk_combo_new(); gtk_editable_set_editable(GTK_EDITABLE((GTK_COMBO(Combo)->entry)), FALSE); g_list_free(liste); liste = NULL; liste = g_list_append(liste, "1"); liste = g_list_append(liste, "2"); gtk_combo_set_popdown_strings(GTK_COMBO(Combo), liste); gtk_combo_set_value_in_list(GTK_COMBO(Combo), TRUE, FALSE); g_free(chaine); chaine = g_strdup_printf("%d", config.stops); gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(Combo)->entry), chaine); gtk_table_attach(GTK_TABLE(Table), Combo, 1, 2, 3, 4, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 5, 5); Combos[4] = Combo; g_free(chaine); Combo = gtk_combo_new(); gtk_editable_set_editable(GTK_EDITABLE((GTK_COMBO(Combo)->entry)), FALSE); g_list_free(liste); liste = NULL; liste = g_list_append(liste, "none"); liste = g_list_append(liste, "RTS/CTS"); liste = g_list_append(liste, "Xon/Xoff"); gtk_combo_set_popdown_strings(GTK_COMBO(Combo), liste); gtk_combo_set_value_in_list(GTK_COMBO(Combo), TRUE, FALSE); switch(config.flux) { case 0: gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(Combo)->entry), "none"); break; case 1: gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(Combo)->entry), "Xon/Xoff"); break; case 2: gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(Combo)->entry), "RTS/CTS"); break; } gtk_table_attach(GTK_TABLE(Table), Combo, 2, 3, 3, 4, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 5, 5); Combos[5] = Combo; g_list_free(liste); Frame = gtk_frame_new(_("ASCII file transfer")); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(Dialogue)->vbox), Frame, FALSE, TRUE, 5); Table = gtk_table_new(2, 2, FALSE); gtk_container_add(GTK_CONTAINER(Frame), Table); Label = gtk_label_new(_("End of line delay (milliseconds) :")); gtk_table_attach_defaults(GTK_TABLE(Table), Label, 0, 1, 0, 1); adj = gtk_adjustment_new(0.0, 0.0, 500.0, 10.0, 20.0, 0.0); Spin = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 0, 0); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(Spin), TRUE); gtk_spin_button_set_value(GTK_SPIN_BUTTON(Spin), (gfloat)config.delai); gtk_table_attach(GTK_TABLE(Table), Spin, 1, 2, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 5, 5); Combos[6] = Spin; Entry = gtk_entry_new_with_max_length(1); gtk_widget_set_sensitive(GTK_WIDGET(Entry), FALSE); gtk_table_attach(GTK_TABLE(Table), Entry, 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 5, 5); CheckBouton = gtk_check_button_new_with_label(_("Wait for this special character before passing to next line :")); gtk_signal_connect(GTK_OBJECT(CheckBouton), "clicked", GTK_SIGNAL_FUNC(Grise_Degrise), (gpointer)Spin); if(config.car != -1) { gtk_entry_set_text(GTK_ENTRY(Entry), &(config.car)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(CheckBouton), TRUE); } gtk_table_attach_defaults(GTK_TABLE(Table), CheckBouton, 0, 1, 1, 2); Combos[7] = CheckBouton; Bouton_OK = gtk_button_new_from_stock(GTK_STOCK_OK); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(Dialogue)->action_area), Bouton_OK, FALSE, TRUE, 0); gtk_signal_connect(GTK_OBJECT(Bouton_OK), "clicked", (GtkSignalFunc)Lis_Config, (gpointer)Combos); gtk_signal_connect_object(GTK_OBJECT(Bouton_OK), "clicked", (GtkSignalFunc)gtk_widget_destroy, GTK_OBJECT(Dialogue)); Bouton_annule = gtk_button_new_from_stock(GTK_STOCK_CANCEL); gtk_signal_connect_object(GTK_OBJECT(Bouton_annule), "clicked", (GtkSignalFunc)gtk_widget_destroy, GTK_OBJECT(Dialogue)); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(Dialogue)->action_area), Bouton_annule, FALSE, TRUE, 0); gtk_widget_show_all(Dialogue); return FALSE;}gint Lis_Config(GtkWidget *bouton, GtkWidget **Combos){ gchar *message; strcpy(config.port, gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(Combos[0])->entry))); config.vitesse = atoi(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(Combos[1])->entry))); config.bits = atoi(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(Combos[3])->entry))); config.delai = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(Combos[6]));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -