On 10/31/07, pancake <[EMAIL PROTECTED]> wrote:
<snip>

> This still doesn't completely achieve the 'scolling through all windows'
> > effect. Probably the easiest alternative (as you suggested) is to zoom()
> on
> > the focussed client automatically on focusnext() if cpt = 1... and that
> > would be a cool improvement to clientspertag. One way is to have a
> > cptfocusnext doing the cpt related chores and calling the actual
> focusnext
> > appropriately. config.h handles binding Ctrl - j to cptfocusnext so
> that's
> > not a problem either. This solves the problem for clientspertag but
> ofcourse
> > is not general enough for a number of hooks (How about a config.c? That
> > could actually handle a lot of other problems too.).
>
> Uhm the zooming way is not ok at all because it modifies the clients list
> and breaks the focusnext()/focusprev(), so imho the right way to achieve
> this is by having an index and a counter. Something like a moving window
> with
>
> Here's a sample:
>
>                      Window (size = cpt)
> =-Index-=> +----------------------------------+
>             |                                  |
> [ client0 ] [ client1 ] [ client2 ] [ client3 ]
>
> So, we should be able to change the starting index into the clients list
> to start handling clients and keeping cpt as the size of our view for
> the current tag.
>
> So, we can hook ^alt+j and ^alt+k to move this index with soemthing like
> cptidx++ or so.
>
> We can make cptidx=0 when entering in 'cpt' mode. And always make't fit
> for all the clients on the current view.
>
> This way. dwm.c will remain as is, and we can 'handle' when focusing a
> non-visible client (out of the window) and shifting right or left the
> window.
>
> I think this way we can make cpt more consistent and functional, but
> we also need the visible-clients indicator.
>
> Thanks for discussing the cpt stuff. I need some feedback to think on
> some concepts and so..let see if we finally got the proper approach
> for this patch.
>
> --pancake
>
>
You are right, zoom will alter the order of the clients in the client list.
I am wondering, do you want the window scrolling behavior if there are two
or more windows? My guess is that this is useful only if cpt = 1. Also,
instead of using a cptidx you could just use sel (the currently selected
client). Actually, forgive my impatience... I gave it a shot and the
scrolling monocle works with the following patch :). The main trick is
somehow calling arrange on a focus change.
Using sel instead of cptidx also means that when I deactivate cpt mode, the
window I am currently viewing (in monocle) is now the focussed window in the
tiled layout. I guess we can move custom_focus* to nmaster.c so that it is
less of a hack.
What do you think?

_r

diff -r 18756f3d803d config.h
--- a/config.h  Tue Oct 30 22:39:33 2007 -0400
+++ b/config.h  Wed Oct 31 15:08:00 2007 -0400
@@ -41,6 +41,20 @@ Layout layouts[] = {
 /* Status text */
 char* statusbar[] = { cptstext, inputtext };

+static void custom_focusnext(const char* a)
+{
+       focusnext(NULL);
+       if(cpt == 1)
+               arrange();
+}
+
+static void custom_focusprev(const char* a)
+{
+       focusprev(NULL);
+       if(cpt == 1)
+               arrange();
+}
+
 /* key definitions */
 #define MODKEY                 Mod1Mask
 #define KEYS \
@@ -54,8 +68,8 @@ Key keys[] = { \
        { MODKEY,                       XK_s,           spawn, "exec
.dwm/audio_toggle.sh" }, \
        { MODKEY,                       XK_space,       setlayout,      NULL
}, \
        { MODKEY,                       XK_b,           togglebar,      NULL
}, \
-       { MODKEY,                       XK_n,           focusnext,      NULL
}, \
-       { MODKEY,                       XK_e,           focusprev,      NULL
}, \
+       { MODKEY,                       XK_n,
custom_focusnext,       NULL }, \
+       { MODKEY,                       XK_e,
custom_focusprev,       NULL }, \
        { MODKEY,                       XK_h,           setmwfact,      "-
0.05" }, \
        { MODKEY,                       XK_o,           setmwfact,
"+0.05" }, \
        { MODKEY,                       XK_m,           togglemax,      NULL
}, \
diff -r 18756f3d803d nmaster.c
--- a/nmaster.c Tue Oct 30 22:39:33 2007 -0400
+++ b/nmaster.c Wed Oct 31 15:31:56 2007 -0400
@@ -103,6 +103,20 @@ ntile(void) {

        n = getclientspertag(n);

+       if(cpt == 1) { // Scrolling monocle layout
+               for(c = nexttiled(clients); c; c = nexttiled(c->next)){
+                       if(sel && c!=sel){
+                               ban(c);
+                               continue;
+                       }
+               }
+               if(sel)
+                       c = sel;
+               else
+                       c = nexttiled(clients);
+               resize(c, wax, way, waw - 2*c->border, wah - 2*c->border,
False);
+               return;
+       }
        /* window geoms */
        mh = (n <= nmaster) ? wah / (n > 0 ? n : 1) : wah / nmaster;
        mw = (n <= nmaster) ? waw : mwfact * waw;

Reply via email to