Float behavior confusion

I always thought that setting a float property resulted in non-floated objects acting as if the floated object was not there
however look at this code
<div style="width:100px; height:100px; background-color:#03C;"></div>
<div style="width:100px; height:100px; background-color:#F36;"></div>
<div style="width:100px; height:100px; background-color:#F36; float:left;"></div>
<div style="width:100px; height:100px; background-color:#F36; float:left;"></div>
some divs are floated some are not
if i place the non floated ones on top the floated ones appear bellow where they would if there was no floating at all.
but if i place the floated ones on top the non floated ones position themselves where the floated ones are as if the floated ones do not exist.
so why is it that floated/non floated elements ignore each other if the non-floated element comes first but not if its the other way arround

when applying clear which block do i apply it to?
if i apply it to the final block before the block which i intend to change the behavior of will it changhe the behavior of the block that i applied it to
if i apply it to the first block that should ignore the float then what happens if this block itself must also be floated in order to effect the behavior of blocks which come after it.
is there any reason why float/clear cannot be unused and simply use display:block and display:inline instead?
frankly the confusion caused by css float/clear, espcially when combined with different display properties really annoys me
Basic css, mysql and javascript did not cause me this sort of headache, basic AS3 did but only because i tried to run before i could walk.
css is far more basic than any of these technologies and yet it causes me more grief than any of them.

