Organizing compilations

This is my first post here so hi.
Btw, i tried to search for this but i couldn't get a good answer.
I've got a problem with iTunes 7.1.3., and a compilation album.
I've got my iTunes sorting on Albumartist. That's ok, the complete album (consisting of different artists) is shown as one album. But the problem is, it sorts the songs within the album on Artist, instead of Tracknumber.
Here's an example of what i mean; http://img256.imageshack.us/my.php?image=afbeelding1vk9.png
I also got the Compilation box checked.
Any idea how to get this working good?

Messing with it, it seems to be kind of messed up.
When sorting on Album Artist, it seems to sort on Album artist, then Artist, then Track number.
When sorting a regular album by one artist, the track numbers are in the correct order. It's only when there are different artists for the songs.

Similar Messages

  • Compilations and organizing files--suggestions

    Because of an issue I was having with music disappearing (see these posts if interested):
    http://discussions.info.apple.com/webx?128@@.68b7d52c
    http://discussions.info.apple.com/webx?128@@.68b45f4b
    I went ahead and followed the advice of others and unchecked the "Keep iTunes Music folder organized" to see if it would solve my problem. So for the last week or so things seem to be fine. Nothing magically disappearing. However, now I'm noticing that albums I want to keep as Compilations don't stay organized in my folder on my hard drive. It takes the songs and puts them in the separate artists folders. They show up as compilations in iTunes, which is good, and they stay filed under the appropriate album names, but I'm a bit anal and would like them to stay together on my hard drive as well. Any suggestions as to how to do this? The only thing I can think of is that when I'm importing a cd with multiple artists I make sure that the "Keep organized" is on and then turn it off?
    Also, some others have posted that it's wise to uncheck the "Copy files to iTunes music folder..." What's the reason for doing this other than controlling duplicate files? And if you do uncheck that do you have to manually put those new imports into the iTunes music folder?
    Any help is appreciated! Thanks!

    Given that you can read these files with notepad, I would think you could use Get-Content.
    Something like this may work:
    $Path = "\\Path\To\Directory"
    $12linepath = "\\Path\To\12lineDirectory"
    $4linepath = "\\Path\To\4lineDirectory"
    $nomatchpath = "\\Path\To\NoMatchDirectory"
    $files = Get-ChildItem -Path $Path -Filter *.phy | Select -ExpandProperty FullName
    ForEach ($file in $files)
    $linecount = (Get-Content $file).count
    If($linecount -eq 12)
    Move-Item -Path $file -Destination $12linepath
    If($linecount -eq 4)
    Move-Item -Path $file -Destination $4linepath
    else
    Move-Item -Path $file -Destination $nomatchpath

  • Compilations on Ipod, organizing issue

    I have a 30gb video, 5th gen ipod.
    When I scroll through the artist category, each artist from every soundtrack/compilation I have is listed individually. This is annoying, as I only have one song by many of these artists and don't listen to them individually, outside of the compilation. It just adds to the names I have to scroll past.
    In my itunes, I have these albums checked as "compilations" and have "various artists" filled in under "album artist". The library on my computer no longer has every single artist in individual folders for these; now they all fall under a "compilations" folder. In itunes, they all come under "various artists". This makes it easier for me to find the songs together, and doesn't end up listing them all as individual artists when I sort by artist.
    Is my ipod just incapable of making this distinction that itunes does when searching through "artists"? Or am I still missing a setting in itunes to make it sort the way I want?

    Make sure you have Compilations set up on the iPod as well, it takes more than marking the album as a compilation in iTunes. Scroll to Settings on your iPod and click the centre button. Scroll down the list to Compilations and make sure it is on (pressing the centre button toggles it on and off). Scroll back up to Main Menu and press the centre button again. Scroll down this list and press the centre button to add Compilations to the main menu. Press Menu a couple of times to return to the main display.

  • 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)

  • How do I get albums out of "compilations'?  On one of my machined I can go to individual songs, "get info" and uncheck "part of a compilation", but that does not work on my office machine.  I would also like to be able to do this in  a group for an album,

    I don't know how so much of my music got lost by being labled "compilations"?  I would like to go back and catagorize it as it should be but the screens are gray and will not let me alter them as to the catagory I wish them to be in (or even the genere they are already labled?  On my home machine I can (by individual song) "get info and uncheck "part of a compilation" and when this is finished the album goes to the genere as it is listed?  Frustrating bit of hous keeping.  Help and Thanks  Chuck

    The Get Info. fields show up gray if the files is locked and iTunes knows it can't edit the file. Make sure the files are not marked as read only and, if necessary grant both your account and system full access to all files and subfolders of your media folder.
    You can set Part of a Compilation for multiple tracks from the Options tab of Get Info.
    See Grouping tracks into albums for tips on getting iTunes organized.
    tt2

  • Disappointed with IOS7, i had organized my music library as per the Genre and now im unable to hear all the songs of the same genre like in the earlier versions. The options of "all albums" and "all songs" are missing in this version of IOS. Help Please..

    Disappointed with IOS7, i had organized my music library as per the Genre and now im unable to hear all the songs of the same genre like in the earlier versions. The options of "all albums" and "all songs" are missing in this version of IOS. Help Please..

    It would be nice if you told others the steps you've tried and/or how you used to have your setup.
    Anyway have you tried tapping MORE this will then bring you to
    the selection-list of Audiobooks, Genres, Compilations & Composers.
    Selecting Genres gives you a list of all your music split into genres which was set within the Music downloaded via iTunes or uploaded from CD or which you may have set yourself.
    Then you just select the Genre you want:
    If certent songs are not correctly gategorised you may need to go into iTunes and reselect via Get-info
    >Info>Genre and change it there. That way you should end up with all songs of Jazz or other in 1 place.

  • Can I run the "Keep iTunes organized" script on a folder-by-folder basis?

    Hi there,
    I luckily stopped the operation before it completed, so it didn't take too long to re-compile my music folder the way I had it. Right now, I have folders with each artist that has >7 songs in my library (I used to use a PC and this is how I organized it). There was a Various Folder and genre folders, like Jazz that made my music easy to navigate for me. Not all my music is labeled correctly, so the "keep iTunes organized" feature started creating random folders, and even duplicating artist folders.
    So while I wouldn't mind my music organized, I still want to retain my folder structure. Is there any way to run the organize tool on a folder by folder basis and clean my library up from there? Or are there any tools available that actually scan a song until a literal audio match is found in some database?
    Even then, sometimes one might run into the issue with iTunes making artists like:
    Ella Fitzgerald & Charlie Parker
    rather than simply Ella Fitzgerald.
    I'm new, and trying to figure out an optimal way to consolidate my music in a way that is easy to traverse, doesn't make multiple folders for the same artist, etc.
    Ideally, regardless of whether if it's Greatest Hits Elvis or from a soundtrack, I'd love if iTunes would "organize" and create folders for artist names, whoever made the song, period. For my "genre" folders, I'd love to simply scan those folders individually and manually manage them.
    Is this possible? If so, what is an optimal solution?
    Thanks (in advance) so much for your advice!
    ~ dizzythejazzman

    Hi there,
    I luckily stopped the operation before it completed, so it didn't take too long to re-compile my music folder the way I had it. Right now, I have folders with each artist that has >7 songs in my library (I used to use a PC and this is how I organized it). There was a Various Folder and genre folders, like Jazz that made my music easy to navigate for me. Not all my music is labeled correctly, so the "keep iTunes organized" feature started creating random folders, and even duplicating artist folders.
    So while I wouldn't mind my music organized, I still want to retain my folder structure. Is there any way to run the organize tool on a folder by folder basis and clean my library up from there? Or are there any tools available that actually scan a song until a literal audio match is found in some database?
    Even then, sometimes one might run into the issue with iTunes making artists like:
    Ella Fitzgerald & Charlie Parker
    rather than simply Ella Fitzgerald.
    I'm new, and trying to figure out an optimal way to consolidate my music in a way that is easy to traverse, doesn't make multiple folders for the same artist, etc.
    Ideally, regardless of whether if it's Greatest Hits Elvis or from a soundtrack, I'd love if iTunes would "organize" and create folders for artist names, whoever made the song, period. For my "genre" folders, I'd love to simply scan those folders individually and manually manage them.
    Is this possible? If so, what is an optimal solution?
    Thanks (in advance) so much for your advice!
    ~ dizzythejazzman

  • Music app shows unknown artist for compilation albums

    I just submitted a bug report to Apple, though I can't believe I am the only person with this issue.
    Since iOS7 (I am currently on iOS7.0.4) I have noticed that the music app (along with many many other issues) will no longer display the artist for compilation albums that I have.  In iTunes the artist on the compilation is clearly defined but in iOS7 the Music app simply states "unknown artist".
    Surely I am not the only one with this issue?

    I am very annoyed by this bug too, I have  a lot of compilation albums and soundtracks with lots of differents artists, and my library is super organized in iTunes, with the “Album artist” field empty and the “Part of a compilation” checkbox enabled, and it shows the compilations as a “Various Artists” album.
    But when I tried to download through iTunes Match in my iPhone 5C some few songs from those albums today, I found out that the music app has this bug that makes almost all of the compilation albums appear within this “UNKNOWN ARTIST” category under the artists tab.
    It is very annoying and I hope Apple fixes this, cuz it is driving me crazy.

  • Organizing class files (in the filesystem)

    Hi, I'm new to Java and the JDC. I have run into one issue, in my explorations in Java, and that is organizing the class files and source code files. I understand that I can organize them in any way that I like, but I was curious if there is a standard system that other Java developers use (like the /usr/local convention on Unix).
    Should I create a /usr/local/java directory and then store class and source files in subdirectories of that? And then add the class directory to the CLASSPATH? How about downloaded source code that I didn't write -- that seems like it would then go in yet another directory.
    So far I've got everything stored in ~/dev/java (a directory I created for this purpose), but it seems like it's bound to get unmanageable if I don't order it better. And I'm just curious what others with more experience do.
    Thanks!
    Erik

    Anyway, back to why. If as you mentioned you keep all of your class files off a given root folder, then you can add that folder root to the classpath.
    Okay, I have the domain "erikprice.com". So then I would create a hierarchy like this (?) :
    - ~
      - dev
        - Java
          - com
            - erikprice
              - packageA
              - packageB
              - packageC
                 ...etc...And then, if I add ~/dev/Java/com to my CLASSPATH, all of the classes in the various packages below that will be accessible to the compiler? Or do I have to explicitly put ~/dev/Java/com/erikprice into the classpath?
    Also, if I have downloaded someone else's source code (such as a Jakarta project or something), it seems like I should put its root folder in with my personal root folder. In other words, like this:
    - ~
      - dev
        - Java
          - com
            - erikprice
          - org
            - apache
              - xml
                - xerces
                  - packageA
                  - packageB
                - xalan
                  - packageA
                  - packageB
                  ...etc...Does this seem right? If I understand correctly, I will have to add the org directory to the CLASSPATH too. Can I save all of this trouble by putting just ~/dev/Java into the CLASSPATH so that all of the packages below (com/erikprice/*, org/apache/xml/*, org/someotherproject/*) are available?
    The trick of this is that I'm trying to organize both my own Java files as well as those that I've downloaded to study from. Thanks for your input, MLangstaff.

  • IPod versus iTunes, organizing music

    I spent 2 hours last night organizing my music that had featuring artists so it would show up under the album it belongs to, versus being its own separate "album"... so I assumed that if iTunes was perfectly organized and the music is listed as it should be, that it would translate to my iPod... NOPE! How is that possible? How do you get your albums, no matter how many contributing artists, in one place on your iPod, when it's already like that in iTunes?
    I have no clue what to do, and it is soooo frustrating!

    If this is a Compilation album, one with varying artists in the Artist field for different songs on the same album, you need to do the following:
    1- Select all songs on the album and go to Get Info.
    2- Enter the same +Album Artist+ for each song. If there is no common artist among the songs, use something like "Various Artists".
    3- Go to the Options tab and change "Part of a Compilation" to Yes.
    4- Make sure that the total number of disks is the same for all songs.
    5- Re-sync your iPod.
    Also, in iTunes you can sort your library as "+Album by Artist+", which will group compilations together according to what you've used for +Album Artist+.

  • Future Things We Want Rim To Fix On The Playbook (Organized)

    Well I cannot believe I just did this. I just went through the entire thread “Future Things we Want Rim to Fix On The Blackberry Playbook” (Found Here) yes all 16 pages. I made a list of all the features everyone requested in particular the more important ones / commonly requested and organized it in hopes RIM and PB developers and the like will come across this, and be able to quickly sift through what its users want. I will attempt to keep this updated as updates are released to solve these issues. Any suggestions feel free and I will edit the post. Please don’t spam this thread, let’s try to keep this thread organized. Remember this is for FEATURES. APPLICATION requests belong in the application request thread (Found Here).
    These are not listed in any sort of importance, it’s just the list I compiled as I was sifting through the forum.
    BlackBerry App World
             Sort Applications by New, Popular, Most download, Highest Rated etc.
              Sort Downloaded applications by Size, Name, Personal rating etc.
    BlackBerry OS
            Cursor, it needs to be a lot simpler to move the cursor to edit a few letters/words currently the steps required are far too cumbersome. Many suggested arrow keys.
            File Manager, pretty straight forward
             Auto-correct, word anticipation, auto-capitalize, Spelling-suggestion, add to dictionary (Basically what our             BlackBerry Phone can already do)
             Pictures in Portrait Mode
             Wi-Fi Music Sync, similar to current BlackBerry Phones
             File Extension Support throughout OS that includes emails (.zip .rar .htm .html .wav) Streaming extensions such as .pls and .mp3 in email attachments
             Open Multiple Documents (Doc To Go, ppt to go, spreadsheet to go)
             Ability to quickly change font color, size, type, and various formatting of words (Double tap brings up a little window with few simple options)
             No backlight/stand-by option when plugged in
             Save E-mail to playbook for future edit (This might not be so important once a native client is on the PB)
             Support for File Folders within Email (Again, native email client might fix this)
             Adobe Acrobat Reader enhancement/bring up to par (PDF Search, Highlighting, bookmarks, click links)
             Open PDF in browser or support to auto-open PDF once downloaded (Should be an option to turn on/off)
             While viewing a picture/video in Pictures or Video App have the ability to send via email
             Ability to create custom folders for applications / home-screen icons
             Better Bluetooth support (headsets, cars)
             Recognition of an Email Address or Phone Number or Street Address in an Email/Browser/Application, if BB Phone is bridged then option to place call or launch email or maps should be available
             Search Text in Doc to Go (Ctrl + F like feature)
             Wireless Printing
             Ability to delete stock applications
             If GPS isn’t working and Phone is bridged it should make use of Phone GPS
             More Camera Options (timer, lighting modes, exposure settings etc.)
             Advanced Multi-Task options – Have two applications open side by side using gestures
             Gesture to put to sleep/unlock (2 Hand finger swipe from top-to-bottom) [I personally don’t mind the power button this is just what people mentioned] 
    Keyboard
             Smart space bar similar to Blackberry Phones (Eg. Space in URL inputs a ‘.’ Or in an email it inputs the @)
             Hold letter to capitalize
             123/sym key locking after use, Most people only use one symbol at a time. Therefore, after clicking that symbol the keyboard should switch back to letters. (This should be an option to turn off/on)
             Arrow Key (Mentioned above, not sure how it would work, but if applied correctly it might be better than some form of cursor)
    BlackBerry Browser
             Change browser ID for websites that specify Internet Explorer etc.
             Organize bookmarks – change order, rename etc.
             Search text in browser (Ctrl +F like feature)
             Save passwords in browser
             Flash on demand (option to press to play flash)
             New Option in settings – Default Links Open in new tab
             Ability to have multiple browser running (It is a Multi-Task power horse)
    BlackBerry Bridge
    Support photo, audio and videos of files on BB Phones
    fb, twitter and other social apps should be able to push notifications into playbook and be viewed there as well.
    sms can be viewed and edited just like BBM messages

    **bleep** that deletes the purpose of this thread . I was hoping to keep it updated... I hate when forums don't let you edit.

  • I am getting this error when compiling project.

    I created a project from an existing source files. I then wanted to compile my entire project. When I do that, I am getting the following errors on all my .jsp files. Does anyone know what this mean or how to stop this. Thanks.
    Error: JSP files must reside in the server root directory or a subdirectory beneath it

    Thaks for posting replying. I like to understand why you need to have it under a perticular directory. We have our project organized as follow.
    Project
    |
    |- src
    |--- java
    |------ com
    |--------- abc
    |--- web
    |--- xml
    |--- conf
    |--- db
    |--- other ...
    And we have the .jsp files all under web directory. We are currently using another IDEA and I would like to give JDeveloper a try. So, I checked out my project from CVS into a temp directory and playing with jdeveloper. Do I have to re-arrange all my directory structure to make it work with jdeveloper?

  • ITunes organizing music does not work and deletes my files

    When I have checked box nex to where it said something like : keed folder organized, scince i have so much music, it decided to move my music into compilations folder it had created by itself. After wards i was moving files from compilations folder to artist music belonged to. Little while later it decided to move all my music to the trash. And scince trash doesn't hold everything, it deleted 95% of my music. iTunes decides also to create and decide where to put music by itself, moves half to under artist name half somewhere else. Just to let apple people know, next time I'll get an mp3 player, but rather go with Zune or something, so I wouldn't have to use iTunes

    Place the iOS device in Recovery Mode and then connect to your computer and restore via iTunes. The iPod will be erased.
    iOS: Wrong passcode results in red disabled screen                          
    If recovery mode does not work try DFU mode.                         
    How to put iPod touch / iPhone into DFU mode « Karthik's scribblings         
    For how to restore:
    iTunes: Restoring iOS software
    To restore from backup see:
    iOS: How to back up      
    If you restore from iCloud backup the apps will be automatically downloaded. If you restore from iTunes backup the apps and music have to be in the iTunes library since synced media like apps and music are not included in the backup of the iOS device that iTunes makes.
    You can redownload iTunes purchases by:
    Downloading past purchases from the App Store, iBookstore, and iTunes Store         

  • Organizing Music. on my iPod

    On my computer I have all my music in Folders & SubFolders:
    Artist
    -Album 1964
    -Album 1965
    -Album 1966
    After I go into the Folder(Artist) I can then go into any SubFolder(Album).
    Sounds simple enough and works really well on my computer.
    When I load this same File Structure onto my 80GB Video iPod(Manual/using the iPod as a HardDrive-No Syncing w/iTunes) this File Structure is ignored. All of a sudden I have some Folders that are without the parent Artist Folder.
    Also... sometimes they tend to break apart and look like:
    Artist
    Artist w/Artist 2
    Artist feat/Artist3
    Artist w/Artist 2 feat/Artist 3
    I imagine that it has to do with the iPod trying to organize my files by using the ID tags of the files.
    I do realize that I can choose to sort by Artist, Album, Genre, etc. I usually look for music based on the Artist. From there I then open the Album. Rarely do I ever Sort/Search using any of the other options.
    I prefer my Folder/SubFolder Structure. I like my Music to stay organized the way I organize it. I do Not like for them to be automatically organized by my iPod.
    How can I have my iPod display my Files/Music the way I load them onto it and stop reorganizing my shizzle?

    The breaking apart thing with featured artists can be fixed by turning on compilations option.
    This didn't work just by turning ON this option. Maybe I have to turn ON this option, then load my iPod?
    How are you getting these files onto the iPod?
    I am using the iPod like a HardDrive. (so I can connect to the many PC's & Mac's I use without Syncing to any of them)
    I am Dragging & Dropping the files/folders from my Computer to my iPod in MAUNUAL Mode.
    I have also tried XPlay by MediaFour.
    On my computer they are organized by ARTIST then ALBUM.
    It really gets screwy when the ARTIST does a song with another ARTIST.
    - I want my music to stay the way I have it organized on my computer... regardless of the ID3 tags. <-- Is this possible?

  • Organizing Music in iTunes 7.6.1.9

    OK, this may be a simple issue, but it is driving me bonkers. Any help would be appreciated!
    I like to have my music organized by Album in my iTunes window. In the older versions, when you sorted by the Album column, it would then sub-sort by track number. For whatever reason, my music now sub-sorts alphabetically by Artist name. Most of the tim, that's ok on 'normal' albums. I have a lot of compilations however, so this throws the track listing well out of order.
    How can I get my music sorted by album and then by track number?
    Thanks in advance!

    I can see what is going on, this is a multi artist album and when you sort by album, you get Album>Artist>Track number.
    Try filling in The album artist field. You can select all the tracks in the album together, then right click get info.
    This lets you change the album artist field in all the tracks at once. You need to have the same album artist for all the tracks, the field is not normally displayed unless you choose to select the column for display. I am not sure if it is necessary to flag the album as a compilation as well - you can do this in the multi - Get info window as well.

Maybe you are looking for