[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