История первая.
Диалог открытия/сохранения файлов у Gtk. Ситуация: приложение не указало используемый каталог. Какой каталог должен быть отображен в диалоге? Здравый смысл подсказывает нам, что это должен быть current working directory. Так оно и работало.
Потом пришел добрый человек и решил облегчить жизнь людям, которые про такое понятие как cwd, никогда ничего не слышали. (Гном же для «просто пользователя», вы в курсе. Так, кто сейчас выкрикнул «Gtk — это не гном»? Cядь, заткнись и читкани HIGца, твое мнение никого не волнует.) Добрый человек реализовал запоминание последнего использованного каталога:
case RELOAD_EMPTY:
- /* The user didn't explicitly give us a folder to
- * display, so we'll use the cwd
+ /* The user didn't explicitly give us a folder to display, so we'll
+ * use the saved one from the last invocation of the file chooser
*/
- current_working_dir = g_get_current_dir ();
- gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (impl),
- current_working_dir);
- g_free (current_working_dir);
+ folder = get_file_for_last_folder_opened (impl);
+ gtk_file_chooser_set_current_folder_file (GTK_FILE_CHOOSER (impl), folder, NULL);
+ g_object_unref (folder);
Ок, выглядит разумно, по крайней мере. Дальше веселее.
В тот же день (буквально; история коммитов не врёт) пришел другой добрый, но глупый человек (или умный, но злой? нельзя же быть настолько глупым?). И сделал это:
case RELOAD_EMPTY:
- /* The user didn't explicitly give us a folder to display, so we'll
- * use the saved one from the last invocation of the file chooser
- */
- folder = get_file_for_last_folder_opened (impl);
- gtk_file_chooser_set_current_folder_file (GTK_FILE_CHOOSER (impl), folder, NULL);
- g_object_unref (folder);
+ recent_shortcut_handler (impl);
break;
------------------------------------------------
История вторая.
Допустим, мы сошли с ума и решили попользоваться этим вашим списком recently used. Пусть это будет какой-нибудь, прости господи, Totem. Пусть мы вчера смотрели в нём /media/data/Видео/Unforgettable/Unforgettable.S01E07.HDTV.XviD-ASAP.avi. Сегодня мы желаем посмотреть — правильно! — /media/data/Видео/Unforgettable/Unforgettable.S01E08.HDTV.XviD-ASAP.avi. И вот мы открываем этот диалог, видим список недавно использованных файлов с пунктом Unforgettable.S01E07.HDTV.XviD-ASAP.avi на первом месте, иии...
А? Что-что? Кто там из угла робко бормочет «щелкнуть правой кнопкой и выбрать в контекстном меню Open Folder»? Нет такого пункта, запомни! Пришло время пересмотреть седьмую серию! Седьмая серия сама не пересмотрится!
------------------------------------------------
История третья.
В настройках объекта, отвечающего за отображение recently used есть такая опция show_not_found. Вполне логично, что её имеет смысл всегда держать выключенной, потому что имена удаленных файлов вряд ли кому-то могут понадобиться в этом списке.
Вот только в виджете GtkRecentChooserMenu эта опция не работает. Если вы пользовались gnome-panel, то вы видели этот виджет — это то самое подменю с недавними документами в главном меню гнома. И несуществующие файлы вы в нём тоже наверняка видели, да-да.
Я наткнулся на эти грабли при попытке добавить поддержку списка recently used в меню lxpanelx. Для обхода бага пришлось сделать кустомный фильтр и фильтровать файлы вручную. (Кстати, при этом фильтр поначалу сегфолтился, потому что Gtk зануляет поле, которое не должно занулять, и для обхода и этого бага тоже пришлось пошаманить.)
А вот команда гнома на всём протяжении существования Gnome2 этот баг не заметила. Ну файлы какие-то левые в меню, фигня, да кому это надо вообще. Впрочем, я давно подозреваю, что все девелоперы гнома сидят на макоси.
Ну про то, что из этого меню тоже невозможно перейти в каталог, где находится файл, — это и вовсе мелочи, чтоб об этом говорить...
------------------------------------------------
Боженька, убей их всех!