You can subscribe to this list here.
2010 |
Jan
|
Feb
|
Mar
|
Apr
(66) |
May
|
Jun
|
Jul
|
Aug
(31) |
Sep
(6) |
Oct
(1) |
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2011 |
Jan
(12) |
Feb
(35) |
Mar
(11) |
Apr
(16) |
May
(18) |
Jun
|
Jul
(1) |
Aug
(12) |
Sep
(21) |
Oct
(23) |
Nov
(12) |
Dec
|
2012 |
Jan
(5) |
Feb
(14) |
Mar
(3) |
Apr
(3) |
May
(6) |
Jun
|
Jul
(4) |
Aug
(1) |
Sep
(1) |
Oct
|
Nov
(3) |
Dec
(12) |
2013 |
Jan
(11) |
Feb
(10) |
Mar
(2) |
Apr
|
May
(4) |
Jun
|
Jul
|
Aug
(4) |
Sep
|
Oct
(3) |
Nov
(9) |
Dec
(2) |
2014 |
Jan
(43) |
Feb
|
Mar
|
Apr
|
May
(4) |
Jun
(1) |
Jul
(1) |
Aug
(3) |
Sep
|
Oct
|
Nov
(1) |
Dec
(5) |
2015 |
Jan
|
Feb
|
Mar
|
Apr
(3) |
May
(1) |
Jun
|
Jul
(2) |
Aug
(2) |
Sep
|
Oct
|
Nov
|
Dec
|
2016 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(2) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2017 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(3) |
Sep
|
Oct
|
Nov
|
Dec
|
2018 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(1) |
Dec
|
2019 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(5) |
Oct
(4) |
Nov
|
Dec
|
From: Tomáš E. <eb...@dr...> - 2011-02-17 23:10:04
|
From: Tomáš Ebenlendr <eb...@uc...> This patch is already commited in http://drak.ucw.cz/~ebik/git/notion-doc This patch completes (and repairs) previous documentation of frame_tab_width_alg and frame_tab_min_w. --- de.tex | 14 ++++++++++---- 1 files changed, 10 insertions(+), 4 deletions(-) diff --git a/de.tex b/de.tex index bdc6d5f..8a65976 100644 --- a/de.tex +++ b/de.tex @@ -404,12 +404,18 @@ engine configuration file. long as no other tab has to be truncated in the case of the \codestr{proportional} or \codestr{elastic} algorithm. Also minimum size of a tab in shaped frame (for all algorithms). \\ -\code{floatframe_tab_min_w} & Minimum tab width in pixels for - the shaped style, given that this number times number of tabs - doesn't exceed frame width. \\ +\code{floatframe_tab_min_w} & Alias for \code{frame_tab_min_w}. + This is an old name of the variable from times when the only algorithm + was \codestr{equal}. \\ +\code{frame_propor_tab_min_w} & Absolute minimum size of an elastic or + proportional tab, \codestr{elastic} and \codestr{proportional} + algorithms truncate other tabs rather than shortening a short + tab below this size. \\ \code{floatframe_bar_max_w_q} & Maximum tab-bar width quotient of frame width for the shaped styles. A number in the - interval $(0, 1]$. + interval $(0, 1]$. This quotient is maintained even if + the tabs has to be smaller than \code{frame_tab_min_w} + or \code{frame_propor_tab_min_w} to fit. \end{tabularx} -- 1.7.1 |
From: Ole J. B. <ole...@ya...> - 2011-02-16 04:54:19
|
Agreed, an extra sed can't be that bad? (to the extend that anything needs to be done) Hopefully my next inquiry will be of a less nitpicking character ;) On Wed, 16 Feb 2011 00:07:29 +0100, Arnout Engelen <no...@bz...> wrote: > Hi, > > I can confirm the issue. > > Adding *.mk to the dependencies seems a bit odd, as basically everything is > dependent on those and it's uncommon to list them as dependencies. > > Adding libextrl-mkexports to the 'clean' list seems like a bad idea: afaics the > convention is that 'make clean' will not clean the 'deliverables': in principle > you should be able to 'make install' even after having done 'make clean'. > > A third option might be to specify that libextrl-mkexports always needs to be > rebuilt, regardless of whether its dependencies have changed. This can be done > by: > > .PHONY : libextrl-mkexports > > This might be a GNU thing, but we're GNU Make-specific anyway. > > Thoughts? > > > Kind regards, > > Arnout > > On Tue, Feb 15, 2011 at 10:39:06PM +0100, Ole Jørgen Brønner wrote: >> If you do a 'make -j2' first, and for some weird reason do a 'make -j2' again, realize you have to change the lua settings in system.mk, do a 'make clean', and then 'make -j2' again, the changes has not propagated to the shebang in 'libextl-mkexports'. >> >> or maybe better: >> >> # make sure lua config is wrong >> make realclean >> make -j2 >> make -j2 >> # check that libextl-mkexports has appeared >> # fix lua config >> make clean >> make >> make install >> # -> libextl-mkexports fails to run. (wrong shebang) >> >> This only happens when running 'make -j2'. For some reason you have to run it twice to get the effect, although that could be coincidence related to scheduling? >> >> The reason is that 'make clean' does not remove 'libextl-mkexports', and the source ('libextl-mkexports.in') contains a "macro", expanded by the makefile: >> >> libextl-mkexports: libextl-mkexports.in >> sed "1s:LUA50:$(LUA):" $< > $@ >> >> 'libextl-mkexports' is thus not remade, and the shebang remains unchanged. You wont realize the error until you try to run 'libextl-mkexports' (ie. when building notion/ion3), since the build succeeds. >> >> 'make realclean' removes the file, but it's not exactly obvious... >> >> Again.. a fairly obscure(*) problem ;) >> >> (*) Apart from the 'make -j2', and for some reason running make twice, I think you'd only see this when you change your lua install location. eg. from the deb package to upstream. >> >> Easiest fix (if deemed worthwhile) is either to add the *.mk files as dependencies to the 'libextl-mkexports' target, or add 'libextrl-mkexports' to the clean list. (line 136 in 'build/rules.mk'). (Well, according to my limited make knowledge at least) >> >> - Ole Jørgen Brnner |
From: <eb...@dr...> - 2011-02-16 04:52:08
|
If you have config.h from some automake/autoconf, then all your sources also depends on it. Thus I think that system.mk and build/libs.mk should be general prerequisities (i.e., everything depends on that). Only on these two, they are the locations where, e.g., CFLAGS are set. On Wed, 16 Feb 2011 00:07:29 +0100 Arnout Engelen <no...@bz...> wrote: > Hi, > > I can confirm the issue. > > Adding *.mk to the dependencies seems a bit odd, as basically > everything is dependent on those and it's uncommon to list them as > dependencies. > > Adding libextrl-mkexports to the 'clean' list seems like a bad idea: > afaics the convention is that 'make clean' will not clean the > 'deliverables': in principle you should be able to 'make install' > even after having done 'make clean'. > > A third option might be to specify that libextrl-mkexports always > needs to be rebuilt, regardless of whether its dependencies have > changed. This can be done by: > > .PHONY : libextrl-mkexports > > This might be a GNU thing, but we're GNU Make-specific anyway. > > Thoughts? > > > Kind regards, > > Arnout > > On Tue, Feb 15, 2011 at 10:39:06PM +0100, Ole Jørgen Brønner wrote: > > If you do a 'make -j2' first, and for some weird reason do a 'make > > -j2' again, realize you have to change the lua settings in > > system.mk, do a 'make clean', and then 'make -j2' again, the > > changes has not propagated to the shebang in 'libextl-mkexports'. > > > > or maybe better: > > > > # make sure lua config is wrong > > make realclean > > make -j2 > > make -j2 > > # check that libextl-mkexports has appeared > > # fix lua config > > make clean > > make > > make install > > # -> libextl-mkexports fails to run. (wrong shebang) > > > > This only happens when running 'make -j2'. For some reason you have > > to run it twice to get the effect, although that could be > > coincidence related to scheduling? > > > > The reason is that 'make clean' does not remove > > 'libextl-mkexports', and the source ('libextl-mkexports.in') > > contains a "macro", expanded by the makefile: > > > > libextl-mkexports: libextl-mkexports.in > > sed "1s:LUA50:$(LUA):" $< > $@ > > > > 'libextl-mkexports' is thus not remade, and the shebang remains > > unchanged. You wont realize the error until you try to run > > 'libextl-mkexports' (ie. when building notion/ion3), since the > > build succeeds. > > > > 'make realclean' removes the file, but it's not exactly obvious... > > > > Again.. a fairly obscure(*) problem ;) > > > > (*) Apart from the 'make -j2', and for some reason running make > > twice, I think you'd only see this when you change your lua install > > location. eg. from the deb package to upstream. > > > > Easiest fix (if deemed worthwhile) is either to add the *.mk files > > as dependencies to the 'libextl-mkexports' target, or add > > 'libextrl-mkexports' to the clean list. (line 136 in > > 'build/rules.mk'). (Well, according to my limited make knowledge at > > least) > > > > - Ole Jørgen Brnner > > > > ------------------------------------------------------------------------------ > > The ultimate all-in-one performance toolkit: Intel(R) Parallel > > Studio XE: Pinpoint memory and threading errors before they happen. > > Find and fix more than 250 security defects in the development > > cycle. Locate bottlenecks in serial and parallel code that limit > > performance. http://p.sf.net/sfu/intel-dev2devfeb > > _______________________________________________ > > Notion-devel mailing list > > Not...@li... > > https://lists.sourceforge.net/lists/listinfo/notion-devel > > ------------------------------------------------------------------------------ > The ultimate all-in-one performance toolkit: Intel(R) Parallel Studio > XE: Pinpoint memory and threading errors before they happen. > Find and fix more than 250 security defects in the development cycle. > Locate bottlenecks in serial and parallel code that limit performance. > http://p.sf.net/sfu/intel-dev2devfeb > _______________________________________________ > Notion-devel mailing list > Not...@li... > https://lists.sourceforge.net/lists/listinfo/notion-devel > -- Tomáš 'ebík' Ebenlendr PF 2011.12667278666 |
From: Arnout E. <no...@bz...> - 2011-02-15 23:07:49
|
Hi, I can confirm the issue. Adding *.mk to the dependencies seems a bit odd, as basically everything is dependent on those and it's uncommon to list them as dependencies. Adding libextrl-mkexports to the 'clean' list seems like a bad idea: afaics the convention is that 'make clean' will not clean the 'deliverables': in principle you should be able to 'make install' even after having done 'make clean'. A third option might be to specify that libextrl-mkexports always needs to be rebuilt, regardless of whether its dependencies have changed. This can be done by: .PHONY : libextrl-mkexports This might be a GNU thing, but we're GNU Make-specific anyway. Thoughts? Kind regards, Arnout On Tue, Feb 15, 2011 at 10:39:06PM +0100, Ole Jørgen Brønner wrote: > If you do a 'make -j2' first, and for some weird reason do a 'make -j2' again, realize you have to change the lua settings in system.mk, do a 'make clean', and then 'make -j2' again, the changes has not propagated to the shebang in 'libextl-mkexports'. > > or maybe better: > > # make sure lua config is wrong > make realclean > make -j2 > make -j2 > # check that libextl-mkexports has appeared > # fix lua config > make clean > make > make install > # -> libextl-mkexports fails to run. (wrong shebang) > > This only happens when running 'make -j2'. For some reason you have to run it twice to get the effect, although that could be coincidence related to scheduling? > > The reason is that 'make clean' does not remove 'libextl-mkexports', and the source ('libextl-mkexports.in') contains a "macro", expanded by the makefile: > > libextl-mkexports: libextl-mkexports.in > sed "1s:LUA50:$(LUA):" $< > $@ > > 'libextl-mkexports' is thus not remade, and the shebang remains unchanged. You wont realize the error until you try to run 'libextl-mkexports' (ie. when building notion/ion3), since the build succeeds. > > 'make realclean' removes the file, but it's not exactly obvious... > > Again.. a fairly obscure(*) problem ;) > > (*) Apart from the 'make -j2', and for some reason running make twice, I think you'd only see this when you change your lua install location. eg. from the deb package to upstream. > > Easiest fix (if deemed worthwhile) is either to add the *.mk files as dependencies to the 'libextl-mkexports' target, or add 'libextrl-mkexports' to the clean list. (line 136 in 'build/rules.mk'). (Well, according to my limited make knowledge at least) > > - Ole Jørgen Brnner > > ------------------------------------------------------------------------------ > The ultimate all-in-one performance toolkit: Intel(R) Parallel Studio XE: > Pinpoint memory and threading errors before they happen. > Find and fix more than 250 security defects in the development cycle. > Locate bottlenecks in serial and parallel code that limit performance. > http://p.sf.net/sfu/intel-dev2devfeb > _______________________________________________ > Notion-devel mailing list > Not...@li... > https://lists.sourceforge.net/lists/listinfo/notion-devel |
From: Ole J. B. <ole...@ya...> - 2011-02-15 21:39:17
|
If you do a 'make -j2' first, and for some weird reason do a 'make -j2' again, realize you have to change the lua settings in system.mk, do a 'make clean', and then 'make -j2' again, the changes has not propagated to the shebang in 'libextl-mkexports'. or maybe better: # make sure lua config is wrong make realclean make -j2 make -j2 # check that libextl-mkexports has appeared # fix lua config make clean make make install # -> libextl-mkexports fails to run. (wrong shebang) This only happens when running 'make -j2'. For some reason you have to run it twice to get the effect, although that could be coincidence related to scheduling? The reason is that 'make clean' does not remove 'libextl-mkexports', and the source ('libextl-mkexports.in') contains a "macro", expanded by the makefile: libextl-mkexports: libextl-mkexports.in sed "1s:LUA50:$(LUA):" $< > $@ 'libextl-mkexports' is thus not remade, and the shebang remains unchanged. You wont realize the error until you try to run 'libextl-mkexports' (ie. when building notion/ion3), since the build succeeds. 'make realclean' removes the file, but it's not exactly obvious... Again.. a fairly obscure(*) problem ;) (*) Apart from the 'make -j2', and for some reason running make twice, I think you'd only see this when you change your lua install location. eg. from the deb package to upstream. Easiest fix (if deemed worthwhile) is either to add the *.mk files as dependencies to the 'libextl-mkexports' target, or add 'libextrl-mkexports' to the clean list. (line 136 in 'build/rules.mk'). (Well, according to my limited make knowledge at least) - Ole Jørgen Brnner |
From: Arnout E. <no...@bz...> - 2011-02-15 21:27:19
|
On Tue, Feb 15, 2011 at 10:18:53PM +0100, Arnout Engelen wrote: > Changing this line in build/rules.mk: > -%.o: %.c > +%.o: %.c $(EXPORTS_H) > $(CC) $(CC_PICFLAGS) $(CFLAGS) -c $< -o $@ > > .. makes 'make -j2' work for me, but not 'make -j4'. I wonder what's going > on there. Ah, missed 2 spots. This should do it: http://notion.git.sourceforge.net/git/gitweb.cgi?p=notion/notion;a=commitdiff;h=522169b166439f8f479e2baf5d6805e1c76b8e66 -- Kind regards, Arnout > > On Tue, 15 Feb 2011 13:32:27 +0100, <eb...@dr...> wrote: > > > One pass is enough here, but I did NOT INSTALLED libtu and libextl. > > > What is the error that it stops on? > > > > > > I changed build/libs.mk (both in notion and in libextl) instead > > > of installing libtu and libextl. Here is the contents of my > > > notion/build/libs.mk: > > > > > > LIBS_SUBDIRS = libmainloop > > > > > > LIBTU_DIR = $(TOPDIR)/../libtu > > > LIBTU_INCLUDES = -I$(TOPDIR)/.. > > > LIBTU_LIBS = -L$(LIBTU_DIR) -ltu > > > > > > LIBMAINLOOP_DIR = $(TOPDIR)/libmainloop > > > LIBMAINLOOP_INCLUDES = -I$(TOPDIR) > > > LIBMAINLOOP_LIBS = -L$(LIBMAINLOOP_DIR) -lmainloop > > > > > > LIBEXTL_DIR = $(TOPDIR)/../libextl > > > LIBEXTL_INCLUDES = -I$(TOPDIR)/.. > > > LIBEXTL_LIBS = -L$(LIBEXTL_DIR) -lextl > > > > > > MKEXPORTS = $(LIBEXTL_DIR)/libextl-mkexports > > > > > > > > > > > > On Tue, 15 Feb 2011 05:30:07 +0100 > > > Ole Jørgen Brønner <ole...@ya...> wrote: > > >> Am I the only one that has to do multiple make passes for a complete > > >> build? (ie. first make fails after a while, second make progresses a > > >> bit further, ..., last make succeeds) > > >> > > >> I remember that this happened with ion3plus (and probably ion3) too, > > >> so it's not something introduced in notion, and isn't really that > > >> annoying either. (After an initial build, a single make usually > > >> suffices) Just curios if it's some weird thing going on in my > > >> environment. > > >> > > >> - Ole Jørgen Brønner > > > > ------------------------------------------------------------------------------ > > The ultimate all-in-one performance toolkit: Intel(R) Parallel Studio XE: > > Pinpoint memory and threading errors before they happen. > > Find and fix more than 250 security defects in the development cycle. > > Locate bottlenecks in serial and parallel code that limit performance. > > http://p.sf.net/sfu/intel-dev2devfeb > > _______________________________________________ > > Notion-devel mailing list > > Not...@li... > > https://lists.sourceforge.net/lists/listinfo/notion-devel > > ------------------------------------------------------------------------------ > The ultimate all-in-one performance toolkit: Intel(R) Parallel Studio XE: > Pinpoint memory and threading errors before they happen. > Find and fix more than 250 security defects in the development cycle. > Locate bottlenecks in serial and parallel code that limit performance. > http://p.sf.net/sfu/intel-dev2devfeb > _______________________________________________ > Notion-devel mailing list > Not...@li... > https://lists.sourceforge.net/lists/listinfo/notion-devel |
From: Arnout E. <no...@bz...> - 2011-02-15 21:19:03
|
On Tue, Feb 15, 2011 at 06:34:21PM +0100, Ole Jørgen Brønner wrote: > I figured it out :) > > I looked a bit closer, and the problem was related to export.h (which is > afaik generated from the c source by a lua script) I had aliased make to > 'make -j2' and the parallel build tripped up the order of export.{h,c} > generation and compiling. Changing this line in build/rules.mk: -%.o: %.c +%.o: %.c $(EXPORTS_H) $(CC) $(CC_PICFLAGS) $(CFLAGS) -c $< -o $@ .. makes 'make -j2' work for me, but not 'make -j4'. I wonder what's going on there. Kind regards, Arnout > On Tue, 15 Feb 2011 13:32:27 +0100, <eb...@dr...> wrote: > > One pass is enough here, but I did NOT INSTALLED libtu and libextl. > > What is the error that it stops on? > > > > I changed build/libs.mk (both in notion and in libextl) instead > > of installing libtu and libextl. Here is the contents of my > > notion/build/libs.mk: > > > > LIBS_SUBDIRS = libmainloop > > > > LIBTU_DIR = $(TOPDIR)/../libtu > > LIBTU_INCLUDES = -I$(TOPDIR)/.. > > LIBTU_LIBS = -L$(LIBTU_DIR) -ltu > > > > LIBMAINLOOP_DIR = $(TOPDIR)/libmainloop > > LIBMAINLOOP_INCLUDES = -I$(TOPDIR) > > LIBMAINLOOP_LIBS = -L$(LIBMAINLOOP_DIR) -lmainloop > > > > LIBEXTL_DIR = $(TOPDIR)/../libextl > > LIBEXTL_INCLUDES = -I$(TOPDIR)/.. > > LIBEXTL_LIBS = -L$(LIBEXTL_DIR) -lextl > > > > MKEXPORTS = $(LIBEXTL_DIR)/libextl-mkexports > > > > > > > > On Tue, 15 Feb 2011 05:30:07 +0100 > > Ole Jørgen Brønner <ole...@ya...> wrote: > >> Am I the only one that has to do multiple make passes for a complete > >> build? (ie. first make fails after a while, second make progresses a > >> bit further, ..., last make succeeds) > >> > >> I remember that this happened with ion3plus (and probably ion3) too, > >> so it's not something introduced in notion, and isn't really that > >> annoying either. (After an initial build, a single make usually > >> suffices) Just curios if it's some weird thing going on in my > >> environment. > >> > >> - Ole Jørgen Brønner > > ------------------------------------------------------------------------------ > The ultimate all-in-one performance toolkit: Intel(R) Parallel Studio XE: > Pinpoint memory and threading errors before they happen. > Find and fix more than 250 security defects in the development cycle. > Locate bottlenecks in serial and parallel code that limit performance. > http://p.sf.net/sfu/intel-dev2devfeb > _______________________________________________ > Notion-devel mailing list > Not...@li... > https://lists.sourceforge.net/lists/listinfo/notion-devel |
From: Arnout E. <no...@bz...> - 2011-02-15 21:16:30
|
On Tue, Feb 15, 2011 at 01:32:27PM +0100, eb...@dr... wrote: > One pass is enough here, but I did NOT INSTALLED libtu and libextl. > I changed build/libs.mk (both in notion and in libextl) instead > of installing libtu and libextl. Hmm, that's actually pretty neat, perhaps we should document that as the preferred way to build notion. Arnout > notion/build/libs.mk: > > LIBS_SUBDIRS = libmainloop > > LIBTU_DIR = $(TOPDIR)/../libtu > LIBTU_INCLUDES = -I$(TOPDIR)/.. > LIBTU_LIBS = -L$(LIBTU_DIR) -ltu > > LIBMAINLOOP_DIR = $(TOPDIR)/libmainloop > LIBMAINLOOP_INCLUDES = -I$(TOPDIR) > LIBMAINLOOP_LIBS = -L$(LIBMAINLOOP_DIR) -lmainloop > > LIBEXTL_DIR = $(TOPDIR)/../libextl > LIBEXTL_INCLUDES = -I$(TOPDIR)/.. > LIBEXTL_LIBS = -L$(LIBEXTL_DIR) -lextl > > MKEXPORTS = $(LIBEXTL_DIR)/libextl-mkexports > > > > On Tue, 15 Feb 2011 05:30:07 +0100 > Ole Jørgen Brønner <ole...@ya...> wrote: > > Am I the only one that has to do multiple make passes for a complete > > build? (ie. first make fails after a while, second make progresses a > > bit further, ..., last make succeeds) > > > > I remember that this happened with ion3plus (and probably ion3) too, > > so it's not something introduced in notion, and isn't really that > > annoying either. (After an initial build, a single make usually > > suffices) Just curios if it's some weird thing going on in my > > environment. > > > > - Ole Jørgen Brønner > > > > ------------------------------------------------------------------------------ > > The ultimate all-in-one performance toolkit: Intel(R) Parallel Studio > > XE: Pinpoint memory and threading errors before they happen. > > Find and fix more than 250 security defects in the development cycle. > > Locate bottlenecks in serial and parallel code that limit performance. > > http://p.sf.net/sfu/intel-dev2devfeb > > _______________________________________________ > > Notion-devel mailing list > > Not...@li... > > https://lists.sourceforge.net/lists/listinfo/notion-devel > > > -- > Tomáš 'ebík' Ebenlendr > PF 2011.12480463597 > > ------------------------------------------------------------------------------ > The ultimate all-in-one performance toolkit: Intel(R) Parallel Studio XE: > Pinpoint memory and threading errors before they happen. > Find and fix more than 250 security defects in the development cycle. > Locate bottlenecks in serial and parallel code that limit performance. > http://p.sf.net/sfu/intel-dev2devfeb > _______________________________________________ > Notion-devel mailing list > Not...@li... > https://lists.sourceforge.net/lists/listinfo/notion-devel |
From: <eb...@dr...> - 2011-02-15 20:19:03
|
Then the dependencies are wrong. I mean wrong by relying on nonparallel building. We should document this somewhere (in README) or fix the Makefile. On Tue, 15 Feb 2011 18:34:21 +0100 Ole Jørgen Brønner <ole...@ya...> wrote: > I figured it out :) > > I looked a bit closer, and the problem was related to export.h (which > is afaik generated from the c source by a lua script) I had aliased > make to 'make -j2' and the parallel build tripped up the order of > export.{h,c} generation and compiling. > > > On Tue, 15 Feb 2011 13:32:27 +0100, <eb...@dr...> wrote: > > > One pass is enough here, but I did NOT INSTALLED libtu and libextl. > > What is the error that it stops on? > > > > I changed build/libs.mk (both in notion and in libextl) instead > > of installing libtu and libextl. Here is the contents of my > > notion/build/libs.mk: > > > > LIBS_SUBDIRS = libmainloop > > > > LIBTU_DIR = $(TOPDIR)/../libtu > > LIBTU_INCLUDES = -I$(TOPDIR)/.. > > LIBTU_LIBS = -L$(LIBTU_DIR) -ltu > > > > LIBMAINLOOP_DIR = $(TOPDIR)/libmainloop > > LIBMAINLOOP_INCLUDES = -I$(TOPDIR) > > LIBMAINLOOP_LIBS = -L$(LIBMAINLOOP_DIR) -lmainloop > > > > LIBEXTL_DIR = $(TOPDIR)/../libextl > > LIBEXTL_INCLUDES = -I$(TOPDIR)/.. > > LIBEXTL_LIBS = -L$(LIBEXTL_DIR) -lextl > > > > MKEXPORTS = $(LIBEXTL_DIR)/libextl-mkexports > > > > > > > > On Tue, 15 Feb 2011 05:30:07 +0100 > > Ole Jørgen Brønner <ole...@ya...> wrote: > >> Am I the only one that has to do multiple make passes for a > >> complete build? (ie. first make fails after a while, second make > >> progresses a bit further, ..., last make succeeds) > >> > >> I remember that this happened with ion3plus (and probably ion3) > >> too, so it's not something introduced in notion, and isn't really > >> that annoying either. (After an initial build, a single make > >> usually suffices) Just curios if it's some weird thing going on in > >> my environment. > >> > >> - Ole Jørgen Brønner > > ------------------------------------------------------------------------------ > The ultimate all-in-one performance toolkit: Intel(R) Parallel Studio > XE: Pinpoint memory and threading errors before they happen. > Find and fix more than 250 security defects in the development cycle. > Locate bottlenecks in serial and parallel code that limit performance. > http://p.sf.net/sfu/intel-dev2devfeb > _______________________________________________ > Notion-devel mailing list > Not...@li... > https://lists.sourceforge.net/lists/listinfo/notion-devel -- Tomáš 'ebík' Ebenlendr PF 2011.12571486555 |
From: Ole J. B. <ole...@ya...> - 2011-02-15 17:48:26
|
I figured it out :) I looked a bit closer, and the problem was related to export.h (which is afaik generated from the c source by a lua script) I had aliased make to 'make -j2' and the parallel build tripped up the order of export.{h,c} generation and compiling. On Tue, 15 Feb 2011 13:32:27 +0100, <eb...@dr...> wrote: > One pass is enough here, but I did NOT INSTALLED libtu and libextl. > What is the error that it stops on? > > I changed build/libs.mk (both in notion and in libextl) instead > of installing libtu and libextl. Here is the contents of my > notion/build/libs.mk: > > LIBS_SUBDIRS = libmainloop > > LIBTU_DIR = $(TOPDIR)/../libtu > LIBTU_INCLUDES = -I$(TOPDIR)/.. > LIBTU_LIBS = -L$(LIBTU_DIR) -ltu > > LIBMAINLOOP_DIR = $(TOPDIR)/libmainloop > LIBMAINLOOP_INCLUDES = -I$(TOPDIR) > LIBMAINLOOP_LIBS = -L$(LIBMAINLOOP_DIR) -lmainloop > > LIBEXTL_DIR = $(TOPDIR)/../libextl > LIBEXTL_INCLUDES = -I$(TOPDIR)/.. > LIBEXTL_LIBS = -L$(LIBEXTL_DIR) -lextl > > MKEXPORTS = $(LIBEXTL_DIR)/libextl-mkexports > > > > On Tue, 15 Feb 2011 05:30:07 +0100 > Ole Jørgen Brønner <ole...@ya...> wrote: >> Am I the only one that has to do multiple make passes for a complete >> build? (ie. first make fails after a while, second make progresses a >> bit further, ..., last make succeeds) >> >> I remember that this happened with ion3plus (and probably ion3) too, >> so it's not something introduced in notion, and isn't really that >> annoying either. (After an initial build, a single make usually >> suffices) Just curios if it's some weird thing going on in my >> environment. >> >> - Ole Jørgen Brønner |
From: <eb...@dr...> - 2011-02-15 12:32:49
|
One pass is enough here, but I did NOT INSTALLED libtu and libextl. What is the error that it stops on? I changed build/libs.mk (both in notion and in libextl) instead of installing libtu and libextl. Here is the contents of my notion/build/libs.mk: LIBS_SUBDIRS = libmainloop LIBTU_DIR = $(TOPDIR)/../libtu LIBTU_INCLUDES = -I$(TOPDIR)/.. LIBTU_LIBS = -L$(LIBTU_DIR) -ltu LIBMAINLOOP_DIR = $(TOPDIR)/libmainloop LIBMAINLOOP_INCLUDES = -I$(TOPDIR) LIBMAINLOOP_LIBS = -L$(LIBMAINLOOP_DIR) -lmainloop LIBEXTL_DIR = $(TOPDIR)/../libextl LIBEXTL_INCLUDES = -I$(TOPDIR)/.. LIBEXTL_LIBS = -L$(LIBEXTL_DIR) -lextl MKEXPORTS = $(LIBEXTL_DIR)/libextl-mkexports On Tue, 15 Feb 2011 05:30:07 +0100 Ole Jørgen Brønner <ole...@ya...> wrote: > Am I the only one that has to do multiple make passes for a complete > build? (ie. first make fails after a while, second make progresses a > bit further, ..., last make succeeds) > > I remember that this happened with ion3plus (and probably ion3) too, > so it's not something introduced in notion, and isn't really that > annoying either. (After an initial build, a single make usually > suffices) Just curios if it's some weird thing going on in my > environment. > > - Ole Jørgen Brønner > > ------------------------------------------------------------------------------ > The ultimate all-in-one performance toolkit: Intel(R) Parallel Studio > XE: Pinpoint memory and threading errors before they happen. > Find and fix more than 250 security defects in the development cycle. > Locate bottlenecks in serial and parallel code that limit performance. > http://p.sf.net/sfu/intel-dev2devfeb > _______________________________________________ > Notion-devel mailing list > Not...@li... > https://lists.sourceforge.net/lists/listinfo/notion-devel -- Tomáš 'ebík' Ebenlendr PF 2011.12480463597 |
From: Ole J. B. <ole...@ya...> - 2011-02-15 04:30:35
|
Am I the only one that has to do multiple make passes for a complete build? (ie. first make fails after a while, second make progresses a bit further, ..., last make succeeds) I remember that this happened with ion3plus (and probably ion3) too, so it's not something introduced in notion, and isn't really that annoying either. (After an initial build, a single make usually suffices) Just curios if it's some weird thing going on in my environment. - Ole Jørgen Brønner |
From: Arnout E. <no...@bz...> - 2011-02-13 22:16:18
|
On Sat, Feb 12, 2011 at 05:08:13AM +0100, Ole Jørgen Brønner wrote: > My brother have used a variant of this patch (seems to be about the same > changes) for a long time now. > > He uses a nested frame without tab decorations to organize his browser > windows. When the number of windows in that frame grow, resizing became > very slow without the patch, so it actually a valid concern from a > performance standpoint too. Interesting > I don't think he has experienced a lot of weird side effects. > > An option is to make it controllable by a winprop? I gave it a shot, patch attached. The winprop is called 'lazy_resize', so for example: defwinprop{ class = "VirtualBox", lazy_resize = true } Because the client windows may not be a direct child of the mplex (at least it looks like there's usually a WGroupCW in between), it seemed like a reasonable idea to move that logic to clientwin_fitrep instead. To seperate resizing and reparenting a bit more neatly, I moved the REGION_GEOM(cwin)=geom assignment to happen after reparenting instead of before. This seems to work beautifully here - but I'd be glad if you guys could test and review the changes a bit. Kind regards, Arnout > On Sat, 12 Feb 2011 02:35:50 +0100, Arnout Engelen <no...@bz...> wrote: > >> Hi, >> >> When a frame holds multiple tabs and gets resized, all multiplexed client >> windows are directly resized. >> >> Some applications, such as Oracle VirtualBox, appear to send an >> XConfigureRequestEvent requesting the window to be raised whenever they are >> resized. >> >> Since http://notion.git.sourceforge.net/git/gitweb.cgi?p=notion/notion;a=commit;h=519a5fdccf5ab27e55436d11098b8631fd3f1218 >> we honour those requests. This, of course, makes it more obvious (and >> annoying) that these clients are misbehaving (at least it seems like >> misbehaviour to me). >> >> To prevent hitting such problems, it might make sense to resize only the >> visible client window and leave the hidden ones alone. When switching windows, >> we'd have to perform the resize on the window you switch to (if needed). >> >> Attached is a simple patch that does that. I'm not so sure I like it though: >> it makes switching tabs after a resize a bit slower because the resize has to >> be performed. On the other hand we're no longer bothered by hidden windows >> doing funny stuff when resizing their frame. >> >> What do you think? >> >> >> Kind regards, >> >> Arnout |
From: Arnout E. <no...@bz...> - 2011-02-13 11:37:57
|
On Mon, Feb 07, 2011 at 04:50:56AM +0100, Tomáš Ebenlendr wrote: > I did not included the user documentation in the patches, as we have not the > sources of the document "Configuring and Extending Ion with Lua". The document > is GPL'ed, thus we should be able to get the sources of the document. I attach > it below in the form of the example. Added it to the documentation at http://notion.git.sourceforge.net/git/gitweb.cgi?p=notion/notion-doc;a=commit;h=612d28deda20196dd9908bec3a15abe328d56f3a I think it'd be neat to include the example somewhere, too, but I'm not sure where. Kind regards, Arnout > de.defstyle("frame", { > --[[ > Difference between elastic and proportional is when there is plenty free > space and the frame is not shaped. Elastic wants equal sized tabs, with > long titles longer. Proportional wants distribute free space equally > among the tabs. > ]]-- > -- frame_tab_width_alg = "equal", > frame_tab_width_alg = "elastic", > -- frame_tab_width_alg = "proportional", > > --[[ > Minimum size of a tab. > This size is maintained as long as no other tab has to be truncated in the > case of the 'proportional' or 'elastic' algorithm. > Also minimun size of a tab in shaped frame (for all algorithms). > ]]-- > -- frame_tab_min_w = 100 > > --[[ > Minimum size of an elastic/proportional tab. > Elastic/proportional algorithms truncate other tabs rather than shortening > a short tab below this size. > ]]-- > -- frame_propor_tab_min_w = 50 > > --[[ > Minimum size of an elastic/proportional tab. > Elastic/proportional algorithms truncate other tabs rather than shortening > a short tab below this size. > ]]-- > -- floatframe_tab_min_w = 50 > }) |
From: Ole J. B. <ole...@ya...> - 2011-02-12 04:08:23
|
My brother have used a variant of this patch (seems to be about the same changes) for a long time now. He uses a nested frame without tab decorations to organize his browser windows. When the number of windows in that frame grow, resizing became very slow without the patch, so it actually a valid concern from a performance standpoint too. I don't think he has experienced a lot of weird side effects. An option is to make it controllable by a winprop? - Ole Jørgen Brønner / olejorgenb On Sat, 12 Feb 2011 02:35:50 +0100, Arnout Engelen <no...@bz...> wrote: > Hi, > > When a frame holds multiple tabs and gets resized, all multiplexed client > windows are directly resized. > > Some applications, such as Oracle VirtualBox, appear to send an > XConfigureRequestEvent requesting the window to be raised whenever they are > resized. > > Since http://notion.git.sourceforge.net/git/gitweb.cgi?p=notion/notion;a=commit;h=519a5fdccf5ab27e55436d11098b8631fd3f1218 > we honour those requests. This, of course, makes it more obvious (and > annoying) that these clients are misbehaving (at least it seems like > misbehaviour to me). > > To prevent hitting such problems, it might make sense to resize only the > visible client window and leave the hidden ones alone. When switching windows, > we'd have to perform the resize on the window you switch to (if needed). > > Attached is a simple patch that does that. I'm not so sure I like it though: > it makes switching tabs after a resize a bit slower because the resize has to > be performed. On the other hand we're no longer bothered by hidden windows > doing funny stuff when resizing their frame. > > What do you think? > > > Kind regards, > > Arnout |
From: Arnout E. <no...@bz...> - 2011-02-12 01:36:02
|
Hi, When a frame holds multiple tabs and gets resized, all multiplexed client windows are directly resized. Some applications, such as Oracle VirtualBox, appear to send an XConfigureRequestEvent requesting the window to be raised whenever they are resized. Since http://notion.git.sourceforge.net/git/gitweb.cgi?p=notion/notion;a=commit;h=519a5fdccf5ab27e55436d11098b8631fd3f1218 we honour those requests. This, of course, makes it more obvious (and annoying) that these clients are misbehaving (at least it seems like misbehaviour to me). To prevent hitting such problems, it might make sense to resize only the visible client window and leave the hidden ones alone. When switching windows, we'd have to perform the resize on the window you switch to (if needed). Attached is a simple patch that does that. I'm not so sure I like it though: it makes switching tabs after a resize a bit slower because the resize has to be performed. On the other hand we're no longer bothered by hidden windows doing funny stuff when resizing their frame. What do you think? Kind regards, Arnout |
From: Arnout E. <no...@bz...> - 2011-02-12 00:02:58
|
The patches look good and a quick tests reveals no regressions, so I applied them, thanks! I successfully imported the documentation with history into a git repo. Unfortunately sf.net shell services are still inactive due to a recent hack attack, so I can't create a repo for the documentation there yet. This is also the reason why we don't have a working notion-commits mailinglist yet :). For the time being I put it up at: http://arnout.engelen.eu/files/dev/notion/notion-doc.git Kind regards, Arnout On Mon, Feb 07, 2011 at 04:50:56AM +0100, Tomáš Ebenlendr wrote: > I reimplemented the elastic/proportional tab widths in following patches. > They are already commited in http://drak.ucw.cz/~ebik/git/notion . > > > It is not enabled by default. It has to be selected in frame's style. See > example below. > > I did not included the user documentation in the patches, as we have not the > sources of the document "Configuring and Extending Ion with Lua". The document > is GPL'ed, thus we should be able to get the sources of the document. I attach > it below in the form of the example. > > Following should be added to your style, to allow 'elastic' algorithm. I also > document here options that are already documented in the section "4.3.2 Extra > fields for style `frame'" of "Configuring and Extending Ion with Lua". > > de.defstyle("frame", { > --[[ > Difference between elastic and proportional is when there is plenty free > space and the frame is not shaped. Elastic wants equal sized tabs, with > long titles longer. Proportional wants distribute free space equally > among the tabs. > ]]-- > -- frame_tab_width_alg = "equal", > frame_tab_width_alg = "elastic", > -- frame_tab_width_alg = "proportional", > > --[[ > Minimum size of a tab. > This size is maintained as long as no other tab has to be truncated in the > case of the 'proportional' or 'elastic' algorithm. > Also minimun size of a tab in shaped frame (for all algorithms). > ]]-- > -- frame_tab_min_w = 100 > > --[[ > Minimum size of an elastic/proportional tab. > Elastic/proportional algorithms truncate other tabs rather than shortening > a short tab below this size. > ]]-- > -- frame_propor_tab_min_w = 50 > > --[[ > Minimum size of an elastic/proportional tab. > Elastic/proportional algorithms truncate other tabs rather than shortening > a short tab below this size. > ]]-- > -- floatframe_tab_min_w = 50 > }) > > ------------------------------------------------------------------------------ > The modern datacenter depends on network connectivity to access resources > and provide services. The best practices for maximizing a physical server's > connectivity to a physical network are well understood - see how these > rules translate into the virtual world? > http://p.sf.net/sfu/oracle-sfdevnlfb > _______________________________________________ > Notion-devel mailing list > Not...@li... > https://lists.sourceforge.net/lists/listinfo/notion-devel |
From: Ole J. B. <ole...@ya...> - 2011-02-08 14:39:48
|
If someone managed to grab that already, it was slightly dirty. Fixed now. http://folk.ntnu.no/bronner/temp/ion3/ion-doc-3.tgz - Ole Jørgen Brønner On Tue, 08 Feb 2011 15:31:38 +0100, Ole Jørgen Brønner <ole...@ya...> wrote: > http://folk.ntnu.no/bronner/temp/ion3/ion-doc-3.tgz should contain the latex sources (and the darcs repo). I thought I had uploaded the repo before, but apparently I had only included the html files. Sorry about that. |
From: Ole J. B. <ole...@ya...> - 2011-02-08 14:31:49
|
http://folk.ntnu.no/bronner/temp/ion3/ion-doc-3.tgz should contain the latex sources (and the darcs repo). I thought I had uploaded the repo before, but apparently I had only included the html files. Sorry about that. -- Ole Jørgen Brønner On Mon, 07 Feb 2011 04:50:56 +0100, Tomáš Ebenlendr <eb...@dr...> wrote: > I did not included the user documentation in the patches, as we have not the > sources of the document "Configuring and Extending Ion with Lua". The document > is GPL'ed, thus we should be able to get the sources of the document. I attach > it below in the form of the example. |
From: Arnout E. <no...@bz...> - 2011-02-08 00:57:34
|
On Tue, Feb 08, 2011 at 12:02:00AM +0100, ebik wrote: > The condition is just copied from place just few lines above (in the > same function). I did not checked how and why the condition works. Those strings are from the 'stringstore' (a libtu thing), which appear to be (refcounted) constants, so I guess it'd be OK to compare them with ==. Arnout > On Mon, 7 Feb 2011 23:57:47 +0100 > Arnout Engelen <no...@bz...> wrote: > > > On Mon, Feb 07, 2011 at 04:50:59AM +0100, Tomáš Ebenlendr wrote: > > > @@ -767,9 +769,11 @@ void frame_managed_notify(WFrame *frame, > > > WRegion *sub, WRegionNotify how) > > > how==ioncore_g.notifies.sub_activity || > > > how==ioncore_g.notifies.tag){ > > > + complete=how==ioncore_g.notifies.name; > > > > Shouldn't that use strcmp? > > > > > > Arnout > > > > > -- > Tomáš 'ebík' Ebenlendr > PF 2011.10410813039 > |
From: Arnout E. <no...@bz...> - 2011-02-07 22:57:57
|
On Mon, Feb 07, 2011 at 04:50:59AM +0100, Tomáš Ebenlendr wrote: > @@ -767,9 +769,11 @@ void frame_managed_notify(WFrame *frame, WRegion *sub, WRegionNotify how) > how==ioncore_g.notifies.sub_activity || > how==ioncore_g.notifies.tag){ > > + complete=how==ioncore_g.notifies.name; Shouldn't that use strcmp? Arnout |
From: Tomáš E. <eb...@dr...> - 2011-02-07 03:51:15
|
From: Tomáš Ebenlendr <eb...@uc...> If title of a tab is changed, then do complete recalculation. New algorithms will change the tab widths on title change. --- ioncore/frame.c | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) diff --git a/ioncore/frame.c b/ioncore/frame.c index ce865d5..01cd891 100644 --- a/ioncore/frame.c +++ b/ioncore/frame.c @@ -760,6 +760,8 @@ bool frame_set_grattr_extl(WFrame *frame, const char *attr, const char *how) void frame_managed_notify(WFrame *frame, WRegion *sub, WRegionNotify how) { + bool complete; + if(how==ioncore_g.notifies.activated || how==ioncore_g.notifies.inactivated || how==ioncore_g.notifies.name || @@ -767,9 +769,11 @@ void frame_managed_notify(WFrame *frame, WRegion *sub, WRegionNotify how) how==ioncore_g.notifies.sub_activity || how==ioncore_g.notifies.tag){ + complete=how==ioncore_g.notifies.name; + frame_update_attrs(frame); - frame_recalc_bar(frame, FALSE); - frame_draw_bar(frame, FALSE); + frame_recalc_bar(frame, complete); + frame_draw_bar(frame, complete); } } -- 1.7.1 |
From: Tomáš E. <eb...@dr...> - 2011-02-07 03:51:15
|
From: Tomáš Ebenlendr <eb...@uc...> Move the algorithm to calculate sizes of tabs and bar to separate file. Add framework to allow more named algorithms. Allow switching such algorithms using style. --- ioncore/Makefile | 2 +- ioncore/frame-draw.c | 108 ++++------------------- ioncore/frame-tabs-recalc.c | 206 +++++++++++++++++++++++++++++++++++++++++++ ioncore/frame-tabs-recalc.h | 54 +++++++++++ ioncore/frame.c | 49 ++-------- ioncore/frame.h | 6 +- 6 files changed, 291 insertions(+), 134 deletions(-) create mode 100644 ioncore/frame-tabs-recalc.c create mode 100644 ioncore/frame-tabs-recalc.h diff --git a/ioncore/Makefile b/ioncore/Makefile index de7529d..6e0b865 100644 --- a/ioncore/Makefile +++ b/ioncore/Makefile @@ -24,7 +24,7 @@ SOURCES=binding.c conf-bindings.c cursor.c event.c exec.c focus.c \ pholder.c mplexpholder.c llist.c basicpholder.c sizepolicy.c \ stacking.c group.c grouppholder.c group-cw.c navi.c \ group-ws.c float-placement.c framedpholder.c \ - return.c detach.c screen-notify.c + return.c detach.c screen-notify.c frame-tabs-recalc.c LUA_SOURCES=\ ioncore_ext.lua ioncore_luaext.lua ioncore_bindings.lua \ diff --git a/ioncore/frame-draw.c b/ioncore/frame-draw.c index 086304c..7ee2491 100644 --- a/ioncore/frame-draw.c +++ b/ioncore/frame-draw.c @@ -224,80 +224,12 @@ void frame_clear_shape(WFrame *frame) } -#define CF_TAB_MAX_TEXT_X_OFF 10 - - -static void frame_shaped_recalc_bar_size(WFrame *frame, bool complete) -{ - int bar_w, textw=0, tmaxw=frame->tab_min_w, tmp=0; - WLListIterTmp itmp; - WRegion *sub; - const char *displayname; - GrBorderWidths bdw; - char *title; - uint bdtotal; - int i, m; - - if(frame->bar_brush==NULL) - return; - - m=FRAME_MCOUNT(frame); - bar_w=frame->bar_max_width_q*REGION_GEOM(frame).w; - - if(m>0){ - grbrush_get_border_widths(frame->bar_brush, &bdw); - bdtotal=((m-1)*(bdw.tb_ileft+bdw.tb_iright+bdw.spacing) - +bdw.right+bdw.left); - - FRAME_MX_FOR_ALL(sub, frame, itmp){ - displayname=region_displayname(sub); - if(displayname==NULL) - continue; - - textw=grbrush_get_text_width(frame->bar_brush, - displayname, strlen(displayname)); - if(textw>tmaxw) - tmaxw=textw; - } - - if(bar_w<frame->tab_min_w && - REGION_GEOM(frame).w>frame->tab_min_w) - bar_w=frame->tab_min_w; - - tmp=bar_w-bdtotal-m*tmaxw; - - if(tmp>0){ - /* No label truncation needed, good. See how much can be padded. */ - tmp/=m*2; - if(tmp>CF_TAB_MAX_TEXT_X_OFF) - tmp=CF_TAB_MAX_TEXT_X_OFF; - bar_w=(tmaxw+tmp*2)*m+bdtotal; - }else{ - /* Some labels must be truncated */ - } - }else{ - if(bar_w<frame->tab_min_w) bar_w=frame->tab_min_w; - } - - if(complete || frame->bar_w!=bar_w){ - frame->bar_w=bar_w; - frame_set_shape(frame); - } -} - - -static int init_title(WFrame *frame, int i) +static void free_title(WFrame *frame, int i) { - int textw; - if(frame->titles[i].text!=NULL){ free(frame->titles[i].text); frame->titles[i].text=NULL; } - - textw=frame_nth_tab_iw((WFrame*)frame, i); - frame->titles[i].iw=textw; - return textw; } @@ -307,19 +239,25 @@ void frame_recalc_bar(WFrame *frame, bool complete) WLListIterTmp tmp; WRegion *sub; char *title; + bool set_shape; if(frame->bar_brush==NULL || frame->titles==NULL) return; - - if(frame->barmode==FRAME_BAR_SHAPED) - frame_shaped_recalc_bar_size(frame, complete); - else if(complete) - frame_clear_shape(frame); + + set_shape=frame->tabs_params.alg(frame,complete); + + if(set_shape) { + if(frame->barmode==FRAME_BAR_SHAPED) + frame_set_shape(frame); + else + frame_clear_shape(frame); + } i=0; if(FRAME_MCOUNT(frame)==0){ - textw=init_title(frame, i); + free_title(frame, i); + textw=frame->titles[i].iw; if(textw>0){ title=grbrush_make_label(frame->bar_brush, TR("<empty frame>"), textw); @@ -329,7 +267,8 @@ void frame_recalc_bar(WFrame *frame, bool complete) } FRAME_MX_FOR_ALL(sub, frame, tmp){ - textw=init_title(frame, i); + free_title(frame, i); + textw=frame->titles[i].iw; if(textw>0){ title=region_make_label(sub, textw, frame->bar_brush); frame->titles[i].text=title; @@ -426,21 +365,8 @@ void frame_brushes_updated(WFrame *frame) frame->bar_h=bdw.top+bdw.bottom+fnte.max_height; } - /* shaped mode stuff */ - frame->tab_min_w=100; - frame->bar_max_width_q=0.95; - - if(grbrush_get_extra(frame->brush, "floatframe_tab_min_w", - 'i', &(frame->tab_min_w))){ - if(frame->tab_min_w<=0) - frame->tab_min_w=1; - } - - if(grbrush_get_extra(frame->brush, "floatframe_bar_max_w_q", - 'd', &(frame->bar_max_width_q))){ - if(frame->bar_max_width_q<=0.0 || frame->bar_max_width_q>1.0) - frame->bar_max_width_q=1.0; - } + /* tabs and bar width calculation stuff */ + frame_tabs_calc_brushes_updated(frame); } diff --git a/ioncore/frame-tabs-recalc.c b/ioncore/frame-tabs-recalc.c new file mode 100644 index 0000000..b6aba01 --- /dev/null +++ b/ioncore/frame-tabs-recalc.c @@ -0,0 +1,206 @@ +/* + * notion/ioncore/frame-tabs-recalc.c + * + * Copyright (c) Tuomo Valkonen 1999-2009. + * Copyright (c) Tomas Ebenlendr 2011. + * + * See the included file LICENSE for details. + */ +#include <string.h> + +#include "common.h" +#include "names.h" +#include "frame.h" +#include "framep.h" +#include "frame-draw.h" +#include "frame-tabs-recalc.h" + + +/*{{{ Common functions */ + + +/* + * Temporarily store actual title widths (without truncation) in + * frame->titles[*].iw, when calculating tabs widths and bar width. After the + * algorithm returns it has to set frame->titles[*].iw to the proper values. + * + * This function is generic for all algorithms. + */ +static void get_titles_text_width(WFrame *frame) +{ + int i=0; + WLListIterTmp itmp; + WRegion *sub; + const char *displayname; + + /* Assume frame->bar_brush != NULL. + Assume FRAME_MCOUNT(frame) > 0 */ + + FRAME_MX_FOR_ALL(sub, frame, itmp){ + displayname=region_displayname(sub); + if(displayname==NULL) + frame->titles[i].iw=0; + else + frame->titles[i].iw=grbrush_get_text_width(frame->bar_brush, + displayname, strlen(displayname)); + i++; + } +} + +/*}}}*/ + +/*{{{ Equal tab sizes algorithm + * This gives tabs equal sizes (up to 1 pixel). + */ +static void frame_tabs_width_calculate_equal(WFrame *frame) +{ + WRectangle bg; + GrBorderWidths bdw=GR_BORDER_WIDTHS_INIT; + int i,m=frame->titles_n; + uint w; + + frame_bar_geom(frame, &bg); + grbrush_get_border_widths(frame->bar_brush, &bdw); + + /* Remove borders */ + w=bg.w-bdw.left-bdw.right-(bdw.tb_ileft+bdw.tb_iright+bdw.spacing)*(m-1); + + if(w<=0){ + for(i=0;i<m;i++) + frame->titles[i].iw=0; + }else{ + for(i=0;i<m;i++) + /* Get i:th tab's portion of free area */ + frame->titles[i].iw=((i+1)*w)/m-(i*w)/m; + } +} + +/* + Equal tab sizes algorithm. + Calculate size of the bar of a shaped (i.e., floating) frame. +*/ +static int frame_shaped_recalc_bar_size_equal(WFrame *frame) +{ + int bar_w, textw=0, tmaxw=frame->tabs_params.tab_min_w, tmp=0; + GrBorderWidths bdw; + uint bdtotal; + int i, m; + + m=FRAME_MCOUNT(frame); + bar_w=frame->tabs_params.bar_max_width_q*REGION_GEOM(frame).w; + + if(m>0){ + grbrush_get_border_widths(frame->bar_brush, &bdw); + bdtotal=((m-1)*(bdw.tb_ileft+bdw.tb_iright+bdw.spacing) + +bdw.right+bdw.left); + + get_titles_text_width(frame); + for(i=0;i<m;i++) + if(frame->titles[i].iw>tmaxw) + tmaxw=frame->titles[i].iw; + + if(bar_w<frame->tabs_params.tab_min_w && + REGION_GEOM(frame).w>frame->tabs_params.tab_min_w) + bar_w=frame->tabs_params.tab_min_w; + + tmp=bar_w-bdtotal-m*tmaxw; + + if(tmp>0){ + /* No label truncation needed, good. See how much can be padded. */ + tmp/=m*2; + if(tmp>frame->tabs_params.requested_pad) + tmp=frame->tabs_params.requested_pad; + bar_w=(tmaxw+tmp*2)*m+bdtotal; + }else{ + /* Some labels must be truncated */ + } + }else{ + if(bar_w<frame->tabs_params.tab_min_w) bar_w=frame->tabs_params.tab_min_w; + } + + return bar_w; +} + +static bool tab_sizes_equal(WFrame * frame, bool complete) +{ + int bar_w; + + if(frame->barmode==FRAME_BAR_SHAPED){ + bar_w=frame_shaped_recalc_bar_size_equal(frame); + if((frame->bar_w!=bar_w)){ + frame->bar_w=bar_w; + complete=TRUE; + } + } + frame_tabs_width_calculate_equal(frame); + return complete; +} + + + + + +/*}}}*/ + +DECLFUNPTRMAP(TabCalcPtr); + +static StringTabCalcPtrMap frame_tabs_width_algorithms[] = { + { "equal", tab_sizes_equal }, + END_STRINGPTRMAP +}; + +static TabCalcPtr default_frame_tabs_width_algorithm=tab_sizes_equal; + + + +static void param_init(TabCalcParams *pars) +{ + pars->tab_min_w=100; + pars->bar_max_width_q=0.95; + pars->requested_pad=10; + pars->alg=default_frame_tabs_width_algorithm; +} + +void frame_tabs_calc_brushes_updated(WFrame *frame) +{ + char *str; + TabCalcPtr alg; + TabCalcParams *pars=&(frame->tabs_params); + + param_init(pars); + + if(grbrush_get_extra(frame->brush, "floatframe_tab_min_w", + 'i', &(pars->tab_min_w)) || + grbrush_get_extra(frame->brush, "frame_tab_min_w", + 'i', &(pars->tab_min_w))){ + if(pars->tab_min_w<=0) + pars->tab_min_w=1; + } + + if(grbrush_get_extra(frame->brush, "floatframe_bar_max_w_q", + 'd', &(pars->bar_max_width_q))){ + if(pars->bar_max_width_q<=0.0 || pars->bar_max_width_q>1.0) + pars->bar_max_width_q=1.0; + } + + if(grbrush_get_extra(frame->brush, "frame_tab_padding", + 'i', &(pars->requested_pad))){ + if(pars->requested_pad<=0) + pars->requested_pad=1; + } + + if(grbrush_get_extra(frame->brush, "frame_tab_width_alg", + 's', &str)){ + alg=STRINGFUNPTRMAP_VALUE(TabCalcPtr, + frame_tabs_width_algorithms, + str, NULL); + + if(alg!=NULL) + frame->tabs_params.alg=alg; + } +} + +void frame_tabs_width_recalc_init(WFrame *frame) +{ + param_init(&(frame->tabs_params)); +} diff --git a/ioncore/frame-tabs-recalc.h b/ioncore/frame-tabs-recalc.h new file mode 100644 index 0000000..2472aac --- /dev/null +++ b/ioncore/frame-tabs-recalc.h @@ -0,0 +1,54 @@ +/* + * notion/ioncore/frame-tabs-recalc.h + * + * Copyright (c) Tomas Ebenlendr 2011. + * + * See the included file LICENSE for details. + */ + +#ifndef NOTION_IONCORE_FRAME_TABS_RECALC_H +#define NOTION_IONCORE_FRAME_TABS_RECALC_H + +#include "libtu/map.h" +#include "libtu/obj.h" + +/* Compute inner widths of tabs and width of shaped bar. + * There will be more algorithms to do this, thus here + * is prototype of the called function. + * + * Requirements: + * + * If complete is set and frame->barmode==FRAME_BAR_SHAPED + * then frame->bar_w has to be updated. + * return TRUE if bar_w changed (i.e, new value != old value) + * return the value of 'complete' on normal run. + * frame_set_shape or frame_clear_shape is called when TRUE is returned. + * + * The function is called only if + * frame->bar_brush != NULL && frame->titles != NULL + */ +typedef bool (*TabCalcPtr)(WFrame *frame, bool complete); + +/* Gets the identifier of the algorithm. */ +const char *frame_get_tabs_sizes_algorithm(WFrame *frame); + +/* Sets the algorithm based on the identifier. + * Returns -1 on failure, 1 on successfull change, 0 on success but no change + * If 1 is returned, frame_bar_recalc and frame_bar_draw should be called. + */ +int frame_do_set_tabs_sizes_algorithm(WFrame *frame, const char *algstr); + +INTRSTRUCT(TabCalcParams); +DECLSTRUCT(TabCalcParams){ + TabCalcPtr alg; + /* Maximum size of shaped bar. */ + double bar_max_width_q; + /* Requested size of the tab. */ + int tab_min_w; + /* Requested empty space to be added before and after text. */ + int requested_pad; +}; + +void frame_tabs_calc_brushes_updated(WFrame *frame); +void frame_tabs_width_recalc_init(WFrame *frame); +#endif /* NOTION_IONCORE_FRAME_TABS_RECALC_H */ diff --git a/ioncore/frame.c b/ioncore/frame.c index 3598351..ce865d5 100644 --- a/ioncore/frame.c +++ b/ioncore/frame.c @@ -100,8 +100,7 @@ bool frame_init(WFrame *frame, WWindow *parent, const WFitParams *fp, frame->brush=NULL; frame->bar_brush=NULL; frame->mode=mode; - frame->tab_min_w=0; - frame->bar_max_width_q=1.0; + frame_tabs_width_recalc_init(frame); gr_stylespec_init(&frame->baseattr); @@ -282,49 +281,22 @@ int frame_nth_tab_x(WFrame *frame, int n) } -static int frame_nth_tab_w_iw(WFrame *frame, int n, bool inner) +int frame_nth_tab_w(WFrame *frame, int n) { - WRectangle bg; GrBorderWidths bdw=GR_BORDER_WIDTHS_INIT; - int m=FRAME_MCOUNT(frame); - uint w; - - frame_bar_geom(frame, &bg); - - if(m==0) - m=1; - if(frame->bar_brush!=NULL) - grbrush_get_border_widths(frame->bar_brush, &bdw); - - /* Remove borders */ - w=bg.w-bdw.left-bdw.right-(bdw.tb_ileft+bdw.tb_iright+bdw.spacing)*(m-1); - - if(w<=0) + if (n>frame->titles_n){ + fprintf(stderr,"WARNING: we should not be here, please contact notion developers\n"); return 0; - - /* Get n:th tab's portion of free area */ - w=(((n+1)*w)/m-(n*w)/m); - - /* Add n:th tab's borders back */ - if(!inner){ - w+=(n==0 ? bdw.left : bdw.tb_ileft); - w+=(n==m-1 ? bdw.right : bdw.tb_iright+bdw.spacing); } + if(frame->titles[n].iw==0) return 0; /* Too small tab. */ - return w; -} - - -int frame_nth_tab_w(WFrame *frame, int n) -{ - return frame_nth_tab_w_iw(frame, n, FALSE); -} - + if(frame->bar_brush!=NULL) + grbrush_get_border_widths(frame->bar_brush, &bdw); -int frame_nth_tab_iw(WFrame *frame, int n) -{ - return frame_nth_tab_w_iw(frame, n, TRUE); + return frame->titles[n].iw + + (n==0 ? bdw.left : bdw.tb_ileft) + + (n==frame->titles_n-1 ? bdw.right : bdw.tb_iright+bdw.spacing); } @@ -373,7 +345,6 @@ static void frame_free_titles(WFrame *frame) static void do_init_title(WFrame *frame, int i, WRegion *sub) { frame->titles[i].text=NULL; - frame->titles[i].iw=frame_nth_tab_iw(frame, i); gr_stylespec_init(&frame->titles[i].attr); diff --git a/ioncore/frame.h b/ioncore/frame.h index d69c279..048a1d5 100644 --- a/ioncore/frame.h +++ b/ioncore/frame.h @@ -20,6 +20,7 @@ #include "gr.h" #include "rectangle.h" #include "sizehint.h" +#include "frame-tabs-recalc.h" #define FRAME_SAVED_VERT 0x0008 #define FRAME_SAVED_HORIZ 0x0010 @@ -75,8 +76,8 @@ DECLCLASS(WFrame){ /* Bar stuff */ WFrameBarMode barmode; int bar_w, bar_h; - double bar_max_width_q; - int tab_min_w; + /* Parameters to calculate tab sizes. */ + TabCalcParams tabs_params; }; @@ -103,7 +104,6 @@ extern void frame_inactivated(WFrame *frame); /* Tabs */ extern int frame_nth_tab_w(WFrame *frame, int n); -extern int frame_nth_tab_iw(WFrame *frame, int n); extern int frame_nth_tab_x(WFrame *frame, int n); extern int frame_tab_at_x(WFrame *frame, int x); extern void frame_update_attr_nth(WFrame *frame, int i); -- 1.7.1 |
From: Tomáš E. <eb...@dr...> - 2011-02-07 03:51:15
|
From: Tomáš Ebenlendr <eb...@uc...> Proportional and elastic algorithms for calculating widths of tabs. --- ioncore/frame-tabs-recalc.c | 195 +++++++++++++++++++++++++++++++++++++++++++ ioncore/frame-tabs-recalc.h | 10 ++- 2 files changed, 204 insertions(+), 1 deletions(-) diff --git a/ioncore/frame-tabs-recalc.c b/ioncore/frame-tabs-recalc.c index b6aba01..f2b6679 100644 --- a/ioncore/frame-tabs-recalc.c +++ b/ioncore/frame-tabs-recalc.c @@ -7,6 +7,7 @@ * See the included file LICENSE for details. */ #include <string.h> +#include <stdlib.h> /* qsort */ #include "common.h" #include "names.h" @@ -142,10 +143,197 @@ static bool tab_sizes_equal(WFrame * frame, bool complete) /*}}}*/ +/*{{{ Proportional/Elastic tab sizes algorithms + * This gives tabs sizes proportional to the contained text. + */ + +/* Failsafes to 'equal' algorithm if there are more tabs. + * The result will be same in most cases of many tabs anyway. + */ +#define PROPOR_MAX_TABS 30 + +static int intcompare (const void *a, const void *b) { + return *(int *)a-*(int *)b; +} + +static bool tab_sizes_propor_elastic(WFrame * frame, bool complete, bool proportional) +{ + int bar_w, titles_total=0; + int titles_padded_total1=0, titles_padded_total2=0; + WRectangle bg; + GrBorderWidths bdw=GR_BORDER_WIDTHS_INIT; + int i, m=frame->titles_n; + int iw, min_w=0, max_w, w; + int sorted_sizes[PROPOR_MAX_TABS]; + uint bdtotal; + + if (m>PROPOR_MAX_TABS) + return tab_sizes_equal(frame, complete); + + + frame_bar_geom(frame, &bg); + grbrush_get_border_widths(frame->bar_brush, &bdw); + + if (frame->barmode==FRAME_BAR_SHAPED) { + bar_w=frame->tabs_params.bar_max_width_q*REGION_GEOM(frame).w; + } else { + bar_w=bg.w; + frame->bar_w=bar_w; + } + + get_titles_text_width(frame); + + /* Calculate thresholds. */ + for (i=0;i<m;i++) { + iw=sorted_sizes[i]=frame->titles[i].iw; + titles_total+= + (iw<frame->tabs_params.propor_tab_min_w ? + frame->tabs_params.propor_tab_min_w : iw); + titles_padded_total1+= + (iw < frame->tabs_params.propor_tab_min_w-2*frame->tabs_params.requested_pad ? + frame->tabs_params.propor_tab_min_w : iw+2*frame->tabs_params.requested_pad); + titles_padded_total2+= + (iw < frame->tabs_params.tab_min_w-2*frame->tabs_params.requested_pad ? + frame->tabs_params.tab_min_w : iw+2*frame->tabs_params.requested_pad); + } + bdtotal=((m-1)*(bdw.tb_ileft+bdw.tb_iright+bdw.spacing) + +bdw.right+bdw.left); + w=bar_w-bdtotal; + + /* Do different things based on thresholds. */ + if (m*frame->tabs_params.propor_tab_min_w>=w) { + /*Equal sizes (tiny tabs). Base width is zero.*/ + for(i=0;i<m;i++) + frame->titles[i].iw=0; + } else if (titles_total>=w) { + /*Truncate long tabs.*/ + qsort(sorted_sizes, m, sizeof(int), intcompare); + min_w=frame->tabs_params.propor_tab_min_w; + max_w=sorted_sizes[m-1];titles_total=0; + for(i=0;i<m;i++){ + if (sorted_sizes[i]>frame->tabs_params.propor_tab_min_w) + break; + titles_total+=frame->tabs_params.propor_tab_min_w; + } + for(;i<m;i++){ + if (titles_total+sorted_sizes[i]*(m-i)>=w) { + max_w=(w-titles_total)/(m-i); + break; + } + titles_total+=sorted_sizes[i]; + } + for(i=0;i<m;i++) + if (frame->titles[i].iw>max_w) + frame->titles[i].iw=max_w; + } else if (titles_padded_total1>=w) { + /*Just a little padding. + *Pad equally, no tab shorter than tabs_params.propor_tab_min_w-1. + */ + max_w=frame->tabs_params.propor_tab_min_w; +equal_pad: + qsort(sorted_sizes, m, sizeof(int), intcompare); + titles_total=m*max_w; + i=m-1;min_w=0; + while((i>=0) && + (sorted_sizes[i]>=max_w)){ + titles_total+=sorted_sizes[i]; + i--; + } + while(i>=0){ + /*Test padding by max_w-sorted_sizes[i].*/ + if(titles_total-(m-i-1)*sorted_sizes[i]>=w){ + min_w=(titles_total-w)/(m-i-1); + break; + } + titles_total+=sorted_sizes[i]; + i--; + } + /* After expanding to min_w: equal padding will extend short tabs to + * required size (+- 1pixel). + */ + + } else if (titles_padded_total2>=w) { + /* Expand as many short tabs as possible to equal size, + * they will be shorter than tabs_params.tab_min_w anyway. + * Long tabs should be padded by 2*tabs_params.requested_pad. + */ +equal_tab: + qsort(sorted_sizes, m, sizeof(int), intcompare); + min_w=0;titles_total=2*m*frame->tabs_params.requested_pad; + for(i=m-1;i>=0;i--){ + if (sorted_sizes[i]*(i+1)+titles_total<=w){ + min_w=(w-titles_total)/(i+1); + break; + } + titles_total+=sorted_sizes[i]; + } + /* After expanding to min_w: it should remain + * 2*m*tabs_params.requested_pad +- m + */ + } else if (frame->barmode==FRAME_BAR_SHAPED) { + /* Shorter bar. */ + w=titles_padded_total2; + bar_w=w+bdtotal; + min_w=frame->tabs_params.tab_min_w-2*frame->tabs_params.requested_pad; + /* After expanding to min_w: it should remain + * 2*m*tabs_params.requested_pad exactly + */ + } else { + if(proportional){ + /* Pad equally, no tab shorter than tabs_params.tab_min_w-1. */ + max_w=frame->tabs_params.tab_min_w; + goto equal_pad; + }else{ + /* Expand as many short tabs as possible to equal size, + * Long tabs should be padded by 2*tabs_params.requested_pad. + */ + goto equal_tab; + } + } + if (min_w>0) { + for(i=0;i<m;i++) + if (frame->titles[i].iw<min_w) + frame->titles[i].iw=min_w; + } + + + /* Calculate remaining space */ + titles_total=0; + for(i=0;i<m;i++) + titles_total+=frame->titles[i].iw; + w-=titles_total; + /* Distribute remaining space equally up to 1 pixel */ + for(i=0;i<m;i++) + frame->titles[i].iw+=((i+1)*w)/m-(i*w)/m; + + if((frame->bar_w!=bar_w)){ + frame->bar_w=bar_w; + return TRUE; + } + return complete; +} + + +static bool tab_sizes_proportional(WFrame * frame, bool complete) +{ + return tab_sizes_propor_elastic(frame, complete, TRUE); +} + +static bool tab_sizes_elastic(WFrame * frame, bool complete) +{ + return tab_sizes_propor_elastic(frame, complete, FALSE); +} + + + +/*}}}*/ + DECLFUNPTRMAP(TabCalcPtr); static StringTabCalcPtrMap frame_tabs_width_algorithms[] = { { "equal", tab_sizes_equal }, + { "elastic", tab_sizes_elastic }, + { "proportional", tab_sizes_proportional }, END_STRINGPTRMAP }; @@ -156,6 +344,7 @@ static TabCalcPtr default_frame_tabs_width_algorithm=tab_sizes_equal; static void param_init(TabCalcParams *pars) { pars->tab_min_w=100; + pars->propor_tab_min_w=50; pars->bar_max_width_q=0.95; pars->requested_pad=10; pars->alg=default_frame_tabs_width_algorithm; @@ -177,6 +366,12 @@ void frame_tabs_calc_brushes_updated(WFrame *frame) pars->tab_min_w=1; } + if(grbrush_get_extra(frame->brush, "frame_propor_tab_min_w", + 'i', &(pars->propor_tab_min_w))){ + if(pars->propor_tab_min_w<=0) + pars->propor_tab_min_w=1; + } + if(grbrush_get_extra(frame->brush, "floatframe_bar_max_w_q", 'd', &(pars->bar_max_width_q))){ if(pars->bar_max_width_q<=0.0 || pars->bar_max_width_q>1.0) diff --git a/ioncore/frame-tabs-recalc.h b/ioncore/frame-tabs-recalc.h index 2472aac..2c60701 100644 --- a/ioncore/frame-tabs-recalc.h +++ b/ioncore/frame-tabs-recalc.h @@ -43,10 +43,18 @@ DECLSTRUCT(TabCalcParams){ TabCalcPtr alg; /* Maximum size of shaped bar. */ double bar_max_width_q; - /* Requested size of the tab. */ + /* Minimum width of a tab in shaped frame. + * For 'proportional' and 'elastic' algorithms also minimum width of a tab + * provided that no title has to be truncated + */ int tab_min_w; /* Requested empty space to be added before and after text. */ int requested_pad; + /* Minimum width of a tab for 'proportional' and 'elastic' algorithms. + * Long titles will be truncated instead of shortening a short tab below + * this length. + */ + int propor_tab_min_w; }; void frame_tabs_calc_brushes_updated(WFrame *frame); -- 1.7.1 |
From: Tomáš E. <eb...@dr...> - 2011-02-07 03:51:13
|
I reimplemented the elastic/proportional tab widths in following patches. They are already commited in http://drak.ucw.cz/~ebik/git/notion . It is not enabled by default. It has to be selected in frame's style. See example below. I did not included the user documentation in the patches, as we have not the sources of the document "Configuring and Extending Ion with Lua". The document is GPL'ed, thus we should be able to get the sources of the document. I attach it below in the form of the example. Following should be added to your style, to allow 'elastic' algorithm. I also document here options that are already documented in the section "4.3.2 Extra fields for style `frame'" of "Configuring and Extending Ion with Lua". de.defstyle("frame", { --[[ Difference between elastic and proportional is when there is plenty free space and the frame is not shaped. Elastic wants equal sized tabs, with long titles longer. Proportional wants distribute free space equally among the tabs. ]]-- -- frame_tab_width_alg = "equal", frame_tab_width_alg = "elastic", -- frame_tab_width_alg = "proportional", --[[ Minimum size of a tab. This size is maintained as long as no other tab has to be truncated in the case of the 'proportional' or 'elastic' algorithm. Also minimun size of a tab in shaped frame (for all algorithms). ]]-- -- frame_tab_min_w = 100 --[[ Minimum size of an elastic/proportional tab. Elastic/proportional algorithms truncate other tabs rather than shortening a short tab below this size. ]]-- -- frame_propor_tab_min_w = 50 --[[ Minimum size of an elastic/proportional tab. Elastic/proportional algorithms truncate other tabs rather than shortening a short tab below this size. ]]-- -- floatframe_tab_min_w = 50 }) |