Установить цвет границы диалогового окна

Основной вопрос здесь заключается в следующем: как установить цвет рамки вокруг окна (точнее, диалогового окна)?

У меня есть диалоговое окно, которое всплывает с предупреждением. Из-за критического характера безопасности предупреждения существует требование, чтобы некоторые части окна были красными, включая границу окна диалога. Когда я получил это требование, я подумал, что это хорошая идея. Кажется разумным и достаточно простым.

Приложение использует X / мотив для своей графики. Я начал с того, что сделал другие запрашиваемые детали красными, например кнопку подтверждения. Выполнение всего остального было достаточно простым путем изменения графического контекста и цветовых ресурсов.

Граница диалога, однако, была болью. Существует ресурс XmNborderColor, поэтому я попытался изменить это. Это не похоже на работу. В конце концов, после попытки установить его для разных виджетов (фрейм и его предки), я сделал следующее из отчаяния:

Widget w = button;

for(int i = 0; i <= 20; i += 1)
{
printf("i = %d, w = %d\n", i, w);
if(w <= 0) break;
XtVaSetValues( w, XmNborderColor, border, NULL);
w = XtParent(w);
}

Я сделал это, чтобы просто установить его на все, от кнопки до рута и все между.

Проведя дополнительные исследования, я понял, что вместо этого мне может понадобиться изменить атрибуты окна, например, через XChangeWindowAttributes(display, window, mask, values), Структура значений включает в себя border_pixelЯ предполагаю, что это цвет границы, но не могу найти подтверждения этому — документация просто говорит, что он для установки «пикселя границы». К счастью, есть удобная функция для установки только пикселя границы, так что вам не нужно передавать всю структуру значений; удобная функция, которая изменяет только пиксель границы XSetWindowBorder(display, window, border_pixel),

Поэтому я хотел попробовать это. Теперь у меня есть:

// control_area is the widget containing the other
XSetWindowBorder(XtDisplay(shell), window, border);

shell устанавливается в другом месте с помощью следующей функции:

Widget myClass :: createShell( Widget parent, string title )
{
while( !XtIsApplicationShell(parent) )
{
parent = XtParent( parent );
}

shell = XtVaCreatePopupShell( name, xmDialogShellWidgetClass, parent,
XtNvisual, visual, // visual, colormap, depth are class member variables
XtNcolormap, colormap,
XtNdepth, depth,
NULL );

XtVaSetValues( shell,
XmNmwmDecorations, MWM_DECOR_BORDER,
XtNtitle, const_cast<char*> (title.c_str()),
XmNmwmFunctions, NO_FUNCTIONS,
XmNresizePolicy, XmRESIZE_NONE,
NULL );

return shell;
}

С другого места в коде это выглядит так window может быть ссылка на корневое окно — может быть в этом проблема?

Я удивлен отсутствием информации об этом и тем, как трудно было найти прямой ответ.

Как установить цвет границы? Если я должен использовать XSetWindowBorder(), Что я делаю неправильно? Если это потому, что мой window переменная может не ссылаться на правильное окно, как мне получить ссылку на правильное окно, зная оболочку и содержащиеся в ней виджеты (может быть, я должен сделать из этого отдельный вопрос, если этот вопрос не набирает обороты)?

3

Решение

Цвет границы, скорее всего, контролируется вашим оконным менеджером, если вы не работаете без оконного менеджера. Вам нужно переопределить цвет по умолчанию для этого конкретного окна в вашем файле ~ / .Xdefaults. Что-то вроде:

[название] * bordercolor: красный

Где [title] совпадает со строкой, которую вы передаете createShell ().

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]