aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/fluxbox.cc62
1 files changed, 50 insertions, 12 deletions
diff --git a/src/fluxbox.cc b/src/fluxbox.cc
index a45f4e4..2f2b7af 100644
--- a/src/fluxbox.cc
+++ b/src/fluxbox.cc
@@ -22,7 +22,7 @@
22// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23// DEALINGS IN THE SOFTWARE. 23// DEALINGS IN THE SOFTWARE.
24 24
25// $Id: fluxbox.cc,v 1.25 2002/02/02 19:51:15 pekdon Exp $ 25// $Id: fluxbox.cc,v 1.26 2002/02/04 06:57:26 fluxgen Exp $
26 26
27//Use some GNU extensions 27//Use some GNU extensions
28#ifndef _GNU_SOURCE 28#ifndef _GNU_SOURCE
@@ -237,7 +237,7 @@ std::string Resource<std::string>::
237getString() { return **this; } 237getString() { return **this; }
238 238
239template<> 239template<>
240string Resource<Fluxbox::TitlebarList>:: 240std::string Resource<Fluxbox::TitlebarList>::
241getString() { 241getString() {
242 string retval; 242 string retval;
243 int size=m_value.size(); 243 int size=m_value.size();
@@ -701,6 +701,9 @@ void Fluxbox::process_event(XEvent *e) {
701 701
702 case MapNotify: 702 case MapNotify:
703 { 703 {
704 #ifdef DEBUG
705 cerr<<__FILE__<<"("<<__LINE__<<"): MapNotify:"<<hex<<e->xmap.window<<endl;
706 #endif
704 FluxboxWindow *win = searchWindow(e->xmap.window); 707 FluxboxWindow *win = searchWindow(e->xmap.window);
705 708
706 if (win) 709 if (win)
@@ -711,6 +714,9 @@ void Fluxbox::process_event(XEvent *e) {
711 714
712 case UnmapNotify: 715 case UnmapNotify:
713 { 716 {
717 #ifdef DEBUG
718 cerr<<__FILE__<<"("<<__LINE__<<"): UnmapNotify:"<<hex<<e->xunmap.window<<endl;
719 #endif
714 FluxboxWindow *win = (FluxboxWindow *) 0; 720 FluxboxWindow *win = (FluxboxWindow *) 0;
715 721
716 #ifdef SLIT 722 #ifdef SLIT
@@ -718,8 +724,11 @@ void Fluxbox::process_event(XEvent *e) {
718 #endif // SLIT 724 #endif // SLIT
719 725
720 if ((win = searchWindow(e->xunmap.window))) { 726 if ((win = searchWindow(e->xunmap.window))) {
721 win->unmapNotifyEvent(&e->xunmap); 727 // only process windows with StructureNotify selected
722 728 // (ignore SubstructureNotify)
729 // if (win->windowFor(e->xunmap.window))
730 if (win->getClientWindow()!=e->xunmap.window)
731 win->unmapNotifyEvent(&e->xunmap);
723 #ifdef SLIT 732 #ifdef SLIT
724 } else if ((slit = searchSlit(e->xunmap.window))) { 733 } else if ((slit = searchSlit(e->xunmap.window))) {
725 slit->removeClient(e->xunmap.window); 734 slit->removeClient(e->xunmap.window);
@@ -729,7 +738,8 @@ void Fluxbox::process_event(XEvent *e) {
729 738
730 break; 739 break;
731 } 740 }
732 741 case CreateNotify:
742 break;
733 case DestroyNotify: 743 case DestroyNotify:
734 { 744 {
735 FluxboxWindow *win = (FluxboxWindow *) 0; 745 FluxboxWindow *win = (FluxboxWindow *) 0;
@@ -964,6 +974,7 @@ void Fluxbox::process_event(XEvent *e) {
964 case Keys::RIGHTWORKSPACE: 974 case Keys::RIGHTWORKSPACE:
965 screen->rightWorkspace(); 975 screen->rightWorkspace();
966 break; 976 break;
977
967 case Keys::KILLWINDOW: //kill the current window 978 case Keys::KILLWINDOW: //kill the current window
968 XKillClient(screen->getBaseDisplay()->getXDisplay(), 979 XKillClient(screen->getBaseDisplay()->getXDisplay(),
969 focused_window->getClientWindow()); 980 focused_window->getClientWindow());
@@ -1057,6 +1068,10 @@ void Fluxbox::process_event(XEvent *e) {
1057 1068
1058 case ClientMessage: 1069 case ClientMessage:
1059 { 1070 {
1071 #ifdef DEBUG
1072 cerr<<__FILE__<<"("<<__LINE__<<"): ClientMessage. data.l[0]="<<e->xclient.data.l[0]<<endl;
1073 #endif
1074
1060 if (e->xclient.format == 32) { 1075 if (e->xclient.format == 32) {
1061 if (e->xclient.message_type == getWMChangeStateAtom()) { 1076 if (e->xclient.message_type == getWMChangeStateAtom()) {
1062 FluxboxWindow *win = searchWindow(e->xclient.window); 1077 FluxboxWindow *win = searchWindow(e->xclient.window);
@@ -1101,20 +1116,42 @@ void Fluxbox::process_event(XEvent *e) {
1101 1116
1102 win->changeBlackboxHints(&net); 1117 win->changeBlackboxHints(&net);
1103 } 1118 }
1104 } 1119 }
1105 #ifdef GNOME 1120 #ifdef GNOME
1106 else if (e->xclient.message_type == getGnomeWorkspaceAtom()) { 1121 else if (e->xclient.message_type == getGnomeWorkspaceAtom()) {
1107 #ifdef DEBUG 1122 #ifdef DEBUG
1108 cerr<<__FILE__<<"("<<__LINE__<<"): Got workspace atom"<<endl; 1123 cerr<<__FILE__<<"("<<__LINE__<<"): Got workspace atom="<<e->xclient.data.l[0]<<endl;
1109 #endif//!DEBUG 1124 #endif//!DEBUG
1110 BScreen *screen = searchScreen(e->xclient.window); 1125 BScreen *screen = 0;
1111 if (screen) 1126 FluxboxWindow *win = 0;
1127
1128 if ( (win = searchWindow(e->xclient.window))!=0 &&
1129 win->getScreen() && e->xclient.data.l[0] >= 0 &&
1130 e->xclient.data.l[0] < win->getScreen()->getCount()) {
1131
1132 win->getScreen()->changeWorkspaceID(e->xclient.data.l[0]);
1133
1134 } else if ((screen = searchScreen(e->xclient.window))!=0 &&
1135 e->xclient.data.l[0] >= 0 &&
1136 e->xclient.data.l[0] < screen->getCount()) {
1137
1112 screen->changeWorkspaceID(e->xclient.data.l[0]); 1138 screen->changeWorkspaceID(e->xclient.data.l[0]);
1139 }
1113 1140
1114 } 1141 }
1115 #endif //!GNOME 1142 #endif //!GNOME
1116 } 1143 #ifdef NEWWMSPEC
1144 else if (e->xclient.message_type == getNETWMDesktopAtom()) {
1145 BScreen *screen = searchScreen(e->xclient.window);
1117 1146
1147 if (screen && e->xclient.data.l[0] >= 0 &&
1148 e->xclient.data.l[0] < screen->getCount())
1149 screen->changeWorkspaceID(e->xclient.data.l[0]);
1150 }
1151 #endif //!NEWWMSPEC
1152
1153 }
1154
1118 break; 1155 break;
1119 } 1156 }
1120 1157
@@ -1122,7 +1159,7 @@ void Fluxbox::process_event(XEvent *e) {
1122 default: 1159 default:
1123 { 1160 {
1124 1161
1125#ifdef SHAPE 1162 #ifdef SHAPE
1126 if (e->type == getShapeEventBase()) { 1163 if (e->type == getShapeEventBase()) {
1127 XShapeEvent *shape_event = (XShapeEvent *) e; 1164 XShapeEvent *shape_event = (XShapeEvent *) e;
1128 FluxboxWindow *win = (FluxboxWindow *) 0; 1165 FluxboxWindow *win = (FluxboxWindow *) 0;
@@ -1131,7 +1168,7 @@ void Fluxbox::process_event(XEvent *e) {
1131 (shape_event->kind != ShapeBounding)) 1168 (shape_event->kind != ShapeBounding))
1132 win->shapeEvent(shape_event); 1169 win->shapeEvent(shape_event);
1133 } 1170 }
1134#endif // SHAPE 1171 #endif // SHAPE
1135 1172
1136 } 1173 }
1137 } 1174 }
@@ -2117,6 +2154,7 @@ void Fluxbox::reconfigure(void) {
2117 2154
2118 2155
2119void Fluxbox::real_reconfigure(void) { 2156void Fluxbox::real_reconfigure(void) {
2157 BaseDisplay::GrabGuard gg(*this);
2120 grab(); 2158 grab();
2121 2159
2122 XrmDatabase new_blackboxrc = (XrmDatabase) 0; 2160 XrmDatabase new_blackboxrc = (XrmDatabase) 0;