1Cv77+wine@etersoft+NXclient+буфер обмена (Не работает буфер с кирилицей)

Модераторы: dimbor, Модераторы разделов

caspervova
Сообщения: 9
ОС: linux ubuntu 10.04 i386

1Cv77+wine@etersoft+NXclient+буфер обмена

Сообщение caspervova »

Здраствуйте. Может продублируюсь, но уже неделю по форуме лажу, но ничего не нашел по етому вопросу.
Есть проблема с буфером обмена (вставка кирилицы из Линукса через терминал в 1С). Вместо кирилицы вставляет кракозябры.
Кто сталкивался с етой проблемой помогите!!!
Подключается через SSH!!! 1-сервер, 28-клиентов.
На сервере стоит: Ubuntu 10.04,
freenx-server_0.7.4-eter22ubuntu_i386,
nx_3.4.0-eter7ubuntu_i386,
opennx_0.16-eter4.svn444ubuntu_i386,
wine-etersoft-network_1.0.12-eter4ubuntu_i386

У клиента: Ubuntu 10.04,
nxclient_3.4.0.7-eter1ubuntu_i386,
nx_3.4.0-eter7ubuntu_i386.
Спасибо сказали:
pelmen
Сообщения: 1268
ОС: debian

Re: 1Cv77+wine@etersoft+NXclient+буфер обмена

Сообщение pelmen »

По-моему эта проблема имеет место даже в виндоусе.
Спасибо сказали:
caspervova
Сообщения: 9
ОС: linux ubuntu 10.04 i386

Re: 1Cv77+wine@etersoft+NXclient+буфер обмена

Сообщение caspervova »

pelmen писал(а):
16.06.2010 13:51
По-моему эта проблема имеет место даже в виндоусе.

возможно. Но у всех стоит линукс. Помогите решить проблему!!! Очень срочно надо!!!
Спасибо сказали:
guliver
Сообщения: 38
ОС: debian

Re: 1Cv77+wine@etersoft+NXclient+буфер обмена

Сообщение guliver »

pelmen писал(а):
16.06.2010 13:51
По-моему эта проблема имеет место даже в виндоусе.

Замечал такое на 8 версиях не проверял на 7 была такая проблема даже на винде
Спасибо сказали:
caspervova
Сообщения: 9
ОС: linux ubuntu 10.04 i386

Re: 1Cv77+wine@etersoft+NXclient+буфер обмена

Сообщение caspervova »

guliver писал(а):
16.06.2010 17:19
pelmen писал(а):
16.06.2010 13:51
По-моему эта проблема имеет место даже в виндоусе.

Замечал такое на 8 версиях не проверял на 7 была такая проблема даже на винде

Версия 7.7 релиз 27
Спасибо сказали:
dimbor
Ведущий рубрики
Сообщения: 1572
Статус: Подвинутый участник

Re: 1Cv77+wine@etersoft+NXclient+буфер обмена

Сообщение dimbor »

На семерке лечится.
Блин, это под виндой, сори. Под линем и опенэныксом надо патчить nxagent аналогично винде. Не патчил, т.к. не применяю.
Спасибо сказали:
caspervova
Сообщения: 9
ОС: linux ubuntu 10.04 i386

Re: 1Cv77+wine@etersoft+NXclient+буфер обмена

Сообщение caspervova »

dimbor писал(а):
16.06.2010 22:19
На семерке лечится.
Блин, это под виндой, сори. Под линем и опенэныксом надо патчить nxagent аналогично винде. Не патчил, т.к. не применяю.

как его пропатчить? может есть ссилка на *.deb уже пропатченого???
Спасибо сказали:
dimbor
Ведущий рубрики
Сообщения: 1572
Статус: Подвинутый участник

Re: 1Cv77+wine@etersoft+NXclient+буфер обмена

Сообщение dimbor »

caspervova писал(а):
17.06.2010 10:25
как его пропатчить? может есть ссилка на *.deb уже пропатченого???

Теоретически, там надо решить три проблемы:
- найти код в nxagent, отвечающий за клипборду в клиентском режиме.
- заставить отдавать CLIPBOARD вместо PRIMARY (на 3.4 и новых вайнах может быть неактуально - чет они там с SetSelectionOwner намутили, что даже без этого работает)
- самое главное: везде изменить приоритет, чтобы кодировка селекшенсов отдавалась/получалась в UTF8_STRING, а XA_STRING задвинуть на последнее место, т.к под вайном она CP1251 частенько, линуксу не характерная.

Только после этого можно будет собирать свой deb и давать на него ссылку.
Спасибо сказали:
caspervova
Сообщения: 9
ОС: linux ubuntu 10.04 i386

Re: 1Cv77+wine@etersoft+NXclient+буфер обмена

Сообщение caspervova »

dimbor писал(а):
18.06.2010 03:27
caspervova писал(а):
17.06.2010 10:25
как его пропатчить? может есть ссилка на *.deb уже пропатченого???

Теоретически, там надо решить три проблемы:
- найти код в nxagent, отвечающий за клипборду в клиентском режиме.
- заставить отдавать CLIPBOARD вместо PRIMARY (на 3.4 и новых вайнах может быть неактуально - чет они там с SetSelectionOwner намутили, что даже без этого работает)
- самое главное: везде изменить приоритет, чтобы кодировка селекшенсов отдавалась/получалась в UTF8_STRING, а XA_STRING задвинуть на последнее место, т.к под вайном она CP1251 частенько, линуксу не характерная.

Только после этого можно будет собирать свой deb и давать на него ссылку.

а можно по подробнее? где ети файлы искать? я еще не очень хорошо знаю NX...
Спасибо сказали:
dimbor
Ведущий рубрики
Сообщения: 1572
Статус: Подвинутый участник

Re: 1Cv77+wine@etersoft+NXclient+буфер обмена

Сообщение dimbor »

Более подробный алогоритм ;):

Поставить сырцы пакета nx_3.4.0... и по ходу дела много всякой хрени во главе с gcc.
Добиться сборки клона - это уже первый шаг к победе.
Агент живет в nx-X11/progams/Xserver/hw/nxagent/*.c
Здесь есть тема "Курощение...". Там весь механизм работы клипборды обжеван. Отличие - клиент патчился все-же виндовый. Т.е., что русскому человеку хорошо, немцу - смерть (это я про 1251). Агент там тоже патчился, но в серверной ипостаси.
Спасибо сказали:
caspervova
Сообщения: 9
ОС: linux ubuntu 10.04 i386

Re: 1Cv77+wine@etersoft+NXclient+буфер обмена

Сообщение caspervova »

dimbor писал(а):
18.06.2010 16:01
Более подробный алогоритм ;):

Поставить сырцы пакета nx_3.4.0... и по ходу дела много всякой хрени во главе с gcc.
Добиться сборки клона - это уже первый шаг к победе.
Агент живет в nx-X11/progams/Xserver/hw/nxagent/*.c
Здесь есть тема "Курощение...". Там весь механизм работы клипборды обжеван. Отличие - клиент патчился все-же виндовый. Т.е., что русскому человеку хорошо, немцу - смерть (это я про 1251). Агент там тоже патчился, но в серверной ипостаси.

Извините, но у меня нет такой папки... nx-X11/progams/Xserver/hw/nxagent/. Если можно как-то по подробней описать? Буду очень признателен. Просто я новичок в Линуксе, и знаком только с ДЕБ пакетами. С нуля собирать пакети неумею. Помогите новичку!!!
Спасибо сказали:
dimbor
Ведущий рубрики
Сообщения: 1572
Статус: Подвинутый участник

Re: 1Cv77+wine@etersoft+NXclient+буфер обмена

Сообщение dimbor »

caspervova писал(а):
21.06.2010 11:30
С нуля собирать пакети неумею. Помогите новичку!!!

Тематика раздела совсем не про это. Но если напрашиваетесь на послание в Гугель, то почему бы не послать. ;)
Спасибо сказали:
Hoblin
Модератор
Сообщения: 1442
Статус: Etersoft team
ОС: ALT Linux

Re: 1Cv77+wine@etersoft+NXclient+буфер обмена

Сообщение Hoblin »

dimbor
Возможно, проблема в том, что в этих исходниках в progams/Xserver/hw/ нет директории nxagent. Больно уж точно послал - теперь обидно прибыть на место и не обнаружить искомого агента.

Уважаемый caspervova! У меня есть лёгкое ощущение того, что Вы тут руководствуетесь принципом "решите мне мою проблему, да побыстрее". Буду рад, если ошибаюсь, тогда просто не очень понимаю стиля Ваших постов.
А вообще, тут помощь очень специфичная. Никто никому не должен и убивает своё время ради удовольствия или собственных нужд. В таких тусовках гораздо проще самому решить проблему, слушая советы тех, кто мудр, но не страдает от переизбытка свободного времени, чем ждать, когда проблема решится :)

Я недавно столкнулся с тем, что мне нужен этот линуксовый буфер обмена, по работе. Если появится свободное время, а решения ещё не будет, сделаю исправление. Выложу максимум патч, никаких дебов или рпмов.
Спасибо сказали:
dimbor
Ведущий рубрики
Сообщения: 1572
Статус: Подвинутый участник

Re: 1Cv77+wine@etersoft+NXclient+буфер обмена

Сообщение dimbor »

Hoblin писал(а):
22.06.2010 08:24
Возможно, проблема в том, что в этих исходниках в progams/Xserver/hw/ нет директории nxagent. Больно уж точно послал - теперь обидно прибыть на место и не обнаружить искомого агента.

Как верно подмечено, тутошняя обстановочка сплетена из множества нюансов (во блин сказал ;)).
Дело в том, что этот тарбол - один из нескольких нужных. nxagent идет отдельным, а собирается все вместе. Полный паноптикум живет здесь. Отсыл именно к сырцам пакета был все-таки точным, т.к. там эти дела в зависимостях прописаны быть обязаны. По крайней мере для rpm это так.
Спасибо сказали:
Hoblin
Модератор
Сообщения: 1442
Статус: Etersoft team
ОС: ALT Linux

Re: 1Cv77+wine@etersoft+NXclient+буфер обмена

Сообщение Hoblin »

Хм, я правильно понял, что патч сведётся к перемене мест элементов xa_STRING? Или это патч для другого случая?

Код: Выделить всё

--- Clipboard.c 2010-06-22 14:40:36.000000000 +0400
+++ Clipboard.c.new     2010-06-22 14:39:37.000000000 +0400
@@ -1218,10 +1218,10 @@
     Atom xa_STRING[4];
     xEvent x;

-    xa_STRING[0] = XA_STRING;
+    xa_STRING[0] = clientUTF8_STRING;
     xa_STRING[1] = clientTEXT;
     xa_STRING[2] = clientCOMPOUND_TEXT;
-    xa_STRING[3] = clientUTF8_STRING;
+    xa_STRING[3] = XA_STRING;

     ChangeWindowProperty(pWin,
                          property,

Когда уже выдастся время всем этим позаниматься? Уже руки чешутся, а возможности даже собрать nx и проверить нет :(
Спасибо сказали:
dimbor
Ведущий рубрики
Сообщения: 1572
Статус: Подвинутый участник

Re: 1Cv77+wine@etersoft+NXclient+буфер обмена

Сообщение dimbor »

Так точно, это серверный патч для paste. На виндовом клиенте требует кода:

Код: Выделить всё

Bool nxwinConvertSelection(ClientPtr client ,WindowPtr pWin, Atom selection, Window requestor, Atom property, Atom target, Time time)
{
......

#ifdef NXWIN_CLIPBOARD_DEBUG
   ErrorF("ConvertSelection converting...\n");
#endif

   if ((target == clientTEXT) ||
           (target == XA_STRING) ||
               (target == clientUTF8_STRING))
   {
      HGLOBAL hGlobal;
      /* code bellow changed by dimbor - kill bug with noncorrect cut/paste international symbols */
      wchar_t *pszGlobalData;

      xEvent x;

      /* Access the clipboard */
      if (!OpenClipboard (lastHwnd)) return 0;

      hGlobal = GetClipboardData (CF_UNICODETEXT);

      if (!hGlobal)
      {
        CloseClipboard();
        x.u.u.type = SelectionNotify;
        x.u.selectionNotify.time = time;
        x.u.selectionNotify.requestor = requestor;
        x.u.selectionNotify.selection = selection;
        x.u.selectionNotify.target = target;
        x.u.selectionNotify.property = None;
        (void) TryClientEvents(client, &x, 1, NoEventMask,
                               NoEventMask , NullGrab);
        return 1;
      }
      pszGlobalData = (wchar_t *) GlobalLock (hGlobal);

      char *pszData = unicode_to_cp(CP_ACP,pszGlobalData);
      char *pszData2;
      if (target == clientUTF8_STRING)
        pszData2 = ansi_to_utf8(pszData);
      else /* тут как раз и используется, что 1251 для винды "родная" кодировка */
        pszData2 = pszData;

      /* Convert DOS string to UNIX string */
      DOStoUNIX (pszData2, strlen (pszData2));
      /* Copy the clipboard text to the requesting window */
      ChangeWindowProperty(pWin,
                           property,
                           target,
                           8,
                           PropModeReplace,
                           strlen(pszData2),
                           pszData2, 1);


      /* Release the clipboard data */
      GlobalUnlock (hGlobal);
      pszGlobalData = NULL;
      CloseClipboard ();

      if(pszData)
        free(pszData);
      if (target == clientUTF8_STRING && pszData2)
        free(pszData2);
      /* ------------------------------------------------------------------- */

      x.u.u.type = SelectionNotify;
      x.u.selectionNotify.time = time;
      x.u.selectionNotify.requestor = requestor;
      x.u.selectionNotify.selection = selection;
      x.u.selectionNotify.target = target;
      x.u.selectionNotify.property = property;
      (void) TryClientEvents(client, &x, 1, NoEventMask,
                             NoEventMask , NullGrab);
      return 1;
   }
   return 0;
}


Еще есть copy. На вин-клиенте писано:

Код: Выделить всё

void nxwinRequestSelection(void)
{
  if (lastOwnerWindowPtr)
  {
    xEvent x;

    x.u.u.type = SelectionRequest;
    x.u.selectionRequest.time = GetTimeInMillis();
    x.u.selectionRequest.owner = lastOwnerWindow;
    x.u.selectionRequest.requestor = WindowTable[0]->drawable.id;
    /* by dimbor - CLIPBOARD instead of PRIMARY ??? */
    //x.u.selectionRequest.selection = clientCLIPBOARD;
    x.u.selectionRequest.selection = nxwinLastSelection;
    /* ------------------------------------------------ */
    x.u.selectionRequest.target = clientUTF8_STRING;
    x.u.selectionRequest.property = clientCutProperty;

    (void) TryClientEvents (lastOwnerClientPtr, &x, 1,
                                NoEventMask, NoEventMask /* CantBeFiltered */,
                                NullGrab);
    SetCriticalOutputPending();

    x.u.selectionRequest.target = XA_STRING;
    x.u.selectionRequest.time = GetTimeInMillis();

    (void) TryClientEvents (lastOwnerClientPtr, &x, 1,
                                NoEventMask, NoEventMask /* CantBeFiltered */,
                                NullGrab);
    SetCriticalOutputPending();
  }
}

Bool nxwinSendNotify(xEvent* x)
{
 int iReturn;

#ifdef NXWIN_CLIPBOARD_DEBUG
  ErrorF("SendNotify\n");
#endif
  if (x->u.selectionNotify.property == clientCutProperty)
  {
     Atom       atomReturnType;
     int     iReturnFormat;
     unsigned long   ulReturnItems;
     unsigned long   ulReturnBytesLeft;
     unsigned char   *pszReturnData = NULL;
     iReturn = GetWindowProperty(lastOwnerWindowPtr, clientCutProperty, 0, 0, FALSE,
                                AnyPropertyType, &atomReturnType, &iReturnFormat,
                                &ulReturnItems, &ulReturnBytesLeft, &pszReturnData);

     if ((iReturn == Success) && (ulReturnBytesLeft > 0))
     {
        iReturn = GetWindowProperty(lastOwnerWindowPtr,clientCutProperty,0,ulReturnBytesLeft, FALSE,
                                        AnyPropertyType, &atomReturnType, &iReturnFormat,
                                        &ulReturnItems, &ulReturnBytesLeft, &pszReturnData);
        if ((iReturn == Success) && (ulReturnItems > 0))
        {
            /* add by dimbor (idea from zahvatov)*/
            if (x->u.selectionNotify.target != XA_STRING)
            {
              char * pszTemp = calloc(sizeof(char),ulReturnItems+1);
              if (!pszTemp)
                return FALSE;
              memcpy(pszTemp, pszReturnData, ulReturnItems);
              *(pszTemp + ulReturnItems) = 0;
              char * pszTemp2 = utf8_to_ansi(pszTemp);

              if (!pszTemp2)
                return FALSE;
              nxwinSetWindowClipboard(pszTemp2, strlen(pszTemp2));
              free(pszTemp2);
            }
            /* ------------------------------------------------------------------- */
            else /* original code */
            {
              nxwinSetWindowClipboard(pszReturnData, ulReturnItems);
            }
          clientOwner = TRUE;
          /* nxwinClearSelection(); */

          return TRUE;
        }
     }
  }
  return FALSE;
}

