[ekg2-devel] Pola zamiast act w window_t
Michał Górny
mgorny.hejl w mailnull.com
Nie, 10 Lut 2008, 13:38:52 CET
On Fri, Feb 08, 2008 at 05:29:16PM +0100, Jakub Zawadzki wrote:
> W sumie racja, /me myslal o polach bitowych zeby nie popsuc ABI, a to
> w koncu niepotrzebne.
>
> Wiec mozna olac pola bitowe, i mozna zrobic na calym int.
Hm, 32 bajty â dobrze liczÄ?
> Zamianie wszedzie raczej bym sie wstrzymal, ale to jest do dyskusji.
> (W koncu korzystamy wszedzie z int)
>
> Rozmiar struktury window_t jest malo wazny.
MoĹźe i na zbawienie pamiÄci uĹźytkownika to nie wpĹynie, ale róşnica jest.
- przed (tzn. jak byĹo oryginalnie, wspĂłlny int dla flag):
(gdb) print sizeof(window_t)
$1 = 104
- po:
(gdb) print sizeof(window_t)
$1 = 80
(amd64, -O0)
No i zaĹÄ
czam tÄ diffkÄ, ktĂłra miaĹa byÄ ostatnio (ale jakoĹ uÄkĹa).
--
Z powaĹźaniem,
MichaĹ GĂłrny
<http://mailnull.com/w?au=f6744c6f5e097cc9816a562802f331c2>
<xmpp:mgorny w jabster.pl>
-------------- następna część ---------
Index: plugins/ncurses/old.c
===================================================================
--- plugins/ncurses/old.c (wersja 3761)
+++ plugins/ncurses/old.c (kopia robocza)
@@ -184,7 +184,7 @@
const char *sid = session_uid_get(ncurses_typing_win->session);
const char *uid = get_uid(ncurses_typing_win->session, ncurses_typing_win->target);
- if (((first > 1) || (ncurses_typing_win->act & 8)) && uid)
+ if (((first > 1) || (ncurses_typing_win->in_active)) && uid)
return query_emit_id(NULL, PROTOCOL_TYPING_OUT, &sid, &uid, &len, &first);
else
return -1;
@@ -265,12 +265,12 @@
ncurses_typing(0, NULL);
ncurses_typing_mod = tmp;
- } else if (w->act & 24) { /* <gone/> or <active/> */
+ } else if (w->in_active || w->out_active) { /* <gone/> or <active/> */
window_t *tmp = ncurses_typing_win;
ncurses_typing_win = w;
- if (!ncurses_typingsend(0, !(w->act & 16) ? 4 : 5) || (w->act & 16))
- w->act ^= 16;
+ if (!ncurses_typingsend(0, !w->out_active ? 4 : 5) || w->out_active)
+ w->out_active ^= 1;
ncurses_typing_win = tmp;
}
@@ -1543,12 +1543,12 @@
char tmp[33];
window_t *w = l->data;
- if (!(w->act & 7) || !w->id || (w == window_current))
+ if ((!w->act && !w->in_typing) || !w->id || (w == window_current))
continue;
if (act)
string_append_c(s, ',');
- sprintf(tmp, "statusbar_act%s%s", (w->act & 2 ? "_important" : ""), (w->act & 4 ? "_typing" : ""));
+ sprintf(tmp, "statusbar_act%s%s", (w->act == 2 ? "_important" : ""), (w->in_typing ? "_typing" : ""));
string_append(s, format_find(tmp));
string_append(s, itoa(w->id));
act = 1;
Index: plugins/ncurses/main.c
===================================================================
--- plugins/ncurses/main.c (wersja 3761)
+++ plugins/ncurses/main.c (kopia robocza)
@@ -165,8 +165,8 @@
ncurses_commit();
if (w->act & 2) { /* enable <composing/> on incoming chat message receival */
- w->act |= 8;
- if (!(w->act & 16)) /* send <active/>, as we showed interest in chat */
+ w->in_active = 1;
+ if (!w->out_active) /* send <active/>, as we showed interest in chat */
ncurses_window_gone(w);
}
Index: plugins/ncurses/bindings.c
===================================================================
--- plugins/ncurses/bindings.c (wersja 3761)
+++ plugins/ncurses/bindings.c (kopia robocza)
@@ -129,10 +129,10 @@
command_exec(window_current->target, window_current->session, tmp, 0);
if (!tmp[0] || tmp[0] == '/' || !window_current->target)
- ncurses_typing_mod = 1;
+ ncurses_typing_mod = 1;
else {
- ncurses_typing_win = NULL;
- window_current->act |= 16;
+ ncurses_typing_win = NULL;
+ window_current->out_active = 1;
}
curs_set(1);
@@ -260,10 +260,10 @@
if (ncurses_plugin_destroyed)
return;
if (!line[0] || line[0] == '/' || !window_current->target) /* if empty or command, just mark as modified */
- ncurses_typing_mod = 1;
+ ncurses_typing_mod = 1;
else { /* if message, assume that its' handler has already disabled <composing/> */
- ncurses_typing_win = NULL;
- window_current->act |= 16; /* but also remember that is should have set <active/> chatstate */
+ ncurses_typing_win = NULL;
+ window_current->out_active = 1; /* but also remember that it should have set <active/> chatstate */
}
if (xwcscmp(line, TEXT(""))) {
Index: plugins/gtk/main.c
===================================================================
--- plugins/gtk/main.c (wersja 3761)
+++ plugins/gtk/main.c (kopia robocza)
@@ -199,7 +199,7 @@
mg_switch_page(FALSE, w->id);
gtk_ui_window_switch_lock = 0;
- fe_set_tab_color(w, w->act & 3);
+ fe_set_tab_color(w, w->act);
return 0;
}
@@ -276,7 +276,7 @@
for (l = windows; l; l = l->next) {
window_t *w = l->data;
- fe_set_tab_color(w, w->act & 3);
+ fe_set_tab_color(w, w->act);
}
return 0;
Index: ekg/themes.c
===================================================================
--- ekg/themes.c (wersja 3761)
+++ ekg/themes.c (kopia robocza)
@@ -686,9 +686,9 @@
if (w != window_current && !w->floating && !(separate & 2)) {
int oldact = w->act;
if (separate)
- w->act = 2 | (w->act & ~3);
- else if ((w->act & 3) != 2)
- w->act = 1 | (w->act & ~3);
+ w->act = 2;
+ else if (w->act != 2)
+ w->act = 1;
if (oldact != w->act) /* emit UI_WINDOW_ACT_CHANGED only when w->act changed */
query_emit_id(NULL, UI_WINDOW_ACT_CHANGED);
Index: ekg/windows.c
===================================================================
--- ekg/windows.c (wersja 3761)
+++ ekg/windows.c (kopia robocza)
@@ -205,7 +205,7 @@
window_current = w;
query_emit_id(NULL, UI_WINDOW_SWITCH, &w); /* XXX */
- w->act &= ~3;
+ w->act = 0;
if (w->target && w->session && (u = userlist_find(w->session, w->target)) && (u->xstate & EKG_XSTATE_BLINK)) {
u->xstate &= ~EKG_XSTATE_BLINK;
ul_refresh = 1;
@@ -624,7 +624,7 @@
for (l = windows; l; l = l->next) {
window_t *w = l->data;
- if ((w->act & 3) && !w->floating && w->id) {
+ if (w->act && !w->floating && w->id) {
id = w->id;
break;
}
Index: ekg/windows.h
===================================================================
--- ekg/windows.h (wersja 3761)
+++ ekg/windows.h (kopia robocza)
@@ -45,25 +45,32 @@
} window_lastlog_t;
typedef struct {
- int id; /* numer okna */
- char *target; /* nick query albo inna nazwa albo NULL */
- session_t *session; /* której sesji dotyczy okno */
+ int id; /* numer okna */
+ char *target; /* nick query albo inna nazwa albo NULL */
+ session_t *session; /* której sesji dotyczy okno */
- int left, top; /* pozycja (x, y) względem początku ekranu */
- int width, height; /* wymiary okna */
+ int left, top; /* pozycja (x, y) względem początku ekranu */
+ int width, height; /* wymiary okna */
- int act; /* czy coś się zmieniło? */
- int more; /* pojawiło się coś poza ekranem */
+ unsigned act : 2; /* activity: 1 - status/junk; 2 - msg */
+ unsigned in_typing : 1; /* user is composing a message to us */
+ unsigned in_active : 1; /* user has sent some kind of message,
+ so we can start sending composing to him/her */
+ unsigned out_active : 1; /* we 'started' sending messages to user (considered
+ ourselves active), so we shall say goodbye when done */
+ unsigned more : 1; /* pojawiło się coś poza ekranem */
+ unsigned floating : 1; /* czy pływające? */
+ unsigned doodle : 1; /* czy do gryzmolenia? */
- int floating; /* czy pływające? */
- int doodle; /* czy do gryzmolenia? */
- int frames; /* informacje o ramkach */
- int edge; /* okienko brzegowe */
- int last_update; /* czas ostatniego uaktualnienia */
- int nowrap; /* nie zawijamy linii */
- int hide; /* ukrywamy, bo jest zbyt duże */
- int lock; /* blokowanie zmian w obrębie komendy */
+ unsigned frames : 4; /* informacje o ramkach */
+ unsigned edge : 4; /* okienko brzegowe */
+ unsigned nowrap : 1; /* nie zawijamy linii */
+ unsigned hide : 1; /* ukrywamy, bo jest zbyt duże */
+ unsigned lock : 1; /* blokowanie zmian w obrębie komendy */
+
+ time_t last_update; /* czas ostatniego uaktualnienia */
+
list_t userlist; /* sometimes window may require separate userlist */
window_lastlog_t *lastlog; /* prywatne informacje lastloga */
Index: ekg/protocol.c
===================================================================
--- ekg/protocol.c (wersja 3761)
+++ ekg/protocol.c (kopia robocza)
@@ -734,7 +734,7 @@
}
/* jeżeli nie mamy podanego uid'u w liście kontaktów to trzeba go dopisać do listy dopełnianych */
- if (!userlist)
+ if (!userlist && !our_msg) /* don't add us to tabnick */
tabnick_add(uid);
if (!userlist && xstrcasecmp(session_class->uid, uid) && session_int_get(session_class, "auto_find") >= 1) {
@@ -830,12 +830,12 @@
if (!(s = session_find(session)))
return 0;
-
+
if ((w = window_find_s(s, uid))) {
if (offstate & EKG_XSTATE_TYPING)
- w->act &= ~4;
+ w->in_typing = 0;
else if (state & EKG_XSTATE_TYPING)
- w->act |= 4;
+ w->in_typing = 1;
query_emit_id(NULL, UI_WINDOW_ACT_CHANGED);
}
Więcej informacji o liście dyskusyjnej ekg2-devel