mirror of
https://github.com/profanity-im/profanity.git
synced 2024-12-04 14:46:46 -05:00
Added "tidy" and "prune" options to /wins command
This commit is contained in:
parent
aa1f8b655c
commit
905571bfb7
@ -415,11 +415,13 @@ static struct cmd_t main_commands[] =
|
|||||||
NULL } } },
|
NULL } } },
|
||||||
|
|
||||||
{ "/wins",
|
{ "/wins",
|
||||||
_cmd_wins, parse_args, 0, 0,
|
_cmd_wins, parse_args, 0, 1,
|
||||||
{ "/wins", "List active windows.",
|
{ "/wins [tidy|prune]", "List or tidy active windows.",
|
||||||
{ "/wins",
|
{ "/wins [tidy|prune]",
|
||||||
"-----",
|
"------------------",
|
||||||
"List all currently active windows and information about their usage.",
|
"Passing no argument will list all currently active windows and information about their usage.",
|
||||||
|
"tidy : Shuffle windows so there are no gaps between used windows.",
|
||||||
|
"prune : Close all windows with no unread messages, and then tidy as above.",
|
||||||
NULL } } },
|
NULL } } },
|
||||||
|
|
||||||
{ "/sub",
|
{ "/sub",
|
||||||
@ -486,9 +488,9 @@ static struct cmd_t main_commands[] =
|
|||||||
{ "/close [win|read|all]",
|
{ "/close [win|read|all]",
|
||||||
"---------------------",
|
"---------------------",
|
||||||
"Passing no argument will close the current window.",
|
"Passing no argument will close the current window.",
|
||||||
"Passing 2,3,4,5,6,7,8,9 or 0 will close the specified window.",
|
"2,3,4,5,6,7,8,9 or 0 : Close the specified window.",
|
||||||
"Passing 'all' will close all currently open windows.",
|
"all : Close all currently open windows.",
|
||||||
"Passing 'read' will close all windows that have no unread messages.",
|
"read : Close all windows that have no new messages.",
|
||||||
"The console window cannot be closed.",
|
"The console window cannot be closed.",
|
||||||
"If in a chat room, you will leave the room.",
|
"If in a chat room, you will leave the room.",
|
||||||
NULL } } },
|
NULL } } },
|
||||||
@ -805,6 +807,7 @@ static Autocomplete theme_load_ac;
|
|||||||
static Autocomplete account_ac;
|
static Autocomplete account_ac;
|
||||||
static Autocomplete disco_ac;
|
static Autocomplete disco_ac;
|
||||||
static Autocomplete close_ac;
|
static Autocomplete close_ac;
|
||||||
|
static Autocomplete wins_ac;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialise command autocompleter and history
|
* Initialise command autocompleter and history
|
||||||
@ -886,6 +889,10 @@ cmd_init(void)
|
|||||||
autocomplete_add(close_ac, strdup("read"));
|
autocomplete_add(close_ac, strdup("read"));
|
||||||
autocomplete_add(close_ac, strdup("all"));
|
autocomplete_add(close_ac, strdup("all"));
|
||||||
|
|
||||||
|
wins_ac = autocomplete_new();
|
||||||
|
autocomplete_add(wins_ac, strdup("prune"));
|
||||||
|
autocomplete_add(wins_ac, strdup("tidy"));
|
||||||
|
|
||||||
theme_load_ac = NULL;
|
theme_load_ac = NULL;
|
||||||
|
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
@ -934,6 +941,7 @@ cmd_close(void)
|
|||||||
autocomplete_free(account_ac);
|
autocomplete_free(account_ac);
|
||||||
autocomplete_free(disco_ac);
|
autocomplete_free(disco_ac);
|
||||||
autocomplete_free(close_ac);
|
autocomplete_free(close_ac);
|
||||||
|
autocomplete_free(wins_ac);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Command autocompletion functions
|
// Command autocompletion functions
|
||||||
@ -1000,6 +1008,7 @@ cmd_reset_autocomplete()
|
|||||||
autocomplete_reset(account_ac);
|
autocomplete_reset(account_ac);
|
||||||
autocomplete_reset(disco_ac);
|
autocomplete_reset(disco_ac);
|
||||||
autocomplete_reset(close_ac);
|
autocomplete_reset(close_ac);
|
||||||
|
autocomplete_reset(wins_ac);
|
||||||
}
|
}
|
||||||
|
|
||||||
GSList *
|
GSList *
|
||||||
@ -1198,6 +1207,7 @@ _cmd_complete_parameters(char *input, int *size)
|
|||||||
_parameter_autocomplete_with_ac(input, size, "/log", log_ac);
|
_parameter_autocomplete_with_ac(input, size, "/log", log_ac);
|
||||||
_parameter_autocomplete_with_ac(input, size, "/disco", disco_ac);
|
_parameter_autocomplete_with_ac(input, size, "/disco", disco_ac);
|
||||||
_parameter_autocomplete_with_ac(input, size, "/close", close_ac);
|
_parameter_autocomplete_with_ac(input, size, "/close", close_ac);
|
||||||
|
_parameter_autocomplete_with_ac(input, size, "/wins", wins_ac);
|
||||||
|
|
||||||
_sub_autocomplete(input, size);
|
_sub_autocomplete(input, size);
|
||||||
_notify_autocomplete(input, size);
|
_notify_autocomplete(input, size);
|
||||||
@ -1543,7 +1553,13 @@ _cmd_quit(gchar **args, struct cmd_help_t help)
|
|||||||
static gboolean
|
static gboolean
|
||||||
_cmd_wins(gchar **args, struct cmd_help_t help)
|
_cmd_wins(gchar **args, struct cmd_help_t help)
|
||||||
{
|
{
|
||||||
|
if (args[0] == NULL) {
|
||||||
cons_show_wins();
|
cons_show_wins();
|
||||||
|
} else if (strcmp(args[0], "tidy") == 0) {
|
||||||
|
ui_tidy_wins();
|
||||||
|
} else if (strcmp(args[0], "prune") == 0) {
|
||||||
|
ui_prune_wins();
|
||||||
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2487,27 +2503,6 @@ _cmd_clear(gchar **args, struct cmd_help_t help)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _close_connected_win(index)
|
|
||||||
{
|
|
||||||
win_type_t win_type = ui_win_type(index);
|
|
||||||
if (win_type == WIN_MUC) {
|
|
||||||
char *room_jid = ui_recipient(index);
|
|
||||||
presence_leave_chat_room(room_jid);
|
|
||||||
} else if ((win_type == WIN_CHAT) || (win_type == WIN_PRIVATE)) {
|
|
||||||
|
|
||||||
if (prefs_get_boolean(PREF_STATES)) {
|
|
||||||
char *recipient = ui_recipient(index);
|
|
||||||
|
|
||||||
// send <gone/> chat state before closing
|
|
||||||
if (chat_session_get_recipient_supports(recipient)) {
|
|
||||||
chat_session_set_gone(recipient);
|
|
||||||
message_send_gone(recipient);
|
|
||||||
chat_session_end(recipient);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
_cmd_close(gchar **args, struct cmd_help_t help)
|
_cmd_close(gchar **args, struct cmd_help_t help)
|
||||||
{
|
{
|
||||||
@ -2522,7 +2517,7 @@ _cmd_close(gchar **args, struct cmd_help_t help)
|
|||||||
for (curr = 1; curr <= 9; curr++) {
|
for (curr = 1; curr <= 9; curr++) {
|
||||||
if (ui_win_exists(curr)) {
|
if (ui_win_exists(curr)) {
|
||||||
if (conn_status == JABBER_CONNECTED) {
|
if (conn_status == JABBER_CONNECTED) {
|
||||||
_close_connected_win(curr);
|
ui_close_connected_win(curr);
|
||||||
}
|
}
|
||||||
ui_close_win(curr);
|
ui_close_win(curr);
|
||||||
count++;
|
count++;
|
||||||
@ -2540,7 +2535,7 @@ _cmd_close(gchar **args, struct cmd_help_t help)
|
|||||||
for (curr = 1; curr <= 9; curr++) {
|
for (curr = 1; curr <= 9; curr++) {
|
||||||
if (ui_win_exists(curr) && (ui_win_unread(curr) == 0)) {
|
if (ui_win_exists(curr) && (ui_win_unread(curr) == 0)) {
|
||||||
if (conn_status == JABBER_CONNECTED) {
|
if (conn_status == JABBER_CONNECTED) {
|
||||||
_close_connected_win(curr);
|
ui_close_connected_win(curr);
|
||||||
}
|
}
|
||||||
ui_close_win(curr);
|
ui_close_win(curr);
|
||||||
count++;
|
count++;
|
||||||
@ -2581,7 +2576,7 @@ _cmd_close(gchar **args, struct cmd_help_t help)
|
|||||||
|
|
||||||
// handle leaving rooms, or chat
|
// handle leaving rooms, or chat
|
||||||
if (conn_status == JABBER_CONNECTED) {
|
if (conn_status == JABBER_CONNECTED) {
|
||||||
_close_connected_win(index);
|
ui_close_connected_win(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
// close the window
|
// close the window
|
||||||
|
@ -84,6 +84,7 @@ static void _win_resize_all(void);
|
|||||||
static void _win_show_history(WINDOW *win, int win_index,
|
static void _win_show_history(WINDOW *win, int win_index,
|
||||||
const char * const contact);
|
const char * const contact);
|
||||||
static void _ui_draw_win_title(void);
|
static void _ui_draw_win_title(void);
|
||||||
|
gboolean _tidy(void);
|
||||||
|
|
||||||
void
|
void
|
||||||
ui_init(void)
|
ui_init(void)
|
||||||
@ -507,6 +508,28 @@ ui_handle_special_keys(const wint_t * const ch, const char * const inp,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ui_close_connected_win(int index)
|
||||||
|
{
|
||||||
|
win_type_t win_type = ui_win_type(index);
|
||||||
|
if (win_type == WIN_MUC) {
|
||||||
|
char *room_jid = ui_recipient(index);
|
||||||
|
presence_leave_chat_room(room_jid);
|
||||||
|
} else if ((win_type == WIN_CHAT) || (win_type == WIN_PRIVATE)) {
|
||||||
|
|
||||||
|
if (prefs_get_boolean(PREF_STATES)) {
|
||||||
|
char *recipient = ui_recipient(index);
|
||||||
|
|
||||||
|
// send <gone/> chat state before closing
|
||||||
|
if (chat_session_get_recipient_supports(recipient)) {
|
||||||
|
chat_session_set_gone(recipient);
|
||||||
|
message_send_gone(recipient);
|
||||||
|
chat_session_end(recipient);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ui_switch_win(const int i)
|
ui_switch_win(const int i)
|
||||||
{
|
{
|
||||||
@ -555,7 +578,8 @@ ui_close_current(void)
|
|||||||
current_win_dirty = TRUE;
|
current_win_dirty = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ui_close_win(int index)
|
void
|
||||||
|
ui_close_win(int index)
|
||||||
{
|
{
|
||||||
win_free(windows[index]);
|
win_free(windows[index]);
|
||||||
windows[index] = NULL;
|
windows[index] = NULL;
|
||||||
@ -571,6 +595,43 @@ void ui_close_win(int index)
|
|||||||
current_win_dirty = TRUE;
|
current_win_dirty = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ui_tidy_wins(void)
|
||||||
|
{
|
||||||
|
gboolean tidied = _tidy();
|
||||||
|
|
||||||
|
if (tidied) {
|
||||||
|
cons_show("Windows tidied.");
|
||||||
|
} else {
|
||||||
|
cons_show("No tidy needed.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ui_prune_wins(void)
|
||||||
|
{
|
||||||
|
jabber_conn_status_t conn_status = jabber_get_connection_status();
|
||||||
|
int curr = 0;
|
||||||
|
gboolean pruned = FALSE;
|
||||||
|
|
||||||
|
for (curr = 1; curr <= 9; curr++) {
|
||||||
|
if (ui_win_exists(curr) && (ui_win_unread(curr) == 0)) {
|
||||||
|
if (conn_status == JABBER_CONNECTED) {
|
||||||
|
ui_close_connected_win(curr);
|
||||||
|
}
|
||||||
|
ui_close_win(curr);
|
||||||
|
pruned = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_tidy();
|
||||||
|
if (pruned) {
|
||||||
|
cons_show("Windows pruned.");
|
||||||
|
} else {
|
||||||
|
cons_show("No prune needed.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
win_type_t
|
win_type_t
|
||||||
ui_current_win_type(void)
|
ui_current_win_type(void)
|
||||||
{
|
{
|
||||||
@ -1568,3 +1629,35 @@ _set_current(int index)
|
|||||||
current = windows[current_index];
|
current = windows[current_index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
_tidy(void)
|
||||||
|
{
|
||||||
|
int gap = 1;
|
||||||
|
int filler = 1;
|
||||||
|
gboolean tidied = FALSE;
|
||||||
|
|
||||||
|
for (gap = 1; gap < NUM_WINS; gap++) {
|
||||||
|
// if a gap
|
||||||
|
if (!ui_win_exists(gap)) {
|
||||||
|
|
||||||
|
// find next used window and move into gap
|
||||||
|
for (filler = gap + 1; filler < NUM_WINS; filler++) {
|
||||||
|
if (ui_win_exists(filler)) {
|
||||||
|
windows[gap] = windows[filler];
|
||||||
|
if (windows[gap]->unread > 0) {
|
||||||
|
status_bar_new(gap);
|
||||||
|
} else {
|
||||||
|
status_bar_active(gap);
|
||||||
|
}
|
||||||
|
windows[filler] = NULL;
|
||||||
|
status_bar_inactive(filler);
|
||||||
|
tidied = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tidied;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -64,6 +64,7 @@ void ui_print_error_from_recipient(const char * const from, const char *err_msg)
|
|||||||
void ui_print_system_msg_from_recipient(const char * const from, const char *message);
|
void ui_print_system_msg_from_recipient(const char * const from, const char *message);
|
||||||
gint ui_unread(void);
|
gint ui_unread(void);
|
||||||
void ui_console_dirty(void);
|
void ui_console_dirty(void);
|
||||||
|
void ui_close_connected_win(int index);
|
||||||
|
|
||||||
// current window actions
|
// current window actions
|
||||||
void ui_close_current(void);
|
void ui_close_current(void);
|
||||||
@ -123,6 +124,9 @@ void ui_duck(const char * const query);
|
|||||||
void ui_duck_result(const char * const result);
|
void ui_duck_result(const char * const result);
|
||||||
gboolean ui_duck_exists(void);
|
gboolean ui_duck_exists(void);
|
||||||
|
|
||||||
|
void ui_tidy_wins(void);
|
||||||
|
void ui_prune_wins(void);
|
||||||
|
|
||||||
// create windows
|
// create windows
|
||||||
void create_title_bar(void);
|
void create_title_bar(void);
|
||||||
void create_status_bar(void);
|
void create_status_bar(void);
|
||||||
|
Loading…
Reference in New Issue
Block a user