diff options
Diffstat (limited to 'src/WinClient.cc')
-rw-r--r-- | src/WinClient.cc | 122 |
1 files changed, 54 insertions, 68 deletions
diff --git a/src/WinClient.cc b/src/WinClient.cc index 989088b..d75d6eb 100644 --- a/src/WinClient.cc +++ b/src/WinClient.cc | |||
@@ -25,6 +25,7 @@ | |||
25 | 25 | ||
26 | #include "Window.hh" | 26 | #include "Window.hh" |
27 | #include "fluxbox.hh" | 27 | #include "fluxbox.hh" |
28 | #include "FocusControl.hh" | ||
28 | #include "Screen.hh" | 29 | #include "Screen.hh" |
29 | #include "FbAtoms.hh" | 30 | #include "FbAtoms.hh" |
30 | 31 | ||
@@ -62,7 +63,8 @@ using std::dec; | |||
62 | 63 | ||
63 | WinClient::TransientWaitMap WinClient::s_transient_wait; | 64 | WinClient::TransientWaitMap WinClient::s_transient_wait; |
64 | 65 | ||
65 | WinClient::WinClient(Window win, BScreen &screen, FluxboxWindow *fbwin):FbTk::FbWindow(win), | 66 | WinClient::WinClient(Window win, BScreen &screen, FluxboxWindow *fbwin): |
67 | Focusable(screen, fbwin), FbTk::FbWindow(win), | ||
66 | transient_for(0), | 68 | transient_for(0), |
67 | window_group(0), | 69 | window_group(0), |
68 | x(0), y(0), old_bw(0), | 70 | x(0), y(0), old_bw(0), |
@@ -75,24 +77,17 @@ WinClient::WinClient(Window win, BScreen &screen, FluxboxWindow *fbwin):FbTk::Fb | |||
75 | initial_state(0), | 77 | initial_state(0), |
76 | normal_hint_flags(0), | 78 | normal_hint_flags(0), |
77 | wm_hint_flags(0), | 79 | wm_hint_flags(0), |
78 | m_win(fbwin), | ||
79 | m_modal_count(0), | 80 | m_modal_count(0), |
80 | m_modal(false), | 81 | m_modal(false), |
81 | send_focus_message(false), | 82 | send_focus_message(false), |
82 | send_close_message(false), | 83 | send_close_message(false), |
83 | m_win_gravity(0), | 84 | m_win_gravity(0), |
84 | m_title(""), m_icon_title(""), | ||
85 | m_class_name(""), m_instance_name(""), | ||
86 | m_title_override(false), | 85 | m_title_override(false), |
87 | m_icon_title_override(false), | 86 | m_icon_title_override(false), |
88 | m_blackbox_hint(0), | ||
89 | m_mwm_hint(0), | 87 | m_mwm_hint(0), |
90 | m_focus_mode(F_PASSIVE), | 88 | m_focus_mode(F_PASSIVE), |
91 | m_diesig(*this), m_focussig(*this), | ||
92 | m_screen(screen), | ||
93 | m_strut(0) { | 89 | m_strut(0) { |
94 | updateWMProtocols(); | 90 | updateWMProtocols(); |
95 | updateBlackboxHints(); | ||
96 | updateMWMHints(); | 91 | updateMWMHints(); |
97 | updateWMHints(); | 92 | updateWMHints(); |
98 | updateWMNormalHints(); | 93 | updateWMNormalHints(); |
@@ -145,8 +140,8 @@ WinClient::~WinClient() { | |||
145 | transients.pop_back(); | 140 | transients.pop_back(); |
146 | } | 141 | } |
147 | 142 | ||
148 | if (m_win != 0) | 143 | if (fbwindow() != 0) |
149 | m_win->removeClient(*this); | 144 | fbwindow()->removeClient(*this); |
150 | 145 | ||
151 | // this takes care of any focus issues | 146 | // this takes care of any focus issues |
152 | m_diesig.notify(); | 147 | m_diesig.notify(); |
@@ -159,8 +154,6 @@ WinClient::~WinClient() { | |||
159 | s_transient_wait.erase(window()); | 154 | s_transient_wait.erase(window()); |
160 | 155 | ||
161 | 156 | ||
162 | screen().removeNetizen(window()); | ||
163 | |||
164 | if (window_group != 0) { | 157 | if (window_group != 0) { |
165 | fluxbox->removeGroupSearch(window_group); | 158 | fluxbox->removeGroupSearch(window_group); |
166 | window_group = 0; | 159 | window_group = 0; |
@@ -169,13 +162,8 @@ WinClient::~WinClient() { | |||
169 | if (m_mwm_hint != 0) | 162 | if (m_mwm_hint != 0) |
170 | XFree(m_mwm_hint); | 163 | XFree(m_mwm_hint); |
171 | 164 | ||
172 | if (m_blackbox_hint != 0) | ||
173 | XFree(m_blackbox_hint); | ||
174 | |||
175 | if (window()) | 165 | if (window()) |
176 | fluxbox->removeWindowSearch(window()); | 166 | fluxbox->removeWindowSearch(window()); |
177 | |||
178 | m_win = 0; | ||
179 | } | 167 | } |
180 | 168 | ||
181 | bool WinClient::acceptsFocus() const { | 169 | bool WinClient::acceptsFocus() const { |
@@ -243,12 +231,16 @@ bool WinClient::getWMIconName(XTextProperty &textprop) const { | |||
243 | return XGetWMIconName(display(), window(), &textprop); | 231 | return XGetWMIconName(display(), window(), &textprop); |
244 | } | 232 | } |
245 | 233 | ||
246 | const string &WinClient::getWMClassName() const { | 234 | string WinClient::getWMRole() const { |
247 | return m_instance_name; | 235 | Atom wm_role = XInternAtom(FbTk::App::instance()->display(), |
236 | "WM_WINDOW_ROLE", False); | ||
237 | return textProperty(wm_role); | ||
248 | } | 238 | } |
249 | 239 | ||
250 | const string &WinClient::getWMClassClass() const { | 240 | const string &WinClient::title() const { |
251 | return m_class_name; | 241 | if (!fbwindow() || !fbwindow()->isIconic() || m_icon_title.empty()) |
242 | return m_title; | ||
243 | return m_icon_title; | ||
252 | } | 244 | } |
253 | 245 | ||
254 | void WinClient::updateWMClassHint() { | 246 | void WinClient::updateWMClassHint() { |
@@ -257,6 +249,7 @@ void WinClient::updateWMClassHint() { | |||
257 | #ifdef DEBUG | 249 | #ifdef DEBUG |
258 | cerr<<"WinClient: Failed to read class hint!"<<endl; | 250 | cerr<<"WinClient: Failed to read class hint!"<<endl; |
259 | #endif //DEBUG | 251 | #endif //DEBUG |
252 | m_instance_name = m_class_name = ""; | ||
260 | } else { | 253 | } else { |
261 | 254 | ||
262 | if (ch.res_name != 0) { | 255 | if (ch.res_name != 0) { |
@@ -364,18 +357,24 @@ void WinClient::updateTitle() { | |||
364 | return; | 357 | return; |
365 | 358 | ||
366 | m_title = string(Xutil::getWMName(window()), 0, 512); | 359 | m_title = string(Xutil::getWMName(window()), 0, 512); |
360 | titleSig().notify(); | ||
361 | if (fbwindow()) | ||
362 | fbwindow()->updateTitleFromClient(*this); | ||
367 | } | 363 | } |
368 | 364 | ||
369 | void WinClient::setTitle(FbTk::FbString &title) { | 365 | void WinClient::setTitle(FbTk::FbString &title) { |
370 | m_title = title; | 366 | m_title = title; |
371 | m_title_override = true; | 367 | m_title_override = true; |
372 | if (m_win) | 368 | titleSig().notify(); |
373 | m_win->updateTitleFromClient(*this); | 369 | if (fbwindow()) |
370 | fbwindow()->updateTitleFromClient(*this); | ||
374 | } | 371 | } |
375 | 372 | ||
376 | void WinClient::setIconTitle(FbTk::FbString &icon_title) { | 373 | void WinClient::setIconTitle(FbTk::FbString &icon_title) { |
377 | m_icon_title = icon_title; | 374 | m_icon_title = icon_title; |
378 | m_icon_title_override = true; | 375 | m_icon_title_override = true; |
376 | if (fbwindow() && fbwindow()->isIconic()) | ||
377 | fbwindow()->updateTitleFromClient(*this); | ||
379 | } | 378 | } |
380 | 379 | ||
381 | void WinClient::updateIconTitle() { | 380 | void WinClient::updateIconTitle() { |
@@ -390,24 +389,27 @@ void WinClient::updateIconTitle() { | |||
390 | if (text_prop.value && text_prop.nitems > 0) { | 389 | if (text_prop.value && text_prop.nitems > 0) { |
391 | if (text_prop.encoding != XA_STRING) { | 390 | if (text_prop.encoding != XA_STRING) { |
392 | text_prop.nitems = strlen((char *) text_prop.value); | 391 | text_prop.nitems = strlen((char *) text_prop.value); |
392 | XmbTextPropertyToTextList(display(), &text_prop, &list, &num); | ||
393 | 393 | ||
394 | if (XmbTextPropertyToTextList(display(), &text_prop, | 394 | if (num > 0 && list) |
395 | &list, &num) == Success && | ||
396 | num > 0 && *list) { | ||
397 | m_icon_title = (char *)*list; | 395 | m_icon_title = (char *)*list; |
398 | XFreeStringList(list); | 396 | else |
399 | } else | ||
400 | m_icon_title = text_prop.value ? (char *)text_prop.value : ""; | 397 | m_icon_title = text_prop.value ? (char *)text_prop.value : ""; |
398 | if (list) | ||
399 | XFreeStringList(list); | ||
400 | |||
401 | } else | 401 | } else |
402 | m_icon_title = text_prop.value ? (char *)text_prop.value : ""; | 402 | m_icon_title = text_prop.value ? (char *)text_prop.value : ""; |
403 | 403 | ||
404 | if (text_prop.value) | 404 | if (text_prop.value) |
405 | XFree((char *) text_prop.value); | 405 | XFree((char *) text_prop.value); |
406 | } else | 406 | } else |
407 | m_icon_title = title(); | 407 | m_icon_title = ""; |
408 | } else | 408 | } else |
409 | m_icon_title = title(); | 409 | m_icon_title = ""; |
410 | 410 | ||
411 | if (fbwindow() && fbwindow()->isIconic()) | ||
412 | fbwindow()->updateTitleFromClient(*this); | ||
411 | } | 413 | } |
412 | 414 | ||
413 | void WinClient::saveBlackboxAttribs(FluxboxWindow::BlackboxAttributes &blackbox_attribs) { | 415 | void WinClient::saveBlackboxAttribs(FluxboxWindow::BlackboxAttributes &blackbox_attribs) { |
@@ -419,32 +421,7 @@ void WinClient::saveBlackboxAttribs(FluxboxWindow::BlackboxAttributes &blackbox_ | |||
419 | } | 421 | } |
420 | 422 | ||
421 | void WinClient::setFluxboxWindow(FluxboxWindow *win) { | 423 | void WinClient::setFluxboxWindow(FluxboxWindow *win) { |
422 | m_win = win; | 424 | m_fbwin = win; |
423 | } | ||
424 | |||
425 | void WinClient::updateBlackboxHints() { | ||
426 | int format; | ||
427 | Atom atom_return; | ||
428 | unsigned long num, len; | ||
429 | FbAtoms *atoms = FbAtoms::instance(); | ||
430 | |||
431 | if (m_blackbox_hint) { | ||
432 | XFree(m_blackbox_hint); | ||
433 | m_blackbox_hint = 0; | ||
434 | } | ||
435 | |||
436 | if (property(atoms->getFluxboxHintsAtom(), 0, | ||
437 | PropBlackboxHintsElements, False, | ||
438 | atoms->getFluxboxHintsAtom(), &atom_return, | ||
439 | &format, &num, &len, | ||
440 | (unsigned char **) &m_blackbox_hint) && | ||
441 | m_blackbox_hint) { | ||
442 | |||
443 | if (num != (unsigned)PropBlackboxHintsElements) { | ||
444 | XFree(m_blackbox_hint); | ||
445 | m_blackbox_hint = 0; | ||
446 | } | ||
447 | } | ||
448 | } | 425 | } |
449 | 426 | ||
450 | void WinClient::updateMWMHints() { | 427 | void WinClient::updateMWMHints() { |
@@ -521,16 +498,16 @@ void WinClient::updateWMHints() { | |||
521 | window_group = None; | 498 | window_group = None; |
522 | 499 | ||
523 | if ((bool)(wmhint->flags & IconPixmapHint) && wmhint->icon_pixmap != 0) | 500 | if ((bool)(wmhint->flags & IconPixmapHint) && wmhint->icon_pixmap != 0) |
524 | m_icon_pixmap.copy(wmhint->icon_pixmap, 0, 0); | 501 | m_icon.pixmap().copy(wmhint->icon_pixmap, 0, 0); |
525 | else | 502 | else |
526 | m_icon_pixmap = 0; | 503 | m_icon.pixmap().release(); |
527 | 504 | ||
528 | if ((bool)(wmhint->flags & IconMaskHint) && wmhint->icon_mask != 0) | 505 | if ((bool)(wmhint->flags & IconMaskHint) && wmhint->icon_mask != 0) |
529 | m_icon_mask.copy(wmhint->icon_mask, 0, 0); | 506 | m_icon.mask().copy(wmhint->icon_mask, 0, 0); |
530 | else | 507 | else |
531 | m_icon_mask = 0; | 508 | m_icon.mask().release(); |
532 | 509 | ||
533 | if (m_win) { | 510 | if (fbwindow()) { |
534 | if (wmhint->flags & XUrgencyHint) { | 511 | if (wmhint->flags & XUrgencyHint) { |
535 | Fluxbox::instance()->attentionHandler().addAttention(*this); | 512 | Fluxbox::instance()->attentionHandler().addAttention(*this); |
536 | } else { | 513 | } else { |
@@ -715,10 +692,22 @@ void WinClient::clearStrut() { | |||
715 | } | 692 | } |
716 | 693 | ||
717 | bool WinClient::focus() { | 694 | bool WinClient::focus() { |
718 | if (m_win == 0) | 695 | if (fbwindow() == 0) |
719 | return false; | 696 | return false; |
720 | else | 697 | else |
721 | return m_win->setCurrentClient(*this, true); | 698 | return fbwindow()->setCurrentClient(*this, true); |
699 | } | ||
700 | |||
701 | bool WinClient::isFocused() const { | ||
702 | return (fbwindow() ? | ||
703 | fbwindow()->isFocused() && &fbwindow()->winClient() == this : | ||
704 | false); | ||
705 | } | ||
706 | |||
707 | void WinClient::setAttentionState(bool value) { | ||
708 | Focusable::setAttentionState(value); | ||
709 | if (fbwindow() && !fbwindow()->isFocused()) | ||
710 | fbwindow()->setAttentionState(value); | ||
722 | } | 711 | } |
723 | 712 | ||
724 | void WinClient::updateWMProtocols() { | 713 | void WinClient::updateWMProtocols() { |
@@ -731,19 +720,16 @@ void WinClient::updateWMProtocols() { | |||
731 | // defaults | 720 | // defaults |
732 | send_focus_message = false; | 721 | send_focus_message = false; |
733 | send_close_message = false; | 722 | send_close_message = false; |
734 | // could be added to netizens twice... | ||
735 | for (int i = 0; i < num_return; ++i) { | 723 | for (int i = 0; i < num_return; ++i) { |
736 | if (proto[i] == fbatoms->getWMDeleteAtom()) | 724 | if (proto[i] == fbatoms->getWMDeleteAtom()) |
737 | send_close_message = true; | 725 | send_close_message = true; |
738 | else if (proto[i] == fbatoms->getWMTakeFocusAtom()) | 726 | else if (proto[i] == fbatoms->getWMTakeFocusAtom()) |
739 | send_focus_message = true; | 727 | send_focus_message = true; |
740 | else if (proto[i] == fbatoms->getFluxboxStructureMessagesAtom()) | ||
741 | screen().addNetizen(window()); | ||
742 | } | 728 | } |
743 | 729 | ||
744 | XFree(proto); | 730 | XFree(proto); |
745 | if (m_win) | 731 | if (fbwindow()) |
746 | m_win->updateFunctions(); | 732 | fbwindow()->updateFunctions(); |
747 | #ifdef DEBUG | 733 | #ifdef DEBUG |
748 | } else { | 734 | } else { |
749 | cerr<<"Warning: Failed to read WM Protocols. "<<endl; | 735 | cerr<<"Warning: Failed to read WM Protocols. "<<endl; |