View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0001823 | Wishes | Viewer | public | 2011-07-03 20:31 | 2013-02-03 00:33 |
Reporter | Maximus | Assigned To | 2useven10 | ||
Priority | normal | Severity | feature | Reproducibility | have not tried |
Status | closed | Resolution | fixed | ||
Product Version | 3.0 | ||||
Fixed in Version | 3.0 | ||||
Summary | 0001823: Автообновление вьювера на флешках | ||||
Description | Вьювер не реагирует на изменения файлов (логов, например) расположенных на флешках. Добавил опцию в настройки вьювера. | ||||
Tags | No tags attached. | ||||
Build | 2221 | ||||
|
Viewer110703.diff (2,933 bytes)
Index: config.hpp =================================================================== --- config.hpp (revision 6399) +++ config.hpp (working copy) @@ -319,6 +319,7 @@ int UseExternalViewer; int ShowKeyBar; // $ 15.07.2000 tran + ShowKeyBar int AnsiCodePageAsDefault; + int RefreshOnRemovable; int ShowTitleBar; int SearchRegexp; int MaxLineSize; // 100..100000, default=10000 Index: viewer.cpp =================================================================== --- viewer.cpp (revision 6399) +++ viewer.cpp (working copy) @@ -400,7 +400,7 @@ DriveType = DRIVE_CDROM; switch (DriveType) //??? make it configurable { - case DRIVE_REMOVABLE: update_check_period = -1; break; // flash drive or floppy: never + case DRIVE_REMOVABLE: update_check_period = ViOpt.RefreshOnRemovable ? 500 : -1; break; // flash drive or floppy: 0.5 sec case DRIVE_FIXED: update_check_period = +1; break; // hard disk: 1 msec case DRIVE_REMOTE: update_check_period = 500; break; // network drive: 0.5 sec case DRIVE_CDROM: update_check_period = -1; break; // cd/dvd: never Index: config.cpp =================================================================== --- config.cpp (revision 6399) +++ config.cpp (working copy) @@ -442,6 +442,7 @@ Builder.AddEmptyLine(); Builder.AddCheckbox(MViewAutoDetectCodePage, &ViOpt.AutoDetectCodePage); Builder.AddCheckbox(MViewConfigAnsiCodePageAsDefault, &ViOpt.AnsiCodePageAsDefault); + Builder.AddCheckbox(MViewConfigRefreshOnRemovable, &ViOpt.RefreshOnRemovable); } Builder.AddOKCancel(); if (Builder.ShowDialog()) @@ -590,6 +591,7 @@ {1, GeneralConfig::TYPE_INTEGER, NKeyViewer,L"Wrap",&Opt.ViOpt.ViewerWrap,0, 0}, {1, GeneralConfig::TYPE_INTEGER, NKeyViewer,L"PersistentBlocks",&Opt.ViOpt.PersistentBlocks,0, 0}, {1, GeneralConfig::TYPE_INTEGER, NKeyViewer,L"AnsiCodePageAsDefault",&Opt.ViOpt.AnsiCodePageAsDefault,1, 0}, + {1, GeneralConfig::TYPE_INTEGER, NKeyViewer,L"RefreshOnRemovable",&Opt.ViOpt.RefreshOnRemovable,0, 0}, {0, GeneralConfig::TYPE_INTEGER, NKeyViewer,L"MaxLineSize",&Opt.ViOpt.MaxLineSize,ViewerOptions::eDefLineSize, 0}, {0, GeneralConfig::TYPE_INTEGER, NKeyViewer,L"SearchEditFocus",&Opt.ViOpt.SearchEditFocus,0, 0}, Index: farlang.templ.m4 =================================================================== --- farlang.templ.m4 (revision 6399) +++ farlang.templ.m4 (working copy) @@ -2248,6 +2248,15 @@ "&Otwieraj pliki w kodowaniu Windows" "Usar código ANS&I por defecto" +MViewConfigRefreshOnRemovable +"Авто&обновление на сменных носителях" +"Auto&refresh on removable drives" +upd:"Autorefresh on removable drives" +upd:"Autorefresh on removable drives" +upd:"Autorefresh on removable drives" +upd:"Autorefresh on removable drives" +upd:"Autorefresh on removable drives" + MEditConfigTitle l: "Редактор" |
|
imho надо отличать флэшку от флопа, и если уж конфигурить - то для всех типов, не только removable. ну и вряд ли надо менять дефолтное поведение. |
|
думаю, что опция не нужна, включить всегда. если пользователь сказал создать лог ТАМ, зачем Фару вмешиваться? |
|
Подозреваю, автообновление было отключено, чтобы не горела постоянно лампочка на дисководе A:, хотя проверить надо, вот только дискету найду :) А так как фар пока не умеет отличать дисковод от флешки - то и опция. Мало ли... |
|
А что, у кого-то ещё есть дисководы? И находятся уникумы, которые на дискеты пишут логи, и, более того, смотрят их фаром в процессе записи? |
|
samlykov: фар вмешается если будет постоянно долбить флоп при просмотре файла (чего раньше не было) DrKnS: ещё есть, у фара нет операции view_log при просмотре readme размером в один экран автообновление будет работать Maximus: если без конфига, то на мой взгяд как-то так... (аттач) |
|
Viewer_Floppy-FlashDrive_Autorefresh.diff (1,773 bytes)
Index: viewer.cpp =================================================================== --- viewer.cpp (revision 6429) +++ viewer.cpp (working copy) @@ -245,7 +245,28 @@ //InitHex=VM.Hex; } +static bool IsDriveTypeFLOPPY( const string &strRoot ) // media have to be inserted... +{ + bool floppy = true; // returns true if can't open drive + string drive = HasPathPrefix(strRoot) ? strRoot : L"\\\\?\\" + strRoot; + DeleteEndSlash(drive, false); + + HANDLE hDevice = ::CreateFileW( + drive.CPtr(), + GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_DELETE, nullptr, OPEN_EXISTING, 0, nullptr + ); + if ( INVALID_HANDLE_VALUE != hDevice ) + { + DISK_GEOMETRY g; + DWORD dwOutBytes; + if ( DeviceIoControl(hDevice, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL,0, &g,(DWORD)sizeof(g), &dwOutBytes,NULL) ) + floppy = ( g.MediaType != FixedMedia && g.MediaType != RemovableMedia ); + CloseHandle(hDevice); + } + return floppy; +} + int Viewer::OpenFile(const wchar_t *Name,int warning) { VM.CodePage=DefCodePage; @@ -398,9 +419,9 @@ int DriveType = FAR_GetDriveType(strRoot); if (IsDriveTypeCDROM(DriveType)) DriveType = DRIVE_CDROM; - switch (DriveType) //??? make it configurable - { - case DRIVE_REMOVABLE: update_check_period = -1; break; // flash drive or floppy: never + switch (DriveType) + { // floppy: never, flash drive: 0.5 sec + case DRIVE_REMOVABLE: update_check_period = IsDriveTypeFLOPPY(strRoot) ? -1 : 500; break; case DRIVE_FIXED: update_check_period = +1; break; // hard disk: 1 msec case DRIVE_REMOTE: update_check_period = 500; break; // network drive: 0.5 sec case DRIVE_CDROM: update_check_period = -1; break; // cd/dvd: never |
|
Зачем вообще вьювер лезет проверять время и размер сам, по таймеру? Есть же FindFirstChangeNotification. |
|
Так он же на всю папку, и может генерить не меньше траффика да и вполне может не работать для разных сетевых дисков да и вообще зачем эта заморочка с тредами и т.п. И так всё хорошо работает. |
|
кроме того эта схема работала и на win95, когда viewer был написан было существенно... |
|
Viewer_Floppy-FlashDrive_Autorefresh2.diff (1,790 bytes)
Index: viewer.cpp =================================================================== --- viewer.cpp (revision 6429) +++ viewer.cpp (working copy) @@ -245,7 +245,28 @@ //InitHex=VM.Hex; } +static bool IsDriveTypeFLOPPY( const string &strRoot ) // media have to be inserted... +{ + bool floppy = true; // returns true if can't open drive + string drive = HasPathPrefix(strRoot) ? strRoot : L"\\\\?\\" + strRoot; + DeleteEndSlash(drive, false); + + HANDLE hDevice = ::CreateFileW( + drive.CPtr(), + GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, nullptr, OPEN_EXISTING, 0, nullptr + ); + if ( INVALID_HANDLE_VALUE != hDevice ) + { + DISK_GEOMETRY g; + DWORD dwOutBytes; + if ( DeviceIoControl(hDevice, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL,0, &g,(DWORD)sizeof(g), &dwOutBytes,NULL) ) + floppy = ( g.MediaType != FixedMedia && g.MediaType != RemovableMedia ); + CloseHandle(hDevice); + } + return floppy; +} + int Viewer::OpenFile(const wchar_t *Name,int warning) { VM.CodePage=DefCodePage; @@ -398,9 +419,9 @@ int DriveType = FAR_GetDriveType(strRoot); if (IsDriveTypeCDROM(DriveType)) DriveType = DRIVE_CDROM; - switch (DriveType) //??? make it configurable - { - case DRIVE_REMOVABLE: update_check_period = -1; break; // flash drive or floppy: never + switch (DriveType) + { // floppy: never, flash drive: 0.5 sec + case DRIVE_REMOVABLE: update_check_period = IsDriveTypeFLOPPY(strRoot) ? -1 : 500; break; case DRIVE_FIXED: update_check_period = +1; break; // hard disk: 1 msec case DRIVE_REMOTE: update_check_period = 500; break; // network drive: 0.5 sec case DRIVE_CDROM: update_check_period = -1; break; // cd/dvd: never |
|
шару на запись пропустил... (добавлено в новом аттаче) |
|
хотелось бы увидеть реакцию на последний из предлагаемых апдейтов... |
|
да. так лучше. |
|
build 2221 |
Date Modified | Username | Field | Change |
---|---|---|---|
2011-07-03 20:31 | Maximus | New Issue | |
2011-07-03 20:31 | Maximus | File Added: Viewer110703.diff | |
2011-07-05 22:20 | 2useven10 | Note Added: 0007246 | |
2011-07-06 08:53 | 2useven10 | Note Edited: 0007246 | |
2011-07-07 07:30 | samlyukov | Note Added: 0007252 | |
2011-07-07 07:37 | Maximus | Note Added: 0007253 | |
2011-07-07 08:05 | DrKnS | Note Added: 0007254 | |
2011-07-07 09:04 | 2useven10 | Note Added: 0007255 | |
2011-07-07 09:05 | 2useven10 | File Added: Viewer_Floppy-FlashDrive_Autorefresh.diff | |
2011-07-07 09:11 | DrKnS | Note Added: 0007256 | |
2011-07-07 09:15 | alexy | Note Added: 0007257 | |
2011-07-07 09:19 | 2useven10 | Note Added: 0007258 | |
2011-07-07 09:20 | 2useven10 | Note Edited: 0007258 | |
2011-07-07 09:35 | 2useven10 | File Added: Viewer_Floppy-FlashDrive_Autorefresh2.diff | |
2011-07-07 09:36 | 2useven10 | Note Added: 0007259 | |
2011-08-27 08:12 | 2useven10 | Note Added: 0007555 | |
2011-09-10 08:02 | samlyukov | Note Added: 0007634 | |
2011-10-14 15:02 | 2useven10 | Note Added: 0007883 | |
2011-10-14 15:03 | 2useven10 | Assigned To | => 2useven10 |
2011-10-14 15:03 | 2useven10 | Status | new => feedback |
2012-05-21 12:07 | 2useven10 | Build | => 2221 |
2012-05-21 12:07 | 2useven10 | Status | feedback => closed |
2012-05-21 12:07 | 2useven10 | Resolution | open => fixed |
2012-05-21 12:07 | 2useven10 | Fixed in Version | => 3.0 |
2013-02-03 00:33 | alexy | Severity | minor => feature |