Similar Messages

  • Cursor selection behavior confusion...

    If you place your cursor in some text you are composing and then hold the Shift key, you can press either the left or right arrows to select content in that direction one character at a time. This is normal and expected. In all other applications by Apple if you select a few characters to the right in this manner and then press the left arrow key, it deselects the farthest characters and moves your selection back to the point of origin; however, this is NOT the case in these new forums. Here if you select in one direction in this manner, and then press the opposite direction, then the selection expands in the new direction.
    This behavior is a bit confusing...perhaps it could be addressed to be the way we've come to rely on selecting text in other Safari forms and OS X applications?

    I read your post in Firefox 4, posted text in a reply field to test, and did not see this behavior.
    I opened your post in Chrome 10.0.648.205 and then in Chrome 12.0.725.0 dev, posted text in a reply field to test, and again did not see the behavior you describe.
    I opened your post in Opera 11.10, posted text in a reply field to test, and did not see this behavior.
    I opened your post in Safari 5.0.5 and did experience the behavior you describe.
    The issue seems limited to Safari.

  • IEEE-754-Standard floating point confusion

    Hi there,
    I am really confused. The datatype double should be in C++ and Java the same standard acc. to IEEE-754.
    But when I try to investigate the several bytearrays created from a double value e.g. 1.1d, it is different in C and Java.
    below are the results:
    Value 1.1 in C++
    intCsigned
         bit0     bit1     bit2     bit3     bit4     bit5     bit6     bit7
    byte0     1     1     0     0     1     1     0     1     -51
    byte1     1     1     0     0     1     1     1     0     -52
    byte2     1     0     0     0     1     1     0     0     -116
    byte3     0     0     1     1     1     1     1     1     63
    byte4     1     1     0     0     1     1     0     0     -52
    byte5     1     1     0     0     1     1     0     0     -52
    byte6     1     1     0     0     1     1     0     0     -52
    byte7     1     1     0     0     1     1     0     0     -52
    Value 1.1 in Java
    intJava(signed)
    byte0     0     0     1     1     1     1     1     1     63
    byte1     1     1     1     1     0     0     0     1     -15
    byte2     1     0     0     1     1     0     0     1     -103
    byte3     1     0     0     1     1     0     0     1     -103
    byte4     1     0     0     1     1     0     0     1     -103
    byte5     1     0     0     1     1     0     0     1     -103
    byte6     1     0     0     1     1     0     0     1     -103
    byte7     1     0     0     1     1     0     1     0     -102
    Can please somebody bring light into that?????
    Does somebody know the exact specification of a double datatype in c++ and java?
    with the best regards,
    stonee

    OK,
    It seems my C-program created a bad array. I finally
    found out, that the Java and C Array of each double is
    exactly turned.
    C[0] == J[7]
    C[1] == J[6]
    C[2] == J[5]
    its probably big endian vs little endian issues plus on top of that nibble swapping.
    I happen to be working on this very problem at this instant. I'll see what I can dig up.

  • Float/double confusion

    Could someone explain the theory behind the following:
    The default floating point data type is a double, hence the following declaration will not compile:
    float f=1.3;
    However the following declaration will compile:
    float f=1/3
    ...without specifying that it should be a float. Why does this happen, and why is the resulting value in f 0.0? Surely it should be 0.3333 or similar?

    1/3 is the integer 1 divided with the integer 3, and since they both are integers it would be natural for the result to be integer too, and so the division performed is called integer division. And the integer 0 is the result because one third is doesn't fit any integer. The fractional part is clamped. This result is then implicitely casted to produce the float 0.0f.
    Why? Because that's the way it goes in C and C++.

  • Double email messages, erratic Mail behavior, confused

    Hi there,
    I am getting two of the same emails coming in. For example, if someone sends me an email, I get two of emails (exactly the same, time, same person etc.). Sometimes there are three of them, sometimes there is only one mail copy.
    If I open mail for example, it will tell me there are 6 emails, when really there are only three, with a copy of each. So really there are 6, but only 3 original emails.
    Sometimes, if I click on Mail, and my inbox will say those 6 emails (for example) and I click on trash, or junk mail, or some other mailbox, (before opening any of those mails) then back to the original inbox it will correct itself. (i.e. 3 mails). Usually not. It is hard to tell if there are copies or not; sometimes, I'll delete one of them and then later, they'll _both_ be gone.
    I can't seem to find anything in the settings that make any sense, either that or I do not know the correct language for it.
    Thanks for any help,
    Keri

    Me too. I just created a Mobile Me account the other day, and I'm receiving doubles. None of my other email accounts are though, just my Me account.
    Solutions anyone?
    * I just realized that after I delete the messages and check the Trash folder, they are not doubled anymore...

  • VI does not float if called while modal dialog is running

    In my program I have Floating VIs that popup if certain conditions are met. These Floating VIs allow the Main VI to continue running, but remain front most so the user knows there is an issue.
    There are also other modal dialogs in the application that could be active when an Floating VI is called in the background. When the Floating VI is called it properly shows up behind the modal dialog and in front of the Main VI.
    The problem is that when the modal dialog is dismissed the Floating VI is no longer floating and appears behind the Main VI. Switching focus between VI's will bring either VI to the front. Changing focus to Windows Explorer (clicking on desktop) then back to LabVIEW restores floating behavior to the Floating VI.
    I've attached a crude example that exhibits this behavior.
    LV 2014 32-bit
    WIndows 7 64-bit
    Attachments:
    HiddenFloatingExample.vi ‏10 KB
    FloatingVI.vi ‏7 KB

    I can't offer a solution, but I can verify that the interaction between floating windows and modal dialogs is "hinky" -- though I haven't noticed the effect that you mention.
    Mike...
    Certified Professional Instructor
    Certified LabVIEW Architect
    LabVIEW Champion
    "... after all, He's not a tame lion..."
    Be thinking ahead and mark your dance card for NI Week 2015 now: TS 6139 - Object Oriented First Steps

  • Dwm 5.9 Compilation issues

    Ok guys, I really need your help.
    I am currently with dwm 5.8.2 (everything's fine) and I downloaded 5.9 via ABS.
    I launched a makepkg under ~/dwm. And next, I tried to apply this patch called pertag2. diff: https://github.com/simongmzlj/dwmhacks/ … rtag2.diff
    It succeeded. Used:
    patch -p1 < pertag2.diff
    And I modified my config.h as jokerboy suggested me here: https://bbs.archlinux.org/viewtopic.php … 45#p960545
    I haven't others patches.
    But when I try to compile it, I got many errors messages.
    dwm build options:
    CFLAGS = -std=c99 -pedantic -Wall -Os -I. -I/usr/include -I/usr/include/X11 -DVERSION="5.9" -DXINERAMA
    LDFLAGS = -s -L/usr/lib -lc -L/usr/lib/X11 -lX11 -L/usr/lib/X11 -lXinerama
    CC = cc
    CC dwm.c
    In file included from dwm.c:293:0:
    config.h:31:16: erreur: ‘tile’ undeclared here (not in a function)
    dwm.c: In function ‘buttonpress’:
    dwm.c:450:9: erreur: request for member ‘name’ in something not a structure or union
    dwm.c:450:9: erreur: request for member ‘name’ in something not a structure or union
    dwm.c:450:4: attention : passing argument 1 of ‘strlen’ from incompatible pointer type [enabled by default]
    /usr/include/string.h:399:15: note: expected ‘const char *’ but argument is of type ‘const struct Layout *’
    dwm.c:450:4: attention : passing argument 1 of ‘textnw’ from incompatible pointer type [enabled by default]
    dwm.c:236:12: note: expected ‘const char *’ but argument is of type ‘const struct Layout *’
    dwm.c: In function ‘createmon’:
    dwm.c:686:29: erreur: request for member ‘mfact’ in something not a structure or union
    dwm.c:686:36: attention : comparaison ordonnée de pointeur avec le zéro entier [-pedantic]
    dwm.c:686:61: erreur: request for member ‘mfact’ in something not a structure or union
    dwm.c:686:48: erreur: non concordance de type dans une expression conditionnelle
    dwm.c:686:16: erreur: incompatible types when assigning to type ‘double’ from type ‘const struct Layout *’
    dwm.c:686:3: attention : statement with no effect [-Wunused-value]
    dwm.c:687:31: erreur: request for member ‘nmaster’ in something not a structure or union
    dwm.c:687:40: attention : comparaison ordonnée de pointeur avec le zéro entier [-pedantic]
    dwm.c:687:46: erreur: ‘nmaster’ undeclared (first use in this function)
    dwm.c:687:46: note: each undeclared identifier is reported only once for each function it appears in
    dwm.c:687:67: erreur: request for member ‘nmaster’ in something not a structure or union
    dwm.c:687:18: attention : assignment makes integer from pointer without a cast [enabled by default]
    dwm.c:688:26: erreur: request for member ‘layout’ in something not a structure or union
    dwm.c: In function ‘drawbar’:
    dwm.c:767:10: erreur: request for member ‘name’ in something not a structure or union
    dwm.c:767:10: erreur: request for member ‘name’ in something not a structure or union
    dwm.c:767:3: attention : passing argument 1 of ‘strlen’ from incompatible pointer type [enabled by default]
    /usr/include/string.h:399:15: note: expected ‘const char *’ but argument is of type ‘const struct Layout *’
    dwm.c:767:3: attention : passing argument 1 of ‘textnw’ from incompatible pointer type [enabled by default]
    dwm.c:236:12: note: expected ‘const char *’ but argument is of type ‘const struct Layout *’
    dwm.c:769:19: erreur: request for member ‘name’ in something not a structure or union
    dwm.c:769:3: attention : passing argument 1 of ‘drawtext’ from incompatible pointer type [enabled by default]
    dwm.c:190:13: note: expected ‘const char *’ but argument is of type ‘const struct Layout *’
    dwm.c: Hors de toute fonction :
    dwm.c:1550:1: attention : ‘setnmaster’ defined but not used [-Wunused-function]
    dwm.c:1539:1: attention : ‘incnmaster’ defined but not used [-Wunused-function]
    dwm.c:1691:1: attention : ‘ntile’ defined but not used [-Wunused-function]
    make: *** [dwm.o] Erreur 1
    Here my config.h:
    /* See LICENSE file for copyright and license details. */
    /* appearance */
    static const char font[] = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*";
    static const char normbordercolor[] = "#cccccc";
    static const char normbgcolor[] = "#cccccc";
    static const char normfgcolor[] = "#000000";
    static const char selbordercolor[] = "#0066ff";
    static const char selbgcolor[] = "#0066ff";
    static const char selfgcolor[] = "#ffffff";
    static const unsigned int borderpx = 1; /* border pixel of windows */
    static const unsigned int snap = 32; /* snap pixel */
    static const Bool showbar = True; /* False means no bar */
    static const Bool topbar = True; /* False means bottom bar */
    static const Rule rules[] = {
    /* class instance title tags mask isfloating monitor */
    { "Gimp", NULL, NULL, 0, True, -1 },
    { "Firefox", NULL, NULL, 1 << 8, False, -1 },
    /* layout(s) */
    static const int nmaster = 1; /* clients in the master area */
    static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
    static const Bool resizehints = True; /* True means respect size hints in tiled resizals */
    static const Layout layouts[] = {
    /* symbol arrange function */
    { "[]=", tile }, /* first entry is default */
    { "><>", NULL }, /* no layout function means floating behavior */
    { "[M]", monocle },
    { "[N]", ntile },
    /* tagging */
    static const Tag tags[] = {
    /* name layout mfact nmaster */
    { "1", &layouts[0], -1, -1 },
    { "2", &layouts[1], -1, -1 },
    { "3", &layouts[2], -1, -1 },
    { "4", &layouts[3], 0.40, -1 },
    { "5", &layouts[0], -1, -1 },
    { "6", &layouts[0], -1, -1 },
    { "7", &layouts[0], -1, -1 },
    { "8", &layouts[0], -1, -1 },
    { "9", &layouts[0], -1, -1 },
    /* key definitions */
    #define MODKEY Mod1Mask
    #define TAGKEYS(KEY,TAG) \
    { MODKEY, KEY, view, {.ui = 1 << TAG} }, \
    { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \
    { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \
    { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} },
    /* helper for spawning shell commands in the pre dwm-5.0 fashion */
    #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
    /* commands */
    static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
    static const char *termcmd[] = { "uxterm", NULL };
    static Key keys[] = {
    /* modifier key function argument */
    { MODKEY, XK_p, spawn, {.v = dmenucmd } },
    { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
    { MODKEY, XK_b, togglebar, {0} },
    { MODKEY, XK_j, focusstack, {.i = +1 } },
    { MODKEY, XK_k, focusstack, {.i = -1 } },
    { MODKEY, XK_a, incnmaster, {.i = +1 } },
    { MODKEY, XK_z, incnmaster, {.i = -1 } },
    { MODKEY, XK_h, setmfact, {.f = -0.05} },
    { MODKEY, XK_l, setmfact, {.f = +0.05} },
    { MODKEY, XK_Return, zoom, {0} },
    { MODKEY, XK_Tab, view, {0} },
    { MODKEY|ShiftMask, XK_c, killclient, {0} },
    { MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
    { MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
    { MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
    { MODKEY, XK_n, setlayout, {.v = &layouts[3]} },
    { MODKEY, XK_space, setlayout, {0} },
    { MODKEY|ShiftMask, XK_space, togglefloating, {0} },
    { MODKEY, XK_0, view, {.ui = ~0 } },
    { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
    { MODKEY, XK_comma, focusmon, {.i = -1 } },
    { MODKEY, XK_period, focusmon, {.i = +1 } },
    { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
    { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
    TAGKEYS( XK_1, 0)
    TAGKEYS( XK_2, 1)
    TAGKEYS( XK_3, 2)
    TAGKEYS( XK_4, 3)
    TAGKEYS( XK_5, 4)
    TAGKEYS( XK_6, 5)
    TAGKEYS( XK_7, 6)
    TAGKEYS( XK_8, 7)
    TAGKEYS( XK_9, 8)
    { MODKEY|ShiftMask, XK_q, quit, {0} },
    /* button definitions */
    /* click can be ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
    static Button buttons[] = {
    /* click event mask button function argument */
    { ClkLtSymbol, 0, Button1, setlayout, {0} },
    { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
    { ClkWinTitle, 0, Button2, zoom, {0} },
    { ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
    { ClkClientWin, MODKEY, Button1, movemouse, {0} },
    { ClkClientWin, MODKEY, Button2, togglefloating, {0} },
    { ClkClientWin, MODKEY, Button3, resizemouse, {0} },
    { ClkTagBar, 0, Button1, view, {0} },
    { ClkTagBar, 0, Button3, toggleview, {0} },
    { ClkTagBar, MODKEY, Button1, tag, {0} },
    { ClkTagBar, MODKEY, Button3, toggletag, {0} },
    dwm.c
    /* See LICENSE file for copyright and license details.
    * dynamic window manager is designed like any other X client as well. It is
    * driven through handling X events. In contrast to other X clients, a window
    * manager selects for SubstructureRedirectMask on the root window, to receive
    * events about window (dis-)appearance. Only one X connection at a time is
    * allowed to select for this event mask.
    * The event handlers of dwm are organized in an array which is accessed
    * whenever a new event has been fetched. This allows event dispatching
    * in O(1) time.
    * Each child of the root window is called a client, except windows which have
    * set the override_redirect flag. Clients are organized in a linked client
    * list on each monitor, the focus history is remembered through a stack list
    * on each monitor. Each client contains a bit array to indicate the tags of a
    * client.
    * Keys and tagging rules are organized as arrays and defined in config.h.
    * To understand everything else, start reading main().
    #include <errno.h>
    #include <locale.h>
    #include <stdarg.h>
    #include <signal.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <X11/cursorfont.h>
    #include <X11/keysym.h>
    #include <X11/Xatom.h>
    #include <X11/Xlib.h>
    #include <X11/Xproto.h>
    #include <X11/Xutil.h>
    #ifdef XINERAMA
    #include <X11/extensions/Xinerama.h>
    #endif /* XINERAMA */
    /* macros */
    #define BUTTONMASK (ButtonPressMask|ButtonReleaseMask)
    #define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
    #define INRECT(X,Y,RX,RY,RW,RH) ((X) >= (RX) && (X) < (RX) + (RW) && (Y) >= (RY) && (Y) < (RY) + (RH))
    #define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags]))
    #define LENGTH(X) (sizeof X / sizeof X[0])
    #define MAX(A, B) ((A) > (B) ? (A) : (B))
    #define MIN(A, B) ((A) < (B) ? (A) : (B))
    #define MOUSEMASK (BUTTONMASK|PointerMotionMask)
    #define WIDTH(X) ((X)->w + 2 * (X)->bw)
    #define HEIGHT(X) ((X)->h + 2 * (X)->bw)
    #define TAGMASK ((1 << LENGTH(tags)) - 1)
    #define TEXTW(X) (textnw(X, strlen(X)) + dc.font.height)
    /* enums */
    enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
    enum { ColBorder, ColFG, ColBG, ColLast }; /* color */
    enum { NetSupported, NetWMName, NetWMState,
    NetWMFullscreen, NetActiveWindow, NetLast }; /* EWMH atoms */
    enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */
    enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
    ClkClientWin, ClkRootWin, ClkLast }; /* clicks */
    typedef union {
    int i;
    unsigned int ui;
    float f;
    const void *v;
    } Arg;
    typedef struct {
    unsigned int click;
    unsigned int mask;
    unsigned int button;
    void (*func)(const Arg *arg);
    const Arg arg;
    } Button;
    typedef struct Monitor Monitor;
    typedef struct Client Client;
    struct Client {
    char name[256];
    float mina, maxa;
    int x, y, w, h;
    int oldx, oldy, oldw, oldh;
    int basew, baseh, incw, inch, maxw, maxh, minw, minh;
    int bw, oldbw;
    unsigned int tags;
    Bool isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
    Client *next;
    Client *snext;
    Monitor *mon;
    Window win;
    typedef struct {
    int x, y, w, h;
    unsigned long norm[ColLast];
    unsigned long sel[ColLast];
    Drawable drawable;
    GC gc;
    struct {
    int ascent;
    int descent;
    int height;
    XFontSet set;
    XFontStruct *xfont;
    } font;
    } DC; /* draw context */
    typedef struct {
    unsigned int mod;
    KeySym keysym;
    void (*func)(const Arg *);
    const Arg arg;
    } Key;
    typedef struct {
    const char *symbol;
    void (*arrange)(Monitor *);
    } Layout;
    struct Monitor {
    char ltsymbol[16];
    int num;
    int by; /* bar geometry */
    int mx, my, mw, mh; /* screen size */
    int wx, wy, ww, wh; /* window area */
    unsigned int seltags;
    unsigned int sellt;
    unsigned int tagset[2];
    Bool showbar;
    Bool topbar;
    Client *clients;
    Client *sel;
    Client *stack;
    Monitor *next;
    Window barwin;
    const Layout *lt[2];
    int curtag;
    int prevtag;
    const Layout **lts;
    double *mfacts;
    int *nmasters;
    typedef struct {
    const char *name;
    const Layout *layout;
    float mfact;
    int nmaster;
    } Tag;
    typedef struct {
    const char *class;
    const char *instance;
    const char *title;
    unsigned int tags;
    Bool isfloating;
    int monitor;
    } Rule;
    /* function declarations */
    static void applyrules(Client *c);
    static Bool applysizehints(Client *c, int *x, int *y, int *w, int *h, Bool interact);
    static void arrange(Monitor *m);
    static void arrangemon(Monitor *m);
    static void attach(Client *c);
    static void attachstack(Client *c);
    static void buttonpress(XEvent *e);
    static void checkotherwm(void);
    static void cleanup(void);
    static void cleanupmon(Monitor *mon);
    static void clearurgent(Client *c);
    static void clientmessage(XEvent *e);
    static void configure(Client *c);
    static void configurenotify(XEvent *e);
    static void configurerequest(XEvent *e);
    static Monitor *createmon(void);
    static void destroynotify(XEvent *e);
    static void detach(Client *c);
    static void detachstack(Client *c);
    static void die(const char *errstr, ...);
    static Monitor *dirtomon(int dir);
    static void drawbar(Monitor *m);
    static void drawbars(void);
    static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);
    static void drawtext(const char *text, unsigned long col[ColLast], Bool invert);
    static void enternotify(XEvent *e);
    static void expose(XEvent *e);
    static void focus(Client *c);
    static void focusin(XEvent *e);
    static void focusmon(const Arg *arg);
    static void focusstack(const Arg *arg);
    static unsigned long getcolor(const char *colstr);
    static Bool getrootptr(int *x, int *y);
    static long getstate(Window w);
    static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);
    static void grabbuttons(Client *c, Bool focused);
    static void grabkeys(void);
    static void initfont(const char *fontstr);
    static void keypress(XEvent *e);
    static void killclient(const Arg *arg);
    static void manage(Window w, XWindowAttributes *wa);
    static void mappingnotify(XEvent *e);
    static void maprequest(XEvent *e);
    static void monocle(Monitor *m);
    static void movemouse(const Arg *arg);
    static Client *nexttiled(Client *c);
    static void pop(Client *);
    static void propertynotify(XEvent *e);
    static Monitor *ptrtomon(int x, int y);
    static void quit(const Arg *arg);
    static void resize(Client *c, int x, int y, int w, int h, Bool interact);
    static void resizeclient(Client *c, int x, int y, int w, int h);
    static void resizemouse(const Arg *arg);
    static void restack(Monitor *m);
    static void run(void);
    static void scan(void);
    static Bool sendevent(Client *c, Atom proto);
    static void sendmon(Client *c, Monitor *m);
    static void setclientstate(Client *c, long state);
    static void setfocus(Client *c);
    static void setlayout(const Arg *arg);
    static void setmfact(const Arg *arg);
    static void setnmaster(const Arg *arg);
    static void incnmaster(const Arg *arg);
    static void setup(void);
    static void showhide(Client *c);
    static void sigchld(int unused);
    static void spawn(const Arg *arg);
    static void tag(const Arg *arg);
    static void tagmon(const Arg *arg);
    static int textnw(const char *text, unsigned int len);
    static void ntile(Monitor *);
    static void togglebar(const Arg *arg);
    static void togglefloating(const Arg *arg);
    static void toggletag(const Arg *arg);
    static void toggleview(const Arg *arg);
    static void unfocus(Client *c, Bool setfocus);
    static void unmanage(Client *c, Bool destroyed);
    static void unmapnotify(XEvent *e);
    static Bool updategeom(void);
    static void updatebarpos(Monitor *m);
    static void updatebars(void);
    static void updatenumlockmask(void);
    static void updatesizehints(Client *c);
    static void updatestatus(void);
    static void updatetitle(Client *c);
    static void updatewmhints(Client *c);
    static void view(const Arg *arg);
    static Client *wintoclient(Window w);
    static Monitor *wintomon(Window w);
    static int xerror(Display *dpy, XErrorEvent *ee);
    static int xerrordummy(Display *dpy, XErrorEvent *ee);
    static int xerrorstart(Display *dpy, XErrorEvent *ee);
    static void zoom(const Arg *arg);
    /* variables */
    static const char broken[] = "broken";
    static char stext[256];
    static int screen;
    static int sw, sh; /* X display screen geometry width, height */
    static int bh, blw = 0; /* bar geometry */
    static int (*xerrorxlib)(Display *, XErrorEvent *);
    static unsigned int numlockmask = 0;
    static void (*handler[LASTEvent]) (XEvent *) = {
    [ButtonPress] = buttonpress,
    [ClientMessage] = clientmessage,
    [ConfigureRequest] = configurerequest,
    [ConfigureNotify] = configurenotify,
    [DestroyNotify] = destroynotify,
    [EnterNotify] = enternotify,
    [Expose] = expose,
    [FocusIn] = focusin,
    [KeyPress] = keypress,
    [MappingNotify] = mappingnotify,
    [MapRequest] = maprequest,
    [PropertyNotify] = propertynotify,
    [UnmapNotify] = unmapnotify
    static Atom wmatom[WMLast], netatom[NetLast];
    static Bool running = True;
    static Cursor cursor[CurLast];
    static Display *dpy;
    static DC dc;
    static Monitor *mons = NULL, *selmon = NULL;
    static Window root;
    /* configuration, allows nested code to access above variables */
    #include "config.h"
    /* compile-time check if all tags fit into an unsigned int bit array. */
    struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
    /* function implementations */
    void
    applyrules(Client *c) {
    const char *class, *instance;
    unsigned int i;
    const Rule *r;
    Monitor *m;
    XClassHint ch = { 0 };
    /* rule matching */
    c->isfloating = c->tags = 0;
    if(XGetClassHint(dpy, c->win, &ch)) {
    class = ch.res_class ? ch.res_class : broken;
    instance = ch.res_name ? ch.res_name : broken;
    for(i = 0; i < LENGTH(rules); i++) {
    r = &rules[i];
    if((!r->title || strstr(c->name, r->title))
    && (!r->class || strstr(class, r->class))
    && (!r->instance || strstr(instance, r->instance)))
    c->isfloating = r->isfloating;
    c->tags |= r->tags;
    for(m = mons; m && m->num != r->monitor; m = m->next);
    if(m)
    c->mon = m;
    if(ch.res_class)
    XFree(ch.res_class);
    if(ch.res_name)
    XFree(ch.res_name);
    c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags];
    Bool
    applysizehints(Client *c, int *x, int *y, int *w, int *h, Bool interact) {
    Bool baseismin;
    Monitor *m = c->mon;
    /* set minimum possible */
    *w = MAX(1, *w);
    *h = MAX(1, *h);
    if(interact) {
    if(*x > sw)
    *x = sw - WIDTH(c);
    if(*y > sh)
    *y = sh - HEIGHT(c);
    if(*x + *w + 2 * c->bw < 0)
    *x = 0;
    if(*y + *h + 2 * c->bw < 0)
    *y = 0;
    else {
    if(*x > m->mx + m->mw)
    *x = m->mx + m->mw - WIDTH(c);
    if(*y > m->my + m->mh)
    *y = m->my + m->mh - HEIGHT(c);
    if(*x + *w + 2 * c->bw < m->mx)
    *x = m->mx;
    if(*y + *h + 2 * c->bw < m->my)
    *y = m->my;
    if(*h < bh)
    *h = bh;
    if(*w < bh)
    *w = bh;
    if(resizehints || c->isfloating) {
    /* see last two sentences in ICCCM 4.1.2.3 */
    baseismin = c->basew == c->minw && c->baseh == c->minh;
    if(!baseismin) { /* temporarily remove base dimensions */
    *w -= c->basew;
    *h -= c->baseh;
    /* adjust for aspect limits */
    if(c->mina > 0 && c->maxa > 0) {
    if(c->maxa < (float)*w / *h)
    *w = *h * c->maxa + 0.5;
    else if(c->mina < (float)*h / *w)
    *h = *w * c->mina + 0.5;
    if(baseismin) { /* increment calculation requires this */
    *w -= c->basew;
    *h -= c->baseh;
    /* adjust for increment value */
    if(c->incw)
    *w -= *w % c->incw;
    if(c->inch)
    *h -= *h % c->inch;
    /* restore base dimensions */
    *w = MAX(*w + c->basew, c->minw);
    *h = MAX(*h + c->baseh, c->minh);
    if(c->maxw)
    *w = MIN(*w, c->maxw);
    if(c->maxh)
    *h = MIN(*h, c->maxh);
    return *x != c->x || *y != c->y || *w != c->w || *h != c->h;
    void
    arrange(Monitor *m) {
    if(m)
    showhide(m->stack);
    else for(m = mons; m; m = m->next)
    showhide(m->stack);
    focus(NULL);
    if(m)
    arrangemon(m);
    else for(m = mons; m; m = m->next)
    arrangemon(m);
    void
    arrangemon(Monitor *m) {
    strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol);
    if(m->lt[m->sellt]->arrange)
    m->lt[m->sellt]->arrange(m);
    restack(m);
    void
    attach(Client *c) {
    c->next = c->mon->clients;
    c->mon->clients = c;
    void
    attachstack(Client *c) {
    c->snext = c->mon->stack;
    c->mon->stack = c;
    void
    buttonpress(XEvent *e) {
    unsigned int i, x, click;
    Arg arg = {0};
    Client *c;
    Monitor *m;
    XButtonPressedEvent *ev = &e->xbutton;
    click = ClkRootWin;
    /* focus monitor if necessary */
    if((m = wintomon(ev->window)) && m != selmon) {
    unfocus(selmon->sel, True);
    selmon = m;
    focus(NULL);
    if(ev->window == selmon->barwin) {
    i = x = 0;
    do {
    x += TEXTW(tags[i].name);
    } while(ev->x >= x && ++i < LENGTH(tags));
    if(i < LENGTH(tags)) {
    click = ClkTagBar;
    arg.ui = 1 << i;
    else if(ev->x < x + blw)
    click = ClkLtSymbol;
    else if(ev->x > selmon->ww - TEXTW(stext))
    click = ClkStatusText;
    else
    click = ClkWinTitle;
    else if((c = wintoclient(ev->window))) {
    focus(c);
    click = ClkClientWin;
    for(i = 0; i < LENGTH(buttons); i++)
    if(click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button
    && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state))
    buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg);
    void
    checkotherwm(void) {
    xerrorxlib = XSetErrorHandler(xerrorstart);
    /* this causes an error if some other window manager is running */
    XSelectInput(dpy, DefaultRootWindow(dpy), SubstructureRedirectMask);
    XSync(dpy, False);
    XSetErrorHandler(xerror);
    XSync(dpy, False);
    void
    cleanup(void) {
    Arg a = {.ui = ~0};
    Layout foo = { "", NULL };
    Monitor *m;
    view(&a);
    selmon->lt[selmon->sellt] = &foo;
    for(m = mons; m; m = m->next)
    while(m->stack)
    unmanage(m->stack, False);
    if(dc.font.set)
    XFreeFontSet(dpy, dc.font.set);
    else
    XFreeFont(dpy, dc.font.xfont);
    XUngrabKey(dpy, AnyKey, AnyModifier, root);
    XFreePixmap(dpy, dc.drawable);
    XFreeGC(dpy, dc.gc);
    XFreeCursor(dpy, cursor[CurNormal]);
    XFreeCursor(dpy, cursor[CurResize]);
    XFreeCursor(dpy, cursor[CurMove]);
    while(mons)
    cleanupmon(mons);
    XSync(dpy, False);
    XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
    void
    cleanupmon(Monitor *mon) {
    Monitor *m;
    if(mon == mons)
    mons = mons->next;
    else {
    for(m = mons; m && m->next != mon; m = m->next);
    m->next = mon->next;
    XUnmapWindow(dpy, mon->barwin);
    XDestroyWindow(dpy, mon->barwin);
    free(mon->mfacts);
    free(mon->nmasters);
    free(mon->lts);
    free(mon);
    void
    clearurgent(Client *c) {
    XWMHints *wmh;
    c->isurgent = False;
    if(!(wmh = XGetWMHints(dpy, c->win)))
    return;
    wmh->flags &= ~XUrgencyHint;
    XSetWMHints(dpy, c->win, wmh);
    XFree(wmh);
    void
    clientmessage(XEvent *e) {
    XClientMessageEvent *cme = &e->xclient;
    Client *c = wintoclient(cme->window);
    if(!c)
    return;
    if(cme->message_type == netatom[NetWMState] && cme->data.l[1] == netatom[NetWMFullscreen]) {
    if(cme->data.l[0] && !c->isfullscreen) {
    XChangeProperty(dpy, cme->window, netatom[NetWMState], XA_ATOM, 32,
    PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1);
    c->isfullscreen = True;
    c->oldstate = c->isfloating;
    c->oldbw = c->bw;
    c->bw = 0;
    c->isfloating = True;
    resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh);
    XRaiseWindow(dpy, c->win);
    else {
    XChangeProperty(dpy, cme->window, netatom[NetWMState], XA_ATOM, 32,
    PropModeReplace, (unsigned char*)0, 0);
    c->isfullscreen = False;
    c->isfloating = c->oldstate;
    c->bw = c->oldbw;
    c->x = c->oldx;
    c->y = c->oldy;
    c->w = c->oldw;
    c->h = c->oldh;
    resizeclient(c, c->x, c->y, c->w, c->h);
    arrange(c->mon);
    else if(cme->message_type == netatom[NetActiveWindow]) {
    if(!ISVISIBLE(c)) {
    c->mon->seltags ^= 1;
    c->mon->tagset[c->mon->seltags] = c->tags;
    pop(c);
    void
    configure(Client *c) {
    XConfigureEvent ce;
    ce.type = ConfigureNotify;
    ce.display = dpy;
    ce.event = c->win;
    ce.window = c->win;
    ce.x = c->x;
    ce.y = c->y;
    ce.width = c->w;
    ce.height = c->h;
    ce.border_width = c->bw;
    ce.above = None;
    ce.override_redirect = False;
    XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&ce);
    void
    configurenotify(XEvent *e) {
    Monitor *m;
    XConfigureEvent *ev = &e->xconfigure;
    Bool dirty;
    if(ev->window == root) {
    dirty = (sw != ev->width);
    sw = ev->width;
    sh = ev->height;
    if(updategeom() || dirty) {
    if(dc.drawable != 0)
    XFreePixmap(dpy, dc.drawable);
    dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen));
    updatebars();
    for(m = mons; m; m = m->next)
    XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);
    arrange(NULL);
    void
    configurerequest(XEvent *e) {
    Client *c;
    Monitor *m;
    XConfigureRequestEvent *ev = &e->xconfigurerequest;
    XWindowChanges wc;
    if((c = wintoclient(ev->window))) {
    if(ev->value_mask & CWBorderWidth)
    c->bw = ev->border_width;
    else if(c->isfloating || !selmon->lt[selmon->sellt]->arrange) {
    m = c->mon;
    if(ev->value_mask & CWX)
    c->x = m->mx + ev->x;
    if(ev->value_mask & CWY)
    c->y = m->my + ev->y;
    if(ev->value_mask & CWWidth)
    c->w = ev->width;
    if(ev->value_mask & CWHeight)
    c->h = ev->height;
    if((c->x + c->w) > m->mx + m->mw && c->isfloating)
    c->x = m->mx + (m->mw / 2 - c->w / 2); /* center in x direction */
    if((c->y + c->h) > m->my + m->mh && c->isfloating)
    c->y = m->my + (m->mh / 2 - c->h / 2); /* center in y direction */
    if((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight)))
    configure(c);
    if(ISVISIBLE(c))
    XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
    else
    configure(c);
    else {
    wc.x = ev->x;
    wc.y = ev->y;
    wc.width = ev->width;
    wc.height = ev->height;
    wc.border_width = ev->border_width;
    wc.sibling = ev->above;
    wc.stack_mode = ev->detail;
    XConfigureWindow(dpy, ev->window, ev->value_mask, &wc);
    XSync(dpy, False);
    /* TODO Check how many times createmon is called */
    Monitor *
    createmon(void) {
    Monitor *m;
    int i, numtags = LENGTH(tags) + 1;
    if(!(m = (Monitor *)calloc(1, sizeof(Monitor))))
    die("fatal: could not malloc() %u bytes\n", sizeof(Monitor));
    if(!(m->mfacts = calloc(sizeof(double), numtags)))
    die("fatal: could not malloc() %u bytes\n", sizeof(double) * numtags);
    if(!(m->nmasters = calloc(sizeof(int), numtags)))
    die("fatal: could not malloc() %u bytes\n", sizeof(int) * numtags);
    if(!(m->lts = calloc(sizeof(Layout *), numtags)))
    die("fatal: could not malloc() %u bytes\n", sizeof(Layout *) * numtags);
    m->tagset[0] = m->tagset[1] = 1;
    m->showbar = showbar;
    m->topbar = topbar;
    m->curtag = m->prevtag = 1;
    for(i = 1; i < numtags; i++) {
    m->mfacts[i] = tags[i - 1].mfact < 0 ? mfact : tags[i - 1].mfact;
    m->nmasters[i] = tags[i - 1].nmaster < 0 ? nmaster : tags[i - 1].nmaster;
    m->lts[i] = tags[i - 1].layout;
    m->lt[0] = m->lts[m->curtag];
    m->lt[1] = &layouts[1 % LENGTH(layouts)];
    strncpy(m->ltsymbol, m->lt[0]->symbol, sizeof m->ltsymbol);
    return m;
    void
    destroynotify(XEvent *e) {
    Client *c;
    XDestroyWindowEvent *ev = &e->xdestroywindow;
    if((c = wintoclient(ev->window)))
    unmanage(c, True);
    void
    detach(Client *c) {
    Client **tc;
    for(tc = &c->mon->clients; *tc && *tc != c; tc = &(*tc)->next);
    *tc = c->next;
    void
    detachstack(Client *c) {
    Client **tc, *t;
    for(tc = &c->mon->stack; *tc && *tc != c; tc = &(*tc)->snext);
    *tc = c->snext;
    if(c == c->mon->sel) {
    for(t = c->mon->stack; t && !ISVISIBLE(t); t = t->snext);
    c->mon->sel = t;
    void
    die(const char *errstr, ...) {
    va_list ap;
    va_start(ap, errstr);
    vfprintf(stderr, errstr, ap);
    va_end(ap);
    exit(EXIT_FAILURE);
    Monitor *
    dirtomon(int dir) {
    Monitor *m = NULL;
    if(dir > 0) {
    if(!(m = selmon->next))
    m = mons;
    else {
    if(selmon == mons)
    for(m = mons; m->next; m = m->next);
    else
    for(m = mons; m->next != selmon; m = m->next);
    return m;
    void
    drawbar(Monitor *m) {
    int x;
    unsigned int i, occ = 0, urg = 0;
    unsigned long *col;
    Client *c;
    for(c = m->clients; c; c = c->next) {
    occ |= c->tags;
    if(c->isurgent)
    urg |= c->tags;
    dc.x = 0;
    for(i = 0; i < LENGTH(tags); i++) {
    dc.w = TEXTW(tags[i].name);
    col = m->tagset[m->seltags] & 1 << i ? dc.sel : dc.norm;
    drawtext(tags[i].name, col, urg & 1 << i);
    drawsquare(m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
    occ & 1 << i, urg & 1 << i, col);
    dc.x += dc.w;
    dc.w = blw = TEXTW(m->ltsymbol);
    drawtext(m->ltsymbol, dc.norm, False);
    dc.x += dc.w;
    x = dc.x;
    if(m == selmon) { /* status is only drawn on selected monitor */
    dc.w = TEXTW(stext);
    dc.x = m->ww - dc.w;
    if(dc.x < x) {
    dc.x = x;
    dc.w = m->ww - x;
    drawtext(stext, dc.norm, False);
    else
    dc.x = m->ww;
    if((dc.w = dc.x - x) > bh) {
    dc.x = x;
    if(m->sel) {
    col = m == selmon ? dc.sel : dc.norm;
    drawtext(m->sel->name, col, False);
    drawsquare(m->sel->isfixed, m->sel->isfloating, False, col);
    else
    drawtext(NULL, dc.norm, False);
    XCopyArea(dpy, dc.drawable, m->barwin, dc.gc, 0, 0, m->ww, bh, 0, 0);
    XSync(dpy, False);
    void
    drawbars(void) {
    Monitor *m;
    for(m = mons; m; m = m->next)
    drawbar(m);
    void
    drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {
    int x;
    XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]);
    x = (dc.font.ascent + dc.font.descent + 2) / 4;
    if(filled)
    XFillRectangle(dpy, dc.drawable, dc.gc, dc.x+1, dc.y+1, x+1, x+1);
    else if(empty)
    XDrawRectangle(dpy, dc.drawable, dc.gc, dc.x+1, dc.y+1, x, x);
    void
    drawtext(const char *text, unsigned long col[ColLast], Bool invert) {
    char buf[256];
    int i, x, y, h, len, olen;
    XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG]);
    XFillRectangle(dpy, dc.drawable, dc.gc, dc.x, dc.y, dc.w, dc.h);
    if(!text)
    return;
    olen = strlen(text);
    h = dc.font.ascent + dc.font.descent;
    y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
    x = dc.x + (h / 2);
    /* shorten text if necessary */
    for(len = MIN(olen, sizeof buf); len && textnw(text, len) > dc.w - h; len--);
    if(!len)
    return;
    memcpy(buf, text, len);
    if(len < olen)
    for(i = len; i && i > len - 3; buf[--i] = '.');
    XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]);
    if(dc.font.set)
    XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
    else
    XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
    void
    enternotify(XEvent *e) {
    Client *c;
    Monitor *m;
    XCrossingEvent *ev = &e->xcrossing;
    if((ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root)
    return;
    c = wintoclient(ev->window);
    m = c ? c->mon : wintomon(ev->window);
    if(m != selmon) {
    unfocus(selmon->sel, True);
    selmon = m;
    else if(!c || c == selmon->sel)
    return;
    focus(c);
    void
    expose(XEvent *e) {
    Monitor *m;
    XExposeEvent *ev = &e->xexpose;
    if(ev->count == 0 && (m = wintomon(ev->window)))
    drawbar(m);
    void
    focus(Client *c) {
    if(!c || !ISVISIBLE(c))
    for(c = selmon->stack; c && !ISVISIBLE(c); c = c->snext);
    /* was if(selmon->sel) */
    if(selmon->sel && selmon->sel != c)
    unfocus(selmon->sel, False);
    if(c) {
    if(c->mon != selmon)
    selmon = c->mon;
    if(c->isurgent)
    clearurgent(c);
    detachstack(c);
    attachstack(c);
    grabbuttons(c, True);
    XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]);
    setfocus(c);
    else
    XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
    selmon->sel = c;
    drawbars();
    void
    focusin(XEvent *e) { /* there are some broken focus acquiring clients */
    XFocusChangeEvent *ev = &e->xfocus;
    if(selmon->sel && ev->window != selmon->sel->win)
    setfocus(selmon->sel);
    void
    focusmon(const Arg *arg) {
    Monitor *m;
    if(!mons->next)
    return;
    if((m = dirtomon(arg->i)) == selmon)
    return;
    unfocus(selmon->sel, True);
    selmon = m;
    focus(NULL);
    void
    focusstack(const Arg *arg) {
    Client *c = NULL, *i;
    if(!selmon->sel)
    return;
    if(arg->i > 0) {
    for(c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next);
    if(!c)
    for(c = selmon->clients; c && !ISVISIBLE(c); c = c->next);
    else {
    for(i = selmon->clients; i != selmon->sel; i = i->next)
    if(ISVISIBLE(i))
    c = i;
    if(!c)
    for(; i; i = i->next)
    if(ISVISIBLE(i))
    c = i;
    if(c) {
    focus(c);
    restack(selmon);
    unsigned long
    getcolor(const char *colstr) {
    Colormap cmap = DefaultColormap(dpy, screen);
    XColor color;
    if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color))
    die("error, cannot allocate color '%s'\n", colstr);
    return color.pixel;
    Bool
    getrootptr(int *x, int *y) {
    int di;
    unsigned int dui;
    Window dummy;
    return XQueryPointer(dpy, root, &dummy, &dummy, x, y, &di, &di, &dui);
    long
    getstate(Window w) {
    int format;
    long result = -1;
    unsigned char *p = NULL;
    unsigned long n, extra;
    Atom real;
    if(XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState],
    &real, &format, &n, &extra, (unsigned char **)&p) != Success)
    return -1;
    if(n != 0)
    result = *p;
    XFree(p);
    return result;
    Bool
    gettextprop(Window w, Atom atom, char *text, unsigned int size) {
    char **list = NULL;
    int n;
    XTextProperty name;
    if(!text || size == 0)
    return False;
    text[0] = '\0';
    XGetTextProperty(dpy, w, &name, atom);
    if(!name.nitems)
    return False;
    if(name.encoding == XA_STRING)
    strncpy(text, (char *)name.value, size - 1);
    else {
    if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success && n > 0 && *list) {
    strncpy(text, *list, size - 1);
    XFreeStringList(list);
    text[size - 1] = '\0';
    XFree(name.value);
    return True;
    void
    grabbuttons(Client *c, Bool focused) {
    updatenumlockmask();
    unsigned int i, j;
    unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
    XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
    if(focused) {
    for(i = 0; i < LENGTH(buttons); i++)
    if(buttons[i].click == ClkClientWin)
    for(j = 0; j < LENGTH(modifiers); j++)
    XGrabButton(dpy, buttons[i].button,
    buttons[i].mask | modifiers[j],
    c->win, False, BUTTONMASK,
    GrabModeAsync, GrabModeSync, None, None);
    else
    XGrabButton(dpy, AnyButton, AnyModifier, c->win, False,
    BUTTONMASK, GrabModeAsync, GrabModeSync, None, None);
    void
    grabkeys(void) {
    updatenumlockmask();
    unsigned int i, j;
    unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
    KeyCode code;
    XUngrabKey(dpy, AnyKey, AnyModifier, root);
    for(i = 0; i < LENGTH(keys); i++) {
    if((code = XKeysymToKeycode(dpy, keys[i].keysym)))
    for(j = 0; j < LENGTH(modifiers); j++)
    XGrabKey(dpy, code, keys[i].mod | modifiers[j], root,
    True, GrabModeAsync, GrabModeAsync);
    void
    initfont(const char *fontstr) {
    char *def, **missing;
    int n;
    missing = NULL;
    dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
    if(missing) {
    while(n--)
    fprintf(stderr, "dwm: missing fontset: %s\n", missing[n]);
    XFreeStringList(missing);
    if(dc.font.set) {
    XFontStruct **xfonts;
    char **font_names;
    dc.font.ascent = dc.font.descent = 0;
    XExtentsOfFontSet(dc.font.set);
    n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names);
    while(n--) {
    dc.font.ascent = MAX(dc.font.ascent, (*xfonts)->ascent);
    dc.font.descent = MAX(dc.font.descent,(*xfonts)->descent);
    xfonts++;
    else {
    if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr))
    && !(dc.font.xfont = XLoadQueryFont(dpy, "fixed")))
    die("error, cannot load font: '%s'\n", fontstr);
    dc.font.ascent = dc.font.xfont->ascent;
    dc.font.descent = dc.font.xfont->descent;
    dc.font.height = dc.font.ascent + dc.font.descent;
    #ifdef XINERAMA
    static Bool
    isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info) {
    while(n--)
    if(unique[n].x_org == info->x_org && unique[n].y_org == info->y_org
    && unique[n].width == info->width && unique[n].height == info->height)
    return False;
    return True;
    #endif /* XINERAMA */
    void
    keypress(XEvent *e) {
    unsigned int i;
    KeySym keysym;
    XKeyEvent *ev;
    ev = &e->xkey;
    keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
    for(i = 0; i < LENGTH(keys); i++)
    if(keysym == keys[i].keysym
    && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state)
    && keys[i].func)
    keys[i].func(&(keys[i].arg));
    void
    killclient(const Arg *arg) {
    if(!selmon->sel)
    return;
    if(!sendevent(selmon->sel, wmatom[WMDelete])) {
    XGrabServer(dpy);
    XSetErrorHandler(xerrordummy);
    XSetCloseDownMode(dpy, DestroyAll);
    XKillClient(dpy, selmon->sel->win);
    XSync(dpy, False);
    XSetErrorHandler(xerror);
    XUngrabServer(dpy);
    void
    manage(Window w, XWindowAttributes *wa) {
    Client *c, *t = NULL;
    Window trans = None;
    XWindowChanges wc;
    if(!(c = calloc(1, sizeof(Client))))
    die("fatal: could not malloc() %u bytes\n", sizeof(Client));
    c->win = w;
    updatetitle(c);
    if(XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) {
    c->mon = t->mon;
    c->tags = t->tags;
    else {
    c->mon = selmon;
    applyrules(c);
    /* geometry */
    c->x = c->oldx = wa->x;
    c->y = c->oldy = wa->y;
    c->w = c->oldw = wa->width;
    c->h = c->oldh = wa->height;
    c->oldbw = wa->border_width;
    if(c->w == c->mon->mw && c->h == c->mon->mh) {
    c->isfloating = True;
    c->x = c->mon->mx;
    c->y = c->mon->my;
    c->bw = 0;
    else {
    if(c->x + WIDTH(c) > c->mon->mx + c->mon->mw)
    c->x = c->mon->mx + c->mon->mw - WIDTH(c);
    if(c->y + HEIGHT(c) > c->mon->my + c->mon->mh)
    c->y = c->mon->my + c->mon->mh - HEIGHT(c);
    c->x = MAX(c->x, c->mon->mx);
    /* only fix client y-offset, if the client center might cover the bar */
    c->y = MAX(c->y, ((c->mon->by == 0) && (c->x + (c->w / 2) >= c->mon->wx)
    && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : c->mon->my);
    c->bw = borderpx;
    wc.border_width = c->bw;
    XConfigureWindow(dpy, w, CWBorderWidth, &wc);
    XSetWindowBorder(dpy, w, dc.norm[ColBorder]);
    configure(c); /* propagates border_width, if size doesn't change */
    updatesizehints(c);
    updatewmhints(c);
    XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);
    grabbuttons(c, False);
    if(!c->isfloating)
    c->isfloating = c->oldstate = trans != None || c->isfixed;
    if(c->isfloating)
    XRaiseWindow(dpy, c->win);
    attach(c);
    attachstack(c);
    XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */
    XMapWindow(dpy, c->win);
    setclientstate(c, NormalState);
    arrange(c->mon);
    void
    mappingnotify(XEvent *e) {
    XMappingEvent *ev = &e->xmapping;
    XRefreshKeyboardMapping(ev);
    if(ev->request == MappingKeyboard)
    grabkeys();
    void
    maprequest(XEvent *e) {
    static XWindowAttributes wa;
    XMapRequestEvent *ev = &e->xmaprequest;
    if(!XGetWindowAttributes(dpy, ev->window, &wa))
    return;
    if(wa.override_redirect)
    return;
    if(!wintoclient(ev->window))
    manage(ev->window, &wa);
    void
    monocle(Monitor *m) {
    unsigned int n = 0;
    Client *c;
    for(c = m->clients; c; c = c->next)
    if(ISVISIBLE(c))
    n++;
    if(n > 0) /* override layout symbol */
    snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n);
    for(c = nexttiled(m->clients); c; c = nexttiled(c->next))
    resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, False);
    void
    movemouse(const Arg *arg) {
    int x, y, ocx, ocy, nx, ny;
    Client *c;
    Monitor *m;
    XEvent ev;
    if(!(c = selmon->sel))
    return;
    restack(selmon);
    ocx = c->x;
    ocy = c->y;
    if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
    None, cursor[CurMove], CurrentTime) != GrabSuccess)
    return;
    if(!getrootptr(&x, &y))
    return;
    do {
    XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev);
    switch(ev.type) {
    case ConfigureRequest:
    case Expose:
    case MapRequest:
    handler[ev.type](&ev);
    break;
    case MotionNotify:
    nx = ocx + (ev.xmotion.x - x);
    ny = ocy + (ev.xmotion.y - y);
    if(nx >= selmon->wx && nx <= selmon->wx + selmon->ww
    && ny >= selmon->wy && ny <= selmon->wy + selmon->wh) {
    if(abs(selmon->wx - nx) < snap)
    nx = selmon->wx;
    else if(abs((selmon->wx + selmon->ww) - (nx + WIDTH(c))) < snap)
    nx = selmon->wx + selmon->ww - WIDTH(c);
    if(abs(selmon->wy - ny) < snap)
    ny = selmon->wy;
    else if(abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap)
    ny = selmon->wy + selmon->wh - HEIGHT(c);
    if(!c->isfloating && selmon->lt[selmon->sellt]->arrange
    && (abs(nx - c->x) > snap || abs(ny - c->y) > snap))
    togglefloating(NULL);
    if(!selmon->lt[selmon->sellt]->arrange || c->isfloating)
    resize(c, nx, ny, c->w, c->h, True);
    break;
    } while(ev.type != ButtonRelease);
    XUngrabPointer(dpy, CurrentTime);
    if((m = ptrtomon(c->x + c->w / 2, c->y + c->h / 2)) != selmon) {
    sendmon(c, m);
    selmon = m;
    focus(NULL);
    Client *
    nexttiled(Client *c) {
    for(; c && (c->isfloating || !ISVISIBLE(c)); c = c->next);
    return c;
    void
    pop(Client *c) {
    detach(c);
    attach(c);
    focus(c);
    arrange(c->mon);
    void
    propertynotify(XEvent *e) {
    Client *c;
    Window trans;
    XPropertyEvent *ev = &e->xproperty;
    if((ev->window == root) && (ev->atom == XA_WM_NAME))
    updatestatus();
    else if(ev->state == PropertyDelete)
    return; /* ignore */
    else if((c = wintoclient(ev->window))) {
    switch(ev->atom) {
    default: break;
    case XA_WM_TRANSIENT_FOR:
    if(!c->isfloating && (XGetTransientForHint(dpy, c->win, &trans)) &&
    (c->isfloating = (wintoclient(trans)) != NULL))
    arrange(c->mon);
    break;
    case XA_WM_NORMAL_HINTS:
    updatesizehints(c);
    break;
    case XA_WM_HINTS:
    updatewmhints(c);
    drawbars();
    break;
    if(ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) {
    updatetitle(c);
    if(c == c->mon->sel)
    drawbar(c->mon);
    Monitor *
    ptrtomon(int x, int y) {
    Monitor *m;
    for(m = mons; m; m = m->next)
    if(INRECT(x, y, m->wx, m->wy, m->ww, m->wh))
    return m;
    return selmon;
    void
    quit(const Arg *arg) {
    running = False;
    void
    resize(Client *c, int x, int y, int w, int h, Bool interact) {
    if(applysizehints(c, &x, &y, &w, &h, interact))
    resizeclient(c, x, y, w, h);
    void
    resizeclient(Client *c, int x, int y, int w, int h) {
    XWindowChanges wc;
    c->oldx = c->x; c->x = wc.x = x;
    c->oldy = c->y; c->y = wc.y = y;
    c->oldw = c->w; c->w = wc.width = w;
    c->oldh = c->h; c->h = wc.height = h;
    wc.border_width = c->bw;
    XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
    configure(c);
    XSync(dpy, False);
    void
    resizemouse(const Arg *arg) {
    int ocx, ocy;
    int nw, nh;
    Client *c;
    Monitor *m;
    XEvent ev;
    if(!(c = selmon->sel))
    return;
    restack(selmon);
    ocx = c->x;
    ocy = c->y;
    if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
    None, cursor[CurResize], CurrentTime) != GrabSuccess)
    return;
    XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1);
    do {
    XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev);
    switch(ev.type) {
    case ConfigureRequest:
    case Expose:
    case MapRequest:
    handler[ev.type](&ev);
    break;
    case MotionNotify:
    nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1);
    nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1);
    if(c->mon->wx + nw >= selmon->wx && c->mon->wx + nw <= selmon->wx + selmon->ww
    && c->mon->wy + nh >= selmon->wy && c->mon->wy + nh <= selmon->wy + selmon->wh)
    if(!c->isfloating && selmon->lt[selmon->sellt]->arrange
    && (abs(nw - c->w) > snap || abs(nh - c->h) > snap))
    togglefloating(NULL);
    if(!selmon->lt[selmon->sellt]->arrange || c->isfloating)
    resize(c, c->x, c->y, nw, nh, True);
    break;
    } while(ev.type != ButtonRelease);
    XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1);
    XUngrabPointer(dpy, CurrentTime);
    while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
    if((m = ptrtomon(c->x + c->w / 2, c->y + c->h / 2)) != selmon) {
    sendmon(c, m);
    selmon = m;
    focus(NULL);
    void
    restack(Monitor *m) {
    Client *c;
    XEvent ev;
    XWindowChanges wc;
    drawbar(m);
    if(!m->sel)
    return;
    if(m->sel->isfloating || !m->lt[m->sellt]->arrange)
    XRaiseWindow(dpy, m->sel->win);
    if(m->lt[m->sellt]->arrange) {
    wc.stack_mode = Below;
    wc.sibling = m->barwin;
    for(c = m->stack; c; c = c->snext)
    if(!c->isfloating && ISVISIBLE(c)) {
    XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc);
    wc.sibling = c->win;
    XSync(dpy, False);
    while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
    void
    run(void) {
    XEvent ev;
    /* main event loop */
    XSync(dpy, False);
    while(running && !XNextEvent(dpy, &ev)) {
    if(handler[ev.type])
    handler[ev.type](&ev); /* call handler */
    void
    scan(void) {
    unsigned int i, num;
    Window d1, d2, *wins = NULL;
    XWindowAttributes wa;
    if(XQueryTree(dpy, root, &d1, &d2, &wins, &num)) {
    for(i = 0; i < num; i++) {
    if(!XGetWindowAttributes(dpy, wins[i], &wa)
    || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1))
    continue;
    if(wa.map_state == IsViewable || getstate(wins[i]) == IconicState)
    manage(wins[i], &wa);
    for(i = 0; i < num; i++) { /* now the transients */
    if(!XGetWindowAttributes(dpy, wins[i], &wa))
    continue;
    if(XGetTransientForHint(dpy, wins[i], &d1)
    && (wa.map_state == IsViewable || getstate(wins[i]) == IconicState))
    manage(wins[i], &wa);
    if(wins)
    XFree(wins);
    void
    sendmon(Client *c, Monitor *m) {
    if(c->mon == m)
    return;
    unfocus(c, True);
    detach(c);
    detachstack(c);
    c->mon = m;
    c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
    attach(c);
    attachstack(c);
    focus(NULL);
    arrange(NULL);
    void
    setclientstate(Client *c, long state) {
    long data[] = { state, None };
    XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32,
    PropModeReplace, (unsigned char *)data, 2);
    Bool
    sendevent(Client *c, Atom proto) {
    int n;
    Atom *protocols;
    Bool exists = False;
    XEvent ev;
    if(XGetWMProtocols(dpy, c->win, &protocols, &n)) {
    while(!exists && n--)
    exists = protocols[n] == proto;
    XFree(protocols);
    if(exists) {
    ev.type = ClientMessage;
    ev.xclient.window = c->win;
    ev.xclient.message_type = wmatom[WMProtocols];
    ev.xclient.format = 32;
    ev.xclient.data.l[0] = proto;
    ev.xclient.data.l[1] = CurrentTime;
    XSendEvent(dpy, c->win, False, NoEventMask, &ev);
    return exists;
    void
    setfocus(Client *c) {
    if(!c->neverfocus)
    XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
    sendevent(c, wmatom[WMTakeFocus]);
    void
    setlayout(const Arg *arg) {
    if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
    selmon->sellt ^= 1;
    if(arg && arg->v)
    selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag] = (Layout *)arg->v;
    strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
    if(selmon->sel)
    arrange(selmon);
    else
    drawbar(selmon);
    static void
    incnmaster(const Arg *arg) {
    int i;
    if(!arg || !selmon->lt[selmon->sellt]->arrange)
    return;
    i = selmon->nmasters[selmon->curtag] + arg->i;
    selmon->nmasters[selmon->curtag] = i < 0 ? 0 : i;
    arrange(selmon);
    static void
    setnmaster(const Arg *arg) {
    if(!arg || !selmon->lt[selmon->sellt]->arrange)
    return;
    selmon->nmasters[selmon->curtag] = arg->i > 0 ? arg->i : 0;
    arrange(selmon);
    /* arg > 1.0 will set mfact absolutly */
    void
    setmfact(const Arg *arg) {
    float f;
    if(!arg || !selmon->lt[selmon->sellt]->arrange)
    return;
    f = arg->f < 1.0 ? arg->f + selmon->mfacts[selmon->curtag] : arg->f - 1.0;
    if(f < 0.1 || f > 0.9)
    return;
    selmon->mfacts[selmon->curtag] = f;
    arrange(selmon);
    void
    setup(void) {
    XSetWindowAttributes wa;
    /* clean up any zombies immediately */
    sigchld(0);
    /* init screen */
    screen = DefaultScreen(dpy);
    root = RootWindow(dpy, screen);
    initfont(font);
    sw = DisplayWidth(dpy, screen);
    sh = DisplayHeight(dpy, screen);
    bh = dc.h = dc.font.height + 2;
    updategeom();
    /* init atoms */
    wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
    wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
    wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False);
    wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False);
    netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False);
    netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False);
    netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False);
    netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False);
    netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False);
    /* init cursors */
    cursor[CurNormal] = XCreateFontCursor(dpy, XC_left_ptr);
    cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing);
    cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur);
    /* init appearance */
    dc.norm[ColBorder] = getcolor(normbordercolor);
    dc.norm[ColBG] = getcolor(normbgcolor);
    dc.norm[ColFG] = getcolor(normfgcolor);
    dc.sel[ColBorder] = getcolor(selbordercolor);
    dc.sel[ColBG] = getcolor(selbgcolor);
    dc.sel[ColFG] = getcolor(selfgcolor);
    dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, DefaultDepth(dpy, screen));
    dc.gc = XCreateGC(dpy, root, 0, NULL);
    XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
    if(!dc.font.set)
    XSetFont(dpy, dc.gc, dc.font.xfont->fid);
    /* init bars */
    updatebars();
    updatestatus();
    /* EWMH support per view */
    XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32,
    PropModeReplace, (unsigned char *) netatom, NetLast);
    /* select for events */
    wa.cursor = cursor[CurNormal];
    wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask|ButtonPressMask
    |EnterWindowMask|LeaveWindowMask|StructureNotifyMask
    |PropertyChangeMask;
    XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa);
    XSelectInput(dpy, root, wa.event_mask);
    grabkeys();
    void
    showhide(Client *c) {
    if(!c)
    return;
    if(ISVISIBLE(c)) { /* show clients top down */
    XMoveWindow(dpy, c->win, c->x, c->y);
    if((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen)
    resize(c, c->x, c->y, c->w, c->h, False);
    showhide(c->snext);
    else { /* hide clients bottom up */
    showhide(c->snext);
    XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
    void
    sigchld(int unused) {
    if(signal(SIGCHLD, sigchld) == SIG_ERR)
    die("Can't install SIGCHLD handler");
    while(0 < waitpid(-1, NULL, WNOHANG));
    void
    spawn(const Arg *arg) {
    if(fork() == 0) {
    if(dpy)
    close(ConnectionNumber(dpy));
    setsid();
    execvp(((char **)arg->v)[0], (char **)arg->v);
    fprintf(stderr, "dwm: execvp %s", ((char **)arg->v)[0]);
    perror(" failed");
    exit(EXIT_SUCCESS);
    void
    tag(const Arg *arg) {
    if(selmon->sel && arg->ui & TAGMASK) {
    selmon->sel->tags = arg->ui & TAGMASK;
    arrange(selmon);
    void
    tagmon(const Arg *arg) {
    if(!selmon->sel || !mons->next)
    return;
    sendmon(selmon->sel, dirtomon(arg->i));
    int
    textnw(const char *text, unsigned int len) {
    XRectangle r;
    if(dc.font.set) {
    XmbTextExtents(dc.font.set, text, len, NULL, &r);
    return r.width;
    return XTextWidth(dc.font.xfont, text, len);
    void
    ntile(Monitor *m) {
    int x, y, h, w, mw, nmax, nm;
    unsigned int i, n;
    Client *c;
    snprintf(m->ltsymbol, sizeof m->ltsymbol, "=%d]", m->nmasters[m->curtag]);
    for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
    c = nexttiled(m->clients);
    nmax = m->nmasters[m->curtag];
    nm = nmax == 1 ? 1 : MIN(n / 2, nmax);
    if(nm > n)
    nm = n;
    /* master */
    if(nm > 0) {
    mw = selmon->mfacts[selmon->curtag] * m->ww;
    h = m->wh / nm;
    if(h < bh)
    h = m->wh;
    y = m->wy;
    for(i = 0; i < nm; i++, c = nexttiled(c->next)) {
    resize(c, m->wx, y, (n == nm ? m->ww : mw) - 2 * c->bw,
    ((i + 1 == nm) ? m->wy + m->wh - y : h) - 2 * c->bw, False);
    if(h != m->wh)
    y = c->y + HEIGHT(c);
    n -= nm;
    } else
    mw = 0;
    if(n == 0)
    return;
    /* tile stack */
    x = m->wx + mw;
    y = m->wy;
    w = m->ww - mw;
    h = m->wh / n;
    if(h < bh)
    h = m->wh;
    for(i = 0; c; c = nexttiled(c->next), i++) {
    resize(c, x, y, w - 2 * c->bw,
    ((i + 1 == n) ? m->wy + m->wh - y : h) - 2 * c->bw, False);
    if(h != m->wh)
    y = c->y + HEIGHT(c);
    void
    togglebar(const Arg *arg) {
    selmon->showbar = !selmon->showbar;
    updatebarpos(selmon);
    XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
    arrange(selmon);
    void
    togglefloating(const Arg *arg) {
    if(!selmon->sel)
    return;
    selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed;
    if(selmon->sel->isfloating)
    resize(selmon->sel, selmon->sel->x, selmon->sel->y,
    selmon->sel->w, selmon->sel->h, False);
    arrange(selmon);
    void
    toggletag(const Arg *arg) {
    unsigned int newtags;
    unsigned int i;
    if(!selmon->sel)
    return;
    newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
    if(newtags) {
    selmon->sel->tags = newtags;
    if(newtags == ~0) {
    selmon->prevtag = selmon->curtag;
    selmon->curtag = 0;
    if(!(newtags & 1 << (selmon->curtag - 1))) {
    selmon->prevtag = selmon->curtag;
    for (i=0; !(newtags & 1 << i); i++);
    selmon->curtag = i + 1;
    selmon->sel->tags = newtags;
    selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag];
    arrange(selmon);
    void
    toggleview(const Arg *arg) {
    unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK);
    if(newtagset) {
    selmon->tagset[selmon->seltags] = newtagset;
    arrange(selmon);
    void
    unfocus(Client *c, Bool setfocus) {
    if(!c)
    return;
    grabbuttons(c, False);
    XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]);
    if(setfocus)
    XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
    void
    unmanage(Client *c, Bool destroyed) {
    Monitor *m = c->mon;
    XWindowChanges wc;
    /* The server grab construct avoids race conditions. */
    detach(c);
    detachstack(c);
    if(!destroyed) {
    wc.border_width = c->oldbw;
    XGrabServer(dpy);
    XSetErrorHandler(xerrordummy);
    XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */
    XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
    setclientstate(c, WithdrawnState);
    XSync(dpy, False);
    XSetErrorHandler(xerror);
    XUngrabServer(dpy);
    free(c);
    focus(NULL);
    arrange(m);
    void
    unmapnotify(XEvent *e) {
    Client *c;
    XUnmapEvent *ev = &e->xunmap;
    if((c = wintoclient(ev->window)))
    unmanage(c, False);
    void
    updatebars(void) {
    Monitor *m;
    XSetWindowAttributes wa = {
    .override_redirect = True,
    .background_pixmap = ParentRelative,
    .event_mask = ButtonPressMask|ExposureMask
    for(m = mons; m; m = m->next) {
    m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen),
    CopyFromParent, DefaultVisual(dpy, screen),
    CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
    XDefineCursor(dpy, m->barwin, cursor[CurNormal]);
    XMapRaised(dpy, m->barwin);
    void
    updatebarpos(Monitor *m) {
    m->wy = m->my;
    m->wh = m->mh;
    if(m->showbar) {
    m->wh -= bh;
    m->by = m->topbar ? m->wy : m->wy + m->wh;
    m->wy = m->topbar ? m->wy + bh : m->wy;
    else
    m->by = -bh;
    Bool
    updategeom(void) {
    Bool dirty = False;
    #ifdef XINERAMA
    if(XineramaIsActive(dpy)) {
    int i, j, n, nn;
    Client *c;
    Monitor *m;
    XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn);
    XineramaScreenInfo *unique = NULL;
    for(n = 0, m = mons; m; m = m->next, n++);
    /* only consider unique geometries as separate screens */
    if(!(unique = (XineramaScreenInfo *)malloc(sizeof(XineramaScreenInfo) * nn)))
    die("fatal: could not malloc() %u bytes\n", sizeof(XineramaScreenInfo) * nn);
    for(i = 0, j = 0; i < nn; i++)
    if(isuniquegeom(unique, j, &info[i]))
    memcpy(&unique[j++], &info[i], sizeof(XineramaScreenInfo));
    XFree(info);
    nn = j;
    if(n <= nn) {
    for(i = 0; i < (nn - n); i++) { /* new monitors available */
    for(m = mons; m && m->next; m = m->next);
    if(m)
    m->next = createmon();
    else
    mons = createmon();
    for(i = 0, m = mons; i < nn && m; m = m->next, i++)
    if(i >= n
    || (unique[i].x_org != m->mx || unique[i].y_org != m->my
    || unique[i].width != m->mw || unique[i].height != m->mh))
    dirty = True;
    m->num = i;
    m->mx = m->wx = unique[i].x_org;
    m->my = m->wy = unique[i].y_org;
    m->mw = m->ww = unique[i].width;
    m->mh = m->wh = unique[i].height;
    updatebarpos(m);
    else { /* less monitors available nn < n */
    for(i = nn; i < n; i++) {
    for(m = mons; m && m->next; m = m->next);
    while(m->clients) {
    dirty = True;
    c = m->clients;
    m->clients = c->next;
    detachstack(c);
    c->mon = mons;
    attach(c);
    attachstack(c);
    if(m == selmon)
    selmon = mons;
    cleanupmon(m);
    free(unique);
    else
    #endif /* XINERAMA */
    /* default monitor setup */
    if(!mons)
    mons = createmon();
    if(mons->mw != sw || mons->mh != sh) {
    dirty = True;
    mons->mw = mons->ww = sw;
    mons->mh = mons->wh = sh;
    updatebarpos(mons);
    if(dirty) {
    selmon = mons;
    selmon = wintomon(root);
    return dirty;
    void
    updatenumlockmask(void) {
    unsigned int i, j;
    XModifierKeymap *modmap;
    numlockmask = 0;
    modmap = XGetModifierMapping(dpy);
    for(i = 0; i < 8; i++)
    for(j = 0; j < modmap->max_keypermod; j++)
    if(modmap->modifiermap[i * modmap->max_keypermod + j]
    == XKeysymToKeycode(dpy, XK_Num_Lock))
    numlockmask = (1 << i);
    XFreeModifiermap(modmap);
    void
    updatesizehints(Client *c) {
    long msize;
    XSizeHints size;
    if(!XGetWMNormalHints(dpy, c->win, &size, &msize))
    /* size is uninitialized, ensure that size.flags aren't used */
    size.flags = PSize;
    if(size.flags & PBaseSize) {
    c->basew = size.base_width;
    c->baseh = size.base_height;
    else if(size.flags & PMinSize) {
    c->basew = size.min_width;
    c->baseh = size.min_height;
    else
    c->basew = c->baseh = 0;
    if(size.flags & PResizeInc) {
    c->incw = size.width_inc;
    c->inch = size.height_inc;
    else
    c->incw = c->inch = 0;
    if(size.flags & PMaxSize) {
    c->maxw = size

    The diff you use rename tile() to ntile(), you should not have tile in your config.h. The rest of errors probably relate to what the diff has nerfed, or should be gone once you fix that tile.
    I think you should stay on 5.8.2 until all the patches have support for 5.9 if you can't patch on patch on your own.
    (edit) that github repo has issues, it might be good idea to create issue if that patch really have compatible issue with 5.9. That would benefit all other patch users.
    Last edited by livibetter (2011-09-12 14:55:00)

  • Looking for a good method or APP to have client sign a form in a text box

    I am looking for a good method or App to take an existing form/Document and have a client sign, date etc.  I will want to create the text boxes in a stationary location.  Possibly to also take a picture to add to form.
    Has anyone used any apps to accomplish this?
    Apps I have tried.
    Signnow
    Sign PDF
    Sign Easy
    Sign Easy is about the best except the signatures (text boxes, dates, etc) are free floating and confuse people where to add them on form each time.  Clients have no clue how to use it.
    Any suggestions would be helpful.  I may be over complicating this also, as there could just be a PDF app that I utilize.
    Thanks,
    Jim

    Maybe more than you need...
    PDF readers
    PDF Expert – the PDF handling app for the iPad. "It allows you to markup documents with highlights and handwriting, insert text and stamps, sign and even merge PDFs."
    https://itunes.apple.com/us/app/pdf-expert-5-fill-forms-annotate/id743974925?mt= 8
    iAnnotate – turns your tablet into a world-class productivity tool for reading, marking up, and sharing PDFs, Word documents, PowerPoint files, and images.  Has a secure document edition designed for corporations.
    http://www.branchfire.com/iannotate/

  • [solved] problem with making dwm for configuration

    hello everyone,
    i installed and made the dwm following the instructions of this site
    https://wiki.archlinux.org/index.php/dw … mmended.29 which seemed to work fine. now i was configuring my config.h in my ~/dwm folder, which leads to the followng error:
    makepkg -efi
    ==> Making package: dwm 6.0-2 (Tue Sep 30 10:26:22 CEST 2014)
    ==> Checking runtime dependencies...
    ==> Checking buildtime dependencies...
    ==> WARNING: Using existing src/ tree
    ==> Removing existing pkg/ directory...
    ==> Starting build()...
    dwm build options:
    CFLAGS = -std=c99 -pedantic -Wall -Os -I. -I/usr/include -I/usr/include/X11 -D_FORTIFY_SOURCE=2 -DVERSION="6.0" -DXINERAMA
    LDFLAGS = -s -L/usr/lib -lc -L/usr/lib/X11 -lX11 -L/usr/lib/X11 -lXinerama
    CC = cc
    CC dwm.c
    In file included from dwm.c:288:0:
    config.h:35:2: warning: missing braces around initializer [-Wmissing-braces]
    1;
    ^
    config.h:35:2: warning: (near initialization for 'layouts[3]') [-Wmissing-braces]
    config.h:35:2: warning: initialization makes pointer from integer without a cast
    config.h:35:2: warning: (near initialization for 'layouts[3].symbol')
    config.h:35:3: error: expected '}' before ';' token
    1;
    ^
    dwm.c: In function 'keypress':
    dwm.c:1087:2: warning: 'XKeycodeToKeysym' is deprecated (declared at /usr/include/X11/Xlib.h:1699) [-Wdeprecated-declarations]
    keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
    ^
    Makefile:18: recipe for target 'dwm.o' failed
    make: *** [dwm.o] Error 1
    ==> ERROR: A failure occurred in build().
    Aborting...
    here is my config.h
    /* See LICENSE file for copyright and license details. */
    /* appearance */
    static const char font[] = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*";
    static const char normbordercolor[] = "#444444";
    static const char normbgcolor[] = "#222222";
    static const char normfgcolor[] = "#bbbbbb";
    static const char selbordercolor[] = "#005577";
    static const char selbgcolor[] = "#005577";
    static const char selfgcolor[] = "#eeeeee";
    static const unsigned int borderpx = 1; /* border pixel of windows */
    static const unsigned int snap = 32; /* snap pixel */
    static const Bool showbar = True; /* False means no bar */
    static const Bool topbar = True; /* False means bottom bar */
    /* tagging */
    static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
    static const Rule rules[] = {
    /* class instance title tags mask isfloating monitor */
    { "Gimp", NULL, NULL, 0, True, -1 },
    { "Firefox", NULL, NULL, 1 << 8, False, -1 },
    /* layout(s) */
    static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
    static const int nmaster = 1; /* number of clients in master area */
    static const Bool resizehints = True; /* True means respect size hints in tiled resizals */
    static const Layout layouts[] = {
    /* symbol arrange function */
    { "[]=", tile }, /* first entry is default */
    { "><>", NULL }, /* no layout function means floating behavior */
    { "[M]", monocle },
    1;
    /* key definitions */
    #define MODKEY Mod1Mask
    #define TAGKEYS(KEY,TAG) \
    { MODKEY, KEY, view, {.ui = 1 << TAG} }, \
    { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \
    { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \
    { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} },
    /* helper for spawning shell commands in the pre dwm-5.0 fashion */
    #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
    /* commands */
    static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
    static const char *termcmd[] = { "lxterminal", NULL };
    static const char *browsercmd[] = { "dwb", NULL };
    static const char *surfcmd[] = { "surf", NULL };
    static const char *mailcmd[] = { "thunderbird", NULL };
    /*static const char *browsercmd[] = { "dwb", NULL };
    static const char *browsercmd[] = { "dwb", NULL };
    static const char *browsercmd[] = { "dwb", NULL };*/
    static Key keys[] = {
    /* modifier key function argument */
    { MODKEY, XK_p, spawn, {.v = dmenucmd } },
    { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
    { MODKEY, XK_w, spawn, {.v = browsercmd } },
    { MODKEY, XK_s, spawn, {.v = surfcmd} },
    { MODKEY, XK_m, spawn, {.v = mailcmd} },
    { MODKEY, XK_b, togglebar, {0} },
    { MODKEY, XK_j, focusstack, {.i = +1 } },
    { MODKEY, XK_k, focusstack, {.i = -1 } },
    { MODKEY, XK_i, incnmaster, {.i = +1 } },
    { MODKEY, XK_d, incnmaster, {.i = -1 } },
    { MODKEY, XK_h, setmfact, {.f = -0.05} },
    { MODKEY, XK_l, setmfact, {.f = +0.05} },
    { MODKEY, XK_Return, zoom, {0} },
    { MODKEY, XK_Tab, view, {0} },
    { MODKEY|ShiftMask, XK_c, killclient, {0} },
    { MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
    { MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
    { MODKEY, XK_z, setlayout, {.v = &layouts[2]} },
    { MODKEY, XK_space, setlayout, {0} },
    { MODKEY|ShiftMask, XK_space, togglefloating, {0} },
    { MODKEY, XK_0, view, {.ui = ~0 } },
    { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
    { MODKEY, XK_comma, focusmon, {.i = -1 } },
    { MODKEY, XK_period, focusmon, {.i = +1 } },
    { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
    { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
    TAGKEYS( XK_1, 0)
    TAGKEYS( XK_2, 1)
    TAGKEYS( XK_3, 2)
    TAGKEYS( XK_4, 3)
    TAGKEYS( XK_5, 4)
    TAGKEYS( XK_6, 5)
    TAGKEYS( XK_7, 6)
    TAGKEYS( XK_8, 7)
    TAGKEYS( XK_9, 8)
    { MODKEY|ShiftMask, XK_q, quit, {0} },
    /* button definitions */
    /* click can be ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
    static Button buttons[] = {
    /* click event mask button function argument */
    { ClkLtSymbol, 0, Button1, setlayout, {0} },
    { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
    { ClkWinTitle, 0, Button2, zoom, {0} },
    { ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
    { ClkClientWin, MODKEY, Button1, movemouse, {0} },
    { ClkClientWin, MODKEY, Button2, togglefloating, {0} },
    { ClkClientWin, MODKEY, Button3, resizemouse, {0} },
    { ClkTagBar, 0, Button1, view, {0} },
    { ClkTagBar, 0, Button3, toggleview, {0} },
    { ClkTagBar, MODKEY, Button1, tag, {0} },
    { ClkTagBar, MODKEY, Button3, toggletag, {0} },
    i dont understand the error, but as i tried the same with the default config.h, its not due to my changes. i dont get the error when using
    makepkg -i
    but my changes weren't taken (obviously). for some reason, i cant overwrite the default package!?
    greets lizzy
    Last edited by caravanlizzy (2014-09-30 14:47:16)

    The warning messages are as clear as it gets:
    config.h:35:2: warning: missing braces around initializer [-Wmissing-braces]
    1;
    ^
    'config.h' is the filename, '35:2' is the position - 35th line, 2nd column. You even get the line in question printed out: '1;' with and "arrow" pointing to it from below - '^'.

  • After disasters in iDVD `05, should I bother with `06?  Is it repaired?

    Hello,
    I appreciate any help possible, but am particularly interested in comments from "Len Goff" and "John Beatty1." This question involves a small experiment.
    I found errors in iDVD 5 that went unrepaired (yes, I did report them, once). There was no patch for the problems and I noticed that after 6 months and two downloads, patch support vanishes for iApps until the new version (which = $$) comes out. Hmmmm.... (I've picked up DSP4 and will start learning it ASAP. However, for simpler jobs, such as archive video, iDVD would be useful.)
    So here's a re-hash of the two old issues that were never fixed via patch.
    First, iDVD 5 handled the menus strangely relative to version 4. Using menus did not work well in v5. If on menu A, the user selected a button that was to lead to menu B, then the cursor/focus would "land" on menu B on a button that was at an elevation nearest to the button last used on menu A. If that's not clear, I'll rephrase. Say that menu B has many (6-10) buttons (leading to chapters) arranged in a tidy verticle line. On menu A, the button leading to menu B sits about 2/3rd's down the screen. The focus/cursor would "land" on menu B at whatever button was about 2/3rd's down the screen instead of going to the upper left and proceding from the top left, L-R, T-B.
    This "error" lost and confused people for whom I made disks. I was not expecting it either. It made navigating difficult for people because they were expecting something more intuitive. You can look back in discussions and see that one solution to this was text-editing the files after making a disk image to correct navigation. Was this "fixed" in version 6?
    Second, the other oddity in version 5 is this. From v4, the "Wedding Bronze/Silver Two" themes were the most maleable for making near-custom DVD's. This was nice. In V4, in these themes, the "button" included both the little picture and the text label on the picture. This allowed us to use either no picture (text only buttons) or no text (picture only). Well, in v5, they changed something. The active button was only highlighting the text. Therefore, if one tried to make a no-text/picture-only menu (because it's fun), it wouldn't work. The preview did ok but without highlights around the pictures, and you could navigate by counting. (Funny how things work in Preview but not in reality.) But once the encoding and multiplexing was finished, the menus couldn't be set because iDVD couldn't program the menu navigation to "land" on any button, for whatever reason, without a highlight. V5 would return a "-1" or "1" error. In DSP, you might see that the picture was not included as part of the button.
    Experiment: If someone would please snag 5 to 10 minutes of video with a few chapter markers in it (more than 2 sec apart and more than 2 sec from each end of the video) and toss it into v6 with chapter menus. Please try this situation (as disk image) especially using the same theme or a very similar one. Please let me know if the textless buttons can now be made again, like v4 was. Again, did they fix it?
    If you've read all of this, then thank you for your time. If anyone takes up my experiment, then double thanks! and please respond.
    If nothing has improved, than I'll stick to importing v4 archives into DSP and tweaking. (Can't wait until I learn DSP more.)

    Good thing for you I like to do experiments!
    The theme "Wedding Bronze" in iDVD6 still only highlights text on the submenu buttons.
    However, I think that's a theme change and not an iDVD6 limitation per se, as the theme "Porfolio Color" seems to makes buttons that highlight your movie clip, and not just the text.
    So I opened Wedding Bronze and dragged in a short movie with 5 chapters. As in iDVD5, those buttons only highlighted the text. But you can change the button style from the default button used in the theme! So I selected a button, and then chose a new style from the button pallet (a heart shaped button or a formal frame button). These new buttons select the frame around the movie itself, not just the text. Then I selected "Save as Disk Image", and it worked fine, with two of the chapters with no text at all on the buttons. Navigation using the DVD Player on the disk image worked fine and highlighted the frames around the chapters with no text at all on the buttons. Could you have changed the buttons in iDVD5? I think so!
    As for iDVD6 always starting submenus in the top left, it doesn't work that way. However, I must admit that I don’t find the behavior confusing, and could envision multiple schemes that might seem to make sense to different people for different reasons. They key to me is that the navigation within a menu makes sense, not where the starting point is as long as the "highlight" shows up well.
    As for this experiment, the button to go to the chapter menu (scene selection) is in the middle right of the main menu, but when I click on it, it highlights chapter 2 (with no text, middle top row) on the submenu. This is not the closest to the previous button, but it is not the “beginning” chapter either. Maybe it's button #2 going to button #2???
    So there you go, hope this helps…..
    John B

  • Mathematica Doesn't Quite Obey Tag Rule in DWM

    I used the xprop command given here to identify Mathematica, as follows:
    xprop |awk '
    /^WM_CLASS/{sub(/.* =/, "instance:"); sub(/,/, "\nclass:"); print}
    /^WM_NAME/{sub(/.* =/, "title:"); print}'
    title: "Untitled-1"
    instance: "XMathematica"
    I then assigned Mathematica to tag 3, with this line in my config.h:
    { NULL, "XMathematica", NULL, 1 << 2, False },
    But Mathematica only opens in tag 3 if I restart dwm (it's in a while loop, so I restart it using the script given in the dwm article at the Archwiki). Otherwise, it opens in the current tag. No other program doesn't follow my tag rules. Does anyone else have similar issue, or have an idea what could be up?
    I'm running dwm 5.5, with the bstack, pertag, bstack.horiz, fibonacci, cellwriter, pango, tilemovemouse, and monocole patches.
    My full config.h:
    /* See LICENSE file for copyright and license details. */
    /* appearance */
    static const char font[] = "kroeger 05_55 caps 6";
    static const char normbordercolor[] = "#ffffff";
    static const char normbgcolor[] = "#ffffff";
    static const char normfgcolor[] = "#222222";
    static const char selbordercolor[] = "#42b1e1";
    static const char selbgcolor[] = "#ffffff";
    static const char selfgcolor[] = "#42b1e1";
    static unsigned int borderpx = 0; /* border pixel of windows */
    static unsigned int snap = 32; /* snap pixel */
    static Bool showbar = True; /* False means no bar */
    static Bool topbar = True; /* False means bottom bar */
    /* tagging */
    static const char tags[][MAXTAGLEN] = { "xoj", "pdf", "nb", "www", "cli"};
    static unsigned int tagset[] = {1, 1}; /* after start, first tag is selected */
    static Rule rules[] = {
    /* class instance title tags mask isfloating */
    { "Cellwriter", NULL, NULL, ~0, True },
    { "Easystroke", NULL, NULL, 0, False },
    { "Pychrom", NULL, NULL, 0, True },
    { "Xournal", NULL, NULL, 1 << 0, False },
    { "MuPDF", NULL, NULL, 1 << 1, False },
    { NULL, "XMathematica", NULL, 1 << 2, False },
    { "Mplayer", NULL, NULL, 1 << 3, True },
    { "surf", NULL, NULL, 1 << 3, False },
    { "Chromium", NULL, NULL, 1 << 3, False },
    { "Pidgin", NULL, NULL, 1 << 3, True },
    { "URxvt", NULL, NULL, 1 << 4, False },
    /* layout(s) */
    static float mfact = 0.55; /* factor of master area size [0.05..0.95] */
    static Bool resizehints = False; /* False means respect size hints in tiled resizals */
    #include "bstack.c"
    #include "bstackhoriz.c"
    #include "fibonacci.c"
    static Layout layouts[] = {
    /* symbol arrange function */
    { "[]=", tile }, /* first entry is default */
    { "><>", NULL }, /* no layout function means floating behavior */
    { "[M]", monocle },
    { "TTT", bstack },
    { "===", bstackhoriz },
    { "[@]", spiral },
    { "[\\]", dwindle },
    /* key definitions */
    #define MODKEY Mod1Mask
    #define TAGKEYS(KEY,TAG) \
    { MODKEY, KEY, view, {.ui = 1 << TAG} }, \
    { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \
    { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \
    { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} },
    /* helper for spawning shell commands in the pre dwm-5.0 fashion */
    #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
    /* commands */
    static const char *dmenucmd[] = { "dmenu_run", NULL};
    static const char *termcmd[] = { "urxvt", NULL };
    static const char *rotatecmd[] = { "/home/sara/.scripts/rotate.sh", NULL };
    static const char *scrollupcmd[] = { "xte", "mouseclick 4", NULL };
    static const char *scrolldncmd[] = { "xte", "mouseclick 5", NULL };
    static const char *printcmd[] = { "scrot", NULL };
    static const char *mathcmd[] = { "mathematica", NULL };
    static const char *notecmd[] = { "xournal", NULL };
    static const char *webcmd[] = { "sr", "-g", "google", NULL };
    static const char *raisevolcmd[] = { "/home/sara/.scripts/raisevol.sh", NULL };
    static const char *lowvolcmd[] = { "/home/sara/.scripts/lowvol.sh", NULL };
    static const char *mutvolcmd[] = { "/home/sara/.scripts/mutevol.sh", NULL };
    #include <X11/XF86keysym.h>
    static Key keys[] = {
    /* modifier key function argument */
    { MODKEY, XK_p, spawn, {.v = dmenucmd } },
    { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
    { MODKEY, XF86XK_Launch3, spawn, {.v = webcmd } },
    { 0, XF86XK_Launch3, spawn, {.v = rotatecmd } },
    { 0, XF86XK_ScrollUp, spawn, {.v = scrollupcmd } },
    { MODKEY, XF86XK_ScrollUp, spawn, {.v = mathcmd } },
    { 0, XF86XK_ScrollDown, spawn, {.v = scrolldncmd } },
    { MODKEY, XF86XK_ScrollDown, spawn, {.v = notecmd } },
    { 0, XK_Print, spawn, {.v = printcmd } },
    { 0, XF86XK_AudioRaiseVolume, spawn, {.v = raisevolcmd } },
    { 0, XF86XK_AudioLowerVolume, spawn, {.v = lowvolcmd } },
    { 0, XF86XK_AudioMute, spawn, {.v = mutvolcmd } },
    { MODKEY, XK_b, togglebar, {0} },
    { MODKEY, XK_j, focusstack, {.i = +1 } },
    { MODKEY, XK_k, focusstack, {.i = -1 } },
    { MODKEY, XK_h, setmfact, {.f = -0.05} },
    { MODKEY, XK_l, setmfact, {.f = +0.05} },
    { MODKEY, XK_Return, zoom, {0} },
    { MODKEY, XK_Tab, view, {0} },
    { MODKEY|ShiftMask, XK_c, killclient, {0} },
    { MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
    { MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
    { MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
    { MODKEY, XK_r, setlayout, {.v = &layouts[3]} },
    { MODKEY, XK_o, setlayout, {.v = &layouts[4]} },
    { MODKEY, XK_s, setlayout, {.v = &layouts[5]} },
    { MODKEY, XK_d, setlayout, {.v = &layouts[6]} },
    { MODKEY, XK_space, setlayout, {0} },
    { MODKEY|ShiftMask, XK_space, togglefloating, {0} },
    { MODKEY, XK_0, view, {.ui = ~0 } },
    { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
    TAGKEYS( XK_1, 0)
    TAGKEYS( XK_2, 1)
    TAGKEYS( XK_3, 2)
    TAGKEYS( XK_4, 3)
    TAGKEYS( XK_5, 4)
    { MODKEY|ShiftMask, XK_q, quit, {0} },
    #include "tilemovemouse.c"
    /* button definitions */
    /* click can be a tag number (starting at 0),
    * ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
    static Button buttons[] = {
    /* click event mask button function argument */
    { ClkLtSymbol, 0, Button1, setlayout, {0} },
    { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
    { ClkWinTitle, 0, Button2, zoom, {0} },
    { ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
    { ClkClientWin, MODKEY, Button1, tilemovemouse, {0} },
    { ClkClientWin, MODKEY, Button2, togglefloating, {0} },
    { ClkClientWin, MODKEY, Button3, resizemouse, {0} },
    { ClkTagBar, 0, Button1, view, {0} },
    { ClkTagBar, 0, Button3, toggleview, {0} },
    { ClkTagBar, MODKEY, Button1, tag, {0} },
    { ClkTagBar, MODKEY, Button3, toggletag, {0} },
    Appreciate the help .
    [Edit] Adding to the strangeness, Mathematica's documentation always starts up as a floating window, until I restart dwm with Mod-Shift-Q. This is wierd. Mathematica notebooks I create are properly tiled. [/Edit]
    Last edited by Sara (2010-11-01 10:11:16)

    Pasted another example of my usb sd card reader.
    there is no test_X symbol link in /dev/ directory after i un-pluged sd card reader and re-pluged it in on my computer
    oh, I use systemd of course:
    XSign rules.d # cat /boot/grub/menu.lst
    # (0) Arch Linux
    title Arch Linux
    root (hd0,0)
    kernel /boot/vmlinuz26 root=/dev/disk/by-label/root resume=/dev/sda7 ro vga=0x361 init=/usr/lib/systemd/systemd quiet
    initrd /boot/kernel26.img
    Hacksign wrote:
    brebs wrote:You're mixing the hierarchy levels (i.e. subsystems) - can't do that. See working example.
    no, I dont think I mixed te hierarchy level.
    SUBSYSTEM=="input" matched '/devices/platform/i8042/serio1/serio2/input/input24/mouse2'
    and
    SUBSYSTEMS=="usb", ATTR{idVendor}=="1532",
    matched its parent
    and I'm so sorry that I pasted a wrong device tree...
    sorry

  • Business Object - Start

    Hi,
    I want to learn Business Object. With loads of informations floating around confuses me. Would anybody suggest me from where to start. If any document, would you please give me the link. It will be a great help.
    Points will be assigned for all the helpful answers..
    Regards,

    Hi bill,
    The platform includes Crystal Reports®, the industry standard for enterprise reporting.
    Refer to the following links:
    http://www.businessobjects.com/pdf/products/businessobjects_xi_whats_new.pdf
    http://www.businessobje[cts.com/]
    Link to download the useru2019s Guide:
    u2022 Please go to http://help.sap.com
    u2022 Click on BusinessObjects tab
    u2022 Select the product as Integration Kit for SAP
    User guide: BusinessObjects Integration Kit for SAP Useru2019s Guide.
    It will list all the documents for Integration Kit for SAP which will be helpful to you.
    You can download free trial product from the following link:
    http://www.businessobjects.com/product/freetrials.asp
    I hope this information helps you.
    Regards,
    Shweta

  • Greek letters in dwm status bar? How?

    Is there a change in config.h that I could do to show Greek letters normally?
    Thank you

    Sorry..
    The problem exists when I open a Greek web page in a browser. In dwm status bar the Greek characters of the title of the web page are not displayd correctly.
    Here is my config.h:
    /* See LICENSE file for copyright and license details. */
    /* appearance */
    static const char font[] = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*";
    static const char normbordercolor[] = "#444444";
    static const char normbgcolor[] = "#222222";
    static const char normfgcolor[] = "#bbbbbb";
    static const char selbordercolor[] = "#005577";
    static const char selbgcolor[] = "#005577";
    static const char selfgcolor[] = "#eeeeee";
    static const unsigned int borderpx = 1; /* border pixel of windows */
    static const unsigned int snap = 32; /* snap pixel */
    static const Bool showbar = True; /* False means no bar */
    static const Bool topbar = True; /* False means bottom bar */
    /* tagging */
    static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
    static const Rule rules[] = {
    /* class instance title tags mask isfloating monitor */
    { "Gimp", NULL, NULL, 0, True, -1 },
    /* { "Firefox", NULL, NULL, 1 << 8, False, -1 },*/
    /* layout(s) */
    static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
    static const int nmaster = 1; /* number of clients in master area */
    static const Bool resizehints = True; /* True means respect size hints in tiled resizals */
    static const Layout layouts[] = {
    /* symbol arrange function */
    { "[]=", tile }, /* first entry is default */
    { "><>", NULL }, /* no layout function means floating behavior */
    { "[M]", monocle },
    /* key definitions */
    #define MODKEY Mod4Mask
    #define TAGKEYS(KEY,TAG) \
    { MODKEY, KEY, view, {.ui = 1 << TAG} }, \
    { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \
    { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \
    { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} },
    /* helper for spawning shell commands in the pre dwm-5.0 fashion */
    #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
    /* commands */
    static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
    static const char *termcmd[] = { "st", NULL };
    static const char *rebcmd[] = { "systemctl", "reboot", NULL };
    static const char *shutcmd[] = { "systemctl", "poweroff", NULL };
    static const char *dwbcmd[] = { "dwb", NULL };
    static Key keys[] = {
    /* modifier key function argument */
    { MODKEY, XK_p, spawn, {.v = dmenucmd } },
    { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
    { MODKEY|ShiftMask, XK_d, spawn, {.v = dwbcmd } },
    { MODKEY, XK_b, togglebar, {0} },
    { MODKEY, XK_j, focusstack, {.i = +1 } },
    { MODKEY, XK_k, focusstack, {.i = -1 } },
    { MODKEY, XK_i, incnmaster, {.i = +1 } },
    { MODKEY, XK_d, incnmaster, {.i = -1 } },
    { MODKEY, XK_h, setmfact, {.f = -0.05} },
    { MODKEY, XK_l, setmfact, {.f = +0.05} },
    { MODKEY, XK_Return, zoom, {0} },
    { MODKEY, XK_Tab, view, {0} },
    { MODKEY|ShiftMask, XK_c, killclient, {0} },
    { MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
    { MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
    { MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
    { MODKEY, XK_space, setlayout, {0} },
    { MODKEY|ShiftMask, XK_space, togglefloating, {0} },
    { MODKEY, XK_0, view, {.ui = ~0 } },
    { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
    { MODKEY, XK_comma, focusmon, {.i = -1 } },
    { MODKEY, XK_period, focusmon, {.i = +1 } },
    { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
    { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
    TAGKEYS( XK_1, 0)
    TAGKEYS( XK_2, 1)
    TAGKEYS( XK_3, 2)
    TAGKEYS( XK_4, 3)
    TAGKEYS( XK_5, 4)
    TAGKEYS( XK_6, 5)
    TAGKEYS( XK_7, 6)
    TAGKEYS( XK_8, 7)
    TAGKEYS( XK_9, 8)
    { MODKEY|ShiftMask, XK_q, quit, {0} },
    { MODKEY|ShiftMask, XK_r, spawn, {.v = rebcmd } },
    { MODKEY|ShiftMask, XK_s, spawn, {.v = shutcmd } },
    /* button definitions */
    /* click can be ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
    static Button buttons[] = {
    /* click event mask button function argument */
    { ClkLtSymbol, 0, Button1, setlayout, {0} },
    { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
    { ClkWinTitle, 0, Button2, zoom, {0} },
    { ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
    { ClkClientWin, MODKEY, Button1, movemouse, {0} },
    { ClkClientWin, MODKEY, Button2, togglefloating, {0} },
    { ClkClientWin, MODKEY, Button3, resizemouse, {0} },
    { ClkTagBar, 0, Button1, view, {0} },
    { ClkTagBar, 0, Button3, toggleview, {0} },
    { ClkTagBar, MODKEY, Button1, tag, {0} },
    { ClkTagBar, MODKEY, Button3, toggletag, {0} },
    Last edited by hariskar (2013-10-02 13:46:57)

  • Active window property/m​ethod?

    Is there is property or method that will return whether or not a specific VI is the active (has focus) window?
    Thanks,
    Cristian

    (That's just the way code snippets work, nothing was done wrong)
    back on topic:
    In LV 8.2, the code "works", i.e. @ Floating, Frontmost = True
    In LV 8.5, the code does not work, i.e. @ Floating, Frontmost = False.
    I noticed in the Help re: Floating behavior, something was changed in 8.5. It says Focus will not immediately be relinquished when a floating window is selected (or something like that) and 8.2 does not mention that.
    Message Edited by Broken Arrow on 12-23-2009 08:20 AM
    Richard

  • [SOLVED-ish] Useless gaps patch on dwm failing to build

    Trying to apply uselessgaps unsuccessfully.
    Here's the error at compilation:
    ┌─[parazyd][archbox][~/dwm]
    └──╼ makepkg -efi
    ==> Making package: dwm 6.0-2 (Wed Feb 18 00:45:08 CET 2015)
    ==> Checking runtime dependencies...
    ==> Checking buildtime dependencies...
    ==> WARNING: Using existing $srcdir/ tree
    ==> Removing existing $pkgdir/ directory...
    ==> Starting build()...
    dwm build options:
    CFLAGS = -std=c99 -pedantic -Wall -Os -I. -I/usr/include -I/usr/include/X11 -I /usr/include/freetype2 -D_FORTIFY_SOURCE=2 -DVERSION="6.0" -DXINERAMA
    LDFLAGS = -s -L/usr/lib -lc -L/usr/lib/X11 -lX11 -L/usr/lib/X11 -lXinerama -lXft -lfontconfig
    CC = cc
    CC dwm.c
    In file included from dwm.c:336:0:
    config.h:52:2: warning: initialization makes integer from pointer without a cast
    { "", tile }, /* first entry is default */
    ^
    config.h:52:2: warning: (near initialization for ‘layouts[0].addgaps’)
    config.h:52:2: error: initializer element is not computable at load time
    config.h:52:2: error: (near initialization for ‘layouts[0].addgaps’)
    config.h:53:2: warning: initialization makes integer from pointer without a cast
    { "", NULL }, /* no layout function means floating behavior */
    ^
    config.h:53:2: warning: (near initialization for ‘layouts[1].addgaps’)
    config.h:54:2: warning: initialization makes integer from pointer without a cast
    { "", monocle },
    ^
    config.h:54:2: warning: (near initialization for ‘layouts[2].addgaps’)
    config.h:54:2: error: initializer element is not computable at load time
    config.h:54:2: error: (near initialization for ‘layouts[2].addgaps’)
    config.h:55:2: warning: initialization makes integer from pointer without a cast
    { "", spiral },
    ^
    config.h:55:2: warning: (near initialization for ‘layouts[3].addgaps’)
    config.h:55:2: error: initializer element is not computable at load time
    config.h:55:2: error: (near initialization for ‘layouts[3].addgaps’)
    config.h:56:2: warning: initialization makes integer from pointer without a cast
    { "", dwindle },
    ^
    config.h:56:2: warning: (near initialization for ‘layouts[4].addgaps’)
    config.h:56:2: error: initializer element is not computable at load time
    config.h:56:2: error: (near initialization for ‘layouts[4].addgaps’)
    config.h:57:2: warning: initialization makes integer from pointer without a cast
    { "", bstack },
    ^
    config.h:57:2: warning: (near initialization for ‘layouts[5].addgaps’)
    config.h:57:2: error: initializer element is not computable at load time
    config.h:57:2: error: (near initialization for ‘layouts[5].addgaps’)
    In file included from dwm.c:336:0:
    config.h:75:1: warning: initialization from incompatible pointer type
    static const char *scratchpadcmd[] = { termcmd, "-title", scratchpadname, "-geometry", "160x40", NULL };
    ^
    config.h:75:1: warning: (near initialization for ‘scratchpadcmd[0]’)
    Makefile:18: recipe for target 'dwm.o' failed
    make: *** [dwm.o] Error 1
    ==> ERROR: A failure occurred in build().
    Aborting...
    And here are dwm.c and config.h I want this to work with:
    https://raw.githubusercontent.com/paraz … ster/dwm.c
    https://raw.githubusercontent.com/paraz … r/config.h
    Any ideas on making this work?
    Last edited by parazyd (2015-02-19 06:01:15)

    jasonwryan wrote:
    The scratchpad error is pretty evident from your config.h; the others look like the uselessgaps patch needs updating...
    This, however, isn't a support thread as such.
    It's the uselessgaps I'm trying to fix. Do I just open a new thread?

Maybe you are looking for