0
1
mirror of https://github.com/profanity-im/profanity.git synced 2025-07-26 12:14:28 -04:00

Merge pull request #2033 from profanity-im/some-improvements

Some improvements
This commit is contained in:
Michael Vetter 2025-04-16 10:25:56 +02:00 committed by GitHub
commit 0b767d39d1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 110 additions and 331 deletions

View File

@ -1190,7 +1190,8 @@ static const struct cmd_t command_defs[] = {
"Time formats are strings supported by g_date_time_format. "
"See https://developer.gnome.org/glib/stable/glib-GDateTime.html#g-date-time-format for more details. "
"Setting the format to an unsupported string, will display the string. "
"If the format contains spaces, it must be surrounded with double quotes.")
"If the format contains spaces, it must be surrounded with double quotes. "
"It is possible to pass format as 'iso8601' in order to set the time format according to ISO-8601 (only local time, without Time zone designator).")
CMD_ARGS(
{ "console set <format>", "Set time format for console window." },
{ "console off", "Do not show time in console window." },
@ -1216,7 +1217,8 @@ static const struct cmd_t command_defs[] = {
"/time xml off",
"/time statusbar set %H:%M",
"/time lastactivity set \"%d-%m-%y %H:%M:%S\"",
"/time all set \"%d-%m-%y %H:%M:%S\"")
"/time all set \"%d-%m-%y %H:%M:%S\"",
"/time all set iso8601")
},
{ CMD_PREAMBLE("/inpblock",

View File

@ -5297,217 +5297,67 @@ cmd_wrap(ProfWin* window, const char* const command, gchar** args)
gboolean
cmd_time(ProfWin* window, const char* const command, gchar** args)
{
if (g_strcmp0(args[0], "lastactivity") == 0) {
const struct time_preferences
{
preference_t pref;
const char *name, *description;
} time_prefs[] = {
{ .pref = PREF_TIME_LASTACTIVITY, .name = "lastactivity", .description = "Last activity" },
{ .pref = PREF_TIME_CONSOLE, .name = "console", .description = "Console" },
{ .pref = PREF_TIME_STATUSBAR, .name = "statusbar", .description = "Status bar" },
{ .pref = PREF_TIME_CHAT, .name = "chat", .description = "Chat" },
{ .pref = PREF_TIME_MUC, .name = "muc", .description = "MUC" },
{ .pref = PREF_TIME_CONFIG, .name = "config", .description = "Config" },
{ .pref = PREF_TIME_PRIVATE, .name = "private", .description = "Private chat" },
{ .pref = PREF_TIME_XMLCONSOLE, .name = "xml", .description = "XML Console" },
{ .pref = PREF_TIME_VCARD, .name = "vcard", .description = "vCard" },
};
gboolean redraw = FALSE;
gboolean set_all = g_strcmp0(args[0], "all") == 0;
for (size_t n = 0; n < ARRAY_SIZE(time_prefs); ++n) {
if (!set_all && g_strcmp0(args[0], time_prefs[n].name) != 0)
continue;
const struct time_preferences* tp = &time_prefs[n];
if (args[1] == NULL) {
auto_gchar gchar* format = prefs_get_string(PREF_TIME_LASTACTIVITY);
cons_show("Last activity time format: '%s'.", format);
return TRUE;
if (set_all) {
cons_time_setting();
return TRUE;
}
auto_gchar gchar* format = prefs_get_string(tp->pref);
cons_show("%s time format: '%s'.", tp->description, format);
} else if (g_strcmp0(args[1], "set") == 0 && args[2] != NULL) {
prefs_set_string(PREF_TIME_LASTACTIVITY, args[2]);
cons_show("Last activity time format set to '%s'.", args[2]);
ui_redraw();
return TRUE;
const struct format_strings
{
const char *name, *format;
} format_strings[] = {
{ .name = "iso8601", .format = "%Y-%m-%dT%H:%M:%S" },
};
const gchar* set_arg = args[2];
for (size_t m = 0; m < ARRAY_SIZE(format_strings); ++m) {
if (g_strcmp0(args[2], format_strings[m].name) == 0) {
set_arg = format_strings[m].format;
break;
}
}
prefs_set_string(tp->pref, set_arg);
cons_show("%s time format set to '%s'.", tp->description, args[2]);
redraw = TRUE;
} else if (g_strcmp0(args[1], "off") == 0) {
cons_show("Last activity time cannot be disabled.");
ui_redraw();
return TRUE;
if (tp->pref == PREF_TIME_LASTACTIVITY) {
cons_show("%s time display cannot be disabled.", tp->description);
} else {
prefs_set_string(tp->pref, "off");
cons_show("%s time display disabled.", tp->description);
redraw = TRUE;
}
} else {
cons_bad_cmd_usage(command);
return TRUE;
}
} else if (g_strcmp0(args[0], "statusbar") == 0) {
if (args[1] == NULL) {
auto_gchar gchar* format = prefs_get_string(PREF_TIME_STATUSBAR);
cons_show("Status bar time format: '%s'.", format);
return TRUE;
} else if (g_strcmp0(args[1], "set") == 0 && args[2] != NULL) {
prefs_set_string(PREF_TIME_STATUSBAR, args[2]);
cons_show("Status bar time format set to '%s'.", args[2]);
ui_redraw();
return TRUE;
} else if (g_strcmp0(args[1], "off") == 0) {
prefs_set_string(PREF_TIME_STATUSBAR, "off");
cons_show("Status bar time display disabled.");
ui_redraw();
return TRUE;
} else {
cons_bad_cmd_usage(command);
return TRUE;
}
} else if (g_strcmp0(args[0], "console") == 0) {
if (args[1] == NULL) {
auto_gchar gchar* format = prefs_get_string(PREF_TIME_CONSOLE);
cons_show("Console time format: '%s'.", format);
return TRUE;
} else if (g_strcmp0(args[1], "set") == 0 && args[2] != NULL) {
prefs_set_string(PREF_TIME_CONSOLE, args[2]);
cons_show("Console time format set to '%s'.", args[2]);
wins_resize_all();
return TRUE;
} else if (g_strcmp0(args[1], "off") == 0) {
prefs_set_string(PREF_TIME_CONSOLE, "off");
cons_show("Console time display disabled.");
wins_resize_all();
return TRUE;
} else {
cons_bad_cmd_usage(command);
return TRUE;
}
} else if (g_strcmp0(args[0], "chat") == 0) {
if (args[1] == NULL) {
auto_gchar gchar* format = prefs_get_string(PREF_TIME_CHAT);
cons_show("Chat time format: '%s'.", format);
return TRUE;
} else if (g_strcmp0(args[1], "set") == 0 && args[2] != NULL) {
prefs_set_string(PREF_TIME_CHAT, args[2]);
cons_show("Chat time format set to '%s'.", args[2]);
wins_resize_all();
return TRUE;
} else if (g_strcmp0(args[1], "off") == 0) {
prefs_set_string(PREF_TIME_CHAT, "off");
cons_show("Chat time display disabled.");
wins_resize_all();
return TRUE;
} else {
cons_bad_cmd_usage(command);
return TRUE;
}
} else if (g_strcmp0(args[0], "muc") == 0) {
if (args[1] == NULL) {
auto_gchar gchar* format = prefs_get_string(PREF_TIME_MUC);
cons_show("MUC time format: '%s'.", format);
return TRUE;
} else if (g_strcmp0(args[1], "set") == 0 && args[2] != NULL) {
prefs_set_string(PREF_TIME_MUC, args[2]);
cons_show("MUC time format set to '%s'.", args[2]);
wins_resize_all();
return TRUE;
} else if (g_strcmp0(args[1], "off") == 0) {
prefs_set_string(PREF_TIME_MUC, "off");
cons_show("MUC time display disabled.");
wins_resize_all();
return TRUE;
} else {
cons_bad_cmd_usage(command);
return TRUE;
}
} else if (g_strcmp0(args[0], "config") == 0) {
if (args[1] == NULL) {
auto_gchar gchar* format = prefs_get_string(PREF_TIME_CONFIG);
cons_show("config time format: '%s'.", format);
return TRUE;
} else if (g_strcmp0(args[1], "set") == 0 && args[2] != NULL) {
prefs_set_string(PREF_TIME_CONFIG, args[2]);
cons_show("config time format set to '%s'.", args[2]);
wins_resize_all();
return TRUE;
} else if (g_strcmp0(args[1], "off") == 0) {
prefs_set_string(PREF_TIME_CONFIG, "off");
cons_show("config time display disabled.");
wins_resize_all();
return TRUE;
} else {
cons_bad_cmd_usage(command);
return TRUE;
}
} else if (g_strcmp0(args[0], "private") == 0) {
if (args[1] == NULL) {
auto_gchar gchar* format = prefs_get_string(PREF_TIME_PRIVATE);
cons_show("Private chat time format: '%s'.", format);
return TRUE;
} else if (g_strcmp0(args[1], "set") == 0 && args[2] != NULL) {
prefs_set_string(PREF_TIME_PRIVATE, args[2]);
cons_show("Private chat time format set to '%s'.", args[2]);
wins_resize_all();
return TRUE;
} else if (g_strcmp0(args[1], "off") == 0) {
prefs_set_string(PREF_TIME_PRIVATE, "off");
cons_show("Private chat time display disabled.");
wins_resize_all();
return TRUE;
} else {
cons_bad_cmd_usage(command);
return TRUE;
}
} else if (g_strcmp0(args[0], "xml") == 0) {
if (args[1] == NULL) {
auto_gchar gchar* format = prefs_get_string(PREF_TIME_XMLCONSOLE);
cons_show("XML Console time format: '%s'.", format);
return TRUE;
} else if (g_strcmp0(args[1], "set") == 0 && args[2] != NULL) {
prefs_set_string(PREF_TIME_XMLCONSOLE, args[2]);
cons_show("XML Console time format set to '%s'.", args[2]);
wins_resize_all();
return TRUE;
} else if (g_strcmp0(args[1], "off") == 0) {
prefs_set_string(PREF_TIME_XMLCONSOLE, "off");
cons_show("XML Console time display disabled.");
wins_resize_all();
return TRUE;
} else {
cons_bad_cmd_usage(command);
return TRUE;
}
} else if (g_strcmp0(args[0], "all") == 0) {
if (args[1] == NULL) {
cons_time_setting();
return TRUE;
} else if (g_strcmp0(args[1], "set") == 0 && args[2] != NULL) {
prefs_set_string(PREF_TIME_CONSOLE, args[2]);
cons_show("Console time format set to '%s'.", args[2]);
prefs_set_string(PREF_TIME_CHAT, args[2]);
cons_show("Chat time format set to '%s'.", args[2]);
prefs_set_string(PREF_TIME_MUC, args[2]);
cons_show("MUC time format set to '%s'.", args[2]);
prefs_set_string(PREF_TIME_CONFIG, args[2]);
cons_show("config time format set to '%s'.", args[2]);
prefs_set_string(PREF_TIME_PRIVATE, args[2]);
cons_show("Private chat time format set to '%s'.", args[2]);
prefs_set_string(PREF_TIME_XMLCONSOLE, args[2]);
cons_show("XML Console time format set to '%s'.", args[2]);
wins_resize_all();
return TRUE;
} else if (g_strcmp0(args[1], "off") == 0) {
prefs_set_string(PREF_TIME_CONSOLE, "off");
cons_show("Console time display disabled.");
prefs_set_string(PREF_TIME_CHAT, "off");
cons_show("Chat time display disabled.");
prefs_set_string(PREF_TIME_MUC, "off");
cons_show("MUC time display disabled.");
prefs_set_string(PREF_TIME_CONFIG, "off");
cons_show("config time display disabled.");
prefs_set_string(PREF_TIME_PRIVATE, "off");
cons_show("config time display disabled.");
prefs_set_string(PREF_TIME_XMLCONSOLE, "off");
cons_show("XML Console time display disabled.");
ui_redraw();
return TRUE;
} else {
cons_bad_cmd_usage(command);
return TRUE;
}
} else if (g_strcmp0(args[0], "vcard") == 0) {
if (args[1] == NULL) {
auto_gchar gchar* format = prefs_get_string(PREF_TIME_VCARD);
cons_show("vCard time format: %s", format);
return TRUE;
} else if (g_strcmp0(args[1], "set") == 0 && args[2] != NULL) {
prefs_set_string(PREF_TIME_VCARD, args[2]);
cons_show("vCard time format set to '%s'.", args[2]);
ui_redraw();
return TRUE;
} else if (g_strcmp0(args[1], "off") == 0) {
cons_show("vCard time cannot be disabled.");
ui_redraw();
return TRUE;
} else {
cons_bad_cmd_usage(command);
return TRUE;
}
} else {
cons_bad_cmd_usage(command);
return TRUE;
}
if (redraw)
ui_redraw();
return TRUE;
}
gboolean

View File

@ -600,7 +600,7 @@ prefs_get_string_with_locale(preference_t pref, gchar* locale)
* @param new_value The new string value to set. Pass NULL to remove the key.
*/
void
prefs_set_string(preference_t pref, gchar* new_value)
prefs_set_string(preference_t pref, const gchar* new_value)
{
const char* group = _get_group(pref);
const char* key = _get_key(pref);

View File

@ -331,7 +331,7 @@ gboolean prefs_get_boolean(preference_t pref);
void prefs_set_boolean(preference_t pref, gboolean value);
gchar* prefs_get_string(preference_t pref);
gchar* prefs_get_string_with_locale(preference_t pref, gchar* locale);
void prefs_set_string(preference_t pref, gchar* new_value);
void prefs_set_string(preference_t pref, const gchar* new_value);
void prefs_set_string_with_option(preference_t pref, char* option, char* value);
void prefs_set_string_list_with_option(preference_t pref, char* option, const gchar* const* values);

View File

@ -701,12 +701,13 @@ win_page_down(ProfWin* window, int scroll_size)
auto_gchar gchar* start = g_date_time_format_iso8601(last_entry->time);
GDateTime* now = g_date_time_new_now_local();
gchar* end_date = g_date_time_format_iso8601(now);
g_date_time_unref(now);
if (*scroll_state != WIN_SCROLL_REACHED_BOTTOM && !chatwin_db_history((ProfChatWin*)window, start, end_date, FALSE)) {
*scroll_state = WIN_SCROLL_REACHED_BOTTOM;
} else if (*scroll_state == WIN_SCROLL_REACHED_BOTTOM) {
g_free(end_date);
}
g_date_time_unref(now);
int offset = last_entry->y_end_pos - 1;
*page_start = offset - page_space + scroll_size;
}

View File

@ -57,6 +57,7 @@
#endif
static GHashTable* windows;
static GList *keys, *values;
static int current;
static Autocomplete wins_ac;
static Autocomplete wins_close_ac;
@ -64,13 +65,35 @@ static Autocomplete wins_close_ac;
static int _wins_cmp_num(gconstpointer a, gconstpointer b);
static int _wins_get_next_available_num(GList* used);
static void
_wins_htable_update(void)
{
if (values)
g_list_free(values);
if (keys)
g_list_free(keys);
keys = g_hash_table_get_keys(windows);
keys = g_list_sort(keys, _wins_cmp_num);
values = g_hash_table_get_values(windows);
}
static gboolean
_wins_htable_insert(GHashTable* hash_table,
gpointer key,
gpointer value)
{
gboolean ret = g_hash_table_insert(hash_table, key, value);
_wins_htable_update();
return ret;
}
void
wins_init(void)
{
windows = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, (GDestroyNotify)win_free);
ProfWin* console = win_create_console();
g_hash_table_insert(windows, GINT_TO_POINTER(1), console);
_wins_htable_insert(windows, GINT_TO_POINTER(1), console);
current = 1;
@ -98,7 +121,6 @@ wins_chat_exists(const char* const barejid)
ProfChatWin*
wins_get_chat(const char* const barejid)
{
GList* values = g_hash_table_get_values(windows);
GList* curr = values;
while (curr) {
@ -106,14 +128,12 @@ wins_get_chat(const char* const barejid)
if (window->type == WIN_CHAT) {
ProfChatWin* chatwin = (ProfChatWin*)window;
if (g_strcmp0(chatwin->barejid, barejid) == 0) {
g_list_free(values);
return chatwin;
}
}
curr = g_list_next(curr);
}
g_list_free(values);
return NULL;
}
@ -127,7 +147,6 @@ GList*
wins_get_chat_unsubscribed(void)
{
GList* result = NULL;
GList* values = g_hash_table_get_values(windows);
GList* curr = values;
while (curr) {
@ -142,14 +161,12 @@ wins_get_chat_unsubscribed(void)
curr = g_list_next(curr);
}
g_list_free(values);
return result;
}
ProfConfWin*
wins_get_conf(const char* const roomjid)
{
GList* values = g_hash_table_get_values(windows);
GList* curr = values;
while (curr) {
@ -157,21 +174,18 @@ wins_get_conf(const char* const roomjid)
if (window->type == WIN_CONFIG) {
ProfConfWin* confwin = (ProfConfWin*)window;
if (g_strcmp0(confwin->roomjid, roomjid) == 0) {
g_list_free(values);
return confwin;
}
}
curr = g_list_next(curr);
}
g_list_free(values);
return NULL;
}
ProfMucWin*
wins_get_muc(const char* const roomjid)
{
GList* values = g_hash_table_get_values(windows);
GList* curr = values;
while (curr) {
@ -179,21 +193,18 @@ wins_get_muc(const char* const roomjid)
if (window->type == WIN_MUC) {
ProfMucWin* mucwin = (ProfMucWin*)window;
if (g_strcmp0(mucwin->roomjid, roomjid) == 0) {
g_list_free(values);
return mucwin;
}
}
curr = g_list_next(curr);
}
g_list_free(values);
return NULL;
}
ProfPrivateWin*
wins_get_private(const char* const fulljid)
{
GList* values = g_hash_table_get_values(windows);
GList* curr = values;
while (curr) {
@ -201,21 +212,18 @@ wins_get_private(const char* const fulljid)
if (window->type == WIN_PRIVATE) {
ProfPrivateWin* privatewin = (ProfPrivateWin*)window;
if (g_strcmp0(privatewin->fulljid, fulljid) == 0) {
g_list_free(values);
return privatewin;
}
}
curr = g_list_next(curr);
}
g_list_free(values);
return NULL;
}
ProfPluginWin*
wins_get_plugin(const char* const tag)
{
GList* values = g_hash_table_get_values(windows);
GList* curr = values;
while (curr) {
@ -223,14 +231,12 @@ wins_get_plugin(const char* const tag)
if (window->type == WIN_PLUGIN) {
ProfPluginWin* pluginwin = (ProfPluginWin*)window;
if (g_strcmp0(pluginwin->tag, tag) == 0) {
g_list_free(values);
return pluginwin;
}
}
curr = g_list_next(curr);
}
g_list_free(values);
return NULL;
}
@ -254,7 +260,6 @@ wins_get_private_chats(const char* const roomjid)
GList* result = NULL;
GString* prefix = g_string_new(roomjid);
g_string_append(prefix, "/");
GList* values = g_hash_table_get_values(windows);
GList* curr = values;
while (curr) {
@ -268,7 +273,6 @@ wins_get_private_chats(const char* const roomjid)
curr = g_list_next(curr);
}
g_list_free(values);
g_string_free(prefix, TRUE);
return result;
}
@ -332,7 +336,7 @@ wins_get_current(void)
GList*
wins_get_nums(void)
{
return g_hash_table_get_keys(windows);
return g_list_copy(keys);
}
void
@ -431,11 +435,7 @@ wins_get_by_string(const char* str)
ProfWin*
wins_get_next(void)
{
// get and sort win nums
GList* keys = g_hash_table_get_keys(windows);
keys = g_list_sort(keys, _wins_cmp_num);
GList* curr = keys;
// find our place in the list
while (curr) {
if (current == GPOINTER_TO_INT(curr->data)) {
@ -448,23 +448,16 @@ wins_get_next(void)
curr = g_list_next(curr);
if (curr) {
int next = GPOINTER_TO_INT(curr->data);
g_list_free(keys);
return wins_get_by_num(next);
// otherwise return the first window (console)
} else {
g_list_free(keys);
return wins_get_console();
}
// otherwise return the first window (console)
return wins_get_console();
}
ProfWin*
wins_get_previous(void)
{
// get and sort win nums
GList* keys = g_hash_table_get_keys(windows);
keys = g_list_sort(keys, _wins_cmp_num);
GList* curr = keys;
// find our place in the list
while (curr) {
if (current == GPOINTER_TO_INT(curr->data)) {
@ -477,33 +470,27 @@ wins_get_previous(void)
curr = g_list_previous(curr);
if (curr) {
int previous = GPOINTER_TO_INT(curr->data);
g_list_free(keys);
return wins_get_by_num(previous);
// otherwise return the last window
} else {
int new_num = GPOINTER_TO_INT(g_list_last(keys)->data);
g_list_free(keys);
return wins_get_by_num(new_num);
}
// otherwise return the last window
int new_num = GPOINTER_TO_INT(g_list_last(keys)->data);
return wins_get_by_num(new_num);
}
int
wins_get_num(ProfWin* window)
{
GList* keys = g_hash_table_get_keys(windows);
GList* curr = keys;
while (curr) {
gconstpointer num_p = curr->data;
ProfWin* curr_win = g_hash_table_lookup(windows, num_p);
if (curr_win == window) {
g_list_free(keys);
return GPOINTER_TO_INT(num_p);
}
curr = g_list_next(curr);
}
g_list_free(keys);
return -1;
}
@ -596,6 +583,7 @@ wins_close_by_num(int i)
}
g_hash_table_remove(windows, GINT_TO_POINTER(i));
_wins_htable_update();
status_bar_inactive(i);
}
}
@ -615,11 +603,9 @@ wins_is_current(ProfWin* window)
ProfWin*
wins_new_xmlconsole(void)
{
GList* keys = g_hash_table_get_keys(windows);
int result = _wins_get_next_available_num(keys);
g_list_free(keys);
ProfWin* newwin = win_create_xmlconsole();
g_hash_table_insert(windows, GINT_TO_POINTER(result), newwin);
_wins_htable_insert(windows, GINT_TO_POINTER(result), newwin);
autocomplete_add(wins_ac, "xmlconsole");
autocomplete_add(wins_close_ac, "xmlconsole");
return newwin;
@ -628,11 +614,9 @@ wins_new_xmlconsole(void)
ProfWin*
wins_new_chat(const char* const barejid)
{
GList* keys = g_hash_table_get_keys(windows);
int result = _wins_get_next_available_num(keys);
g_list_free(keys);
ProfWin* newwin = win_create_chat(barejid);
g_hash_table_insert(windows, GINT_TO_POINTER(result), newwin);
_wins_htable_insert(windows, GINT_TO_POINTER(result), newwin);
autocomplete_add(wins_ac, barejid);
autocomplete_add(wins_close_ac, barejid);
@ -653,11 +637,9 @@ wins_new_chat(const char* const barejid)
ProfWin*
wins_new_muc(const char* const roomjid)
{
GList* keys = g_hash_table_get_keys(windows);
int result = _wins_get_next_available_num(keys);
g_list_free(keys);
ProfWin* newwin = win_create_muc(roomjid);
g_hash_table_insert(windows, GINT_TO_POINTER(result), newwin);
_wins_htable_insert(windows, GINT_TO_POINTER(result), newwin);
autocomplete_add(wins_ac, roomjid);
autocomplete_add(wins_close_ac, roomjid);
newwin->urls_ac = autocomplete_new();
@ -669,11 +651,9 @@ wins_new_muc(const char* const roomjid)
ProfWin*
wins_new_config(const char* const roomjid, DataForm* form, ProfConfWinCallback submit, ProfConfWinCallback cancel, const void* userdata)
{
GList* keys = g_hash_table_get_keys(windows);
int result = _wins_get_next_available_num(keys);
g_list_free(keys);
ProfWin* newwin = win_create_config(roomjid, form, submit, cancel, userdata);
g_hash_table_insert(windows, GINT_TO_POINTER(result), newwin);
_wins_htable_insert(windows, GINT_TO_POINTER(result), newwin);
return newwin;
}
@ -681,11 +661,9 @@ wins_new_config(const char* const roomjid, DataForm* form, ProfConfWinCallback s
ProfWin*
wins_new_private(const char* const fulljid)
{
GList* keys = g_hash_table_get_keys(windows);
int result = _wins_get_next_available_num(keys);
g_list_free(keys);
ProfWin* newwin = win_create_private(fulljid);
g_hash_table_insert(windows, GINT_TO_POINTER(result), newwin);
_wins_htable_insert(windows, GINT_TO_POINTER(result), newwin);
autocomplete_add(wins_ac, fulljid);
autocomplete_add(wins_close_ac, fulljid);
newwin->urls_ac = autocomplete_new();
@ -697,11 +675,9 @@ wins_new_private(const char* const fulljid)
ProfWin*
wins_new_plugin(const char* const plugin_name, const char* const tag)
{
GList* keys = g_hash_table_get_keys(windows);
int result = _wins_get_next_available_num(keys);
g_list_free(keys);
ProfWin* newwin = win_create_plugin(plugin_name, tag);
g_hash_table_insert(windows, GINT_TO_POINTER(result), newwin);
_wins_htable_insert(windows, GINT_TO_POINTER(result), newwin);
autocomplete_add(wins_ac, tag);
autocomplete_add(wins_close_ac, tag);
return newwin;
@ -710,11 +686,9 @@ wins_new_plugin(const char* const plugin_name, const char* const tag)
ProfWin*
wins_new_vcard(vCard* vcard)
{
GList* keys = g_hash_table_get_keys(windows);
int result = _wins_get_next_available_num(keys);
g_list_free(keys);
ProfWin* newwin = win_create_vcard(vcard);
g_hash_table_insert(windows, GINT_TO_POINTER(result), newwin);
_wins_htable_insert(windows, GINT_TO_POINTER(result), newwin);
return newwin;
}
@ -722,18 +696,15 @@ wins_new_vcard(vCard* vcard)
gboolean
wins_do_notify_remind(void)
{
GList* values = g_hash_table_get_values(windows);
GList* curr = values;
while (curr) {
ProfWin* window = curr->data;
if (win_notify_remind(window)) {
g_list_free(values);
return TRUE;
}
curr = g_list_next(curr);
}
g_list_free(values);
return FALSE;
}
@ -741,7 +712,6 @@ int
wins_get_total_unread(void)
{
int result = 0;
GList* values = g_hash_table_get_values(windows);
GList* curr = values;
while (curr) {
@ -749,21 +719,18 @@ wins_get_total_unread(void)
result += win_unread(window);
curr = g_list_next(curr);
}
g_list_free(values);
return result;
}
void
wins_resize_all(void)
{
GList* values = g_hash_table_get_values(windows);
GList* curr = values;
while (curr) {
ProfWin* window = curr->data;
win_resize(window);
curr = g_list_next(curr);
}
g_list_free(values);
ProfWin* current_win = wins_get_current();
win_update_virtual(current_win);
@ -795,7 +762,6 @@ wins_show_subwin(ProfWin* window)
ProfXMLWin*
wins_get_xmlconsole(void)
{
GList* values = g_hash_table_get_values(windows);
GList* curr = values;
while (curr) {
@ -803,20 +769,17 @@ wins_get_xmlconsole(void)
if (window->type == WIN_XML) {
ProfXMLWin* xmlwin = (ProfXMLWin*)window;
assert(xmlwin->memcheck == PROFXMLWIN_MEMCHECK);
g_list_free(values);
return xmlwin;
}
curr = g_list_next(curr);
}
g_list_free(values);
return NULL;
}
ProfVcardWin*
wins_get_vcard(void)
{
GList* values = g_hash_table_get_values(windows);
GList* curr = values;
while (curr) {
@ -824,13 +787,11 @@ wins_get_vcard(void)
if (window->type == WIN_VCARD) {
ProfVcardWin* vcardwin = (ProfVcardWin*)window;
assert(vcardwin->memcheck == PROFVCARDWIN_MEMCHECK);
g_list_free(values);
return vcardwin;
}
curr = g_list_next(curr);
}
g_list_free(values);
return NULL;
}
@ -838,7 +799,6 @@ GSList*
wins_get_chat_recipients(void)
{
GSList* result = NULL;
GList* values = g_hash_table_get_values(windows);
GList* curr = values;
while (curr) {
@ -849,7 +809,6 @@ wins_get_chat_recipients(void)
}
curr = g_list_next(curr);
}
g_list_free(values);
return result;
}
@ -857,7 +816,6 @@ GSList*
wins_get_prune_wins(void)
{
GSList* result = NULL;
GList* values = g_hash_table_get_values(windows);
GList* curr = values;
while (curr) {
@ -867,14 +825,12 @@ wins_get_prune_wins(void)
}
curr = g_list_next(curr);
}
g_list_free(values);
return result;
}
void
wins_lost_connection(void)
{
GList* values = g_hash_table_get_values(windows);
GList* curr = values;
while (curr) {
@ -889,13 +845,11 @@ wins_lost_connection(void)
}
curr = g_list_next(curr);
}
g_list_free(values);
}
void
wins_reestablished_connection(void)
{
GList* values = g_hash_table_get_values(windows);
GList* curr = values;
while (curr) {
@ -928,7 +882,6 @@ wins_reestablished_connection(void)
}
curr = g_list_next(curr);
}
g_list_free(values);
}
void
@ -943,7 +896,7 @@ wins_swap(int source_win, int target_win)
// target window empty
if (target == NULL) {
g_hash_table_steal(windows, GINT_TO_POINTER(source_win));
g_hash_table_insert(windows, GINT_TO_POINTER(target_win), source);
_wins_htable_insert(windows, GINT_TO_POINTER(target_win), source);
status_bar_inactive(source_win);
auto_char char* identifier = win_get_tab_identifier(source);
if (win_unread(source) > 0) {
@ -961,7 +914,7 @@ wins_swap(int source_win, int target_win)
g_hash_table_steal(windows, GINT_TO_POINTER(source_win));
g_hash_table_steal(windows, GINT_TO_POINTER(target_win));
g_hash_table_insert(windows, GINT_TO_POINTER(source_win), target);
g_hash_table_insert(windows, GINT_TO_POINTER(target_win), source);
_wins_htable_insert(windows, GINT_TO_POINTER(target_win), source);
auto_char char* source_identifier = win_get_tab_identifier(source);
auto_char char* target_identifier = win_get_tab_identifier(target);
if (win_unread(source) > 0) {
@ -1011,16 +964,9 @@ _wins_get_next_available_num(GList* used)
if (g_list_length(used) == 1) {
return 2;
} else {
GList* sorted = NULL;
GList* curr = used;
while (curr) {
sorted = g_list_insert_sorted(sorted, curr->data, _wins_cmp_num);
curr = g_list_next(curr);
}
int result = 0;
int last_num = 1;
curr = sorted;
// skip console
curr = g_list_next(curr);
while (curr) {
@ -1031,7 +977,6 @@ _wins_get_next_available_num(GList* used)
if (result == 10) {
result = 0;
}
g_list_free(sorted);
return (result);
} else {
@ -1047,7 +992,6 @@ _wins_get_next_available_num(GList* used)
result = 0;
}
g_list_free(sorted);
return result;
}
}
@ -1056,10 +1000,6 @@ gboolean
wins_tidy(void)
{
gboolean tidy_required = FALSE;
// check for gaps
GList* keys = g_hash_table_get_keys(windows);
keys = g_list_sort(keys, _wins_cmp_num);
// get last used
GList* last = g_list_last(keys);
int last_num = GPOINTER_TO_INT(last->data);
@ -1104,13 +1044,12 @@ wins_tidy(void)
g_hash_table_destroy(windows);
windows = new_windows;
_wins_htable_update();
current = 1;
ProfWin* console = wins_get_console();
ui_focus_win(console);
g_list_free(keys);
return TRUE;
} else {
g_list_free(keys);
return FALSE;
}
}
@ -1123,9 +1062,6 @@ wins_create_summary(gboolean unread)
}
GSList* result = NULL;
GList* keys = g_hash_table_get_keys(windows);
keys = g_list_sort(keys, _wins_cmp_num);
GList* curr = keys;
while (curr) {
@ -1149,8 +1085,6 @@ wins_create_summary(gboolean unread)
curr = g_list_next(curr);
}
g_list_free(keys);
return result;
}
@ -1159,8 +1093,6 @@ wins_create_summary_attention()
{
GSList* result = NULL;
GList* keys = g_hash_table_get_keys(windows);
keys = g_list_sort(keys, _wins_cmp_num);
GList* curr = keys;
while (curr) {
@ -1193,8 +1125,6 @@ wins_create_summary_attention()
curr = g_list_next(curr);
}
g_list_free(keys);
return result;
}
@ -1225,6 +1155,11 @@ win_close_reset_search_attempts(void)
void
wins_destroy(void)
{
if (values)
g_list_free(values);
if (keys)
g_list_free(keys);
values = keys = NULL;
g_hash_table_destroy(windows);
windows = NULL;
autocomplete_free(wins_ac);
@ -1237,9 +1172,7 @@ ProfWin*
wins_get_next_unread(void)
{
// get and sort win nums
GList* values = g_hash_table_get_keys(windows);
values = g_list_sort(values, _wins_cmp_num);
GList* curr = values;
GList* curr = keys;
while (curr) {
int curr_win_num = GPOINTER_TO_INT(curr->data);
@ -1247,14 +1180,12 @@ wins_get_next_unread(void)
// test if window has unread messages
if (win_unread(window) > 0) {
g_list_free(values);
return window;
}
curr = g_list_next(curr);
}
g_list_free(values);
return NULL;
}
@ -1262,8 +1193,6 @@ ProfWin*
wins_get_next_attention(void)
{
// get and sort win nums
GList* values = g_hash_table_get_values(windows);
values = g_list_sort(values, _wins_cmp_num);
GList* curr = values;
ProfWin* current_window = wins_get_by_num(current);
@ -1283,7 +1212,6 @@ wins_get_next_attention(void)
while (current_window && curr) {
ProfWin* window = curr->data;
if (win_has_attention(window)) {
g_list_free(values);
return window;
}
curr = g_list_next(curr);
@ -1297,13 +1225,11 @@ wins_get_next_attention(void)
break;
}
if (win_has_attention(window)) {
g_list_free(values);
return window;
}
curr = g_list_next(curr);
}
g_list_free(values);
return NULL;
}

View File

@ -201,7 +201,7 @@ roster_set_handler(xmpp_stanza_t* const stanza)
// if from attribute exists and it is not current users barejid, ignore push
const char* from = xmpp_stanza_get_from(stanza);
if (!equals_our_barejid(from)) {
if (from && !equals_our_barejid(from)) {
log_warning("Received alleged roster push from: %s", from);
return;
}