Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37766563
en ru br
Репозитории ALT
S:1.13a-alt6.20140908
4.1: 1.10a-alt3
4.0: 1.10a-alt3
3.0: 1.10a-alt2
www.altlinux.org/Changes

Группа :: Офис
Пакет: magicpoint

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: magicpoint-1.10a-rh-longline.patch
Скачать


diff -ruN magicpoint-1.10a.orig/draw.c magicpoint-1.10a/draw.c
--- magicpoint-1.10a.orig/draw.c	2003-05-14 16:45:35.000000000 +0900
+++ magicpoint-1.10a/draw.c	2003-08-20 19:02:19.000000000 +0900
@@ -4504,6 +4504,7 @@
 	char buf16[1024], *p16;
 	char out16[1024], *o16;
 	int ileft, oleft;
+	int forcefolding = 0;
 #ifdef HAVE_ICONV
 	static iconv_t icv[3];
 #endif
@@ -4569,6 +4570,29 @@
 		if (isspace(*(p + len -1))) {
 		    XftTextExtents8(display, xft_font, (XftChar8 *)p, len -1, &extents);
 			if (state->width - state->leftfillpos / 2 - state->linewidth >= extents.xOff) goto nofolding;
+		} else {
+			/* the specified line might be too long. enforce to split the line in order to avoid the freeze. */
+			wchar_t *wcstr;
+			char *mbstr;
+			int wclength, mblength, i;
+
+			/* converting the strings to wchar to handle the multibyte characters correctly */
+			wcstr = (wchar_t *) malloc (sizeof (wchar_t) * (strlen (p) + 1));
+			wclength = mbstowcs (wcstr, p, len);
+			for (i = wclength - 1; i >= 1; i--) {
+				mbstr = (char *) malloc (sizeof (char) * (i + 1));
+				mblength = wcstombs (mbstr, wcstr, i);
+				XftTextExtents8 (display, xft_font, (XftChar8 *)p, mblength, &extents);
+				if (state->width - state->leftfillpos / 2 - state->linewidth < extents.xOff) {
+					free (mbstr);
+					free (wcstr);
+					len = mblength;
+					forcefolding = 1;
+					goto nofolding;
+				}
+				free (mbstr);
+			}
+			free (wcstr);
 		}
 
 		draw_line_end(state); 
@@ -4588,9 +4612,20 @@
 	if (obj_new_xftfont(state, state->linewidth, 0, p, len, 
 				fontname, registry, char_size[caching], charset16, xft_font)){
 		state->linewidth += extents.xOff;
+		if (forcefolding == 1) {
+			draw_line_end (state);
+			draw_line_start (state);
+			state->linewidth = state->leftfillpos;
+		}
 		return p + len;
-	} else
+	} else {
+		if (forcefolding == 1) {
+			draw_line_end (state);
+			draw_line_start (state);
+			state->linewidth = state->leftfillpos;
+		}
 		return NULL; 
+	}
 }
 static int
 obj_new_xftfont(state, x, y, p, len, fontname, registry, size, charset16, xft_font)
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin