Double Commander

Файловый менеджер

Модератор: Модераторы

Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

B4rr4cuda
У кого какие мысли?

как костыль можно дерективы поставить, как решение премер на 2 кнопки и в трекер.
Аватара пользователя
Alexx2000
постоялец
Сообщения: 490
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи
Контактная информация:

Сообщение Alexx2000 »

B4rr4cuda писал(а):Это работает также под GTK и GTK2.
Точнее работает, но не совсем коректно...

У кого какие мысли?

Раньше без синхронизации под гтк сразу падало или висло. Вот тогда я намучался :( Конечно это баг Лазаруса, надо им в баг трекер закинуть, если еще нету. Надо чтобы везде работало одинаково.
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

Закоментировал синхронизы в uCopyThread и uMoveThread - отлично работает под qt.
Пока лазаровцы не наладили можно, как костылик, использовать:
в make.sh

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

if [ "$lcl" = "qt" ]
 then
  rm interface.inc
  echo "{\$DEFINE QT}">interface.inc
fi


в каждый проблемный файл

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

{$I interface.inc}

и в проблемные места:

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

 {$IFDEF QT}
     FFileOpDlg.UpdateDlg;
    {$ELSE}
     synchronize(@FFileOpDlg.UpdateDlg);
    {$ENDIF}
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

Туплю.
В make.sh просто

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

rm interface.inc 
echo "{\$DEFINE $lcl}">interface.inc
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

Во первых, наваял скриптик для автоматической адаптации DC для QT.
Копируем код ниже в файлик в каталог DC, права на исполнение, запускаем.
(!) Больше одного раза не запускать.
Потом компилим патченый код под qt. Все потоковые операции работают коректно.
Если нужно скомпилить под гтк или гтк2 в interface.inc вместо
{$DEFINE QT} указываем {$DEFINE GTK} или что-то другое.
Вновь нужно под qt - указываем {$DEFINE QT}.
Скрипт заново запускать НЕ надо!

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

#!/usr/bin/perl -w

`rm interface.inc;echo '{\$DEFINE QT\}'>interface.inc`;

@list=`ls *.pas`;

foreach (@list)
{


#удаляем левые символы и выставляем выходное расширение
$fon=$_;
$fon=~s/\n//;
$fon=$`;
$fon=~s/\r//;

`cp $fon $fon.bak`;

$fon=$`.".bak";

open( FIN,"<$fon");
open( FOUT,">$_");

while ($str=<FIN>)
{
$str=~s/\n//;
$str=$`;
$str=~s/\r//;
$str=$`;

#Включаем инклуд
$rez=$str=~m/\{\$H\+\}/;
if ($rez)
{
  $str.="\n\{\$I interface.inc\}\n"
}

 #поиск
 $rez=$str=~m/.*Synchronize\(.*\@/;#@*

#если строка найдена
if ($rez)
  {
    #Присваиваем переменым найденые значеня
    $func=$';
    $sync=$&;

    #Повторный поиск и отделяем мух от котлет
    $rez=$func=~m/\)\;/;
    if ($rez)
    {
      $func=$`;
      $str= "{\$IFDEF QT}\n\t$func;\n{\$ELSE}\n\t$sync$func);\n{\$ENDIF}\n";
    }
  }
    print FOUT "$str\n";
}
close(FIN);
close(FOUT);
}


А во вторых - понравился лог. Очень удобно, красиво и функционально! :)
mpyat2
незнакомец
Сообщения: 5
Зарегистрирован: 15.01.2008 23:15:02
Откуда: Киев

Сообщение mpyat2 »

По поводу появления пустого имени файла:
у меня в директории есть файл "file:" (с двоеточием в конце). Я заметил, что если в имени файла двоеточие, то откусыается все до него, включая его самоё :-).
Видимо, это баг FindFirst/FindNext. Попытаюсь исследовать глубже.
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

2mpyat2
Возможно проблема в модуле uDCUtils или где-то рядом, в частности в этом модуле многие функции а-ля ExtractOnlyFileName удаляют символы разделители ( ['.', '/', '\', ':']), и двоеточие включено в них. Также ищется включение DriveDelim, который тоже является ':'.
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

Нашел.
mpyat2 оказался прав. Функция FindNext возвращает обрезанное имя файла, если в имени есть двоеточие. Имя обрезается в
FindNext ()->FindGetFileInfo()->ExtractFileName()->
fina.inc строка 82

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

while (I > 0) and not (FileName[I] in ['/', '\', ':']) do Dec(I);
Result := Copy(FileName, I + 1, MaxInt);

Обратите внимание на двоеточие в set-е.
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

отправил в трекер

как временое решение сделать примерно так

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

{ifdef linux}
while (I > 0) and not (FileName[I] in ['/', '\']) do Dec(I);
{else}
while (I > 0) and not (FileName[I] in ['/', '\', ':']) do Dec(I);
{endif}
Result := Copy(FileName, I + 1, MaxInt);


и пересобрать фпц
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

Может включить FindFirst/FindNext функции в DC, чтобы не зависеть от багов фпцешников?
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

Перекомпилил fpc с поправкой {$ifdef .... отображает теперь нормально, но операции копирования\перемещения теперь вопрошают "Недостаточно места на диске продолжить?" и, если согласиться копируют с удвоением имени файла до двоеточия:
было new:111.txt, скопировалось, как new:new:111.txt.
Аватара пользователя
Alexx2000
постоялец
Сообщения: 490
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи
Контактная информация:

Сообщение Alexx2000 »

Сриптик надо добавить в SVN.
Может включить FindFirst/FindNext функции в DC, чтобы не зависеть от багов фпцешников?

Кстати думал об этом, правда по другой причине:
Чтобы атрибуты под Линуксом возвращал не всякие там faReadOnly, faArchive (которые под Линуксом имеют мало смысла), а типа rwxrwxrwx. Не охота везде IFDEF'ы пихать. В модуле uFindEx сделал даже небольшой hack так, сказать для этого, но криво это как то.
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

Сриптик надо добавить в SVN.

Только предупреждение о двойном запуске добавь, а то мешанина {$IFDEF} на выходе будет.

Чтобы атрибуты под Линуксом возвращал не всякие там faReadOnly, faArchive (которые под Линуксом имеют мало смысла), а типа rwxrwxrwx.

Очень правильная мысль. Плюс к этому не каждый фпц перекомпилить будет (да и умеет, если откровенно). На днях, один кадр, проприетарные дрова ати ставил, а они с дри в ядре конфликтуют, надо ядро перекомпилить. Он, как об этом узнал, вообще от идеи отказался, под vesa-ой сидит, *здесь была матерная фраза*. *убунты уничтожают новообращеным мозг. Грустно.
А юникод сейчас популярен. И фм просто обязан с ним правильно работать.
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

B4rr4cuda писал(а):
Сриптик надо добавить в SVN.

Только предупреждение о двойном запуске добавь, а то мешанина {$IFDEF} на выходе будет.

а может все таки выполнить скрипт один раз и все ? в будущем много еще каких директив может понадобиться только interface.inc переименовать в dc.inc хотя это не важно.

Чтобы атрибуты под Линуксом возвращал не всякие там faReadOnly, faArchive (которые под Линуксом имеют мало смысла), а типа rwxrwxrwx.

а можно переписать и отправить в фпц =)
Аватара пользователя
Alexx2000
постоялец
Сообщения: 490
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи
Контактная информация:

Сообщение Alexx2000 »

а может все таки выполнить скрипт один раз и все ? в будущем много еще каких директив может понадобиться только interface.inc переименовать в dc.inc хотя это не важно.

Сам не знаю как лучше, а когда поправят это дело, опять писать скриптик который будет убирать IFDEF'ы?
а можно переписать и отправить в фпц =)

Ну FindFirst, FindNext они менять не будут, потеряется совместимость. А вот дополнительные функции можно было бы добавить.
Ответить