]>
Dogcows Code - chaz/openbox/blob - otk/messagedialog.cc
1 // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
5 #include "messagedialog.hh"
10 #include "property.hh"
11 #include "eventdispatcher.hh"
18 DialogButton
MessageDialog::_default_result("", false);
20 class DialogButtonWidget
: public Button
{
22 const DialogButton
&_res
;
24 DialogButtonWidget(Widget
*parent
, MessageDialog
*dia
,
25 const DialogButton
&b
)
32 setMaxSize(Size(0,0));
34 setHighlighted(b
.isDefault());
38 virtual void buttonPressHandler(const XButtonEvent
&e
) {
39 // limit to the left button
40 if (e
.button
== Button1
)
41 Button::buttonPressHandler(e
);
43 virtual void clickHandler(unsigned int) {
44 _dia
->setResult(_res
);
49 MessageDialog::MessageDialog(int screen
, EventDispatcher
*ed
, ustring title
,
51 : Widget(screen
, ed
, Widget::Vertical
)
56 MessageDialog::MessageDialog(EventDispatcher
*ed
, ustring title
,
58 : Widget(DefaultScreen(**display
), ed
, Widget::Vertical
)
63 MessageDialog::MessageDialog(Widget
*parent
, ustring title
, ustring caption
)
64 : Widget(parent
, Widget::Vertical
)
69 void MessageDialog::init(const ustring
&title
, const ustring
&caption
)
71 _label
= new Label(this);
73 _label
->setHighlighted(true);
74 _button_holder
= new Widget(this, Widget::Horizontal
);
75 _button_holder
->show();
76 _return
= XKeysymToKeycode(**display
, XStringToKeysym("Return"));
77 _escape
= XKeysymToKeycode(**display
, XStringToKeysym("Escape"));
78 _result
= &_default_result
;
80 setEventMask(eventMask() | KeyPressMask
);
81 _label
->setText(caption
);
83 otk::Property::set(window(), otk::Property::atoms
.net_wm_name
,
84 otk::Property::utf8
, title
);
85 otk::Property::set(window(), otk::Property::atoms
.wm_name
,
86 otk::Property::ascii
, otk::ustring(title
.c_str(), false));
88 // set WM Protocols on the window
90 protocols
[0] = Property::atoms
.wm_protocols
;
91 protocols
[1] = Property::atoms
.wm_delete_window
;
92 XSetWMProtocols(**display
, window(), protocols
, 2);
95 MessageDialog::~MessageDialog()
97 if (visible()) hide();
98 delete _button_holder
;
102 const DialogButton
& MessageDialog::run()
108 dispatcher()->dispatchEvents();
110 Timer::dispatchTimers(); // fire pending events
115 void MessageDialog::focus()
118 XSetInputFocus(**display
, window(), None
, CurrentTime
);
121 void MessageDialog::show()
123 std::vector
<DialogButton
>::const_iterator it
, end
= _buttons
.end();
124 for (it
= _buttons
.begin(); it
!= end
; ++it
)
125 _button_widgets
.push_back(new DialogButtonWidget(_button_holder
,
131 r
= parent()->area();
133 r
= Rect(Point(0, 0), display
->screenInfo(screen())->size());
136 size
.flags
= PMinSize
| PPosition
| PWinGravity
;
137 size
.min_width
= minSize().width();
138 size
.min_height
= minSize().height();
139 size
.win_gravity
= CenterGravity
;
141 Size dest
= minSize();
142 if (dest
.width() < 200 || dest
.height() < 100) {
143 if (dest
.width() < 200 && dest
.height() < 100) dest
= Size(200, 100);
144 else if (dest
.width() < 200) dest
= Size(200, dest
.height());
145 else dest
= Size(dest
.width(), 100);
149 // center it above its parent
150 move(Point(r
.x() + (r
.width() - dest
.width()) / 2,
151 r
.y() + (r
.height() - dest
.height()) / 2));
153 XSetWMNormalHints(**display
, window(), &size
);
158 void MessageDialog::hide()
161 std::for_each(_button_widgets
.begin(), _button_widgets
.end(),
165 void MessageDialog::keyPressHandler(const XKeyEvent
&e
)
167 if (e
.keycode
== _return
) {
168 std::vector
<DialogButton
>::const_iterator it
, end
= _buttons
.end();
169 for (it
= _buttons
.begin(); it
!= end
; ++it
)
170 if (it
->isDefault()) {
175 } else if (e
.keycode
== _escape
) {
180 void MessageDialog::clientMessageHandler(const XClientMessageEvent
&e
)
182 EventHandler::clientMessageHandler(e
);
183 if (e
.message_type
== Property::atoms
.wm_protocols
&&
184 static_cast<Atom
>(e
.data
.l
[0]) == Property::atoms
.wm_delete_window
)
This page took 0.044317 seconds and 4 git commands to generate.