Further tab color improvements
- Combine the three properties into a single one - Finally fully fix the handling with plugins handling events TODO: Look into lastact handling of these, seems wrong
This commit is contained in:
parent
539949973c
commit
241dd69b08
@ -126,11 +126,11 @@ lastact_update(session *sess)
|
|||||||
int newidx = LACT_NONE;
|
int newidx = LACT_NONE;
|
||||||
int dia = (sess->type == SESS_DIALOG);
|
int dia = (sess->type == SESS_DIALOG);
|
||||||
|
|
||||||
if (sess->nick_said)
|
if (sess->tab_state & TAB_STATE_NEW_HILIGHT)
|
||||||
newidx = dia? LACT_QUERY_HI: LACT_CHAN_HI;
|
newidx = dia? LACT_QUERY_HI: LACT_CHAN_HI;
|
||||||
else if (sess->msg_said)
|
else if (sess->tab_state & TAB_STATE_NEW_MSG)
|
||||||
newidx = dia? LACT_QUERY: LACT_CHAN;
|
newidx = dia? LACT_QUERY: LACT_CHAN;
|
||||||
else if (sess->new_data)
|
else if (sess->tab_state & TAB_STATE_NEW_DATA)
|
||||||
newidx = dia? LACT_QUERY: LACT_CHAN_DATA;
|
newidx = dia? LACT_QUERY: LACT_CHAN_DATA;
|
||||||
|
|
||||||
/* If already first at the right position, just return */
|
/* If already first at the right position, just return */
|
||||||
|
@ -352,6 +352,13 @@ typedef enum gtk_xtext_search_flags_e {
|
|||||||
regexp = 16
|
regexp = 16
|
||||||
} gtk_xtext_search_flags;
|
} gtk_xtext_search_flags;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
TAB_STATE_NONE = 0,
|
||||||
|
TAB_STATE_NEW_DATA = (1 << 0),
|
||||||
|
TAB_STATE_NEW_MSG = (1 << 1),
|
||||||
|
TAB_STATE_NEW_HILIGHT = (1 << 2),
|
||||||
|
} tab_state_flags;
|
||||||
|
|
||||||
typedef struct session
|
typedef struct session
|
||||||
{
|
{
|
||||||
/* Per-Channel Alerts */
|
/* Per-Channel Alerts */
|
||||||
@ -406,16 +413,14 @@ typedef struct session
|
|||||||
int lastact_idx; /* the sess_list_by_lastact[] index of the list we're in.
|
int lastact_idx; /* the sess_list_by_lastact[] index of the list we're in.
|
||||||
* For valid values, see defines of LACT_*. */
|
* For valid values, see defines of LACT_*. */
|
||||||
|
|
||||||
int new_data:1; /* new data avail? (purple tab) */
|
|
||||||
int nick_said:1; /* your nick mentioned? (blue tab) */
|
|
||||||
int msg_said:1; /* new msg available? (red tab) */
|
|
||||||
|
|
||||||
int ignore_date:1;
|
int ignore_date:1;
|
||||||
int ignore_mode:1;
|
int ignore_mode:1;
|
||||||
int ignore_names:1;
|
int ignore_names:1;
|
||||||
int end_of_names:1;
|
int end_of_names:1;
|
||||||
int doing_who:1; /* /who sent on this channel */
|
int doing_who:1; /* /who sent on this channel */
|
||||||
int done_away_check:1; /* done checking for away status changes */
|
int done_away_check:1; /* done checking for away status changes */
|
||||||
|
tab_state_flags tab_state;
|
||||||
|
tab_state_flags last_tab_state; /* before event is handled */
|
||||||
gtk_xtext_search_flags lastlog_flags;
|
gtk_xtext_search_flags lastlog_flags;
|
||||||
void (*scrollback_replay_marklast) (struct session *sess);
|
void (*scrollback_replay_marklast) (struct session *sess);
|
||||||
} session;
|
} session;
|
||||||
|
@ -316,7 +316,7 @@ is_hilight (char *from, char *text, session *sess, server *serv)
|
|||||||
g_free (text);
|
g_free (text);
|
||||||
if (sess != current_tab)
|
if (sess != current_tab)
|
||||||
{
|
{
|
||||||
sess->nick_said = TRUE;
|
sess->tab_state |= TAB_STATE_NEW_HILIGHT;
|
||||||
lastact_update (sess);
|
lastact_update (sess);
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
@ -373,14 +373,9 @@ inbound_action (session *sess, char *chan, char *from, char *ip, char *text,
|
|||||||
if (sess != current_tab)
|
if (sess != current_tab)
|
||||||
{
|
{
|
||||||
if (fromme)
|
if (fromme)
|
||||||
{
|
sess->tab_state |= TAB_STATE_NEW_DATA;
|
||||||
sess->msg_said = FALSE;
|
else
|
||||||
sess->new_data = TRUE;
|
sess->tab_state |= TAB_STATE_NEW_MSG;
|
||||||
} else
|
|
||||||
{
|
|
||||||
sess->msg_said = TRUE;
|
|
||||||
sess->new_data = FALSE;
|
|
||||||
}
|
|
||||||
lastact_update (sess);
|
lastact_update (sess);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -448,8 +443,7 @@ inbound_chanmsg (server *serv, session *sess, char *chan, char *from,
|
|||||||
|
|
||||||
if (sess != current_tab)
|
if (sess != current_tab)
|
||||||
{
|
{
|
||||||
sess->msg_said = TRUE;
|
sess->tab_state |= TAB_STATE_NEW_MSG;
|
||||||
sess->new_data = FALSE;
|
|
||||||
lastact_update (sess);
|
lastact_update (sess);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -631,7 +631,7 @@ cmd_clear (struct session *sess, char *tbuf, char *word[], char *word_eol[])
|
|||||||
while (list)
|
while (list)
|
||||||
{
|
{
|
||||||
sess = list->data;
|
sess = list->data;
|
||||||
if (!sess->nick_said)
|
if (!(sess->tab_state & TAB_STATE_NEW_HILIGHT))
|
||||||
fe_text_clear (list->data, 0);
|
fe_text_clear (list->data, 0);
|
||||||
list = list->next;
|
list = list->next;
|
||||||
}
|
}
|
||||||
|
@ -2008,6 +2008,7 @@ text_emit (int index, session *sess, char *a, char *b, char *c, char *d,
|
|||||||
{
|
{
|
||||||
char *word[PDIWORDS];
|
char *word[PDIWORDS];
|
||||||
int i;
|
int i;
|
||||||
|
tab_state_flags current_state = sess->tab_state;
|
||||||
unsigned int stripcolor_args = (chanopt_is_set (prefs.hex_text_stripcolor_msg, sess->text_strip) ? 0xFFFFFFFF : 0);
|
unsigned int stripcolor_args = (chanopt_is_set (prefs.hex_text_stripcolor_msg, sess->text_strip) ? 0xFFFFFFFF : 0);
|
||||||
char tbuf[NICKLEN + 4];
|
char tbuf[NICKLEN + 4];
|
||||||
|
|
||||||
@ -2026,14 +2027,12 @@ text_emit (int index, session *sess, char *a, char *b, char *c, char *d,
|
|||||||
for (i = 5; i < PDIWORDS; i++)
|
for (i = 5; i < PDIWORDS; i++)
|
||||||
word[i] = "\000";
|
word[i] = "\000";
|
||||||
|
|
||||||
|
/* We want to ignore the tab state if the plugin emits new events
|
||||||
|
* and restore it if it doesn't eat the current one */
|
||||||
|
sess->tab_state = sess->last_tab_state;
|
||||||
if (plugin_emit_print (sess, word, timestamp))
|
if (plugin_emit_print (sess, word, timestamp))
|
||||||
{
|
|
||||||
/* Reset the state that never printed */
|
|
||||||
sess->nick_said = FALSE;
|
|
||||||
sess->msg_said = FALSE;
|
|
||||||
sess->new_data = FALSE;
|
|
||||||
return;
|
return;
|
||||||
}
|
sess->tab_state = current_state;
|
||||||
|
|
||||||
/* If a plugin's callback executes "/close", 'sess' may be invalid */
|
/* If a plugin's callback executes "/close", 'sess' may be invalid */
|
||||||
if (!is_session (sess))
|
if (!is_session (sess))
|
||||||
|
@ -664,14 +664,10 @@ fe_print_text (struct session *sess, char *text, time_t stamp,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (sess == current_tab)
|
if (sess == current_tab)
|
||||||
{
|
fe_set_tab_color (sess, 0);
|
||||||
sess->nick_said = FALSE;
|
else if (sess->tab_state & TAB_STATE_NEW_HILIGHT)
|
||||||
sess->msg_said = FALSE;
|
|
||||||
sess->new_data = FALSE;
|
|
||||||
}
|
|
||||||
else if (sess->nick_said)
|
|
||||||
fe_set_tab_color (sess, 3);
|
fe_set_tab_color (sess, 3);
|
||||||
else if (sess->msg_said)
|
else if (sess->tab_state & TAB_STATE_NEW_MSG)
|
||||||
fe_set_tab_color (sess, 2);
|
fe_set_tab_color (sess, 2);
|
||||||
else
|
else
|
||||||
fe_set_tab_color (sess, 1);
|
fe_set_tab_color (sess, 1);
|
||||||
|
@ -178,62 +178,50 @@ fe_set_tab_color (struct session *sess, int col)
|
|||||||
switch (col)
|
switch (col)
|
||||||
{
|
{
|
||||||
case 0: /* no particular color (theme default) */
|
case 0: /* no particular color (theme default) */
|
||||||
sess->new_data = FALSE;
|
sess->tab_state = TAB_STATE_NONE;
|
||||||
sess->msg_said = FALSE;
|
|
||||||
sess->nick_said = FALSE;
|
|
||||||
chan_set_color (sess->res->tab, plain_list);
|
chan_set_color (sess->res->tab, plain_list);
|
||||||
break;
|
break;
|
||||||
case 1: /* new data has been displayed (dark red) */
|
case 1: /* new data has been displayed (dark red) */
|
||||||
sess->new_data = TRUE;
|
sess->tab_state = TAB_STATE_NEW_DATA;
|
||||||
sess->msg_said = FALSE;
|
|
||||||
sess->nick_said = FALSE;
|
|
||||||
chan_set_color (sess->res->tab, newdata_list);
|
chan_set_color (sess->res->tab, newdata_list);
|
||||||
|
|
||||||
if (chan_is_collapsed (sess->res->tab)
|
if (chan_is_collapsed (sess->res->tab)
|
||||||
&& !(server_sess->msg_said || server_sess->nick_said)
|
&& !((server_sess->tab_state & TAB_STATE_NEW_MSG)
|
||||||
|
|| (server_sess->tab_state & TAB_STATE_NEW_HILIGHT))
|
||||||
&& !(server_sess == current_tab))
|
&& !(server_sess == current_tab))
|
||||||
{
|
{
|
||||||
server_sess->new_data = TRUE;
|
server_sess->tab_state = TAB_STATE_NEW_DATA;
|
||||||
server_sess->msg_said = FALSE;
|
|
||||||
server_sess->nick_said = FALSE;
|
|
||||||
chan_set_color (chan_get_parent (sess->res->tab), newdata_list);
|
chan_set_color (chan_get_parent (sess->res->tab), newdata_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 2: /* new message arrived in channel (light red) */
|
case 2: /* new message arrived in channel (light red) */
|
||||||
sess->new_data = FALSE;
|
sess->tab_state = TAB_STATE_NEW_MSG;
|
||||||
sess->msg_said = TRUE;
|
|
||||||
sess->nick_said = FALSE;
|
|
||||||
chan_set_color (sess->res->tab, newmsg_list);
|
chan_set_color (sess->res->tab, newmsg_list);
|
||||||
|
|
||||||
if (chan_is_collapsed (sess->res->tab)
|
if (chan_is_collapsed (sess->res->tab)
|
||||||
&& !server_sess->nick_said
|
&& !(server_sess->tab_state & TAB_STATE_NEW_HILIGHT)
|
||||||
&& !(server_sess == current_tab))
|
&& !(server_sess == current_tab))
|
||||||
{
|
{
|
||||||
server_sess->new_data = FALSE;
|
server_sess->tab_state = TAB_STATE_NEW_MSG;
|
||||||
server_sess->msg_said = TRUE;
|
|
||||||
server_sess->nick_said = FALSE;
|
|
||||||
chan_set_color (chan_get_parent (sess->res->tab), newmsg_list);
|
chan_set_color (chan_get_parent (sess->res->tab), newmsg_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 3: /* your nick has been seen (blue) */
|
case 3: /* your nick has been seen (blue) */
|
||||||
sess->new_data = FALSE;
|
sess->tab_state = TAB_STATE_NEW_HILIGHT;
|
||||||
sess->msg_said = FALSE;
|
|
||||||
sess->nick_said = TRUE;
|
|
||||||
chan_set_color (sess->res->tab, nickseen_list);
|
chan_set_color (sess->res->tab, nickseen_list);
|
||||||
|
|
||||||
if (chan_is_collapsed (sess->res->tab) && !(server_sess == current_tab))
|
if (chan_is_collapsed (sess->res->tab) && !(server_sess == current_tab))
|
||||||
{
|
{
|
||||||
server_sess->new_data = FALSE;
|
server_sess->tab_state = TAB_STATE_NEW_MSG;
|
||||||
server_sess->msg_said = FALSE;
|
|
||||||
server_sess->nick_said = TRUE;
|
|
||||||
chan_set_color (chan_get_parent (sess->res->tab), nickseen_list);
|
chan_set_color (chan_get_parent (sess->res->tab), nickseen_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
lastact_update (sess);
|
lastact_update (sess);
|
||||||
|
sess->last_tab_state = sess->tab_state; /* For plugins handling future prints */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user