Основной вопрос здесь заключается в следующем: как установить цвет рамки вокруг окна (точнее, диалогового окна)?
У меня есть диалоговое окно, которое всплывает с предупреждением. Из-за критического характера безопасности предупреждения существует требование, чтобы некоторые части окна были красными, включая границу окна диалога. Когда я получил это требование, я подумал, что это хорошая идея. Кажется разумным и достаточно простым.
Приложение использует 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
переменная может не ссылаться на правильное окно, как мне получить ссылку на правильное окно, зная оболочку и содержащиеся в ней виджеты (может быть, я должен сделать из этого отдельный вопрос, если этот вопрос не набирает обороты)?
Цвет границы, скорее всего, контролируется вашим оконным менеджером, если вы не работаете без оконного менеджера. Вам нужно переопределить цвет по умолчанию для этого конкретного окна в вашем файле ~ / .Xdefaults. Что-то вроде:
[название] * bordercolor: красныйГде [title] совпадает со строкой, которую вы передаете createShell ().
Других решений пока нет …