Commit Diff


commit - f8742389d35e4364097a14937c92aedf40cfc468
commit + fad722018f4c0d7c1ea84297874a866f04aa3e8f
blob - 4278cc3ef22718865e75b4b95d281af2ec56763f
blob + 562f8d3e762664b142b128ca3faa7fdcb9fb7fd9
--- ui.c
+++ ui.c
@@ -86,6 +86,8 @@ CMD(cmd_tab_close_other);
 CMD(cmd_tab_new);
 CMD(cmd_tab_next);
 CMD(cmd_tab_previous);
+CMD(cmd_tab_move);
+CMD(cmd_tab_move_to);
 CMD(cmd_load_url);
 CMD(cmd_load_current_url);
 CMD(cmd_bookmark_page);
@@ -284,6 +286,8 @@ load_default_keys(void)
 	global_set_key("C-x t 2",	cmd_tab_new);
 	global_set_key("C-x t o",	cmd_tab_next);
 	global_set_key("C-x t O",	cmd_tab_previous);
+	global_set_key("C-x t m",	cmd_tab_move);
+	global_set_key("C-x t M",	cmd_tab_move_to);
 
 	global_set_key("M-<",		cmd_beginning_of_buffer);
 	global_set_key("M->",		cmd_end_of_buffer);
@@ -311,6 +315,8 @@ load_default_keys(void)
 	global_set_key("g N",		cmd_tab_new);
 	global_set_key("g t",		cmd_tab_next);
 	global_set_key("g T",		cmd_tab_previous);
+	global_set_key("g M-t",		cmd_tab_move);
+	global_set_key("g M-T",		cmd_tab_move_to);
 
 	global_set_key("g g",		cmd_beginning_of_buffer);
 	global_set_key("G",		cmd_end_of_buffer);
@@ -770,6 +776,39 @@ cmd_tab_previous(struct window *window)
 }
 
 static void
+cmd_tab_move(struct window *window)
+{
+	struct tab *tab, *t;
+
+	tab = current_tab();
+	t = TAILQ_NEXT(tab, tabs);
+	TAILQ_REMOVE(&tabshead, tab, tabs);
+
+	if (t == NULL)
+		TAILQ_INSERT_HEAD(&tabshead, tab, tabs);
+	else
+		TAILQ_INSERT_AFTER(&tabshead, t, tab, tabs);
+}
+
+static void
+cmd_tab_move_to(struct window *window)
+{
+	struct tab *tab, *t;
+
+	tab = current_tab();
+	t = TAILQ_PREV(tab, tabshead, tabs);
+	TAILQ_REMOVE(&tabshead, tab, tabs);
+
+	if (t == NULL) {
+		if (TAILQ_EMPTY(&tabshead))
+			TAILQ_INSERT_HEAD(&tabshead, tab, tabs);
+		else
+			TAILQ_INSERT_TAIL(&tabshead, tab, tabs);
+	} else
+		TAILQ_INSERT_BEFORE(t, tab, tabs);
+}
+
+static void
 cmd_load_url(struct window *window)
 {
 	if (in_minibuffer) {