Там есть подозрение, что реквест должен быть один составной, но и с двумя работает.

На сервере же ему отвечает патч:

Код: Выделить всё

--- Clipboard.c.orig    2008-11-26 22:56:51 +0300
+++ Clipboard.c    2008-12-15 04:33:59 +0300
@@ -166,7 +166,9 @@

   if (target == XA_STRING) return True;
   if (target == serverTEXT) return True;
-
+  /* by dimbor */
+  if (target == serverUTF8_STRING) return True;
+
   return False;
 }

@@ -402,7 +404,12 @@
         lastServerProperty = X->xselectionrequest.property;
         lastServerRequestor = X->xselectionrequest.requestor;
         lastServerTarget = X->xselectionrequest.target;
-        lastServerTime = X->xselectionrequest.time;
+
+        /* by dimbor */
+        if (lastServerTarget != XA_STRING)
+      lastServerTarget = serverUTF8_STRING;
+
+    lastServerTime = X->xselectionrequest.time;

         x.u.u.type = SelectionRequest;
         x.u.selectionRequest.time = GetTimeInMillis();
@@ -424,11 +431,12 @@

         x.u.selectionRequest.selection = CurrentSelections[i].selection;

-        /*
-         * x.u.selectionRequest.target = X->xselectionrequest.target;
-         */
-
-        x.u.selectionRequest.target = XA_STRING;
+        /* by dimbor (idea from zahvatov) */
+        if (X->xselectionrequest.target != XA_STRING)
+          x.u.selectionRequest.target = clientUTF8_STRING;
+        else
+          x.u.selectionRequest.target = XA_STRING;
+
         x.u.selectionRequest.property = clientCutProperty;

         (void) TryClientEvents(lastSelectionOwner[i].client, &x, 1,

Это патч #2 из шапки "курощения". Там есть ссылка на родовые муки.

Соответственно, надо патчить "клиентскую" часть nxagent, в этом же clipboard.c и живущую. Смотреть, втыкая отладочные сообщения, что там когда вызывается, и напрягать мозг.
Повторюсь, не занимался не только потому, что не использую. Еще ведь юзабельный opennx появился сравнительно недавно, а родной клиент под линь легально не разобрать. Да, в етерсофтовской баголовке на эту тему где-то уже отписывал аналогичное (потерял).
Спасибо сказали:
caspervova
Сообщения: 9
ОС: linux ubuntu 10.04 i386

Re: 1Cv77+wine@etersoft+NXclient+буфер обмена

Сообщение caspervova »

всем спасибо! проблема решена... етерсофтовцы устранили проблему...
Спасибо сказали:
dimbor
Ведущий рубрики
Сообщения: 1572
Статус: Подвинутый участник

Re: 1Cv77+wine@etersoft+NXclient+буфер обмена

Сообщение dimbor »

Еще бы узнать, как решили.
Спасибо сказали:
caspervova
Сообщения: 9
ОС: linux ubuntu 10.04 i386

Re: 1Cv77+wine@etersoft+NXclient+буфер обмена

Сообщение caspervova »

dimbor писал(а):
25.06.2010 15:19
Еще бы узнать, как решили.

Проблему решили Етерсофтовци. последний патч.
Спасибо сказали:
dimbor
Ведущий рубрики
Сообщения: 1572
Статус: Подвинутый участник

Re: 1Cv77+wine@etersoft+NXclient+буфер обмена

Сообщение dimbor »

caspervova писал(а):
29.06.2010 12:52
Проблему решили Етерсофтовци. последний патч.

Последний патч чего, вайна что-ли?
Спасибо сказали:
caspervova
Сообщения: 9
ОС: linux ubuntu 10.04 i386

Re: 1Cv77+wine@etersoft+NXclient+буфер обмена

Сообщение caspervova »

dimbor писал(а):
29.06.2010 13:55
caspervova писал(а):
29.06.2010 12:52
Проблему решили Етерсофтовци. последний патч.

Последний патч чего, вайна что-ли?

Нет. RX клиента.
Спасибо сказали: