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

Reply via email to