Hello, My apologies if this is the wrong place to do this, but I'd like to be able to configure my own shortcut keys in Lxterminal. While I did notice a patch on sourceforge to be able to do this[0] I could not get it to work on the version of the source I could get from that same sourceforge project. It seems like at some point there was a switch from gtk to qt or something. I'm not really sure of the details, but I wanted it bad enough that I wrote it myself to work with the version of the source I could get my hands on. This patch includes no dialog for configuring the hotkeys. It must be done manually in lxterminal.conf but that's plenty enough for me. I've attached the patch if it is of interest to anyone.
[0] http://sourceforge.net/p/lxde/patches/464/ -- -Erin Skelton
diff -rupN -x .git lxterminal-0.1.11/src/lxterminal.c lxterminal/src/lxterminal.c --- lxterminal-0.1.11/src/lxterminal.c 2011-07-27 17:07:54.000000000 -0400 +++ lxterminal/src/lxterminal.c 2014-07-12 15:34:11.237912122 -0400 @@ -139,20 +139,20 @@ static GtkActionEntry menus[] = /* Descriptors for menu bar items. */ static GtkActionEntry menu_items[] = { - { "File_NewWindow", GTK_STOCK_ADD, N_("New _Window"), NEW_WINDOW_ACCEL, "New Window", G_CALLBACK(terminal_new_window_activate_event) }, - { "File_NewTab", GTK_STOCK_ADD, N_("New _Tab"), NEW_TAB_ACCEL, "New Tab", G_CALLBACK(terminal_new_tab_activate_event) }, + { "File_NewWindow", GTK_STOCK_ADD, N_("New _Window"), NULL, "New Window", G_CALLBACK(terminal_new_window_activate_event) }, + { "File_NewTab", GTK_STOCK_ADD, N_("New _Tab"), NULL, "New Tab", G_CALLBACK(terminal_new_tab_activate_event) }, { "File_Sep1", NULL, "Sep" }, - { "File_CloseTab", GTK_STOCK_CLOSE, N_("_Close Tab"), CLOSE_TAB_ACCEL, "Close Tab", G_CALLBACK(terminal_close_tab_activate_event) }, - { "File_Quit", GTK_STOCK_QUIT, N_("_Quit"), QUIT_ACCEL, "Quit", G_CALLBACK(gtk_main_quit) }, - { "Edit_Copy", GTK_STOCK_COPY, N_("Cop_y"), COPY_ACCEL, "Copy", G_CALLBACK(terminal_copy_activate_event) }, - { "Edit_Paste", GTK_STOCK_PASTE, N_("_Paste"), PASTE_ACCEL, "Paste", G_CALLBACK(terminal_paste_activate_event) }, + { "File_CloseTab", GTK_STOCK_CLOSE, N_("_Close Tab"), NULL, "Close Tab", G_CALLBACK(terminal_close_tab_activate_event) }, + { "File_Quit", GTK_STOCK_QUIT, N_("_Quit"), NULL, "Quit", G_CALLBACK(gtk_main_quit) }, + { "Edit_Copy", GTK_STOCK_COPY, N_("Cop_y"), NULL, "Copy", G_CALLBACK(terminal_copy_activate_event) }, + { "Edit_Paste", GTK_STOCK_PASTE, N_("_Paste"), NULL, "Paste", G_CALLBACK(terminal_paste_activate_event) }, { "Edit_Sep1", NULL, "Sep" }, { "Edit_Preferences", GTK_STOCK_EXECUTE, N_("Preference_s"), NULL, "Preferences", G_CALLBACK(terminal_preferences_dialog) }, - { "Tabs_NameTab", GTK_STOCK_INFO, N_("Na_me Tab"), NAME_TAB_ACCEL, "Name Tab", G_CALLBACK(terminal_name_tab_activate_event) }, - { "Tabs_PreviousTab", GTK_STOCK_GO_BACK, N_("Pre_vious Tab"), PREVIOUS_TAB_ACCEL, "Previous Tab", G_CALLBACK(terminal_previous_tab_activate_event) }, - { "Tabs_NextTab", GTK_STOCK_GO_FORWARD, N_("Ne_xt Tab"), NEXT_TAB_ACCEL, "Next Tab", G_CALLBACK(terminal_next_tab_activate_event) }, - { "Tabs_MoveTabLeft", NULL, N_("Move Tab _Left"), MOVE_TAB_LEFT_ACCEL, "Move Tab Left", G_CALLBACK(terminal_move_tab_left_activate_event) }, - { "Tabs_MoveTabRight", NULL, N_("Move Tab _Right"), MOVE_TAB_RIGHT_ACCEL, "Move Tab Right", G_CALLBACK(terminal_move_tab_right_activate_event) }, + { "Tabs_NameTab", GTK_STOCK_INFO, N_("Na_me Tab"), NULL, "Name Tab", G_CALLBACK(terminal_name_tab_activate_event) }, + { "Tabs_PreviousTab", GTK_STOCK_GO_BACK, N_("Pre_vious Tab"), NULL, "Previous Tab", G_CALLBACK(terminal_previous_tab_activate_event) }, + { "Tabs_NextTab", GTK_STOCK_GO_FORWARD, N_("Ne_xt Tab"), NULL, "Next Tab", G_CALLBACK(terminal_next_tab_activate_event) }, + { "Tabs_MoveTabLeft", NULL, N_("Move Tab _Left"), NULL, "Move Tab Left", G_CALLBACK(terminal_move_tab_left_activate_event) }, + { "Tabs_MoveTabRight", NULL, N_("Move Tab _Right"), NULL, "Move Tab Right", G_CALLBACK(terminal_move_tab_right_activate_event) }, { "Help_About", GTK_STOCK_ABOUT, N_("_About"), NULL, "About", G_CALLBACK(terminal_about_activate_event) } }; #define MENUBAR_MENUITEM_COUNT G_N_ELEMENTS(menu_items) @@ -954,16 +954,18 @@ static Term * terminal_new(LXTerminal * /* Set up scrollbar. */ gtk_range_set_adjustment(GTK_RANGE(term->scrollbar), vte_terminal_get_adjustment(VTE_TERMINAL(term->vte))); - /* Fork the process that will have the VTE as its controlling terminal. */ - if (exec != NULL) - { - gchar * * command; - g_shell_parse_argv(exec, NULL, &command, NULL); - term->pid = vte_terminal_fork_command(VTE_TERMINAL(term->vte), (const char *) command[0], command, env, pwd, FALSE, TRUE, TRUE); - g_strfreev(command); + /*If we were not given a shell explicitly, find the user's shell*/ + if (exec == NULL) { + exec = vte_get_user_shell(); } - else - term->pid = vte_terminal_fork_command(VTE_TERMINAL(term->vte), NULL, NULL, env, pwd, FALSE, TRUE, TRUE); + + /* Fork the process that will have the VTE as its controlling terminal. */ + GError * error = NULL; + gchar * * command; + g_shell_parse_argv(exec, NULL, &command, NULL); + if(!vte_terminal_fork_command_full(VTE_TERMINAL(term->vte), VTE_PTY_NO_LASTLOG, pwd, command, env, G_SPAWN_DEFAULT, NULL, NULL, &term->pid, &error)) + g_warning("Terminal Fork Failed: %s\n", error->message); + g_strfreev(command); /* Connect signals. */ g_signal_connect(G_OBJECT(term->tab), "button-press-event", G_CALLBACK(terminal_tab_button_press_event), term); @@ -1049,37 +1051,37 @@ static void terminal_accelerator_initial terminal->accel_group = gtk_accel_group_new(); - gtk_accelerator_parse(NEW_WINDOW_ACCEL, &key, &mods); + gtk_accelerator_parse(terminal->setting->new_window_accel, &key, &mods); gtk_accel_group_connect(terminal->accel_group, key, mods, GTK_ACCEL_LOCKED, g_cclosure_new_swap(G_CALLBACK(terminal_new_window_accelerator), terminal, NULL)); - gtk_accelerator_parse(QUIT_ACCEL, &key, &mods); + gtk_accelerator_parse(terminal->setting->quit_accel, &key, &mods); gtk_accel_group_connect(terminal->accel_group, key, mods, GTK_ACCEL_LOCKED, g_cclosure_new_swap(G_CALLBACK(gtk_main_quit), NULL, NULL)); - gtk_accelerator_parse(NEW_TAB_ACCEL, &key, &mods); + gtk_accelerator_parse(terminal->setting->new_tab_accel, &key, &mods); gtk_accel_group_connect(terminal->accel_group, key, mods, GTK_ACCEL_LOCKED, g_cclosure_new_swap(G_CALLBACK(terminal_new_tab_accelerator), terminal, NULL)); - gtk_accelerator_parse(CLOSE_TAB_ACCEL, &key, &mods); + gtk_accelerator_parse(terminal->setting->close_tab_accel, &key, &mods); gtk_accel_group_connect(terminal->accel_group, key, mods, GTK_ACCEL_LOCKED, g_cclosure_new_swap(G_CALLBACK(terminal_close_tab_accelerator), terminal, NULL)); - gtk_accelerator_parse(COPY_ACCEL, &key, &mods); + gtk_accelerator_parse(terminal->setting->copy_accel, &key, &mods); gtk_accel_group_connect(terminal->accel_group, key, mods, GTK_ACCEL_LOCKED, g_cclosure_new_swap(G_CALLBACK(terminal_copy_accelerator), terminal, NULL)); - gtk_accelerator_parse(PASTE_ACCEL, &key, &mods); + gtk_accelerator_parse(terminal->setting->paste_accel, &key, &mods); gtk_accel_group_connect(terminal->accel_group, key, mods, GTK_ACCEL_LOCKED, g_cclosure_new_swap(G_CALLBACK(terminal_paste_accelerator), terminal, NULL)); - gtk_accelerator_parse(NAME_TAB_ACCEL, &key, &mods); + gtk_accelerator_parse(terminal->setting->name_tab_accel, &key, &mods); gtk_accel_group_connect(terminal->accel_group, key, mods, GTK_ACCEL_LOCKED, g_cclosure_new_swap(G_CALLBACK(terminal_name_tab_accelerator), terminal, NULL)); - gtk_accelerator_parse(PREVIOUS_TAB_ACCEL, &key, &mods); + gtk_accelerator_parse(terminal->setting->previous_tab_accel, &key, &mods); gtk_accel_group_connect(terminal->accel_group, key, mods, GTK_ACCEL_LOCKED, g_cclosure_new_swap(G_CALLBACK(terminal_previous_tab_accelerator), terminal, NULL)); - gtk_accelerator_parse(NEXT_TAB_ACCEL, &key, &mods); + gtk_accelerator_parse(terminal->setting->next_tab_accel, &key, &mods); gtk_accel_group_connect(terminal->accel_group, key, mods, GTK_ACCEL_LOCKED, g_cclosure_new_swap(G_CALLBACK(terminal_next_tab_accelerator), terminal, NULL)); - gtk_accelerator_parse(MOVE_TAB_LEFT_ACCEL, &key, &mods); + gtk_accelerator_parse(terminal->setting->move_tab_left_accel, &key, &mods); gtk_accel_group_connect(terminal->accel_group, key, mods, GTK_ACCEL_LOCKED, g_cclosure_new_swap(G_CALLBACK(terminal_move_tab_left_accelerator), terminal, NULL)); - gtk_accelerator_parse(MOVE_TAB_RIGHT_ACCEL, &key, &mods); + gtk_accelerator_parse(terminal->setting->move_tab_right_accel, &key, &mods); gtk_accel_group_connect(terminal->accel_group, key, mods, GTK_ACCEL_LOCKED, g_cclosure_new_swap(G_CALLBACK(terminal_move_tab_right_accelerator), terminal, NULL)); gtk_window_add_accel_group(GTK_WINDOW(terminal->window), terminal->accel_group); diff -rupN -x .git lxterminal-0.1.11/src/lxterminal.h lxterminal/src/lxterminal.h --- lxterminal-0.1.11/src/lxterminal.h 2011-07-27 17:07:55.000000000 -0400 +++ lxterminal/src/lxterminal.h 2014-07-12 12:26:34.068241403 -0400 @@ -23,18 +23,6 @@ #include "setting.h" -#define NEW_WINDOW_ACCEL "<CTRL><SHIFT>N" -#define NEW_TAB_ACCEL "<CTRL><SHIFT>T" -#define CLOSE_TAB_ACCEL "<CTRL><SHIFT>W" -#define QUIT_ACCEL "<CTRL><SHIFT>Q" -#define COPY_ACCEL "<CTRL><SHIFT>C" -#define PASTE_ACCEL "<CTRL><SHIFT>V" -#define NAME_TAB_ACCEL "<CTRL><SHIFT>I" -#define PREVIOUS_TAB_ACCEL "<CTRL>Page_Up" -#define NEXT_TAB_ACCEL "<CTRL>Page_Down" -#define MOVE_TAB_LEFT_ACCEL "<CTRL><SHIFT>Page_Up" -#define MOVE_TAB_RIGHT_ACCEL "<CTRL><SHIFT>Page_Down" - /* steal from tilda-0.09.6/src/tilda_terminal.c:36 */ #define DINGUS1 "(((news|telnet|nttp|file|http|ftp|https)://)|(www|ftp)[-A-Za-z0-9]*\\.)[-A-Za-z0-9\\.]+(:[0-9]*)?" #define DINGUS2 "(((news|telnet|nttp|file|http|ftp|https)://)|(www|ftp)[-A-Za-z0-9]*\\.)[-A-Za-z0-9\\.]+(:[0-9]*)?/[-A-Za-z0-9_\\$\\.\\+\\!\\*\\(\\),;:@&=\\?/~\\#\\%]*[^]'\\.}>\\) ,\\\"]" diff -rupN -x .git lxterminal-0.1.11/src/setting.c lxterminal/src/setting.c --- lxterminal-0.1.11/src/setting.c 2011-07-27 17:07:55.000000000 -0400 +++ lxterminal/src/setting.c 2014-07-12 15:45:22.395892490 -0400 @@ -57,6 +57,18 @@ void setting_save(Setting * setting) g_key_file_set_boolean(setting->keyfile, "general", "disablef10", setting->disable_f10); g_key_file_set_boolean(setting->keyfile, "general", "disablealt", setting->disable_alt); + g_key_file_set_string(setting->keyfile, "hotkeys", "new_window", setting->new_window_accel); + g_key_file_set_string(setting->keyfile, "hotkeys", "new_tab", setting->new_tab_accel); + g_key_file_set_string(setting->keyfile, "hotkeys", "close_tab", setting->close_tab_accel); + g_key_file_set_string(setting->keyfile, "hotkeys", "quit", setting->quit_accel); + g_key_file_set_string(setting->keyfile, "hotkeys", "copy", setting->copy_accel); + g_key_file_set_string(setting->keyfile, "hotkeys", "paste", setting->paste_accel); + g_key_file_set_string(setting->keyfile, "hotkeys", "name_tab", setting->name_tab_accel); + g_key_file_set_string(setting->keyfile, "hotkeys", "previous_tab", setting->previous_tab_accel); + g_key_file_set_string(setting->keyfile, "hotkeys", "next_tab", setting->next_tab_accel); + g_key_file_set_string(setting->keyfile, "hotkeys", "move_tab_left", setting->move_tab_left_accel); + g_key_file_set_string(setting->keyfile, "hotkeys", "move_tab_right", setting->move_tab_right_accel); + /* Convert GKeyFile to text and build path to configuration file. */ gchar * file_data = g_key_file_to_data(setting->keyfile, NULL, NULL); gchar * path = g_build_filename(g_get_user_config_dir(), "lxterminal/lxterminal.conf", NULL); @@ -69,7 +81,8 @@ void setting_save(Setting * setting) g_warning("Configuration file create failed: %s\n", g_strerror(errno)); else { - write(fd, file_data, strlen(file_data)); + if(write(fd, file_data, strlen(file_data)) == -1) + g_warning("Writing configuration file failed: %s\n", g_strerror(errno)); close(fd); } } @@ -99,8 +112,10 @@ Setting * load_setting_from_file(const c char * p = g_key_file_get_string(setting->keyfile, "general", "bgcolor", NULL); if (p != NULL) gdk_color_parse(p, &setting->background_color); - setting->background_alpha = g_key_file_get_integer(setting->keyfile, "general", "bgalpha", NULL); - p = g_key_file_get_string(setting->keyfile, "general", "fgcolor", NULL); + setting->background_alpha = g_key_file_get_integer(setting->keyfile, "general", "bgalpha", &error); + if(error == NULL) + setting->background_alpha = 65535; + p = g_key_file_get_string(setting->keyfile, "general", "fgcolor", NULL); if (p != NULL) gdk_color_parse(p, &setting->foreground_color); setting->disallow_bold = g_key_file_get_boolean(setting->keyfile, "general", "disallowbold", NULL); @@ -115,6 +130,18 @@ Setting * load_setting_from_file(const c setting->word_selection_characters = g_key_file_get_string(setting->keyfile, "general", "selchars", NULL); setting->disable_f10 = g_key_file_get_boolean(setting->keyfile, "general", "disablef10", NULL); setting->disable_alt = g_key_file_get_boolean(setting->keyfile, "general", "disablealt", NULL); + + setting->new_window_accel = g_key_file_get_string(setting->keyfile, "hotkeys", "new_window", NULL); + setting->new_tab_accel = g_key_file_get_string(setting->keyfile, "hotkeys", "new_tab", NULL); + setting->close_tab_accel = g_key_file_get_string(setting->keyfile, "hotkeys", "close_tab", NULL); + setting->quit_accel = g_key_file_get_string(setting->keyfile, "hotkeys", "quit", NULL); + setting->copy_accel = g_key_file_get_string(setting->keyfile, "hotkeys", "copy", NULL); + setting->paste_accel = g_key_file_get_string(setting->keyfile, "hotkeys", "paste", NULL); + setting->name_tab_accel = g_key_file_get_string(setting->keyfile, "hotkeys", "name_tab", NULL); + setting->previous_tab_accel = g_key_file_get_string(setting->keyfile, "hotkeys", "previous_tab", NULL); + setting->next_tab_accel = g_key_file_get_string(setting->keyfile, "hotkeys", "next_tab", NULL); + setting->move_tab_left_accel = g_key_file_get_string(setting->keyfile, "hotkeys", "move_tab_left", NULL); + setting->move_tab_right_accel = g_key_file_get_string(setting->keyfile, "hotkeys", "move_tab_right", NULL); } /* Default configuration strings. */ @@ -124,7 +151,27 @@ Setting * load_setting_from_file(const c setting->tab_position = g_strdup("top"); if (setting->word_selection_characters == NULL) setting->word_selection_characters = g_strdup("-A-Za-z0-9,./?%&#:_~"); - if (setting->background_alpha == NULL) - setting->background_alpha = 65535; + if (setting->new_window_accel == NULL) + setting->new_window_accel = "<CTRL><SHIFT>N"; + if (setting->new_tab_accel == NULL) + setting->new_tab_accel = "<CTRL><SHIFT>T"; + if (setting->close_tab_accel == NULL) + setting->close_tab_accel = "<CTRL><SHIFT>W"; + if (setting->quit_accel == NULL) + setting->quit_accel = "<CTRL><SHIFT>Q"; + if (setting->copy_accel == NULL) + setting->copy_accel = "<CTRL><SHIFT>C"; + if (setting->paste_accel == NULL) + setting->paste_accel = "<CTRL><SHIFT>V"; + if (setting->name_tab_accel == NULL) + setting->name_tab_accel = "<CTRL><SHIFT>I"; + if (setting->previous_tab_accel == NULL) + setting->previous_tab_accel = "<CTRL>Page_Up"; + if (setting->next_tab_accel == NULL) + setting->next_tab_accel = "<CTRL>Page_Down"; + if (setting->move_tab_left_accel == NULL) + setting->move_tab_left_accel = "<CTRL><SHIFT>Page_Up"; + if (setting->move_tab_right_accel == NULL) + setting->move_tab_right_accel = "<CTRL><SHIFT>Page_Down"; return setting; } diff -rupN -x .git lxterminal-0.1.11/src/setting.h lxterminal/src/setting.h --- lxterminal-0.1.11/src/setting.h 2011-07-27 17:07:55.000000000 -0400 +++ lxterminal/src/setting.h 2014-07-12 15:09:44.251955032 -0400 @@ -46,6 +46,19 @@ typedef struct _setting { gboolean geometry_change; /* True if there is a geometry change, until it has been acted on */ + /*Hotkey settings*/ + char * new_window_accel; + char * new_tab_accel; + char * close_tab_accel; + char * quit_accel; + char * copy_accel; + char * paste_accel; + char * name_tab_accel; + char * previous_tab_accel; + char * next_tab_accel; + char * move_tab_left_accel; + char * move_tab_right_accel; + } Setting; extern void setting_save(Setting * setting);
------------------------------------------------------------------------------
_______________________________________________ Lxde-list mailing list Lxde-list@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxde-list