LINUX.ORG.RU

Пропатченный xpdf


0

0

Поковырял исходники xpdf, добавил десяток нужных строк кода, в итоге имеем на скриншоте: - кирилица вводится и ищется без проблем; - выделенный текст на русском копируется через xselection.

P.S.:Про шрифты и пр. можно не флеймить, специально включил первую попавшуюся тему к fvwm.

>>> Просмотр (1600x1200, 252 Kb)

Молодцом. Какая система? diff-файл для патча в студию, плиз.

delirio
()

Молодца, diff уже запостил где нибудь?

Atlant ★★★★★
()
Ответ на: комментарий от delirio

>evince не устраивает, бо не юзаю гнома...

По-моему, evince тоже можно скомпилить без гнома.

Davidov ★★★★
()
Ответ на: комментарий от delirio

>epdfview понравилось. буду иметь ввиду. но как в нем выделять и копировать?

svn co svn://svn.emma-soft.com/epdfview/trunk epdfview ;)

gassique ★★
()

Давно таких ужасных шрифтов не видел.

Sikon ★★★
()

страшный(дефолтный?) fvwm :)... 
смотрю только на xpdf.

fugu
()

нинастроено, а за то xpdf(то, что пофиксил кириллицу) - безграничное уважение.

anonymous
()
Ответ на: комментарий от gassique

когда я последний раз смотрел epdfview (около года назад) - оно с тем же poppler, что и evince, рендерило страницу раза в 3 дольше.

по скриншоту - шрифты вполне приличные :-)

cursed
()

Отлично! Молодец! А оглавление в сайдбаре в кириллице у тебя показывает? Это тоже очень нужно.

Zubok ★★★★★
()
Ответ на: комментарий от firsttimeuser

а в upstream проект патч послал ?

anonymous
()
Ответ на: комментарий от vtVitus

> в дебиан поиск по русски кажись работал, а вот русские букмарки не работают.

Не всегда :( Думаю переходить по сему на kpdf, где всё вышесказанное работает из коробки, но непривычно зараза по сравнению с xpdf долго запускается, хотя это особо не критично.

Evgueni ★★★★★
()
Ответ на: комментарий от Evgueni

Мега респект и большой зачёт за пропатчивание xpdf'a.. =)
Ты уже патч послал на рассмотрение добавления в главную ветку?
И где можно скачать diff? =)

dragon_djanic ★★
()
Ответ на: комментарий от dragon_djanic

Вопрос, как я понял, таки не мне а автору корневого поста?

Evgueni ★★★★★
()

Про кирилицу в оглавлении (в правой панели xpdf) честно говоря забыл совсем, пока ковырял остальное. Буду смотреть, хорошо что напомнили. Авторам писал, отклика не получил. Фиг знает почему. Чтобы копирование заработало нужно, чтобы в конф. файле не были указаны таблицы перекодировки для кирилицы (если локаль УТФ-8). Потратил у себя битый час на выяснение, почему у меня не работает копирование. Оказалось добрые люди из АльтЛинукс подключили по умолчанию таблицу для КОИ-8 (хотя у них локаль УТФ-8).

Патч ниже

