summaryrefslogtreecommitdiff
path: root/src/Tab.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/Tab.cc')
-rw-r--r--src/Tab.cc120
1 files changed, 64 insertions, 56 deletions
diff --git a/src/Tab.cc b/src/Tab.cc
index f426c0e..f4f63e0 100644
--- a/src/Tab.cc
+++ b/src/Tab.cc
@@ -110,13 +110,12 @@ void Tab::createTabWindow() {
110 XGrabButton(m_display, Button1, Mod1Mask, m_tabwin, True, 110 XGrabButton(m_display, Button1, Mod1Mask, m_tabwin, True,
111 ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, 111 ButtonReleaseMask | ButtonMotionMask, GrabModeAsync,
112 GrabModeAsync, None, Fluxbox::instance()->getMoveCursor()); 112 GrabModeAsync, None, Fluxbox::instance()->getMoveCursor());
113 113
114
115 //save to tabsearch 114 //save to tabsearch
116 Fluxbox::instance()->saveTabSearch(m_tabwin, this); 115 Fluxbox::instance()->saveTabSearch(m_tabwin, this);
117 116
118 XMapSubwindows(m_display, m_tabwin); 117 XMapSubwindows(m_display, m_tabwin);
119 118
120 XMapWindow(m_display, m_tabwin); 119 XMapWindow(m_display, m_tabwin);
121 120
122 decorate(); 121 decorate();
@@ -155,12 +154,13 @@ void Tab::raise() {
155 m_win->getScreen()->raiseWindows(&first->m_tabwin, 1); 154 m_win->getScreen()->raiseWindows(&first->m_tabwin, 1);
156} 155}
157 156
158//-------------- decorate -------------------- 157//-------------- loadTheme -----------------
159// decorates the tab with current theme 158// loads the texture with the correct
159// width and height, this is necessary in
160// vertical and relative tab modes
160// TODO optimize this 161// TODO optimize this
161//-------------------------------------------- 162//------------------------------------------
162void Tab::decorate() { 163void Tab::loadTheme() {
163
164 BImageControl *image_ctrl = m_win->getScreen()->getImageControl(); 164 BImageControl *image_ctrl = m_win->getScreen()->getImageControl();
165 Pixmap tmp = m_focus_pm; 165 Pixmap tmp = m_focus_pm;
166 BTexture *texture = &(m_win->getScreen()->getWindowStyle()->tab.l_focus); 166 BTexture *texture = &(m_win->getScreen()->getWindowStyle()->tab.l_focus);
@@ -206,18 +206,24 @@ void Tab::decorate() {
206 } 206 }
207 207
208 if (tmp) image_ctrl->removeImage(tmp); 208 if (tmp) image_ctrl->removeImage(tmp);
209 209}
210
211//-------------- decorate --------------------
212// decorates the tab with current theme
213//--------------------------------------------
214void Tab::decorate() {
215 loadTheme();
216
210 XSetWindowBorderWidth(m_display, m_tabwin, 217 XSetWindowBorderWidth(m_display, m_tabwin,
211 m_win->getScreen()->getWindowStyle()->tab.border_width); 218 m_win->getScreen()->getWindowStyle()->tab.border_width);
212 XSetWindowBorder(m_display, m_tabwin, 219 XSetWindowBorder(m_display, m_tabwin,
213 m_win->getScreen()->getWindowStyle()->tab.border_color.getPixel()); 220 m_win->getScreen()->getWindowStyle()->tab.border_color.getPixel());
214} 221}
215 222
216 223//-------------- deiconify -----------------
217//-------------- deiconify -------------------
218// Deiconifies the tab 224// Deiconifies the tab
219// Used from FluxboxWindow to deiconify the tab when the window is deiconfied 225// Used from FluxboxWindow to deiconify the tab when the window is deiconfied
220//-------------------------------------------- 226//------------------------------------------
221void Tab::deiconify() { 227void Tab::deiconify() {
222 XMapWindow(m_display, m_tabwin); 228 XMapWindow(m_display, m_tabwin);
223} 229}
@@ -386,6 +392,7 @@ void Tab::setPosition() {
386 if (m_win->isShaded()) 392 if (m_win->isShaded())
387 pos_y = m_win->frame.y + m_win->getTitleHeight() + 393 pos_y = m_win->frame.y + m_win->getTitleHeight() +
388 m_win->getScreen()->getBorderWidth2x(); 394 m_win->getScreen()->getBorderWidth2x();
395
389 else 396 else
390 pos_y = m_win->frame.y + m_win->getHeight() + 397 pos_y = m_win->frame.y + m_win->getHeight() +
391 m_win->getScreen()->getBorderWidth2x(); 398 m_win->getScreen()->getBorderWidth2x();
@@ -585,70 +592,63 @@ void Tab::buttonReleaseEvent(XButtonEvent *be) {
585 be->x_root, be->y_root, &dest_x, &dest_y, &child)) { 592 be->x_root, be->y_root, &dest_x, &dest_y, &child)) {
586 593
587 Tab *tab = 0; 594 Tab *tab = 0;
595 FluxboxWindow *win = 0;
588 //search tablist for a tabwindow 596 //search tablist for a tabwindow
589 if ((tab = Fluxbox::instance()->searchTab(child))!=0) { 597 if (((tab = Fluxbox::instance()->searchTab(child))!=0) ||
598 (m_win->getScreen()->isSloppyWindowGrouping() &&
599 ((win = Fluxbox::instance()->searchWindow(child))!=0) &&
600 (tab = win->getTab())!=0)) {
601
602 if (tab == this) // inserting ourself to ourself causes a disconnect
603 return;
604
590 // do only attach a hole chain if we dropped the 605 // do only attach a hole chain if we dropped the
591 // first tab in the dropped chain... 606 // first tab in the dropped chain...
592
593 if (m_prev) 607 if (m_prev)
594 disconnect(); 608 disconnect();
595 609
596 // attach this tabwindow chain to the tabwindow chain we found. 610 // attach this tabwindow chain to the tabwindow chain we found.
597 tab->insert(this); 611 tab->insert(this);
598 612
599 } else { 613 } else {
600 disconnect(); 614 disconnect();
601 615
616 // convinience
617 unsigned short int placement = m_win->getScreen()->getTabPlacement();
618
602 // (ab)using dest_x and dest_y 619 // (ab)using dest_x and dest_y
603 switch(m_win->getScreen()->getTabPlacement()) { 620 dest_x = be->x_root;
604 case PTop: 621 dest_y = be->y_root;
605 dest_x = be->x_root; 622
606 dest_y = be->y_root; 623 if (placement == PTop || placement == PBottom || m_win->isShaded()) {
607 switch(m_win->getScreen()->getTabAlignment()) { 624 if (placement == PBottom && !m_win->isShaded())
608 case ACenter: 625 dest_y -= m_win->frame.height;
609 dest_x -= (m_win->frame.width / 2) - (m_size_w / 2); 626 else if (placement != PTop && m_win->isShaded())
610 break; 627 dest_y -= m_win->getTitleHeight();
611 case ARight: 628 else // PTop
612 dest_x -= m_win->frame.width - m_size_w; 629 dest_y += m_win->getTitleHeight();
613 break; 630
614 } 631 switch(m_win->getScreen()->getTabAlignment()) {
615 break;
616 case PBottom:
617 dest_x = be->x_root;
618 dest_y = be->y_root - m_win->frame.height;
619 switch(m_win->getScreen()->getTabAlignment()) {
620 case ACenter: 632 case ACenter:
621 dest_x -= (m_win->frame.width / 2) - (m_size_w / 2); 633 dest_x -= (m_win->frame.width / 2) - (m_size_w / 2);
622 break; 634 break;
623 case ARight: 635 case ARight:
624 dest_x -= m_win->frame.width - m_size_w; 636 dest_x -= m_win->frame.width - m_size_w;
625 break;
626 }
627 break;
628 case PLeft:
629 dest_x = be->x_root;
630 dest_y = be->y_root;
631 switch(m_win->getScreen()->getTabAlignment()) {
632 case ACenter:
633 dest_y -= (m_win->frame.height / 2) - (m_size_h / 2);
634 break; 637 break;
635 case ALeft: 638 }
636 dest_y -= m_win->frame.height - m_size_h; 639
637 break; 640 } else { // PLeft & PRight
638 } 641 if (placement == PRight)
639 break;
640 case PRight:
641 dest_x = be->x_root - m_win->frame.width; 642 dest_x = be->x_root - m_win->frame.width;
642 dest_y = be->y_root; 643
643 switch(m_win->getScreen()->getTabAlignment()) { 644 switch(m_win->getScreen()->getTabAlignment()) {
644 case ACenter: 645 case ACenter:
645 dest_y -= (m_win->frame.height / 2) - (m_size_h / 2); 646 dest_y -= (m_win->frame.height / 2) - (m_size_h / 2);
646 break; 647 break;
647 case ALeft: 648 case ALeft:
648 dest_y -= m_win->frame.height - m_size_h; 649 dest_y -= m_win->frame.height - m_size_h;
649 break; 650 break;
650 } 651 }
651 break;
652 } 652 }
653 //TODO: this causes an calculate increase event, even if we 653 //TODO: this causes an calculate increase event, even if we
654 // only are moving a window 654 // only are moving a window
@@ -778,8 +778,8 @@ Tab *Tab::getFirst(Tab *current) {
778 return i; 778 return i;
779} 779}
780 780
781//-------------- getFirst() --------- 781//-------------- getLast() ---------
782// Returns the first Tab in the chain 782// Returns the last Tab in the chain
783// of currentchain. 783// of currentchain.
784//----------------------------------- 784//-----------------------------------
785Tab *Tab::getLast(Tab *current) { 785Tab *Tab::getLast(Tab *current) {
@@ -918,11 +918,15 @@ void Tab::disconnect() {
918// Sets Tab width _including_ borders 918// Sets Tab width _including_ borders
919// --------------------------------------- 919// ---------------------------------------
920void Tab::setTabWidth(unsigned int w) { 920void Tab::setTabWidth(unsigned int w) {
921 if (w > m_win->getScreen()->getWindowStyle()->tab.border_width_2x) { 921 if (w > m_win->getScreen()->getWindowStyle()->tab.border_width_2x &&
922 w != m_size_w) {
922 m_size_w = w; 923 m_size_w = w;
923 XResizeWindow(m_display, m_tabwin, 924 XResizeWindow(m_display, m_tabwin,
924 m_size_w - m_win->getScreen()->getWindowStyle()->tab.border_width_2x, 925 m_size_w - m_win->getScreen()->getWindowStyle()->tab.border_width_2x,
925 m_size_h - m_win->getScreen()->getWindowStyle()->tab.border_width_2x); 926 m_size_h - m_win->getScreen()->getWindowStyle()->tab.border_width_2x);
927
928 loadTheme(); // rerender themes to right size
929 focus(); // redraw the window
926 } 930 }
927} 931}
928 932
@@ -930,11 +934,15 @@ void Tab::setTabWidth(unsigned int w) {
930// Sets Tab height _including_ borders 934// Sets Tab height _including_ borders
931// --------------------------------------- 935// ---------------------------------------
932void Tab::setTabHeight(unsigned int h) { 936void Tab::setTabHeight(unsigned int h) {
933 if (h > m_win->getScreen()->getWindowStyle()->tab.border_width_2x) { 937 if (h > m_win->getScreen()->getWindowStyle()->tab.border_width_2x &&
938 h != m_size_h) {
934 m_size_h = h; 939 m_size_h = h;
935 XResizeWindow(m_display, m_tabwin, 940 XResizeWindow(m_display, m_tabwin,
936 m_size_w - m_win->getScreen()->getWindowStyle()->tab.border_width_2x, 941 m_size_w - m_win->getScreen()->getWindowStyle()->tab.border_width_2x,
937 m_size_h - m_win->getScreen()->getWindowStyle()->tab.border_width_2x); 942 m_size_h - m_win->getScreen()->getWindowStyle()->tab.border_width_2x);
943
944 loadTheme(); // rerender themes to right size
945 focus(); // redraw the window
938 } 946 }
939} 947}
940 948