aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--src/FbWinFrame.cc15
-rw-r--r--src/FbWinFrame.hh10
-rw-r--r--src/FocusControl.cc3
-rw-r--r--src/Screen.cc1
-rw-r--r--src/Screen.hh2
-rw-r--r--src/WinClient.cc4
-rw-r--r--src/Window.cc37
-rw-r--r--src/Window.hh3
9 files changed, 37 insertions, 42 deletions
diff --git a/ChangeLog b/ChangeLog
index 443f335..1c52fda 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
1 (Format: Year/Month/Day) 1 (Format: Year/Month/Day)
2Changes for 1.1: 2Changes for 1.1:
3*07/03/25:
4 * Added new resource session.screen<N>.tabs.usePixmap that puts the window's
5 icon in the tab, if available. This is on by default. (Mark)
6 Window.cc FbWinFrame.cc/hh WinClient.cc Screen.cc/hh
3*07/03/24: 7*07/03/24:
4 * Updated French translations (thanks Ulrich Etile) 8 * Updated French translations (thanks Ulrich Etile)
5 nls/fr_FR/Translation.m 9 nls/fr_FR/Translation.m
diff --git a/src/FbWinFrame.cc b/src/FbWinFrame.cc
index 99dd93d..84f47f4 100644
--- a/src/FbWinFrame.cc
+++ b/src/FbWinFrame.cc
@@ -33,6 +33,7 @@
33#include "FbWinFrameTheme.hh" 33#include "FbWinFrameTheme.hh"
34#include "Screen.hh" 34#include "Screen.hh"
35 35
36#include "IconButton.hh"
36#include "Container.hh" 37#include "Container.hh"
37 38
38#ifdef SHAPE 39#ifdef SHAPE
@@ -619,11 +620,9 @@ void FbWinFrame::removeAllButtons() {
619 } 620 }
620} 621}
621 622
622FbWinFrame::ButtonId FbWinFrame::createTab(const string &title, FbTk::Command *command, 623IconButton *FbWinFrame::createTab(Focusable &client) {
623 int tabs_padding) { 624 IconButton *button = new IconButton(m_tab_container, theme().font(),
624 FbTk::TextButton *button = new FbTk::TextButton(m_tab_container, 625 client);
625 theme().font(),
626 title);
627 626
628 button->show(); 627 button->show();
629 button->setEventMask(ExposureMask | ButtonPressMask | 628 button->setEventMask(ExposureMask | ButtonPressMask |
@@ -631,10 +630,6 @@ FbWinFrame::ButtonId FbWinFrame::createTab(const string &title, FbTk::Command *c
631 EnterWindowMask); 630 EnterWindowMask);
632 FbTk::EventManager::instance()->add(*button, button->window()); 631 FbTk::EventManager::instance()->add(*button, button->window());
633 632
634 FbTk::RefCount<FbTk::Command> refcmd(command);
635 button->setOnClick(refcmd);
636
637 button->setTextPadding(tabs_padding);
638 button->setJustify(theme().justify()); 633 button->setJustify(theme().justify());
639 button->setBorderColor(theme().border().color()); 634 button->setBorderColor(theme().border().color());
640 button->setBorderWidth(m_window.borderWidth()); 635 button->setBorderWidth(m_window.borderWidth());
@@ -647,7 +642,7 @@ FbWinFrame::ButtonId FbWinFrame::createTab(const string &title, FbTk::Command *c
647 return button; 642 return button;
648} 643}
649 644
650void FbWinFrame::removeTab(ButtonId btn) { 645void FbWinFrame::removeTab(IconButton *btn) {
651 if (btn == m_current_label) 646 if (btn == m_current_label)
652 m_current_label = 0; 647 m_current_label = 0;
653 648
diff --git a/src/FbWinFrame.hh b/src/FbWinFrame.hh
index 182add4..a75d8a1 100644
--- a/src/FbWinFrame.hh
+++ b/src/FbWinFrame.hh
@@ -42,6 +42,8 @@
42class Shape; 42class Shape;
43class FbWinFrameTheme; 43class FbWinFrameTheme;
44class BScreen; 44class BScreen;
45class IconButton;
46class Focusable;
45 47
46namespace FbTk { 48namespace FbTk {
47class TextButton; 49class TextButton;
@@ -70,8 +72,6 @@ public:
70 }; 72 };
71 73
72 74
73 typedef FbTk::TextButton *ButtonId; ///< defines a button id
74
75 /// create a top level window 75 /// create a top level window
76 FbWinFrame(BScreen &screen, FbWinFrameTheme &theme, FbTk::ImageControl &imgctrl, 76 FbWinFrame(BScreen &screen, FbWinFrameTheme &theme, FbTk::ImageControl &imgctrl,
77 FbTk::XLayer &layer, 77 FbTk::XLayer &layer,
@@ -141,10 +141,9 @@ public:
141 /// remove all buttons from titlebar 141 /// remove all buttons from titlebar
142 void removeAllButtons(); 142 void removeAllButtons();
143 /// adds a button to label window with specified title and command 143 /// adds a button to label window with specified title and command
144 ButtonId createTab(const std::string &title, FbTk::Command *cmd, int tab_padding); 144 IconButton *createTab(Focusable &client);
145 // void addLabelButton(FbTk::TextButton &btn);
146 /// removes a specific button from label window 145 /// removes a specific button from label window
147 void removeTab(ButtonId id); 146 void removeTab(IconButton *id);
148 /// move label button to the left 147 /// move label button to the left
149 void moveLabelButtonLeft(FbTk::TextButton &btn); 148 void moveLabelButtonLeft(FbTk::TextButton &btn);
150 /// move label button to the right 149 /// move label button to the right
@@ -322,7 +321,6 @@ private:
322 m_buttons_right; ///< buttons to the right 321 m_buttons_right; ///< buttons to the right
323 typedef std::list<FbTk::TextButton *> LabelList; 322 typedef std::list<FbTk::TextButton *> LabelList;
324 FbTk::TextButton *m_current_label; ///< which client button is focused at the moment 323 FbTk::TextButton *m_current_label; ///< which client button is focused at the moment
325 std::string m_titletext; ///< text to be displayed int m_label
326 int m_bevel; ///< bevel between titlebar items and titlebar 324 int m_bevel; ///< bevel between titlebar items and titlebar
327 bool m_use_titlebar; ///< if we should use titlebar 325 bool m_use_titlebar; ///< if we should use titlebar
328 bool m_use_tabs; ///< if we should use tabs (turns them off in external mode only) 326 bool m_use_tabs; ///< if we should use tabs (turns them off in external mode only)
diff --git a/src/FocusControl.cc b/src/FocusControl.cc
index e653e22..71b289b 100644
--- a/src/FocusControl.cc
+++ b/src/FocusControl.cc
@@ -291,7 +291,8 @@ Focusable *FocusControl::lastFocusedWindow(int workspace) {
291 * Stuck, iconic etc don't matter within a group 291 * Stuck, iconic etc don't matter within a group
292 */ 292 */
293WinClient *FocusControl::lastFocusedWindow(FluxboxWindow &group, WinClient *ignore_client) { 293WinClient *FocusControl::lastFocusedWindow(FluxboxWindow &group, WinClient *ignore_client) {
294 if (m_focused_list.empty()) return 0; 294 if (m_focused_list.empty() || m_screen.isShuttingdown())
295 return 0;
295 296
296 Focusables::iterator it = m_focused_list.begin(); 297 Focusables::iterator it = m_focused_list.begin();
297 Focusables::iterator it_end = m_focused_list.end(); 298 Focusables::iterator it_end = m_focused_list.end();
diff --git a/src/Screen.cc b/src/Screen.cc
index fca932d..a0bc01d 100644
--- a/src/Screen.cc
+++ b/src/Screen.cc
@@ -325,6 +325,7 @@ BScreen::ScreenResource::ScreenResource(FbTk::ResourceManager &rm,
325 altscrname+".overlay.CapStyle"), 325 altscrname+".overlay.CapStyle"),
326 scroll_action(rm, "", scrname+".windowScrollAction", altscrname+".WindowScrollAction"), 326 scroll_action(rm, "", scrname+".windowScrollAction", altscrname+".WindowScrollAction"),
327 scroll_reverse(rm, false, scrname+".windowScrollReverse", altscrname+".WindowScrollReverse"), 327 scroll_reverse(rm, false, scrname+".windowScrollReverse", altscrname+".WindowScrollReverse"),
328 tabs_use_pixmap(rm, true, scrname+".tabs.usePixmap", altscrname+".Tabs.UsePixmap"),
328 max_over_tabs(rm, false, scrname+".tabs.maxOver", altscrname+".Tabs.MaxOver"), 329 max_over_tabs(rm, false, scrname+".tabs.maxOver", altscrname+".Tabs.MaxOver"),
329 default_internal_tabs(rm, false /* TODO: autoconf option? */ , scrname+".tabs.intitlebar", altscrname+".Tabs.InTitlebar") { 330 default_internal_tabs(rm, false /* TODO: autoconf option? */ , scrname+".tabs.intitlebar", altscrname+".Tabs.InTitlebar") {
330 331
diff --git a/src/Screen.hh b/src/Screen.hh
index 352a015..53198fc 100644
--- a/src/Screen.hh
+++ b/src/Screen.hh
@@ -147,6 +147,7 @@ public:
147 inline const std::string &getScrollAction() const { return *resource.scroll_action; } 147 inline const std::string &getScrollAction() const { return *resource.scroll_action; }
148 inline const bool getScrollReverse() const { return *resource.scroll_reverse; } 148 inline const bool getScrollReverse() const { return *resource.scroll_reverse; }
149 inline const bool getDefaultInternalTabs() const { return *resource.default_internal_tabs; } 149 inline const bool getDefaultInternalTabs() const { return *resource.default_internal_tabs; }
150 inline const bool getTabsUsePixmap() const { return *resource.tabs_use_pixmap; }
150 inline const bool getMaxOverTabs() const { return *resource.max_over_tabs; } 151 inline const bool getMaxOverTabs() const { return *resource.max_over_tabs; }
151 152
152 inline unsigned int getTabWidth() const { return *resource.tab_width; } 153 inline unsigned int getTabWidth() const { return *resource.tab_width; }
@@ -468,6 +469,7 @@ private:
468 FbTk::Resource<FbTk::GContext::CapStyle> gc_cap_style; 469 FbTk::Resource<FbTk::GContext::CapStyle> gc_cap_style;
469 FbTk::Resource<std::string> scroll_action; 470 FbTk::Resource<std::string> scroll_action;
470 FbTk::Resource<bool> scroll_reverse; 471 FbTk::Resource<bool> scroll_reverse;
472 FbTk::Resource<bool> tabs_use_pixmap;
471 FbTk::Resource<bool> max_over_tabs; 473 FbTk::Resource<bool> max_over_tabs;
472 FbTk::Resource<bool> default_internal_tabs; 474 FbTk::Resource<bool> default_internal_tabs;
473 475
diff --git a/src/WinClient.cc b/src/WinClient.cc
index 6ede82c..4e491f0 100644
--- a/src/WinClient.cc
+++ b/src/WinClient.cc
@@ -353,11 +353,15 @@ void WinClient::updateTitle() {
353 return; 353 return;
354 354
355 m_title = string(Xutil::getWMName(window()), 0, 512); 355 m_title = string(Xutil::getWMName(window()), 0, 512);
356 titleSig().notify();
357 if (fbwindow())
358 fbwindow()->updateTitleFromClient(*this);
356} 359}
357 360
358void WinClient::setTitle(FbTk::FbString &title) { 361void WinClient::setTitle(FbTk::FbString &title) {
359 m_title = title; 362 m_title = title;
360 m_title_override = true; 363 m_title_override = true;
364 titleSig().notify();
361 if (fbwindow()) 365 if (fbwindow())
362 fbwindow()->updateTitleFromClient(*this); 366 fbwindow()->updateTitleFromClient(*this);
363} 367}
diff --git a/src/Window.cc b/src/Window.cc
index ce14d08..560bf96 100644
--- a/src/Window.cc
+++ b/src/Window.cc
@@ -42,8 +42,8 @@
42#include "StringUtil.hh" 42#include "StringUtil.hh"
43#include "FocusControl.hh" 43#include "FocusControl.hh"
44#include "Layer.hh" 44#include "Layer.hh"
45#include "IconButton.hh"
45 46
46#include "FbTk/TextButton.hh"
47#include "FbTk/Compose.hh" 47#include "FbTk/Compose.hh"
48#include "FbTk/EventManager.hh" 48#include "FbTk/EventManager.hh"
49#include "FbTk/KeyUtil.hh" 49#include "FbTk/KeyUtil.hh"
@@ -739,7 +739,7 @@ bool FluxboxWindow::removeClient(WinClient &client) {
739 FbTk::EventManager &evm = *FbTk::EventManager::instance(); 739 FbTk::EventManager &evm = *FbTk::EventManager::instance();
740 evm.remove(client.window()); 740 evm.remove(client.window());
741 741
742 FbTk::TextButton *label_btn = m_labelbuttons[&client]; 742 IconButton *label_btn = m_labelbuttons[&client];
743 if (label_btn != 0) { 743 if (label_btn != 0) {
744 frame().removeTab(label_btn); 744 frame().removeTab(label_btn);
745 label_btn = 0; 745 label_btn = 0;
@@ -1015,8 +1015,8 @@ void FluxboxWindow::associateClientWindow(bool use_attrs,
1015 int x, int y, 1015 int x, int y,
1016 unsigned int width, unsigned int height, 1016 unsigned int width, unsigned int height,
1017 int gravity, unsigned int client_bw) { 1017 int gravity, unsigned int client_bw) {
1018 updateTitleFromClient(*m_client); 1018 m_client->updateTitle();
1019 updateIconNameFromClient(*m_client); 1019 m_client->updateIconTitle();
1020 1020
1021 if (use_attrs) 1021 if (use_attrs)
1022 frame().moveResizeForClient(x, y, 1022 frame().moveResizeForClient(x, y,
@@ -1099,21 +1099,12 @@ void FluxboxWindow::reconfigure() {
1099 1099
1100/// update current client title and title in our frame 1100/// update current client title and title in our frame
1101void FluxboxWindow::updateTitleFromClient(WinClient &client) { 1101void FluxboxWindow::updateTitleFromClient(WinClient &client) {
1102 client.updateTitle(); 1102 if (&client == m_client) {
1103 // compare old title with new and see if we need to update 1103 frame().setFocusTitle(client.title());
1104 // graphics 1104 titleSig().notify();
1105 if (m_labelbuttons[&client]->text() != client.title()) {
1106 m_labelbuttons[&client]->setText(client.title());
1107 if (&client == m_client)
1108 frame().setFocusTitle(client.title());
1109 } 1105 }
1110} 1106}
1111 1107
1112/// update icon title from client
1113void FluxboxWindow::updateIconNameFromClient(WinClient &client) {
1114 client.updateIconTitle();
1115}
1116
1117void FluxboxWindow::updateMWMHintsFromClient(WinClient &client) { 1108void FluxboxWindow::updateMWMHintsFromClient(WinClient &client) {
1118 const WinClient::MwmHints *hint = client.getMwmHint(); 1109 const WinClient::MwmHints *hint = client.getMwmHint();
1119 1110
@@ -2457,8 +2448,7 @@ void FluxboxWindow::propertyNotifyEvent(WinClient &client, Atom atom) {
2457 // update icon title and then do normal XA_WM_NAME stuff 2448 // update icon title and then do normal XA_WM_NAME stuff
2458 client.updateIconTitle(); 2449 client.updateIconTitle();
2459 case XA_WM_NAME: 2450 case XA_WM_NAME:
2460 updateTitleFromClient(client); 2451 client.updateTitle();
2461 titleSig().notify();
2462 break; 2452 break;
2463 2453
2464 case XA_WM_NORMAL_HINTS: { 2454 case XA_WM_NORMAL_HINTS: {
@@ -4191,13 +4181,14 @@ void FluxboxWindow::ungrabPointer(Time time) {
4191 4181
4192void FluxboxWindow::associateClient(WinClient &client) { 4182void FluxboxWindow::associateClient(WinClient &client) {
4193 4183
4194 FbWinFrame::ButtonId btn = frame().createTab(client.title(), 4184 IconButton *btn = frame().createTab(client);
4195 new SetClientCmd(client),
4196 Fluxbox::instance()->getTabsPadding());
4197
4198 m_labelbuttons[&client] = btn;
4199 4185
4186 FbTk::RefCount<FbTk::Command> setcmd(new SetClientCmd(client));
4187 btn->setOnClick(setcmd, 1);
4188 btn->setTextPadding(Fluxbox::instance()->getTabsPadding());
4189 btn->setPixmap(screen().getTabsUsePixmap());
4200 4190
4191 m_labelbuttons[&client] = btn;
4201 4192
4202 FbTk::EventManager &evm = *FbTk::EventManager::instance(); 4193 FbTk::EventManager &evm = *FbTk::EventManager::instance();
4203 4194
diff --git a/src/Window.hh b/src/Window.hh
index 9991bb6..d04f171 100644
--- a/src/Window.hh
+++ b/src/Window.hh
@@ -456,7 +456,6 @@ private:
456 /// gets title string from client window and updates frame's title 456 /// gets title string from client window and updates frame's title
457 void updateTitleFromClient(WinClient &client); 457 void updateTitleFromClient(WinClient &client);
458 /// gets icon name from client window 458 /// gets icon name from client window
459 void updateIconNameFromClient(WinClient &client);
460 void updateMWMHintsFromClient(WinClient &client); 459 void updateMWMHintsFromClient(WinClient &client);
461 void updateBlackboxHintsFromClient(const WinClient &client); 460 void updateBlackboxHintsFromClient(const WinClient &client);
462 void updateRememberStateFromClient(WinClient &client); 461 void updateRememberStateFromClient(WinClient &client);
@@ -529,7 +528,7 @@ private:
529 528
530 ClientList m_clientlist; 529 ClientList m_clientlist;
531 WinClient *m_client; ///< current client 530 WinClient *m_client; ///< current client
532 typedef std::map<WinClient *, FbTk::TextButton *> Client2ButtonMap; 531 typedef std::map<WinClient *, IconButton *> Client2ButtonMap;
533 Client2ButtonMap m_labelbuttons; 532 Client2ButtonMap m_labelbuttons;
534 533
535 // just temporary solution 534 // just temporary solution