# HG changeset patch # User Mikael Berthe # Date 1269180813 -3600 # Node ID b135572fcd2658071f74436aa0ff09c35adeccf4 # Parent 07e73049f7c5ff412dd5783deaca832623bda738 Add urgent flag per screen buffer diff -r 07e73049f7c5 -r b135572fcd26 mcabber/mcabber/api.h --- a/mcabber/mcabber/api.h Sun Mar 21 15:10:51 2010 +0100 +++ b/mcabber/mcabber/api.h Sun Mar 21 15:13:33 2010 +0100 @@ -3,7 +3,7 @@ #include // For MCABBER_BRANCH -#define MCABBER_API_VERSION 8 +#define MCABBER_API_VERSION 9 #define MCABBER_API_MIN 8 extern const gchar *mcabber_branch; diff -r 07e73049f7c5 -r b135572fcd26 mcabber/mcabber/roster.c --- a/mcabber/mcabber/roster.c Sun Mar 21 15:10:51 2010 +0100 +++ b/mcabber/mcabber/roster.c Sun Mar 21 15:13:33 2010 +0100 @@ -103,6 +103,7 @@ /* Flag used for the UI */ guint flags; + guint ui_prio; // Boolean, positive if "attention" is requested // list: user -> points to his group; group -> points to its users list GSList *list; @@ -610,6 +611,7 @@ if (roster_usr->flags & ROSTER_FLAG_MSG) unread_list_modified = TRUE; roster_usr->flags &= ~ROSTER_FLAG_MSG; + roster_usr->ui_prio = 0; if (unread_list) { GSList *node = g_slist_find(unread_list, roster_usr); if (node) @@ -645,6 +647,7 @@ if (roster_usr->flags & ROSTER_FLAG_MSG) unread_list_modified = TRUE; roster_usr->flags &= ~ROSTER_FLAG_MSG; + roster_usr->ui_prio = 0; if (unread_list) { GSList *node = g_slist_find(unread_list, roster_usr); if (node) @@ -683,6 +686,55 @@ } } +// roster_setuiprio(jid, special, prio_value, action) +// Set the "attention" priority value for the given roster item. +// Note that this function doesn't create the roster item if it doesn't exist. +void roster_setuiprio(const char *jid, guint special, guint value, + enum setuiprio_ops action) +{ + guint oldval, newval; + roster *roster_usr; + + if (special) { + roster_usr = &roster_special; + } else { + GSList *sl_user = roster_find(jid, jidsearch, + ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); + if (!sl_user) + return; + + roster_usr = (roster*)sl_user->data; + } + oldval = roster_usr->ui_prio; + + if (action == prio_max) + newval = MAX(oldval, value); + else if (action == prio_inc) + newval = oldval + value; + else // prio_set + newval = value; + + roster_usr->ui_prio = newval; +} + +guint roster_getuiprio(const char *jid, guint special) +{ + roster *roster_usr; + GSList *sl_user; + + if (special) { + roster_usr = &roster_special; + return roster_usr->ui_prio; + } + + sl_user = roster_find(jid, jidsearch, + ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT); + if (!sl_user) + return 0; + roster_usr = (roster*)sl_user->data; + return roster_usr->ui_prio; +} + const char *roster_getname(const char *jid) { GSList *sl_user; @@ -1394,6 +1446,12 @@ return roster_usr->flags; } +guint buddy_getuiprio(gpointer rosterdata) +{ + roster *roster_usr = rosterdata; + return roster_usr->ui_prio; +} + // buddy_setonserverflag() // Set the on_server flag void buddy_setonserverflag(gpointer rosterdata, guint onserver) diff -r 07e73049f7c5 -r b135572fcd26 mcabber/mcabber/roster.h --- a/mcabber/mcabber/roster.h Sun Mar 21 15:10:51 2010 +0100 +++ b/mcabber/mcabber/roster.h Sun Mar 21 15:13:33 2010 +0100 @@ -9,6 +9,14 @@ #define SPECIAL_BUFFER_STATUS_ID "[status]" +// Default UI priorities +#define ROSTER_UI_PRIO_MUC_MESSAGE 20 +#define ROSTER_UI_PRIO_MUC_HL_MESSAGE 30 +#define ROSTER_UI_PRIO_MUC_PRIV_MESSAGE 40 +#define ROSTER_UI_PRIO_PRIVATE_MESSAGE 50 +#define ROSTER_UI_PRIO_ATTENTION_MESSAGE 100 +#define ROSTER_UI_PRIO_STATUS_WIN_MESSAGE 500 + enum imstatus { offline, available, @@ -57,6 +65,12 @@ namesearch }; +enum setuiprio_ops { + prio_set, // Set priority + prio_max, // Set priority to max(specified, current) + prio_inc, // Increment priority +}; + extern char *strprintstatus[]; // Note: do not change the ordering as these values are visible @@ -166,6 +180,9 @@ const char *realjid); void roster_setflags(const char *jid, guint flags, guint value); void roster_msg_setflag(const char *jid, guint special, guint value); +void roster_setuiprio(const char *jid, guint special, guint value, + enum setuiprio_ops action); +guint roster_getuiprio(const char *jid, guint special); const char *roster_getname(const char *jid); const char *roster_getnickname(const char *jid); void roster_settype(const char *jid, guint type); @@ -226,6 +243,7 @@ void buddy_del_all_resources(gpointer rosterdata); void buddy_setflags(gpointer rosterdata, guint flags, guint value); guint buddy_getflags(gpointer rosterdata); +guint buddy_getuiprio(gpointer rosterdata); void buddy_setonserverflag(gpointer rosterdata, guint onserver); guint buddy_getonserverflag(gpointer rosterdata); GList *buddy_search_jid(const char *jid); diff -r 07e73049f7c5 -r b135572fcd26 mcabber/mcabber/screen.c --- a/mcabber/mcabber/screen.c Sun Mar 21 15:10:51 2010 +0100 +++ b/mcabber/mcabber/screen.c Sun Mar 21 15:13:33 2010 +0100 @@ -2926,6 +2926,41 @@ roster_msg_setflag(bjid, special, TRUE); } +// scr_setattentionflag_if_needed(bare_jid, special, value, action) +// Set the attention flag unless we're already in the jid buffer window +// TODO: avoid code duplication with scr_setmsgflag_if_needed() +void scr_setattentionflag_if_needed(const char *bjid, int special, + guint value, enum setuiprio_ops action) +{ + const char *current_id; + winbuf *wb; + bool iscurrentlocked = FALSE; + + if (!bjid) + return; + + wb = scr_search_window(bjid, special); + if (!wb) + return; + + if (current_buddy) { + if (special) + current_id = buddy_getname(BUDDATA(current_buddy)); + else + current_id = buddy_getjid(BUDDATA(current_buddy)); + if (current_id) { + winbuf *win_entry = scr_search_window(current_id, special); + if (!win_entry) return; + iscurrentlocked = win_entry->bd->lock; + } + } else { + current_id = NULL; + } + + if (!chatmode || !current_id || strcmp(bjid, current_id) || iscurrentlocked) + roster_setuiprio(bjid, special, value, action); +} + // scr_set_multimode() // Public function to (un)set multimode... // Convention: diff -r 07e73049f7c5 -r b135572fcd26 mcabber/mcabber/screen.h --- a/mcabber/mcabber/screen.h Sun Mar 21 15:10:51 2010 +0100 +++ b/mcabber/mcabber/screen.h Sun Mar 21 15:13:33 2010 +0100 @@ -116,6 +116,8 @@ void scr_set_multimode(int enable, char *subject); int scr_get_multimode(void); void scr_setmsgflag_if_needed(const char *jid, int special); +void scr_setattentionflag_if_needed(const char *bjid, int special, + guint value, enum setuiprio_ops action); void scr_append_multiline(const char *line); const char *scr_get_multiline(void); const char *scr_get_multimode_subj(void);