aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.in9
-rw-r--r--TODO16
-rw-r--r--nls/ru_RU/Makefile.in9
-rw-r--r--nls/ru_RU/Windowmenu.m12
-rw-r--r--src/Configmenu.cc2
-rw-r--r--src/Makefile.in100
-rw-r--r--src/Screen.cc2
-rw-r--r--src/Screen.hh8
-rw-r--r--src/Tab.cc117
-rw-r--r--src/Window.cc58
-rw-r--r--src/Windowmenu.cc11
-rw-r--r--src/fluxbox.cc66
-rw-r--r--src/fluxbox.hh6
13 files changed, 261 insertions, 155 deletions
diff --git a/Makefile.in b/Makefile.in
index 7033a27..6809d5f 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -105,9 +105,9 @@ GZIP_ENV = --best
105all: all-redirect 105all: all-redirect
106.SUFFIXES: 106.SUFFIXES:
107$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 107$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
108 cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps Makefile 108 cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile
109 109
110Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status 110Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
111 cd $(top_builddir) \ 111 cd $(top_builddir) \
112 && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status 112 && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
113 113
@@ -276,6 +276,11 @@ distdir: $(DISTFILES)
276 -rm -rf $(distdir) 276 -rm -rf $(distdir)
277 mkdir $(distdir) 277 mkdir $(distdir)
278 -chmod 777 $(distdir) 278 -chmod 777 $(distdir)
279 here=`cd $(top_builddir) && pwd`; \
280 top_distdir=`cd $(distdir) && pwd`; \
281 distdir=`cd $(distdir) && pwd`; \
282 cd $(top_srcdir) \
283 && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu Makefile
279 @for file in $(DISTFILES); do \ 284 @for file in $(DISTFILES); do \
280 d=$(srcdir); \ 285 d=$(srcdir); \
281 if test -d $$d/$$file; then \ 286 if test -d $$d/$$file; then \
diff --git a/TODO b/TODO
index 05f8d9b..d64ddf2 100644
--- a/TODO
+++ b/TODO
@@ -1,15 +1,17 @@
1TODO for Fluxbox 0.2.0 1TODO for Fluxbox 0.2.0
2!* Fix "no font" crash
3* Remove cyclic dep on Basemenu with class Fluxbox
2* sloppy focus - auto-raise 4* sloppy focus - auto-raise
3- Fix configurable toolbar 5* Fix configurable toolbar
4 so the user can configure toolbar in a config file 6 so the user can configure toolbar in a config file
5 7
6- Fix so config file is created @ $HOME if first use 8* Fix so config file is created @ $HOME if first use
7 and config files is copied and configured 9 and config files is copied and configured
8 10
9- Fix so toolbar dont hide if its autohide and 11* Fix so toolbar dont hide if its autohide and
10 you are in "change workspace mode" 12 you are in "change workspace mode"
11 13
12- grabKillWindow to keygrabber grabCloseWindow 14* grabKillWindow to keygrabber grabCloseWindow
13 15
14* Fluxbox::real_reconfigure ...check "session.styleFile %s" 16* Fluxbox::real_reconfigure ...check "session.styleFile %s"
15* grabRootmenu 17* grabRootmenu
@@ -22,13 +24,13 @@ TODO for Fluxbox 0.2.0
22* 0,0-pos fix 24* 0,0-pos fix
23* reconfigure tar upp nya dekorationer 25* reconfigure tar upp nya dekorationer
24 26
2507:39AM <dopey> also, (2) fluxbox wont currently build on linux-hppa, needs the config.{sub, 27* fluxbox wont currently build on linux-hppa, needs the config.{sub,
26 guess} updated from ftp://ftp.gnu.org/pub/gnu/config/ 28 guess} updated from ftp://ftp.gnu.org/pub/gnu/config/
27 29
28* Create fbrun style app 30* Create fbrun style app
29* Add wheelscroll-workspace-change configuration (reversed order or 31(* Add wheelscroll-workspace-change configuration (reversed order or
30 regular)- Add "system menu" for minimized apps in the toolbar. 32 regular)- Add "system menu" for minimized apps in the toolbar.
31 (Close, Kill, Send to, etc) 33 (Close, Kill, Send to, etc) )
32 34
33* HUP the window manager, so it re-reads the 35* HUP the window manager, so it re-reads the
34 .fluxbox/init - rather than having to kill the window manager to change those 36 .fluxbox/init - rather than having to kill the window manager to change those
diff --git a/nls/ru_RU/Makefile.in b/nls/ru_RU/Makefile.in
index b2bb324..c1533c5 100644
--- a/nls/ru_RU/Makefile.in
+++ b/nls/ru_RU/Makefile.in
@@ -104,9 +104,9 @@ GZIP_ENV = --best
104all: all-redirect 104all: all-redirect
105.SUFFIXES: 105.SUFFIXES:
106$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 106$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
107 cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps nls/ru_RU/Makefile 107 cd $(top_srcdir) && $(AUTOMAKE) --gnu nls/ru_RU/Makefile
108 108
109Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status 109Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
110 cd $(top_builddir) \ 110 cd $(top_builddir) \
111 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status 111 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
112 112
@@ -119,6 +119,11 @@ distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
119subdir = nls/ru_RU 119subdir = nls/ru_RU
120 120
121distdir: $(DISTFILES) 121distdir: $(DISTFILES)
122 here=`cd $(top_builddir) && pwd`; \
123 top_distdir=`cd $(top_distdir) && pwd`; \
124 distdir=`cd $(distdir) && pwd`; \
125 cd $(top_srcdir) \
126 && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu nls/ru_RU/Makefile
122 @for file in $(DISTFILES); do \ 127 @for file in $(DISTFILES); do \
123 d=$(srcdir); \ 128 d=$(srcdir); \
124 if test -d $$d/$$file; then \ 129 if test -d $$d/$$file; then \
diff --git a/nls/ru_RU/Windowmenu.m b/nls/ru_RU/Windowmenu.m
index 0883c25..763e35f 100644
--- a/nls/ru_RU/Windowmenu.m
+++ b/nls/ru_RU/Windowmenu.m
@@ -2,19 +2,23 @@ $set 10 #Windowmenu
2 2
3$ #SendTo 3$ #SendTo
4# Отправить на ... 4# Отправить на ...
5$ #Send Group To
6# Отправить группу на...
5$ #Shade 7$ #Shade
6# Свернуть в заголовок 8# Свернуть в заголовок
7$ #Iconify 9$ #Iconify
8# Свернуть в иконку 10# Свернуть на панель инструментов
9$ #Maximize 11$ #Maximize
10# Максимизировать 12# Максимизировать
11$ #Raise 13$ #Raise
12# Поднять наверх 14# На передний план
13$ #Lower 15$ #Lower
14# Опустить вниз 16# На задний план
15$ #Stick 17$ #Stick
16# Приклеить 18# Приклеить
17$ #KillClient 19$ #KillClient
18# Убить клиентское приложение 20# Снять клиентское приложение
19$ #Close 21$ #Close
20# Закрыть 22# Закрыть
23$ #Tab
24# Tab
diff --git a/src/Configmenu.cc b/src/Configmenu.cc
index b701754..5eda254 100644
--- a/src/Configmenu.cc
+++ b/src/Configmenu.cc
@@ -256,7 +256,7 @@ Configmenu::Focusmenu::Focusmenu(Configmenu *cm) : Basemenu(cm->screen) {
256#else // !NLS 256#else // !NLS
257 0, 0, 257 0, 0,
258#endif // NLS 258#endif // NLS
259 "Auto Raise"), 3); 259 "Auto Raise"), 4);
260 260
261 update(); 261 update();
262 262
diff --git a/src/Makefile.in b/src/Makefile.in
index d4bcb63..6f76edd 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -119,7 +119,8 @@ CPPFLAGS = -Wall @CPPFLAGS@ @SHAPE@ @SLIT@ @INTERLACE@ @ORDEREDPSEUDO@ @DEBUG@ @
119 119
120bin_PROGRAMS = fluxbox 120bin_PROGRAMS = fluxbox
121 121
122fluxbox_SOURCES = BaseDisplay.cc BaseDisplay.hh Basemenu.cc Basemenu.hh Clientmenu.cc Clientmenu.hh Configmenu.cc Configmenu.hh Icon.cc Icon.hh Image.cc Image.hh LinkedList.cc LinkedList.hh Netizen.cc Netizen.hh Rootmenu.cc Rootmenu.hh Screen.cc Screen.hh Slit.cc Slit.hh Timer.cc Timer.hh Toolbar.cc Toolbar.hh Window.cc Window.hh Windowmenu.cc Windowmenu.hh Workspace.cc Workspace.hh Workspacemenu.cc Workspacemenu.hh fluxbox.cc fluxbox.hh bsd-snprintf.c bsd-snprintf.h i18n.cc i18n.hh main.cc Tab.hh Tab.cc Keys.cc Keys.hh IconBar.cc IconBar.hh Theme.hh Theme.cc misc.hh misc.cc Rotated.hh 122fluxbox_SOURCES = BaseDisplay.cc BaseDisplay.hh Basemenu.cc Basemenu.hh Clientmenu.cc Clientmenu.hh Configmenu.cc Configmenu.hh Icon.cc Icon.hh Image.cc Image.hh LinkedList.cc LinkedList.hh Netizen.cc Netizen.hh Rootmenu.cc Rootmenu.hh Screen.cc Screen.hh Slit.cc Slit.hh Timer.cc Timer.hh Toolbar.cc Toolbar.hh Window.cc Window.hh Windowmenu.cc Windowmenu.hh Workspace.cc Workspace.hh Workspacemenu.cc Workspacemenu.hh fluxbox.cc fluxbox.hh bsd-snprintf.c bsd-snprintf.h i18n.cc i18n.hh main.cc Tab.hh Tab.cc Keys.cc Keys.hh IconBar.cc IconBar.hh Theme.hh Theme.cc misc.hh misc.cc
123
123 124
124MAINTAINERCLEANFILES = Makefile.in 125MAINTAINERCLEANFILES = Makefile.in
125mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs 126mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
@@ -160,6 +161,13 @@ DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
160 161
161TAR = tar 162TAR = tar
162GZIP_ENV = --best 163GZIP_ENV = --best
164DEP_FILES = .deps/BaseDisplay.P .deps/Basemenu.P .deps/Clientmenu.P \
165.deps/Configmenu.P .deps/Icon.P .deps/IconBar.P .deps/Image.P \
166.deps/Keys.P .deps/LinkedList.P .deps/Netizen.P .deps/Rootmenu.P \
167.deps/Screen.P .deps/Slit.P .deps/Tab.P .deps/Theme.P .deps/Timer.P \
168.deps/Toolbar.P .deps/Window.P .deps/Windowmenu.P .deps/Workspace.P \
169.deps/Workspacemenu.P .deps/bsd-snprintf.P .deps/fluxbox.P .deps/i18n.P \
170.deps/main.P .deps/misc.P
163SOURCES = $(fluxbox_SOURCES) 171SOURCES = $(fluxbox_SOURCES)
164OBJECTS = $(fluxbox_OBJECTS) 172OBJECTS = $(fluxbox_OBJECTS)
165 173
@@ -167,9 +175,9 @@ all: all-redirect
167.SUFFIXES: 175.SUFFIXES:
168.SUFFIXES: .S .c .cc .lo .o .s 176.SUFFIXES: .S .c .cc .lo .o .s
169$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 177$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
170 cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps src/Makefile 178 cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile
171 179
172Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status 180Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
173 cd $(top_builddir) \ 181 cd $(top_builddir) \
174 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status 182 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
175 183
@@ -199,9 +207,6 @@ uninstall-binPROGRAMS:
199 rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ 207 rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
200 done 208 done
201 209
202.c.o:
203 $(COMPILE) -c $<
204
205.s.o: 210.s.o:
206 $(COMPILE) -c $< 211 $(COMPILE) -c $<
207 212
@@ -218,9 +223,6 @@ distclean-compile:
218 223
219maintainer-clean-compile: 224maintainer-clean-compile:
220 225
221.c.lo:
222 $(LIBTOOL) --mode=compile $(COMPILE) -c $<
223
224.s.lo: 226.s.lo:
225 $(LIBTOOL) --mode=compile $(COMPILE) -c $< 227 $(LIBTOOL) --mode=compile $(COMPILE) -c $<
226 228
@@ -279,6 +281,11 @@ distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
279subdir = src 281subdir = src
280 282
281distdir: $(DISTFILES) 283distdir: $(DISTFILES)
284 here=`cd $(top_builddir) && pwd`; \
285 top_distdir=`cd $(top_distdir) && pwd`; \
286 distdir=`cd $(distdir) && pwd`; \
287 cd $(top_srcdir) \
288 && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu src/Makefile
282 @for file in $(DISTFILES); do \ 289 @for file in $(DISTFILES); do \
283 d=$(srcdir); \ 290 d=$(srcdir); \
284 if test -d $$d/$$file; then \ 291 if test -d $$d/$$file; then \
@@ -290,6 +297,56 @@ distdir: $(DISTFILES)
290 fi; \ 297 fi; \
291 done 298 done
292 299
300DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
301
302-include $(DEP_FILES)
303
304mostlyclean-depend:
305
306clean-depend:
307
308distclean-depend:
309 -rm -rf .deps
310
311maintainer-clean-depend:
312
313%.o: %.c
314 @echo '$(COMPILE) -c $<'; \
315 $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
316 @-cp .deps/$(*F).pp .deps/$(*F).P; \
317 tr ' ' '\012' < .deps/$(*F).pp \
318 | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
319 >> .deps/$(*F).P; \
320 rm .deps/$(*F).pp
321
322%.lo: %.c
323 @echo '$(LTCOMPILE) -c $<'; \
324 $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
325 @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
326 < .deps/$(*F).pp > .deps/$(*F).P; \
327 tr ' ' '\012' < .deps/$(*F).pp \
328 | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
329 >> .deps/$(*F).P; \
330 rm -f .deps/$(*F).pp
331
332%.o: %.cc
333 @echo '$(CXXCOMPILE) -c $<'; \
334 $(CXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
335 @-cp .deps/$(*F).pp .deps/$(*F).P; \
336 tr ' ' '\012' < .deps/$(*F).pp \
337 | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
338 >> .deps/$(*F).P; \
339 rm .deps/$(*F).pp
340
341%.lo: %.cc
342 @echo '$(LTCXXCOMPILE) -c $<'; \
343 $(LTCXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
344 @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
345 < .deps/$(*F).pp > .deps/$(*F).P; \
346 tr ' ' '\012' < .deps/$(*F).pp \
347 | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
348 >> .deps/$(*F).P; \
349 rm -f .deps/$(*F).pp
293info-am: 350info-am:
294info: info-am 351info: info-am
295dvi-am: 352dvi-am:
@@ -328,26 +385,27 @@ distclean-generic:
328maintainer-clean-generic: 385maintainer-clean-generic:
329 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) 386 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
330mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-compile \ 387mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-compile \
331 mostlyclean-libtool mostlyclean-tags \ 388 mostlyclean-libtool mostlyclean-tags mostlyclean-depend \
332 mostlyclean-generic 389 mostlyclean-generic
333 390
334mostlyclean: mostlyclean-am 391mostlyclean: mostlyclean-am
335 392
336clean-am: clean-binPROGRAMS clean-compile clean-libtool clean-tags \ 393clean-am: clean-binPROGRAMS clean-compile clean-libtool clean-tags \
337 clean-generic mostlyclean-am 394 clean-depend clean-generic mostlyclean-am
338 395
339clean: clean-am 396clean: clean-am
340 397
341distclean-am: distclean-binPROGRAMS distclean-compile distclean-libtool \ 398distclean-am: distclean-binPROGRAMS distclean-compile distclean-libtool \
342 distclean-tags distclean-generic clean-am 399 distclean-tags distclean-depend distclean-generic \
400 clean-am
343 -rm -f libtool 401 -rm -f libtool
344 402
345distclean: distclean-am 403distclean: distclean-am
346 404
347maintainer-clean-am: maintainer-clean-binPROGRAMS \ 405maintainer-clean-am: maintainer-clean-binPROGRAMS \
348 maintainer-clean-compile maintainer-clean-libtool \ 406 maintainer-clean-compile maintainer-clean-libtool \
349 maintainer-clean-tags maintainer-clean-generic \ 407 maintainer-clean-tags maintainer-clean-depend \
350 distclean-am 408 maintainer-clean-generic distclean-am
351 @echo "This command is intended for maintainers to use;" 409 @echo "This command is intended for maintainers to use;"
352 @echo "it deletes files that may require special tools to rebuild." 410 @echo "it deletes files that may require special tools to rebuild."
353 411
@@ -358,12 +416,14 @@ maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
358mostlyclean-compile distclean-compile clean-compile \ 416mostlyclean-compile distclean-compile clean-compile \
359maintainer-clean-compile mostlyclean-libtool distclean-libtool \ 417maintainer-clean-compile mostlyclean-libtool distclean-libtool \
360clean-libtool maintainer-clean-libtool tags mostlyclean-tags \ 418clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
361distclean-tags clean-tags maintainer-clean-tags distdir info-am info \ 419distclean-tags clean-tags maintainer-clean-tags distdir \
362dvi-am dvi check check-am installcheck-am installcheck install-exec-am \ 420mostlyclean-depend distclean-depend clean-depend \
363install-exec install-data-am install-data install-am install \ 421maintainer-clean-depend info-am info dvi-am dvi check check-am \
364uninstall-am uninstall all-redirect all-am all installdirs \ 422installcheck-am installcheck install-exec-am install-exec \
365mostlyclean-generic distclean-generic clean-generic \ 423install-data-am install-data install-am install uninstall-am uninstall \
366maintainer-clean-generic clean mostlyclean distclean maintainer-clean 424all-redirect all-am all installdirs mostlyclean-generic \
425distclean-generic clean-generic maintainer-clean-generic clean \
426mostlyclean distclean maintainer-clean
367 427
368 428
369# Tell versions [3.59,3.63) of GNU make to not export all variables. 429# Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/src/Screen.cc b/src/Screen.cc
index 73e2aab..2d04566 100644
--- a/src/Screen.cc
+++ b/src/Screen.cc
@@ -676,8 +676,6 @@ void BScreen::changeWorkspaceID(int id) {
676 current_workspace->getLastFocusedWindow()->setInputFocus(); 676 current_workspace->getLastFocusedWindow()->setInputFocus();
677 } 677 }
678 } 678 }
679
680
681 679
682 updateNetizenCurrentWorkspace(); 680 updateNetizenCurrentWorkspace();
683} 681}
diff --git a/src/Screen.hh b/src/Screen.hh
index 95f53c1..9c2b5af 100644
--- a/src/Screen.hh
+++ b/src/Screen.hh
@@ -168,6 +168,10 @@ public:
168 { return resource.row_direction; } 168 { return resource.row_direction; }
169 inline const int &getColPlacementDirection(void) const 169 inline const int &getColPlacementDirection(void) const
170 { return resource.col_direction; } 170 { return resource.col_direction; }
171 inline const unsigned int &getTabWidth(void) const
172 { return resource.tab_width; }
173 inline const unsigned int &getTabHeight(void) const
174 { return resource.tab_height; }
171 inline const int getTabPlacement(void) 175 inline const int getTabPlacement(void)
172 { return resource.tab_placement; } 176 { return resource.tab_placement; }
173 inline const int getTabAlignment(void) 177 inline const int getTabAlignment(void)
@@ -193,6 +197,8 @@ public:
193 inline void saveFullMax(Bool f) { resource.full_max = f; } 197 inline void saveFullMax(Bool f) { resource.full_max = f; }
194 inline void saveFocusNew(Bool f) { resource.focus_new = f; } 198 inline void saveFocusNew(Bool f) { resource.focus_new = f; }
195 inline void saveFocusLast(Bool f) { resource.focus_last = f; } 199 inline void saveFocusLast(Bool f) { resource.focus_last = f; }
200 inline void saveTabWidth(unsigned int w) { resource.tab_width = w; }
201 inline void saveTabHeight(unsigned int h) { resource.tab_height = h; }
196 inline void saveTabPlacement(unsigned int p) { resource.tab_placement = p; } 202 inline void saveTabPlacement(unsigned int p) { resource.tab_placement = p; }
197 inline void saveTabAlignment(unsigned int a) { resource.tab_alignment = a; } 203 inline void saveTabAlignment(unsigned int a) { resource.tab_alignment = a; }
198 inline void saveTabRotateVertical(Bool r) 204 inline void saveTabRotateVertical(Bool r)
@@ -309,7 +315,7 @@ private:
309 int workspaces, toolbar_placement, toolbar_width_percent, placement_policy, 315 int workspaces, toolbar_placement, toolbar_width_percent, placement_policy,
310 edge_snap_threshold, row_direction, col_direction; 316 edge_snap_threshold, row_direction, col_direction;
311 317
312 unsigned int tab_placement, tab_alignment; 318 unsigned int tab_placement, tab_alignment, tab_width, tab_height;
313 319
314#ifdef SLIT 320#ifdef SLIT
315 Bool slit_on_top, slit_auto_hide; 321 Bool slit_on_top, slit_auto_hide;
diff --git a/src/Tab.cc b/src/Tab.cc
index 32437b2..2c80247 100644
--- a/src/Tab.cc
+++ b/src/Tab.cc
@@ -60,11 +60,11 @@ Tab::Tab(FluxboxWindow *win, Tab *prev, Tab *next) {
60 if ((m_win->screen->getTabPlacement() == PLeft || 60 if ((m_win->screen->getTabPlacement() == PLeft ||
61 m_win->screen->getTabPlacement() == PRight) && 61 m_win->screen->getTabPlacement() == PRight) &&
62 m_win->screen->isTabRotateVertical()) { 62 m_win->screen->isTabRotateVertical()) {
63 m_size_w = Fluxbox::instance()->getTabHeight(); 63 m_size_w = m_win->screen->getTabHeight();
64 m_size_h = Fluxbox::instance()->getTabWidth(); 64 m_size_h = m_win->screen->getTabWidth();
65 } else { 65 } else {
66 m_size_w = Fluxbox::instance()->getTabWidth(); 66 m_size_w = m_win->screen->getTabWidth();
67 m_size_h = Fluxbox::instance()->getTabHeight(); 67 m_size_h = m_win->screen->getTabHeight();
68 } 68 }
69 69
70 createTabWindow(); 70 createTabWindow();
@@ -297,7 +297,7 @@ void Tab::shade() {
297 for(Tab *first = getFirst(this); first != 0; first = first->m_next) { 297 for(Tab *first = getFirst(this); first != 0; first = first->m_next) {
298 if (first==this) 298 if (first==this)
299 continue; 299 continue;
300 first->m_win->shade(); 300 first->m_win->shade();
301 } 301 }
302 302
303 if (m_win->screen->getTabPlacement() == PLeft || 303 if (m_win->screen->getTabPlacement() == PLeft ||
@@ -633,7 +633,7 @@ void Tab::buttonReleaseEvent(XButtonEvent *be) {
633 dest_y -= (m_win->frame.height / 2) - (m_size_h / 2); 633 dest_y -= (m_win->frame.height / 2) - (m_size_h / 2);
634 break; 634 break;
635 case ALeft: 635 case ALeft:
636 dest_y -= m_win->frame.height + m_size_h; 636 dest_y -= m_win->frame.height - m_size_h;
637 break; 637 break;
638 } 638 }
639 break; 639 break;
@@ -645,13 +645,13 @@ void Tab::buttonReleaseEvent(XButtonEvent *be) {
645 dest_y -= (m_win->frame.height / 2) - (m_size_h / 2); 645 dest_y -= (m_win->frame.height / 2) - (m_size_h / 2);
646 break; 646 break;
647 case ALeft: 647 case ALeft:
648 dest_y -= m_win->frame.height + m_size_h; 648 dest_y -= m_win->frame.height - m_size_h;
649 break; 649 break;
650 } 650 }
651 break; 651 break;
652 } 652 }
653 //TODO: this causes an calculate increase event, even if 653 //TODO: this causes an calculate increase event, even if we
654 // only moving a tab! 654 // only are moving a window
655 m_win->configure(dest_x, dest_y, m_win->frame.width, m_win->frame.height); 655 m_win->configure(dest_x, dest_y, m_win->frame.width, m_win->frame.height);
656 } 656 }
657 } 657 }
@@ -831,73 +831,56 @@ void Tab::insert(Tab *tab) {
831 831
832 m_next = tab; 832 m_next = tab;
833 833
834 bool resize_tabs = false;
835
834 //TODO: cleanup and optimize 836 //TODO: cleanup and optimize
835 //move and resize all windows in the tablist we inserted 837 //move and resize all windows in the tablist we inserted
836 //only from first tab of the inserted chain to the last 838 //only from first tab of the inserted chain to the last
837 for (; tab!=last->m_next; tab=tab->m_next) { 839 for (; tab!=last->m_next; tab=tab->m_next) {
838 if (m_win->isShaded() != tab->m_win->isShaded()) { 840 if (m_win->isShaded() != tab->m_win->isShaded()) {
841 tab->m_stoptabs = true; // we don't want any actions performed on the
842 // tabs, just the tab windows!
839 if (m_win->screen->getTabPlacement() == PLeft || 843 if (m_win->screen->getTabPlacement() == PLeft ||
840 m_win->screen->getTabPlacement() == PRight) { 844 m_win->screen->getTabPlacement() == PRight)
841 // if window were grouping to, we need to shade the tab window 845 resize_tabs = true;
842 // _after_ reconfigure
843 if(m_win->isShaded()) {
844 tab->m_win->configure(m_win->frame.x, m_win->frame.y,
845 m_win->frame.width, m_win->frame.height);
846 tab->m_win->shade();
847 // don't need unshading as configure will fix that for me
848 } else {
849 if ((m_win->frame.width != tab->m_win->frame.width) ||
850 (m_win->frame.height != tab->m_win->frame.height)) {
851 tab->m_win->configure(m_win->frame.x, m_win->frame.y,
852 m_win->frame.width, m_win->frame.height);
853 } else // need to change shade state as configure _won't_
854 // do the trick if the new and old size is the same
855 tab->m_win->shade();
856 }
857
858 tab->resizeGroup();
859 tab->calcIncrease();
860
861 } else { // PTop & PBottom
862 if(m_win->isShaded()) {
863 846
847 // if the window we are grouping to, we need to shade the tab window
848 // _after_ reconfigure
849 if(m_win->isShaded()) {
864 tab->m_win->configure(m_win->frame.x, m_win->frame.y, 850 tab->m_win->configure(m_win->frame.x, m_win->frame.y,
865 m_win->frame.width, m_win->frame.height); 851 m_win->frame.width, m_win->frame.height);
866 tab->m_win->shade(); 852 tab->m_win->shade();
867 // don't need unshading as configure will fix that for me 853 } else {
868 } else { 854 tab->m_win->shade(); // switch to correct shade state
869 if ((m_win->frame.width != tab->m_win->frame.width) || 855 tab->m_win->configure(m_win->frame.x, m_win->frame.y,
870 (m_win->frame.height != tab->m_win->frame.height)) { 856 m_win->frame.width, m_win->frame.height);
871
872 tab->m_win->configure(m_win->frame.x, m_win->frame.y,
873 m_win->frame.width, m_win->frame.height);
874 } else
875 tab->m_win->shade();
876 }
877 } 857 }
878 858
879 // both window have the same shaded state 859 tab->m_stoptabs = false;
880 } else {
881 if ((m_win->frame.width != tab->m_win->frame.width) ||
882 (m_win->frame.height != tab->m_win->frame.height)) {
883 860
884 tab->m_win->configure(m_win->frame.x, m_win->frame.y, 861 // both window have the same shaded state and have different sizes,
885 m_win->frame.width, m_win->frame.height); 862 // checking this so that I'll only do shade on windows if configure did
863 // anything.
864 } else if ((m_win->frame.width != tab->m_win->frame.width) ||
865 (m_win->frame.height != tab->m_win->frame.height)) {
886 866
887 // need to shade the tab window as configure will mess it up 867 tab->m_win->configure(m_win->frame.x, m_win->frame.y,
888 if (m_win->isShaded()) 868 m_win->frame.width, m_win->frame.height);
889 tab->m_win->shade();
890 }
891 }
892 869
893 // TODO: should check if alignemnt is left or right, 870 // need to shade the tab window as configure will mess it up
894 // cus then resize is allready done resize tabs 871 if (m_win->isShaded())
895 if(m_win->screen->getTabAlignment() == ARelative) { 872 tab->m_win->shade();
896 tab->resizeGroup();
897 tab->calcIncrease();
898 } 873 }
899 m_win->tab->setPosition(); 874 }
900 } 875
876 // resize if in relative mode or resize_tabs is true
877 if(m_win->screen->getTabAlignment() == ARelative ||
878 resize_tabs) {
879 resizeGroup();
880 calcIncrease();
881 }
882 // reposition tabs
883 setPosition();
901} 884}
902 885
903//---------- disconnect() -------------- 886//---------- disconnect() --------------
@@ -970,11 +953,11 @@ void Tab::resizeGroup(void) {
970 m_win->screen->getTabPlacement() == PRight) && 953 m_win->screen->getTabPlacement() == PRight) &&
971 m_win->screen->isTabRotateVertical() && 954 m_win->screen->isTabRotateVertical() &&
972 !m_win->isShaded()) { 955 !m_win->isShaded()) {
973 first->setTabWidth(Fluxbox::instance()->getTabHeight()); 956 first->setTabWidth(m_win->screen->getTabHeight());
974 first->setTabHeight(Fluxbox::instance()->getTabWidth()); 957 first->setTabHeight(m_win->screen->getTabWidth());
975 } else { 958 } else {
976 first->setTabWidth(Fluxbox::instance()->getTabWidth()); 959 first->setTabWidth(m_win->screen->getTabWidth());
977 first->setTabHeight(Fluxbox::instance()->getTabHeight()); 960 first->setTabHeight(m_win->screen->getTabHeight());
978 } 961 }
979 //TODO: do I have to set this all the time? 962 //TODO: do I have to set this all the time?
980 first->m_configured = true; //used in Fluxbox::reconfigure() 963 first->m_configured = true; //used in Fluxbox::reconfigure()
@@ -1032,8 +1015,7 @@ unsigned int Tab::calcCenterYPos() {
1032 1015
1033//------- getTabPlacementString ---------- 1016//------- getTabPlacementString ----------
1034// Returns the tabplacement string of the 1017// Returns the tabplacement string of the
1035// tabplacement number on success else 1018// tabplacement number on success else 0.
1036// 0.
1037//---------------------------------------- 1019//----------------------------------------
1038const char *Tab::getTabPlacementString(int placement) { 1020const char *Tab::getTabPlacementString(int placement) {
1039 for (int i=0; i<(pnone / 5); i++) { 1021 for (int i=0; i<(pnone / 5); i++) {
@@ -1059,8 +1041,7 @@ int Tab::getTabPlacementNum(const char *string) {
1059 1041
1060//------- getTabAlignmentString ---------- 1042//------- getTabAlignmentString ----------
1061// Returns the tabplacement string of the 1043// Returns the tabplacement string of the
1062// tabplacement number on success else 1044// tabplacement number on success else 0.
1063// 0.
1064//---------------------------------------- 1045//----------------------------------------
1065const char *Tab::getTabAlignmentString(int placement) { 1046const char *Tab::getTabAlignmentString(int placement) {
1066 for (int i=0; i<anone; i++) { 1047 for (int i=0; i<anone; i++) {
diff --git a/src/Window.cc b/src/Window.cc
index bba0d04..3618e32 100644
--- a/src/Window.cc
+++ b/src/Window.cc
@@ -291,12 +291,41 @@ FluxboxWindow::FluxboxWindow(Window w, BScreen *s) {
291 client.normal_hint_flags & (PPosition|USPosition)) { 291 client.normal_hint_flags & (PPosition|USPosition)) {
292 setGravityOffsets(); 292 setGravityOffsets();
293 293
294 if ((fluxbox->isStartup()) || 294 if (! fluxbox->isStartup()) { // is going to be used when position
295 if (decorations.tab) { // window is cleanly fixed
296 int real_x = frame.x;
297 int real_y = frame.y;
298
299 if (screen->getTabPlacement() == Tab::PTop)
300 real_y -= screen->getTabHeight();
301
302 else if (screen->getTabPlacement() == Tab::PLeft) {
303 if (screen->isTabRotateVertical())
304 real_x -= screen->getTabHeight();
305 else
306 real_x -= screen->getTabWidth();
307 }
308
309 if (real_x >= 0 &&
310 real_y + frame.y_border >= 0 &&
311 real_x <= (signed) screen->getWidth() &&
312 real_y <= (signed) screen->getHeight())
313 place_window = false;
314
315 } else if (frame.x >= 0 && // non tab
316 (signed) (frame.y + frame.y_border) >= 0 &&
317 frame.x <= (signed) screen->getWidth() &&
318 frame.y <= (signed) screen->getHeight())
319 place_window = false;
320 } else
321 place_window = false;
322
323/* if ((fluxbox->isStartup()) ||
295 (frame.x >= 0 && 324 (frame.x >= 0 &&
296 (signed) (frame.y + frame.y_border) >= 0 && 325 (signed) (frame.y + frame.y_border) >= 0 &&
297 frame.x <= (signed) screen->getWidth() && 326 frame.x <= (signed) screen->getWidth() &&
298 frame.y <= (signed) screen->getHeight())) 327 frame.y <= (signed) screen->getHeight()))
299 place_window = false; 328 place_window = false; */
300 329
301 } 330 }
302 331
@@ -1671,6 +1700,9 @@ void FluxboxWindow::setTab(bool flag) {
1671 if (flag) { 1700 if (flag) {
1672 if (!tab) 1701 if (!tab)
1673 tab = new Tab(this, 0, 0); 1702 tab = new Tab(this, 0, 0);
1703 tab->focus(); // draws the tab with correct texture
1704 tab->setPosition(); // set tab windows position
1705
1674 } else if (tab) { 1706 } else if (tab) {
1675 delete tab; 1707 delete tab;
1676 tab = 0; 1708 tab = 0;
@@ -1846,30 +1878,30 @@ void FluxboxWindow::maximize(unsigned int button) {
1846 if (decorations.tab && Fluxbox::instance()->useTabs()) { // Want to se the tabs 1878 if (decorations.tab && Fluxbox::instance()->useTabs()) { // Want to se the tabs
1847 switch(screen->getTabPlacement()) { 1879 switch(screen->getTabPlacement()) {
1848 case Tab::PTop: 1880 case Tab::PTop:
1849 dy += Fluxbox::instance()->getTabHeight(); 1881 dy += screen->getTabHeight();
1850 dh -= Fluxbox::instance()->getTabHeight() + screen->getBorderWidth(); 1882 dh -= screen->getTabHeight() + screen->getBorderWidth();
1851 break; 1883 break;
1852 case Tab::PLeft: 1884 case Tab::PLeft:
1853 if (screen->isTabRotateVertical()) { 1885 if (screen->isTabRotateVertical()) {
1854 dx += Fluxbox::instance()->getTabHeight(); 1886 dx += screen->getTabHeight();
1855 dw -= Fluxbox::instance()->getTabHeight(); 1887 dw -= screen->getTabHeight();
1856 } else { 1888 } else {
1857 dx += Fluxbox::instance()->getTabWidth(); 1889 dx += screen->getTabWidth();
1858 dw -= Fluxbox::instance()->getTabWidth(); 1890 dw -= screen->getTabWidth();
1859 } 1891 }
1860 break; 1892 break;
1861 case Tab::PRight: 1893 case Tab::PRight:
1862 if (screen->isTabRotateVertical()) 1894 if (screen->isTabRotateVertical())
1863 dw -= Fluxbox::instance()->getTabHeight(); 1895 dw -= screen->getTabHeight();
1864 else 1896 else
1865 dw -= Fluxbox::instance()->getTabWidth(); 1897 dw -= screen->getTabWidth();
1866 break; 1898 break;
1867 case Tab::PBottom: 1899 case Tab::PBottom:
1868 dh -= Fluxbox::instance()->getTabHeight() + screen->getBorderWidth(); 1900 dh -= screen->getTabHeight() + screen->getBorderWidth();
1869 break; 1901 break;
1870 default: 1902 default:
1871 dy += Fluxbox::instance()->getTabHeight(); 1903 dy += screen->getTabHeight();
1872 dh -= Fluxbox::instance()->getTabHeight() + screen->getBorderWidth(); 1904 dh -= screen->getTabHeight() + screen->getBorderWidth();
1873 break; 1905 break;
1874 } 1906 }
1875 } 1907 }
diff --git a/src/Windowmenu.cc b/src/Windowmenu.cc
index 159f090..652bd68 100644
--- a/src/Windowmenu.cc
+++ b/src/Windowmenu.cc
@@ -136,10 +136,15 @@ Windowmenu::Windowmenu(FluxboxWindow *win) : Basemenu(win->getScreen()) {
136#endif // NLS 136#endif // NLS
137 "Close"), 137 "Close"),
138 BScreen::WindowClose); 138 BScreen::WindowClose);
139 insert(i18n->getMessage(
140#ifdef NLS
141 WindowmenuSet, WindowmenuTab,
142#else // !NLS
143 0, 0,
144#endif // NLS
145 "Tab"),
146 BScreen::WindowTab);
139 147
140 //TODO: nls
141 insert("Tab", BScreen::WindowTab);
142
143 update(); 148 update();
144 149
145 setItemEnabled(1, window->hasTitlebar()); 150 setItemEnabled(1, window->hasTitlebar());
diff --git a/src/fluxbox.cc b/src/fluxbox.cc
index b2500e7..61025a2 100644
--- a/src/fluxbox.cc
+++ b/src/fluxbox.cc
@@ -1798,32 +1798,6 @@ void Fluxbox::load_rc(void) {
1798 } else 1798 } else
1799 resource.tabs = true; 1799 resource.tabs = true;
1800 1800
1801 if (XrmGetResource(database, "session.tab.width", "Session.Tab.Width",
1802 &value_type, &value)) {
1803 if (sscanf(value.addr, "%d", &resource.tabwidth) != 1)
1804 resource.tabwidth = 64; // default tab width
1805 else {
1806 if (resource.tabwidth < 5) // are these values sane?
1807 resource.tabwidth = 5;
1808 if (resource.tabwidth > 256)
1809 resource.tabwidth = 256;
1810 }
1811 } else
1812 resource.tabwidth = 64; // default tab width
1813
1814 if (XrmGetResource(database, "session.tab.height", "Session.Tab.Height",
1815 &value_type, &value)) {
1816 if (sscanf(value.addr, "%d", &resource.tabheight) != 1)
1817 resource.tabheight = 16; // default tab height
1818 else {
1819 if (resource.tabheight < 5) // are these values sane?
1820 resource.tabheight = 5;
1821 if (resource.tabheight > 50)
1822 resource.tabheight = 50;
1823 }
1824 } else
1825 resource.tabheight = 16; // default tab height
1826
1827 if (XrmGetResource(database, "session.colorsPerChannel", 1801 if (XrmGetResource(database, "session.colorsPerChannel",
1828 "Session.ColorsPerChannel", &value_type, &value)) { 1802 "Session.ColorsPerChannel", &value_type, &value)) {
1829 if (sscanf(value.addr, "%d", &resource.colors_per_channel) != 1) 1803 if (sscanf(value.addr, "%d", &resource.colors_per_channel) != 1)
@@ -2324,6 +2298,46 @@ void Fluxbox::load_rc(BScreen *screen) {
2324 } else 2298 } else
2325 screen->saveOpaqueMove(False); 2299 screen->saveOpaqueMove(False);
2326 2300
2301 sprintf(name_lookup, "session.screen%d.tab.width", screen_number);
2302 sprintf(class_lookup, "Session.Screen%d.Tab.Width", screen_number);
2303 if (XrmGetResource(database, name_lookup, class_lookup,
2304 &value_type, &value)) {
2305 unsigned int tmp_val;
2306
2307 if (sscanf(value.addr, "%d", &tmp_val) != 1)
2308 screen->saveTabWidth(64); // default tab width
2309 else {
2310 //TODO: should we remove checks for max/min?
2311 if (tmp_val > 512)
2312 screen->saveTabWidth(512);
2313 else if (tmp_val < 5)
2314 screen->saveTabWidth(5);
2315 else
2316 screen->saveTabWidth(tmp_val);
2317 }
2318 } else
2319 screen->saveTabWidth(64); // default tab width
2320
2321 sprintf(name_lookup, "session.screen%d.tab.height", screen_number);
2322 sprintf(class_lookup, "Session.Screen%d.Tab.Height", screen_number);
2323 if (XrmGetResource(database, name_lookup, class_lookup,
2324 &value_type, &value)) {
2325 unsigned int tmp_val;
2326
2327 if (sscanf(value.addr, "%d", &tmp_val) != 1)
2328 screen->saveTabHeight(16); // default tab height
2329 else {
2330 //TODO: should we remove checks for max/min?
2331 if (tmp_val > 50)
2332 screen->saveTabHeight(50);
2333 else if (tmp_val < 5)
2334 screen->saveTabHeight(5);
2335 else
2336 screen->saveTabHeight(tmp_val);
2337 }
2338 } else
2339 screen->saveTabHeight(16); // default tab height
2340
2327 sprintf(name_lookup, "session.screen%d.tab.placement", screen_number); 2341 sprintf(name_lookup, "session.screen%d.tab.placement", screen_number);
2328 sprintf(class_lookup, "Session.Screen%d.Tab.Placement", screen_number); 2342 sprintf(class_lookup, "Session.Screen%d.Tab.Placement", screen_number);
2329 if (XrmGetResource(database, name_lookup, class_lookup, 2343 if (XrmGetResource(database, name_lookup, class_lookup,
diff --git a/src/fluxbox.hh b/src/fluxbox.hh
index 95be304..4f74789 100644
--- a/src/fluxbox.hh
+++ b/src/fluxbox.hh
@@ -94,7 +94,6 @@ public:
94 static Fluxbox *instance(int m_argc=0, char **m_argv=0, char *dpy_name=0, char *rc=0); 94 static Fluxbox *instance(int m_argc=0, char **m_argv=0, char *dpy_name=0, char *rc=0);
95 95
96 inline bool useTabs() const { return resource.tabs; } 96 inline bool useTabs() const { return resource.tabs; }
97// inline TabType &getTabType() { return resource.tabtype; }
98 inline bool useIconBar() const { return resource.iconbar; } 97 inline bool useIconBar() const { return resource.iconbar; }
99 inline void saveTabs(bool value) { resource.tabs = value; } 98 inline void saveTabs(bool value) { resource.tabs = value; }
100 inline void saveIconBar(bool value) { resource.iconbar = value; } 99 inline void saveIconBar(bool value) { resource.iconbar = value; }
@@ -144,9 +143,6 @@ public:
144 { return resource.cache_life; } 143 { return resource.cache_life; }
145 inline const unsigned long &getCacheMax(void) const 144 inline const unsigned long &getCacheMax(void) const
146 { return resource.cache_max; } 145 { return resource.cache_max; }
147 inline const unsigned int &getTabWidth(void) const { return resource.tabwidth; }
148 inline const unsigned int &getTabHeight(void) const { return resource.tabheight; }
149
150 146
151 inline void maskWindowEvents(Window w, FluxboxWindow *bw) 147 inline void maskWindowEvents(Window w, FluxboxWindow *bw)
152 { masked = w; masked_window = bw; } 148 { masked = w; masked_window = bw; }
@@ -220,8 +216,6 @@ private:
220 timeval auto_raise_delay; 216 timeval auto_raise_delay;
221 unsigned long cache_life, cache_max; 217 unsigned long cache_life, cache_max;
222 bool tabs, iconbar; 218 bool tabs, iconbar;
223 //TabType tabtype;
224 unsigned int tabwidth, tabheight;
225 } resource; 219 } resource;
226 220
227 struct titlebar_t { 221 struct titlebar_t {