Netsupport

hi
how do i use net support software in windows ? because my macbook pro retina haven't LAN port!!
thank you

then use a USB or Thunderbolt to Ethernet adapter.
What did NetSupport say when you contacted them for support?

Similar Messages

  • Could not start NetSupport Manager Client For MacOS X because the lice

    Could not start NetSupport Manager Client For MacOS X because the licence expired
    "Could not start NetSupport Manager Client For MacOS X because the license file has expired."
    I have a suspicion the above is a result of an old version of a program from a previous version of MACOS having been migrated, even from a PPC machine (PB17 to be exact).
    My issue is how to fix it. What is the exact programme in error? What do i delete?
    I have even upgraded to Leopard and the problem migrates to that(!) So clearly I have to manually sort this out. But how?
    Many thanks
    Anthony
    reposted original 19/nov/2007 unanswered

    NetSupport Manager's web site would appear to be here (found via a quick web search):
    http://www.netsupportmanager.com/
    They should be able to tell you how to install their product, if the download doesn't contain an uninstaller (I'm not going to register with them just to find out).
    Regards

  • Could not start NetSupport Manager Client For MacOS X because the license e

    "Could not start NetSupport Manager Client For MacOS X because the license file has expired."
    I have a suspicion the above is a result of an old version of a program from a previous version of MACOS having been migrated, even from a PPC machine (PB17 to be exact).
    My issue is how to fix it. What is the exact programme in error? What do i delete?
    I have even upgraded to Leopard and the problem migrates to that(!) So clearly I have to manually sort this out. But how?
    Many thanks
    Anthony

    NetSupport Manager's web site would appear to be here (found via a quick web search):
    http://www.netsupportmanager.com/
    They should be able to tell you how to install their product, if the download doesn't contain an uninstaller (I'm not going to register with them just to find out).
    Regards

  • Has anyone worked with NetSupport and Labview together?

    Hello,
    I am looking for some info on NetSupport (remote desktop software) and LabVIEW together, we run a monitoring station using NetSupport to log into different locations and I have built programs for analyzing data after it has been transfered from the NetSupport login but was looking for some capabilities to integrate some functionality between the two programs, maybe even view the NetSupport login sessions via LabVIEW. is this possilbe and is it a good/bad idea.
    thanks

    Hi Jordan,
    Actually I am trying to connect to a remote server to view and possibly transfer files similar to a remote desktop connection. Ideally I would have a program that would open .csv files and analyze the data, we have been using NetSupport to connect and then doing a file transfer then running an application (labview) to open the file and analyze, however It would be nice to do this without having to connect and then transfer the files and then running the app. Can I build an app that will be able to connect to remote servers and open the files? does this make sense or am I rambling\repeating myself
    Thanks in advance

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

  • System error in opening a query

    hi guys,
    this is the error i'm getting when opening this query which i need for my CR
    Abort System error in program in SAPLRR12 and form cell_fuellen_acell-01
    Diagnosis:
    This internal error is a targeted termination since the program has an
    incorrect status.
    what is needed to be done here
    Your help will be rightly appreciated
    Thanks

    Hi Vj,
    Please check the SAP notes as below, which seems to be relevant for your issue.
    Assign points it useful.....
    Symptom
    There are errors in Business Explorer components such as Analyzer, Browser, Form Reporting, Web Application Designer, Query Designer, Map, OLE DB for OLAP Provider
    Solution General information
    This note contains information about BW 3.0A front end patch 3. Here, you will find the most important information on:
    Installation
    Error corrections
    New features
    Additional general information that is not specifically for this BW front end patch.
    Procedure
    Downloading BW front end patches via FTP from sapserv
    Downloading a BW front end patch via Online Correction Support (SAPnet)
    Preparing the Installation Server
    Checking the Installation Server
    Installation on PC
    Checking the PC
    Problems during the installation of the BW front end Patch
    Distributing a patch per script (for administrators only)
    Installation
    During the installation of the BW front end patch, note the following:
    (This area is constantly updated)
    The BW 3.0A front end patch 3 is based on the SAP GUI 6.10 Presentation CD 1 (6.10 Final Compilation 3, material number 50051811) and the SAP GUI 6.10 patch 12 or higher.
    The BW 3.0A front end patch 3 contains all files, to convert a BW 2.0B/2.1C front end into a BW 3.0A front end.
    The BW 3.0A front end is downward-compatible to BW 2.0B/2.C.Thus, it can also be used on BW 2.0B/2.1C backend systems.
    When you use the Web Application Designer, implement at least BW 3.0A Support Package 03 (see note 425995).
    Error corrections
    This BW front end patch corrects the following errors in particular:
    in SAP Business Explorer Analyzer
    Displaying document links on filter cells and text elements
    Improved performance for low-speed connections (WAN)
    Bug:Incorrect language when starting documents in the Web browser (refer to note 450200)
    Bug:Import of missing styles does not import the color palette anymore (refer to note 450194)
    Bug:Various problems during the server logon as of Release 2.0 (incorrect list of Goto destinations, incorrectly indented hierarchy symbols...)
    Bug: Starting jump destinations in the Web does not work
    in BEx Query Designer
    The system does not correctly interpret characteristics that were selected as being unique in each cell and when it checks these characteristics, it mistakenly reports them as being defined non-uniquely.
    After you called the cell editor, you had to press the toolbar buttons twice to call the required function.
    In the cell editor, you could change the formula cells but not the formulas of the columns or of the rows because the system displayed all references to other columns or rows as 25 digit numbers.
    When you use Save as ... for queries with formula cells, these cells are not copied.
    When you used the Save as ... function for queries with cells, the copied query sometimes displayed the message "Brain 299 SAPLRRI2 Form CELL_FUELLEN_ACELL-01-" when it was executed.
    When you used the Save as ... function for queries with formula cells, these cells were not copied.
    in Variable Editor
    Formula variables that were replaced with the "To" value in intervals, were displayed without the "To" selection when you changed them.
    in SAP Business Explorer Browser
    Drag&Drop of Japanese file names on Japanese WinNT computers is now supported
    Temporary files are automatically deleted when the BEx Browser is exited
    New features
    New features delivered with this BW front end patch:
    SAP Business Explorer Analyzer
    Delete function in dialog "Open -> Views"
    Displaying documents for text elements and filter values
    Now the BW front end is installed in a separate program folder in the start menu. The folder is called 'Business Explorer'.The setup only allows you to change the name of the folder of the SAP front end.
    Procedure
    1. Downloading the BW front end patch via FTP or SAPnet
    2. Preparing and checking the installation server
    3. Installing and checking on the PC
    Note that you cannot install a BW front end patch directly on a PC (also see the 'Distribution of a patch by script' section).
    The check of every step with SAPBEXC.XLA avoids unnecessary subsequent problems.
    Downloading BW front end patches via FTP from sapserv
    Downloading patches from the sapserv is described in note 96885, "Downloading a front end patch from SAPSERVx".
    The BW 3.0A front end patches and the SAP GUI 6.10 patches are in the directory
       sapservX/general/frontend/patches/rel610/Windows/Win32
    The file name of the BW front end patch is
       BW30A_n.EXE (where 'n' is the number of the BW front end patch)
    The file name of the SAP GUI patch is
       GUI610_n.EXE (where 'n' is the number of the SAP GUI patch)
    In general, you can use the highest existing SAP GUI patch.The above-mentioned number of the SAP GUI patch is the minimum requirement.
    Downloading a BW front end patch via Online Correction Support (SAPnet)
    You can also download BW front end patches in the SAPnet.The URL for the SAP Online Correction Support is:
       http://service.sap.com/swcenter-main
    After you select SAP BW/SAP BW 3.0A/Binary Patches/SAP GUI for Windows 6.10/Win32 in the tree on the right side, the SAP Download Area appears on the left side.
    Here you can select BW30A.EXE and, if necessary, GUI610.EXE for downloading.
    In general, you can use the highest existing SAP GUI patch.The above-mentioned number of the SAP GUI patch is the minimum requirement.
    Preparing the Installation Server
    The installation of patches on the installation server is described in note 361222. Follow the instructions in this note.
    A BW front end patch contains all files from the previous patches, so that you only need to install the latest patch.
    Checking the Installation Server
    Note 197460, "BW front end Checktool sapbexc.xla", describes how easily and quickly you can check the installation server.
    Installation on PC
    The BW front end patch is installed by executing the SAP GUI setup.In the setup, you must select the BW add-ons component to install the BW front end.
    See also the section distribution of a patch per script.
    Checking the PC
    Note 197460, "BW front end Checktool sapbexc.xla", describes how simple and fast the local installation checks a PC
    The local execution of SAPBEXC.XLA is necessary if you sent problems to the SAP Support (see note 142705).The status of a PC can be checked with the result of SAPBEXC.XLA.
    Problems during the installation of the BW front end patch
    If problems occur during the installation of the BW front end patches, you should install the BW front end patch again and use the following method for this:
    First, remove the BW front end with "Remove" menu option under "SAP front end" from your local PC.
    Afterwards you can install the front end programs again with the setup program of your setup server.The setup program has been delivered with the front end CD.You must have administrator rights on the local PC.During the setup, no other programs (for example, Excel) should run.
    Certain programs save information on OLE components in special files.These files are not updated automatically during a new installation, therefore, when you change the OLE component during the installation, old information may remain in the system.We recommend you delete all files with the extensions ".EXD" and ".OCA" before you carry out the new installation.
    Distributing a patch per script (for administrators only)
    There is a large number of products for the distribution of software (for example, Microsoft SMS, IBM Tivoli, NetSupport NetInstall), so that no individual Support is possible when you use SAP and BW.There are two general notes about the front end installation (153341 and 194859), to which the system also refers.
    The following remarks are intended for administrators who want to distribute a BW front end patch with such a software.
    A BW front end patch consists of several files in different directories. These directories correspond to the directories on the installation server or on the CD.The files are usually distributed into the following directories on the local PC:
    c:\program files\common files\sap\system
    c:\program files\sappc
    c:\winnt\system32 or c:\windows\system
    In the sapbexc.xla file on the "Version" tab, there are notes about where the file must be copied to and whether it must be registered.
    For the preparation of a script, first you should make a normal installation on a local PC from the installation server which must be checked with sapbexc.xla (see note 197460).Afterwards you can localize the corresponding directory of a file using this PC.In general, each DLL and each OCX must be registered if it can be registered.After the installation per script, a deinstallation may no longer work, therefore, before registering a file with regsvr32.exe <Path\File>, you should execute the script for an unregistration with regsvr32.exe /U <path\file>.
    Currently, the sapbexc.xla checktool may not be able to recognize certain installation errors (copy without registrations) (see note 206609).
    SAP offers support for problems with incorrect scripts for distributing patches.
    Best Regards,
    DMK
    Assign Points if it helps....

  • Win 2000 doesn't show netware printers

    I installed:
    A single Novell 5.0 Server with sp6a
    A Win 2000 PC with Novell client 4.92sp2 IP and IPX
    with some standard software as MS Office 2000, Adobe Acrobat Reader,
    Norman Antivirus, Java 1.5 and son more.
    Using the Windows printer wizard I choose "network printers"
    and "search for" printers. Windows shows only "Microsoft windows
    Printers" but no Novell Network and no Novell printer / queue.
    Using Network Neighborhood and going to NDS with the Printer icon Windows
    tells me, that I have to install this printer. Then it says, the printer
    coulnt be installed or isn't valid.
    From my WinXP prof. Notebook I have no problem to acces the Novell Printer.
    What's wrong?

    The problem is solved.
    A software called "NET SUPPORT SCHOLL 7.01" from PCI - Software hooks a
    part of the printer services. A senseless (!!!) DLL causes the problem.
    See the email following (from PCI) for a workaround. I had to restart the
    PC to for the changes to take effect.
    Thanks for your help!
    dear H. Wybranietz
    Thank you for contacting NetSupport Technical concerning Printing Issue on
    Novell via NetSupport School 7.01. This is not a problem usually found in
    NetSupport School and is usually only reported regarding NetSupport
    Manager, which includes a Print Capture feature.
    The problem you are experiencing relates to NetSupport attempting to Hook
    into the Print Driver in order to do this at start up we have to restart
    the Print Spooler service at startup. After reading through your problem it
    looks like the spooler service is not restarting.
    Therefore, could you please remove the INJLIB.DLL file from the machine -
    this will not cause any problems and will stop NetSupport from hooking into
    the Printer driver. Which means you will not have to keep restarting the
    Print Spooler service.
    The file INJLIB.dll is a NSM file but is included in NSS, removing this
    file from the system will not remove any functionality from NSS. Please
    follow the steps below:
    1) Go into C:\Program Files\NetSupport School
    2) Find a file called injlib.dll
    3) Rename this file to injlib.old
    4) Restart the Print Spooler service
    5) Restart the Client32 service
    > Sounds like something was not right with the client install here -- one
    > thing I'd do with the client install in any event, unless you are using
    > the NetWare server to connect to the internet or the server only has
    > TCPIP on it, you might well configure the client for custom install,
    > IPX only, and then deselect the additional pieces that you can use with
    > the client (ie you just want an NDS login).
    >
    >
    >
    > --
    > Barry Schnur
    > Novell Support Connection Volunteer Sysop

  • Disable the Remote Management Service?

    I know this is "Why would anyone want to do this" question but we are having conflicting issues in one of our labs between NetSupport and Zenworks when trying to run Adobe Flash. NetSupport is a tool that quite a few of our lab teachers use, it gives them the ability to see all of there students screens, take control of them, and a few other features, all from a console that runs on the teacher machine.
    The problem comes in when running Flash if the student tries to create a text box and scroll inside of it then the computer crashes. We contacted NetSupport for help with this and they had us run a reporting tool that looked at the hardware setup and driver information. Then they setup a test machine and tried to replicate the problem and they were not able to. However they tech did note that in the scan of the machine there could be a conflicting issue between NetSupports Mirror Driver and DemoForge TightVNC Mirror Driver. I assumed the latter was part of Zenworks remote management. So we stopped the remote management service on a machine and tried to replicate the problem. We did not encounter the problem so we turned the remote management service back on and sure enough as soon as we tried to replicate the problem again the machine crashed.
    Now when we tried to disable the remote management service in the services menu but it will not stay disable as soon as the machine restarts the remote management service is running and its set to automatic again.
    Is there anyway to disable (preferable) or remove just the remote management piece with out removing the rest of the client from the machines?
    Thanks,
    Mike

    You can configure this in the ZCC for which components you want
    installed. You can deselect Remote Management.
    Note: You can also disable or remove the Mirror Driver from the Devices
    Control Panel under Display Drivers and it will not come back.
    On 1/13/2012 2:36 PM, mshicks wrote:
    >
    > I know this is "Why would anyone want to do this" question but we are
    > having conflicting issues in one of our labs between NetSupport and
    > Zenworks when trying to run Adobe Flash. NetSupport is a tool that quite
    > a few of our lab teachers use, it gives them the ability to see all of
    > there students screens, take control of them, and a few other features,
    > all from a console that runs on the teacher machine.
    >
    > The problem comes in when running Flash if the student tries to create
    > a text box and scroll inside of it then the computer crashes. We
    > contacted NetSupport for help with this and they had us run a reporting
    > tool that looked at the hardware setup and driver information. Then they
    > setup a test machine and tried to replicate the problem and they were
    > not able to. However they tech did note that in the scan of the machine
    > there could be a conflicting issue between NetSupports Mirror Driver and
    > DemoForge TightVNC Mirror Driver. I assumed the latter was part of
    > Zenworks remote management. So we stopped the remote management service
    > on a machine and tried to replicate the problem. We did not encounter
    > the problem so we turned the remote management service back on and sure
    > enough as soon as we tried to replicate the problem again the machine
    > crashed.
    >
    > Now when we tried to disable the remote management service in the
    > services menu but it will not stay disable as soon as the machine
    > restarts the remote management service is running and its set to
    > automatic again.
    >
    > Is there anyway to disable (preferable) or remove just the remote
    > management piece with out removing the rest of the client from the
    > machines?
    >
    > Thanks,
    > Mike
    >
    >
    Craig Wilson - MCNE, MCSE, CCNA
    Novell Knowledge Partner
    Novell does not officially monitor these forums.
    Suggestions/Opinions/Statements made by me are solely my own.
    These thoughts may not be shared by either Novell or any rational human.

  • Take control of VPN Client

    Dear All,
    someone can tell me if is possible take control of the remote client connected by VPN, through application like Remote Desktop or NetSupport?
    We use a VPN Concentrator and one of our customer need to take control of the client-desktop that connected by VPN.
    Thanks in advance.
    Maurizio Pederneschi

    Upsolutely you can , we do it all the time with our Concentrator 3005, if we need to connect to an already connected pptp client to assist we rdp to their machine using that same tunnel. Now you need to keep in mind that in order to RDP to the clients machine while that tunnel is up between the concentrator and the user's machine you will need to use the same users login credentials whatever they use at their end in order to keep the tunnel up without interruption.
    I have not tried netsupport and do not know how Netsupport works but I would assume it should work as the netsuport traffic is sent through the tunnel.
    Rgds
    Jorge

Maybe you are looking for

  • Display Image In List Tile for creating Hyperlink

    Hi, I have a requirement in my project that I have to display Image in one of the column of the List tile for Hyperlink. I have created custom control for this but unable to show the image on the List tile, currently it showing the Path of the Image.

  • Recover data unbootable macbook pro hd onto external hd

    2013 macbook pro got stuck installing mavericks with the error saying that it couldnt install because disk is damaged. restarted in recovery mode and tried to repair from disk utility but after hitting verify disk and repair disk it says it cannot re

  • Cube in Oracle Olap 10g

    Hi, We are planning to make a migration of an Existing Cube to Oracle Olap 10g. Can anybody tell me the complete process to load a OLAP cube, Is it possible to load Cube data from a multi-dimensional variable ? or, if anyone has a previous experience

  • Short Dump - Please let me know if Any Note is available for this

    <unreadable text removed> Moderator message: please search for applicable notes yourself. Edited by: Thomas Zloch on Nov 24, 2011 12:14 PM

  • A query based report

    hi experts, i want to generate a query based report t for following PoNo     Item No     Qty     Vendor Chal No     Challan Date     Assesable Value     BED Value     SED Value     AED Val     ECS value     NCCD VAL     NCCD Rate     ECS Rate %     B