Усечение заголовка окна при использовании Window::set_title с gtkmm

Я пытаюсь переименовать заголовок главного окна моего приложения, но при попытке это имя усекается. Я пытался понять, была ли это проблема преобразования, но я действительно не могу найти, почему это происходит. Попробуйте эту небольшую программу. Нажмите «Отмена», чтобы увидеть имя приложения по умолчанию в строке заголовка, но если вы выберете файл, он должен отображать первую строку файла как заголовок, но вместо этого усекать его... Усечение всегда составляет 3 символа до конца строки. , и добавляются три точки "...".

Что я делаю неправильно?? или это ошибка моей версии gtkmm или что-то в этом роде? Я использую gtkmm-2.4 Заранее спасибо.

#include <iostream>
#include <gtkmm.h>

using namespace std;
using namespace Gtk;
using namespace Glib;

class AppWindow : public Window {
 public:
    AppWindow();
 protected:
    void onMenuFileOpen();
 private:
    ustring app_name;
    void OpenScript(const ustring sScriptFile);
};

AppWindow::AppWindow() {
    app_name = "default app_name, very long name, with !!^spectal caractères à afficher, and there is no name truncation";
    //set_title(app_name);  
    set_default_size(600, 600);

    onMenuFileOpen();

}

void AppWindow::onMenuFileOpen() {
    FileChooserDialog dialog("Choose a file", FILE_CHOOSER_ACTION_OPEN);
    dialog.set_transient_for(*this);

    //Add response buttons the the dialog:
    dialog.add_button(Stock::CANCEL, RESPONSE_CANCEL);
    dialog.add_button(Stock::OPEN, RESPONSE_OK);

    //Plain text filter
    FileFilter filter_text;
    filter_text.set_name("plain text");
    filter_text.add_mime_type("text/plain");
    dialog.add_filter(filter_text);

    //Show the dialog and wait for a user response:
    if(dialog.run() == RESPONSE_OK) {
        OpenScript(dialog.get_filename());
    }
    //HERE, I RENAME THE WINDOW
    set_title(app_name);
    cout << app_name << endl;
}

void AppWindow::OpenScript(const ustring sScriptFile) {
    RefPtr<IOChannel> file = IOChannel::create_from_file(sScriptFile,"r");
    IOStatus status;
    ustring one_line;

    if(file->get_flags() & IO_FLAG_IS_READABLE) {
        status = file->read_line(one_line);
        app_name=one_line;
    }
    file->close();
}

int main(int argc, char *argv[]) {
    Main kit(argc, argv);

    AppWindow window;
    //Shows the window and returns when it is closed.
    Main::run(window);

    return 0;
}

person bass_dr    schedule 20.02.2011    source источник


Ответы (2)


Здесь работает нормально.

  • может ваш файл не в кодировке UTF-8?
  • нормально ли, что заголовок усекается, если он длиннее пробела в строке заголовка?
person Havoc P    schedule 22.02.2011
comment
Спасибо за ваш ответ, однако усечение всегда составляет половину строки заголовка, независимо от того, изменяю ли я размер или что-то еще. Все мои файлы в кодировке UTF8, только что перепроверил. Какая у вас версия Gtkmm/Gtk+/Glib и на какой ОС, чтобы я мог увидеть, не проблема ли это с моими библиотеками GTK. - person bass_dr; 23.02.2011
comment
вы говорите, что усечение меняется при изменении размера окна, но всегда составляет половину строки заголовка? Если это так, я определенно склонен винить тему или оконный менеджер, поскольку, по-видимому, gtk предоставляет всю строку, а WM различается, насколько она обрезается. Если это проблема gtk, вы ожидаете, что в строке будут отсутствовать символы, если это проблема WM, вы ожидаете, что часть строки не будет окрашена. т. е. gtk предоставляет строку, WM ее рисует. Я тестировал gtkmm 2.20.3/gtk 2.22.0 на Ubuntu Maverick. - person Havoc P; 23.02.2011
comment
На самом деле, у меня такая же ОС... И я только что понял, что усечение всегда состоит из трех последних символов, замененных тремя точками... Завтра я попытаюсь использовать новую новую учетную запись, чтобы увидеть, является ли это конфигурацией Gnome. проблема. - person bass_dr; 24.02.2011

Хорошо, я наконец нашел решение сам. Я пишу это здесь на случай, если у кого-то возникнет такая же проблема. Я не знаю, ошибка это или что, но кажется, что GTK заменяет три последних символа перед '\n' на '...'. Другими словами, строка, используемая для переименования окна, не должна содержать '\n', иначе set_title не покажет полное имя (оно остановится на три символа перед '\n').

Поэтому в моем случае, поскольку я использовал getline(), я просто удалил '\n' из конца строки.

app_name.erase(app_name.end()-1);
Обратите внимание, что мне пришлось использовать 'std::string' вместо 'Gtk:: usstring», так как он не обрабатывает «оператор-» в функции «end()».

person bass_dr    schedule 25.02.2011
comment
это, вероятно, делает оконный менеджер, а не GTK. Вероятно, \n сбивает с толку, думая, что заголовок не помещается в доступном пространстве, поэтому пытается сделать его многоточием. - person Havoc P; 26.02.2011
comment
Это означает, что пример, который вы привели, никогда не был для вас проблематичным. - person Drew Dormann; 23.06.2012