1
0
mirror of https://github.com/profanity-im/profanity.git synced 2024-12-04 14:46:46 -05:00

Added command /wins swap

This commit is contained in:
James Booth 2014-04-24 21:50:59 +01:00
parent 034a98587c
commit 547b6cf4da
6 changed files with 66 additions and 6 deletions

View File

@ -347,13 +347,14 @@ static struct cmd_t command_defs[] =
NULL } } },
{ "/wins",
cmd_wins, parse_args, 0, 1, NULL,
{ "/wins [tidy|prune]", "List or tidy active windows.",
{ "/wins [tidy|prune]",
"------------------",
cmd_wins, parse_args, 0, 3, NULL,
{ "/wins [tidy|prune|swap] [source] [target]", "List or tidy active windows.",
{ "/wins [tidy|prune] [source] [target]",
"------------------------------------",
"Passing no argument will list all currently active windows and information about their usage.",
"tidy : Shuffle windows so there are no gaps.",
"prune : Close all windows with no unread messages, and then tidy as above.",
"swap source target : Swap windows.",
NULL } } },
{ "/sub",
@ -1026,6 +1027,7 @@ cmd_init(void)
wins_ac = autocomplete_new();
autocomplete_add(wins_ac, "prune");
autocomplete_add(wins_ac, "tidy");
autocomplete_add(wins_ac, "swap");
roster_ac = autocomplete_new();
autocomplete_add(roster_ac, "add");

View File

@ -470,7 +470,27 @@ cmd_wins(gchar **args, struct cmd_help_t help)
ui_tidy_wins();
} else if (strcmp(args[0], "prune") == 0) {
ui_prune_wins();
} else if (strcmp(args[0], "swap") == 0) {
if ((args[1] == NULL) || (args[2] == NULL)) {
cons_show("Usage: %s", help.usage);
} else {
int source_win = atoi(args[1]);
int target_win = atoi(args[2]);
if ((source_win == 1) || (target_win == 1)) {
cons_show("Cannot move console window.");
} else if (source_win != target_win) {
gboolean swapped = ui_swap_wins(source_win, target_win);
if (swapped) {
cons_show("Swapped windows %d <-> %d", source_win, target_win);
} else {
cons_show("Window %d does not exist", source_win);
}
} else {
cons_show("Same source and target window supplied.");
}
}
}
return TRUE;
}

View File

@ -950,6 +950,12 @@ _ui_prune_wins(void)
}
}
static gboolean
_ui_swap_wins(int source_win, int target_win)
{
return wins_swap(source_win, target_win);
}
static win_type_t
_ui_current_win_type(void)
{
@ -1987,4 +1993,5 @@ ui_init_module(void)
ui_create_xmlconsole_win = _ui_create_xmlconsole_win;
ui_xmlconsole_exists = _ui_xmlconsole_exists;
ui_handle_room_join_error = _ui_handle_room_join_error;
ui_swap_wins = _ui_swap_wins;
}

View File

@ -147,6 +147,7 @@ gboolean (*ui_duck_exists)(void);
void (*ui_tidy_wins)(void);
void (*ui_prune_wins)(void);
gboolean (*ui_swap_wins)(int source_win, int target_win);
void (*ui_auto_away)(void);
void (*ui_end_auto_away)(void);

View File

@ -386,6 +386,35 @@ wins_lost_connection(void)
}
}
gboolean
wins_swap(int source_win, int target_win)
{
ProfWin *source = g_hash_table_lookup(windows, GINT_TO_POINTER(source_win));
if (source != NULL) {
ProfWin *target = g_hash_table_lookup(windows, GINT_TO_POINTER(target_win));
if (target == NULL) {
g_hash_table_steal(windows, GINT_TO_POINTER(source_win));
status_bar_inactive(source_win);
g_hash_table_insert(windows, GINT_TO_POINTER(target_win), source);
if (source->unread > 0) {
status_bar_new(target_win);
} else {
status_bar_active(target_win);
}
if ((wins_get_current_num() == source_win) || (wins_get_current_num() == target_win)) {
ui_switch_win(1);
}
return TRUE;
} else {
return FALSE;
}
} else {
return FALSE;
}
}
gboolean
wins_tidy(void)
{

View File

@ -50,5 +50,6 @@ void wins_destroy(void);
GList * wins_get_nums(void);
gboolean wins_xmlconsole_exists(void);
ProfWin * wins_get_xmlconsole(void);
gboolean wins_swap(int source_win, int target_win);
#endif