diff -ruN xpdf-3.02/xpdf/PDFCore.cc xpdf-3.02-2/xpdf/PDFCore.cc --- xpdf-3.02/xpdf/PDFCore.cc 2007-02-28 01:05:52 +0300 +++ xpdf-3.02-2/xpdf/PDFCore.cc 2007-07-12 21:18:23 +0400 @@ -12,6 +12,7 @@ #pragma implementation #endif +#include <locale.h> #include <math.h> #include "GString.h" #include "GList.h" @@ -1600,18 +1601,27 @@ GBool PDFCore::find(char *s, GBool caseSensitive, GBool next, GBool backward, GBool onePageOnly) { Unicode *u; - int len, i; + int len, i, n; GBool ret; + char * locale_string; // convert to Unicode len = strlen(s); + locale_string=setlocale(LC_CTYPE, NULL); u = (Unicode *)gmallocn(len, sizeof(Unicode)); + if ((!strstr(locale_string, "UTF8")) || (!strstr(locale_string, "utf8"))) + { + n=mbstowcs((wchar_t *)u, s, len); + ret = findU(u, n, caseSensitive, next, backward, onePageOnly); + } + else + { for (i = 0; i < len; ++i) { u[i] = (Unicode)(s[i] & 0xff); } ret = findU(u, len, caseSensitive, next, backward, onePageOnly); - + } gfree(u); return ret; } diff -ruN xpdf-3.02/xpdf/TextOutputDev.cc xpdf-3.02-2/xpdf/TextOutputDev.cc --- xpdf-3.02/xpdf/TextOutputDev.cc 2007-02-28 01:05:52 +0300 +++ xpdf-3.02-2/xpdf/TextOutputDev.cc 2007-07-21 21:35:29 +0400 @@ -3146,7 +3146,7 @@ s = new GString(); if (rawOrder) { - return s; + return s; } // get the output encoding @@ -3289,7 +3289,7 @@ } } - // sort the fragments and generate the string +// sort the fragments and generate the string if (nFrags > 0) { for (i = 0; i < nFrags; ++i) { diff -ruN xpdf-3.02/xpdf/XPDFCore.cc xpdf-3.02-2/xpdf/XPDFCore.cc --- xpdf-3.02/xpdf/XPDFCore.cc 2007-02-28 01:05:52 +0300 +++ xpdf-3.02-2/xpdf/XPDFCore.cc 2007-07-21 21:49:59 +0400 @@ -12,6 +12,7 @@ #pragma implementation #endif +#include <locale.h> #include <X11/keysym.h> #include <X11/cursorfont.h> #include <string.h> @@ -427,13 +428,21 @@ XtPointer *value, unsigned long *length, int *format) { Atom *array; + Atom utf8_text; + char * locale_string; + + utf8_text=XInternAtom(XtDisplay(widget), "UTF8_STRING", False); + locale_string=setlocale(LC_CTYPE, NULL); // send back a list of supported conversion targets if (*target == targetsAtom) { if (!(array = (Atom *)XtMalloc(sizeof(Atom)))) { return False; } - array[0] = XA_STRING; + if ((!strstr(locale_string, "UTF8")) || (!strstr(locale_string, "utf8"))) + array[0] = utf8_text; + else + array[0] = XA_STRING; *value = (XtPointer)array; *type = XA_ATOM; *format = 32; @@ -441,13 +450,14 @@ return True; // send the selected text - } else if (*target == XA_STRING) { + } else if (*target == utf8_text || *target == XA_STRING) { //~ for multithreading: need a mutex here *value = XtNewString(currentSelection->getCString()); *length = currentSelection->getLength(); - *type = XA_STRING; + if (*target == utf8_text) *type = utf8_text; + if (*target == XA_STRING) *type = XA_STRING; *format = 8; // 8-bit elements - return True; + return True; } return False;

zloy_starper ★★★
() автор топика
Ответ на: комментарий от zloy_starper

Мда не расчитал, что переносы строк тут похерятся. Патч могу кому-нибудь выслать мылом, или еще как-нибудь. Самому выкладывать сейчас негде. Ради 1 патча заводить проект на сурсфорже что-то не хочется.

zloy_starper ★★★
() автор топика

К чему такая мешанина стилей?

DOKA
()
Ответ на: комментарий от zloy_starper

>переносы строк тут похерятся

Достаточно выбрать Preformatted text из выпадающего списка под полем ввода сообщения.

Davidov ★★★★
()
Ответ на: комментарий от zloy_starper

Отправьте дифф разработчикам. Это будет самый лучший вариант - если патч примут, его получат все.

anonymous
()
Ответ на: комментарий от zloy_starper

что удалось получить.

diff -ruN xpdf-3.02/xpdf/PDFCore.cc xpdf-3.02-2/xpdf/PDFCore.cc
--- xpdf-3.02/xpdf/PDFCore.cc2007-02-28 01:05:52 +0300
+++ xpdf-3.02-2/xpdf/PDFCore.cc2007-07-12 21:18:23 +0400
@@ -12,6 +12,7 @@
 #pragma implementation
 #endif
 
+#include <locale.h>
 #include <math.h>
 #include "GString.h"
 #include "GList.h"
@@ -1600,18 +1601,27 @@
 GBool PDFCore::find(char *s, GBool caseSensitive, GBool next, GBool backward,
 ePageOnly) {
   Unicode *u;
-  int len, i;
+  int len, i, n;
   GBool ret;
+   char * locale_string;
 
   // convert to Unicode
   len = strlen(s);
+  locale_string=setlocale(LC_CTYPE, NULL);
   u = (Unicode *)gmallocn(len, sizeof(Unicode));
+   if ((!strstr(locale_string, "UTF8")) || (!strstr(locale_string, "utf8")))
+ {
+ n=mbstowcs((wchar_t *)u, s, len);
+ ret = findU(u, n, caseSensitive, next, backward, onePageOnly);
+ }
+   else
+ {
   for (i = 0; i < len; ++i) {
     u[i] = (Unicode)(s[i] & 0xff);
   }
 
   ret = findU(u, len, caseSensitive, next, backward, onePageOnly);
-
+}
   gfree(u);
   return ret;
 }
diff -ruN xpdf-3.02/xpdf/TextOutputDev.cc xpdf-3.02-2/xpdf/TextOutputDev.cc
--- xpdf-3.02/xpdf/TextOutputDev.cc2007-02-28 01:05:52 +0300
+++ xpdf-3.02-2/xpdf/TextOutputDev.cc2007-07-21 21:35:29 +0400
@@ -3146,7 +3146,7 @@
   s = new GString();
 
   if (rawOrder) {
-    return s;
+return s;
   }
 
   // get the output encoding
@@ -3289,7 +3289,7 @@
     }
   }
 
-  // sort the fragments and generate the string
+// sort the fragments and generate the string
   if (nFrags > 0) {
 
     for (i = 0; i < nFrags; ++i) {
diff -ruN xpdf-3.02/xpdf/XPDFCore.cc xpdf-3.02-2/xpdf/XPDFCore.cc
--- xpdf-3.02/xpdf/XPDFCore.cc2007-02-28 01:05:52 +0300
+++ xpdf-3.02-2/xpdf/XPDFCore.cc2007-07-21 21:49:59 +0400
@@ -12,6 +12,7 @@
 #pragma implementation
 #endif
 
+#include <locale.h>
 #include <X11/keysym.h>
 #include <X11/cursorfont.h>
 #include <string.h>
@@ -427,13 +428,21 @@
 ter *value, unsigned long *length,
 t *format) {
   Atom *array;
+  Atom utf8_text;
+  char * locale_string;
+
+  utf8_text=XInternAtom(XtDisplay(widget), "UTF8_STRING", False);
+  locale_string=setlocale(LC_CTYPE, NULL);
 
   // send back a list of supported conversion targets
   if (*target == targetsAtom) {
     if (!(array = (Atom *)XtMalloc(sizeof(Atom)))) {
       return False;
     }
-    array[0] = XA_STRING;
+    if ((!strstr(locale_string, "UTF8")) || (!strstr(locale_string, "utf8")))
+      array[0] = utf8_text;
+    else
+      array[0] = XA_STRING;
     *value = (XtPointer)array;
     *type = XA_ATOM;
     *format = 32;
@@ -441,13 +450,14 @@
     return True;
 
   // send the selected text
-  } else if (*target == XA_STRING) {
+  } else if (*target == utf8_text || *target == XA_STRING) {
     //~ for multithreading: need a mutex here
     *value = XtNewString(currentSelection->getCString());
     *length = currentSelection->getLength();
-    *type = XA_STRING;
+    if (*target == utf8_text) *type = utf8_text;
+    if (*target == XA_STRING) *type = XA_STRING;
     *format = 8; // 8-bit elements
-    return True;
+   return True;
   }
 
   return False;

generatorglukoff ★★
()
Ответ на: комментарий от generatorglukoff

Спасибо, посмотримс... Еле написал ebuild для оригинального xpdf, а то в генте патченый для poppler идёт...

Killy
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.