Float behavior confusion
I always thought that setting a float property resulted in non-floated objects acting as if the floated object was not there
however look at this code
<div style="width:100px; height:100px; background-color:#03C;"></div>
<div style="width:100px; height:100px; background-color:#F36;"></div>
<div style="width:100px; height:100px; background-color:#F36; float:left;"></div>
<div style="width:100px; height:100px; background-color:#F36; float:left;"></div>
some divs are floated some are not
if i place the non floated ones on top the floated ones appear bellow where they would if there was no floating at all.
but if i place the floated ones on top the non floated ones position themselves where the floated ones are as if the floated ones do not exist.
so why is it that floated/non floated elements ignore each other if the non-floated element comes first but not if its the other way arround
when applying clear which block do i apply it to?
if i apply it to the final block before the block which i intend to change the behavior of will it changhe the behavior of the block that i applied it to
if i apply it to the first block that should ignore the float then what happens if this block itself must also be floated in order to effect the behavior of blocks which come after it.
is there any reason why float/clear cannot be unused and simply use display:block and display:inline instead?
frankly the confusion caused by css float/clear, espcially when combined with different display properties really annoys me
Basic css, mysql and javascript did not cause me this sort of headache, basic AS3 did but only because i tried to run before i could walk.
css is far more basic than any of these technologies and yet it causes me more grief than any of them.
Similar Messages
-
Cursor selection behavior confusion...
If you place your cursor in some text you are composing and then hold the Shift key, you can press either the left or right arrows to select content in that direction one character at a time. This is normal and expected. In all other applications by Apple if you select a few characters to the right in this manner and then press the left arrow key, it deselects the farthest characters and moves your selection back to the point of origin; however, this is NOT the case in these new forums. Here if you select in one direction in this manner, and then press the opposite direction, then the selection expands in the new direction.
This behavior is a bit confusing...perhaps it could be addressed to be the way we've come to rely on selecting text in other Safari forms and OS X applications?I read your post in Firefox 4, posted text in a reply field to test, and did not see this behavior.
I opened your post in Chrome 10.0.648.205 and then in Chrome 12.0.725.0 dev, posted text in a reply field to test, and again did not see the behavior you describe.
I opened your post in Opera 11.10, posted text in a reply field to test, and did not see this behavior.
I opened your post in Safari 5.0.5 and did experience the behavior you describe.
The issue seems limited to Safari. -
IEEE-754-Standard floating point confusion
Hi there,
I am really confused. The datatype double should be in C++ and Java the same standard acc. to IEEE-754.
But when I try to investigate the several bytearrays created from a double value e.g. 1.1d, it is different in C and Java.
below are the results:
Value 1.1 in C++
intCsigned
bit0 bit1 bit2 bit3 bit4 bit5 bit6 bit7
byte0 1 1 0 0 1 1 0 1 -51
byte1 1 1 0 0 1 1 1 0 -52
byte2 1 0 0 0 1 1 0 0 -116
byte3 0 0 1 1 1 1 1 1 63
byte4 1 1 0 0 1 1 0 0 -52
byte5 1 1 0 0 1 1 0 0 -52
byte6 1 1 0 0 1 1 0 0 -52
byte7 1 1 0 0 1 1 0 0 -52
Value 1.1 in Java
intJava(signed)
byte0 0 0 1 1 1 1 1 1 63
byte1 1 1 1 1 0 0 0 1 -15
byte2 1 0 0 1 1 0 0 1 -103
byte3 1 0 0 1 1 0 0 1 -103
byte4 1 0 0 1 1 0 0 1 -103
byte5 1 0 0 1 1 0 0 1 -103
byte6 1 0 0 1 1 0 0 1 -103
byte7 1 0 0 1 1 0 1 0 -102
Can please somebody bring light into that?????
Does somebody know the exact specification of a double datatype in c++ and java?
with the best regards,
stoneeOK,
It seems my C-program created a bad array. I finally
found out, that the Java and C Array of each double is
exactly turned.
C[0] == J[7]
C[1] == J[6]
C[2] == J[5]
its probably big endian vs little endian issues plus on top of that nibble swapping.
I happen to be working on this very problem at this instant. I'll see what I can dig up. -
Could someone explain the theory behind the following:
The default floating point data type is a double, hence the following declaration will not compile:
float f=1.3;
However the following declaration will compile:
float f=1/3
...without specifying that it should be a float. Why does this happen, and why is the resulting value in f 0.0? Surely it should be 0.3333 or similar?1/3 is the integer 1 divided with the integer 3, and since they both are integers it would be natural for the result to be integer too, and so the division performed is called integer division. And the integer 0 is the result because one third is doesn't fit any integer. The fractional part is clamped. This result is then implicitely casted to produce the float 0.0f.
Why? Because that's the way it goes in C and C++. -
Double email messages, erratic Mail behavior, confused
Hi there,
I am getting two of the same emails coming in. For example, if someone sends me an email, I get two of emails (exactly the same, time, same person etc.). Sometimes there are three of them, sometimes there is only one mail copy.
If I open mail for example, it will tell me there are 6 emails, when really there are only three, with a copy of each. So really there are 6, but only 3 original emails.
Sometimes, if I click on Mail, and my inbox will say those 6 emails (for example) and I click on trash, or junk mail, or some other mailbox, (before opening any of those mails) then back to the original inbox it will correct itself. (i.e. 3 mails). Usually not. It is hard to tell if there are copies or not; sometimes, I'll delete one of them and then later, they'll _both_ be gone.
I can't seem to find anything in the settings that make any sense, either that or I do not know the correct language for it.
Thanks for any help,
KeriMe too. I just created a Mobile Me account the other day, and I'm receiving doubles. None of my other email accounts are though, just my Me account.
Solutions anyone?
* I just realized that after I delete the messages and check the Trash folder, they are not doubled anymore... -
VI does not float if called while modal dialog is running
In my program I have Floating VIs that popup if certain conditions are met. These Floating VIs allow the Main VI to continue running, but remain front most so the user knows there is an issue.
There are also other modal dialogs in the application that could be active when an Floating VI is called in the background. When the Floating VI is called it properly shows up behind the modal dialog and in front of the Main VI.
The problem is that when the modal dialog is dismissed the Floating VI is no longer floating and appears behind the Main VI. Switching focus between VI's will bring either VI to the front. Changing focus to Windows Explorer (clicking on desktop) then back to LabVIEW restores floating behavior to the Floating VI.
I've attached a crude example that exhibits this behavior.
LV 2014 32-bit
WIndows 7 64-bit
Attachments:
HiddenFloatingExample.vi 10 KB
FloatingVI.vi 7 KBI can't offer a solution, but I can verify that the interaction between floating windows and modal dialogs is "hinky" -- though I haven't noticed the effect that you mention.
Mike...
Certified Professional Instructor
Certified LabVIEW Architect
LabVIEW Champion
"... after all, He's not a tame lion..."
Be thinking ahead and mark your dance card for NI Week 2015 now: TS 6139 - Object Oriented First Steps -
Dwm 5.9 Compilation issues
Ok guys, I really need your help.
I am currently with dwm 5.8.2 (everything's fine) and I downloaded 5.9 via ABS.
I launched a makepkg under ~/dwm. And next, I tried to apply this patch called pertag2. diff: https://github.com/simongmzlj/dwmhacks/ … rtag2.diff
It succeeded. Used:
patch -p1 < pertag2.diff
And I modified my config.h as jokerboy suggested me here: https://bbs.archlinux.org/viewtopic.php … 45#p960545
I haven't others patches.
But when I try to compile it, I got many errors messages.
dwm build options:
CFLAGS = -std=c99 -pedantic -Wall -Os -I. -I/usr/include -I/usr/include/X11 -DVERSION="5.9" -DXINERAMA
LDFLAGS = -s -L/usr/lib -lc -L/usr/lib/X11 -lX11 -L/usr/lib/X11 -lXinerama
CC = cc
CC dwm.c
In file included from dwm.c:293:0:
config.h:31:16: erreur: ‘tile’ undeclared here (not in a function)
dwm.c: In function ‘buttonpress’:
dwm.c:450:9: erreur: request for member ‘name’ in something not a structure or union
dwm.c:450:9: erreur: request for member ‘name’ in something not a structure or union
dwm.c:450:4: attention : passing argument 1 of ‘strlen’ from incompatible pointer type [enabled by default]
/usr/include/string.h:399:15: note: expected ‘const char *’ but argument is of type ‘const struct Layout *’
dwm.c:450:4: attention : passing argument 1 of ‘textnw’ from incompatible pointer type [enabled by default]
dwm.c:236:12: note: expected ‘const char *’ but argument is of type ‘const struct Layout *’
dwm.c: In function ‘createmon’:
dwm.c:686:29: erreur: request for member ‘mfact’ in something not a structure or union
dwm.c:686:36: attention : comparaison ordonnée de pointeur avec le zéro entier [-pedantic]
dwm.c:686:61: erreur: request for member ‘mfact’ in something not a structure or union
dwm.c:686:48: erreur: non concordance de type dans une expression conditionnelle
dwm.c:686:16: erreur: incompatible types when assigning to type ‘double’ from type ‘const struct Layout *’
dwm.c:686:3: attention : statement with no effect [-Wunused-value]
dwm.c:687:31: erreur: request for member ‘nmaster’ in something not a structure or union
dwm.c:687:40: attention : comparaison ordonnée de pointeur avec le zéro entier [-pedantic]
dwm.c:687:46: erreur: ‘nmaster’ undeclared (first use in this function)
dwm.c:687:46: note: each undeclared identifier is reported only once for each function it appears in
dwm.c:687:67: erreur: request for member ‘nmaster’ in something not a structure or union
dwm.c:687:18: attention : assignment makes integer from pointer without a cast [enabled by default]
dwm.c:688:26: erreur: request for member ‘layout’ in something not a structure or union
dwm.c: In function ‘drawbar’:
dwm.c:767:10: erreur: request for member ‘name’ in something not a structure or union
dwm.c:767:10: erreur: request for member ‘name’ in something not a structure or union
dwm.c:767:3: attention : passing argument 1 of ‘strlen’ from incompatible pointer type [enabled by default]
/usr/include/string.h:399:15: note: expected ‘const char *’ but argument is of type ‘const struct Layout *’
dwm.c:767:3: attention : passing argument 1 of ‘textnw’ from incompatible pointer type [enabled by default]
dwm.c:236:12: note: expected ‘const char *’ but argument is of type ‘const struct Layout *’
dwm.c:769:19: erreur: request for member ‘name’ in something not a structure or union
dwm.c:769:3: attention : passing argument 1 of ‘drawtext’ from incompatible pointer type [enabled by default]
dwm.c:190:13: note: expected ‘const char *’ but argument is of type ‘const struct Layout *’
dwm.c: Hors de toute fonction :
dwm.c:1550:1: attention : ‘setnmaster’ defined but not used [-Wunused-function]
dwm.c:1539:1: attention : ‘incnmaster’ defined but not used [-Wunused-function]
dwm.c:1691:1: attention : ‘ntile’ defined but not used [-Wunused-function]
make: *** [dwm.o] Erreur 1
Here my config.h:
/* See LICENSE file for copyright and license details. */
/* appearance */
static const char font[] = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*";
static const char normbordercolor[] = "#cccccc";
static const char normbgcolor[] = "#cccccc";
static const char normfgcolor[] = "#000000";
static const char selbordercolor[] = "#0066ff";
static const char selbgcolor[] = "#0066ff";
static const char selfgcolor[] = "#ffffff";
static const unsigned int borderpx = 1; /* border pixel of windows */
static const unsigned int snap = 32; /* snap pixel */
static const Bool showbar = True; /* False means no bar */
static const Bool topbar = True; /* False means bottom bar */
static const Rule rules[] = {
/* class instance title tags mask isfloating monitor */
{ "Gimp", NULL, NULL, 0, True, -1 },
{ "Firefox", NULL, NULL, 1 << 8, False, -1 },
/* layout(s) */
static const int nmaster = 1; /* clients in the master area */
static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
static const Bool resizehints = True; /* True means respect size hints in tiled resizals */
static const Layout layouts[] = {
/* symbol arrange function */
{ "[]=", tile }, /* first entry is default */
{ "><>", NULL }, /* no layout function means floating behavior */
{ "[M]", monocle },
{ "[N]", ntile },
/* tagging */
static const Tag tags[] = {
/* name layout mfact nmaster */
{ "1", &layouts[0], -1, -1 },
{ "2", &layouts[1], -1, -1 },
{ "3", &layouts[2], -1, -1 },
{ "4", &layouts[3], 0.40, -1 },
{ "5", &layouts[0], -1, -1 },
{ "6", &layouts[0], -1, -1 },
{ "7", &layouts[0], -1, -1 },
{ "8", &layouts[0], -1, -1 },
{ "9", &layouts[0], -1, -1 },
/* key definitions */
#define MODKEY Mod1Mask
#define TAGKEYS(KEY,TAG) \
{ MODKEY, KEY, view, {.ui = 1 << TAG} }, \
{ MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \
{ MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \
{ MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} },
/* helper for spawning shell commands in the pre dwm-5.0 fashion */
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
/* commands */
static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
static const char *termcmd[] = { "uxterm", NULL };
static Key keys[] = {
/* modifier key function argument */
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
{ MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
{ MODKEY, XK_b, togglebar, {0} },
{ MODKEY, XK_j, focusstack, {.i = +1 } },
{ MODKEY, XK_k, focusstack, {.i = -1 } },
{ MODKEY, XK_a, incnmaster, {.i = +1 } },
{ MODKEY, XK_z, incnmaster, {.i = -1 } },
{ MODKEY, XK_h, setmfact, {.f = -0.05} },
{ MODKEY, XK_l, setmfact, {.f = +0.05} },
{ MODKEY, XK_Return, zoom, {0} },
{ MODKEY, XK_Tab, view, {0} },
{ MODKEY|ShiftMask, XK_c, killclient, {0} },
{ MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
{ MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
{ MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
{ MODKEY, XK_n, setlayout, {.v = &layouts[3]} },
{ MODKEY, XK_space, setlayout, {0} },
{ MODKEY|ShiftMask, XK_space, togglefloating, {0} },
{ MODKEY, XK_0, view, {.ui = ~0 } },
{ MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
{ MODKEY, XK_comma, focusmon, {.i = -1 } },
{ MODKEY, XK_period, focusmon, {.i = +1 } },
{ MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
{ MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
TAGKEYS( XK_1, 0)
TAGKEYS( XK_2, 1)
TAGKEYS( XK_3, 2)
TAGKEYS( XK_4, 3)
TAGKEYS( XK_5, 4)
TAGKEYS( XK_6, 5)
TAGKEYS( XK_7, 6)
TAGKEYS( XK_8, 7)
TAGKEYS( XK_9, 8)
{ MODKEY|ShiftMask, XK_q, quit, {0} },
/* button definitions */
/* click can be ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
static Button buttons[] = {
/* click event mask button function argument */
{ ClkLtSymbol, 0, Button1, setlayout, {0} },
{ ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
{ ClkWinTitle, 0, Button2, zoom, {0} },
{ ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
{ ClkClientWin, MODKEY, Button1, movemouse, {0} },
{ ClkClientWin, MODKEY, Button2, togglefloating, {0} },
{ ClkClientWin, MODKEY, Button3, resizemouse, {0} },
{ ClkTagBar, 0, Button1, view, {0} },
{ ClkTagBar, 0, Button3, toggleview, {0} },
{ ClkTagBar, MODKEY, Button1, tag, {0} },
{ ClkTagBar, MODKEY, Button3, toggletag, {0} },
dwm.c
/* See LICENSE file for copyright and license details.
* dynamic window manager is designed like any other X client as well. It is
* driven through handling X events. In contrast to other X clients, a window
* manager selects for SubstructureRedirectMask on the root window, to receive
* events about window (dis-)appearance. Only one X connection at a time is
* allowed to select for this event mask.
* The event handlers of dwm are organized in an array which is accessed
* whenever a new event has been fetched. This allows event dispatching
* in O(1) time.
* Each child of the root window is called a client, except windows which have
* set the override_redirect flag. Clients are organized in a linked client
* list on each monitor, the focus history is remembered through a stack list
* on each monitor. Each client contains a bit array to indicate the tags of a
* client.
* Keys and tagging rules are organized as arrays and defined in config.h.
* To understand everything else, start reading main().
#include <errno.h>
#include <locale.h>
#include <stdarg.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <X11/cursorfont.h>
#include <X11/keysym.h>
#include <X11/Xatom.h>
#include <X11/Xlib.h>
#include <X11/Xproto.h>
#include <X11/Xutil.h>
#ifdef XINERAMA
#include <X11/extensions/Xinerama.h>
#endif /* XINERAMA */
/* macros */
#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask)
#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
#define INRECT(X,Y,RX,RY,RW,RH) ((X) >= (RX) && (X) < (RX) + (RW) && (Y) >= (RY) && (Y) < (RY) + (RH))
#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags]))
#define LENGTH(X) (sizeof X / sizeof X[0])
#define MAX(A, B) ((A) > (B) ? (A) : (B))
#define MIN(A, B) ((A) < (B) ? (A) : (B))
#define MOUSEMASK (BUTTONMASK|PointerMotionMask)
#define WIDTH(X) ((X)->w + 2 * (X)->bw)
#define HEIGHT(X) ((X)->h + 2 * (X)->bw)
#define TAGMASK ((1 << LENGTH(tags)) - 1)
#define TEXTW(X) (textnw(X, strlen(X)) + dc.font.height)
/* enums */
enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
enum { ColBorder, ColFG, ColBG, ColLast }; /* color */
enum { NetSupported, NetWMName, NetWMState,
NetWMFullscreen, NetActiveWindow, NetLast }; /* EWMH atoms */
enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */
enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
ClkClientWin, ClkRootWin, ClkLast }; /* clicks */
typedef union {
int i;
unsigned int ui;
float f;
const void *v;
} Arg;
typedef struct {
unsigned int click;
unsigned int mask;
unsigned int button;
void (*func)(const Arg *arg);
const Arg arg;
} Button;
typedef struct Monitor Monitor;
typedef struct Client Client;
struct Client {
char name[256];
float mina, maxa;
int x, y, w, h;
int oldx, oldy, oldw, oldh;
int basew, baseh, incw, inch, maxw, maxh, minw, minh;
int bw, oldbw;
unsigned int tags;
Bool isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
Client *next;
Client *snext;
Monitor *mon;
Window win;
typedef struct {
int x, y, w, h;
unsigned long norm[ColLast];
unsigned long sel[ColLast];
Drawable drawable;
GC gc;
struct {
int ascent;
int descent;
int height;
XFontSet set;
XFontStruct *xfont;
} font;
} DC; /* draw context */
typedef struct {
unsigned int mod;
KeySym keysym;
void (*func)(const Arg *);
const Arg arg;
} Key;
typedef struct {
const char *symbol;
void (*arrange)(Monitor *);
} Layout;
struct Monitor {
char ltsymbol[16];
int num;
int by; /* bar geometry */
int mx, my, mw, mh; /* screen size */
int wx, wy, ww, wh; /* window area */
unsigned int seltags;
unsigned int sellt;
unsigned int tagset[2];
Bool showbar;
Bool topbar;
Client *clients;
Client *sel;
Client *stack;
Monitor *next;
Window barwin;
const Layout *lt[2];
int curtag;
int prevtag;
const Layout **lts;
double *mfacts;
int *nmasters;
typedef struct {
const char *name;
const Layout *layout;
float mfact;
int nmaster;
} Tag;
typedef struct {
const char *class;
const char *instance;
const char *title;
unsigned int tags;
Bool isfloating;
int monitor;
} Rule;
/* function declarations */
static void applyrules(Client *c);
static Bool applysizehints(Client *c, int *x, int *y, int *w, int *h, Bool interact);
static void arrange(Monitor *m);
static void arrangemon(Monitor *m);
static void attach(Client *c);
static void attachstack(Client *c);
static void buttonpress(XEvent *e);
static void checkotherwm(void);
static void cleanup(void);
static void cleanupmon(Monitor *mon);
static void clearurgent(Client *c);
static void clientmessage(XEvent *e);
static void configure(Client *c);
static void configurenotify(XEvent *e);
static void configurerequest(XEvent *e);
static Monitor *createmon(void);
static void destroynotify(XEvent *e);
static void detach(Client *c);
static void detachstack(Client *c);
static void die(const char *errstr, ...);
static Monitor *dirtomon(int dir);
static void drawbar(Monitor *m);
static void drawbars(void);
static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);
static void drawtext(const char *text, unsigned long col[ColLast], Bool invert);
static void enternotify(XEvent *e);
static void expose(XEvent *e);
static void focus(Client *c);
static void focusin(XEvent *e);
static void focusmon(const Arg *arg);
static void focusstack(const Arg *arg);
static unsigned long getcolor(const char *colstr);
static Bool getrootptr(int *x, int *y);
static long getstate(Window w);
static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);
static void grabbuttons(Client *c, Bool focused);
static void grabkeys(void);
static void initfont(const char *fontstr);
static void keypress(XEvent *e);
static void killclient(const Arg *arg);
static void manage(Window w, XWindowAttributes *wa);
static void mappingnotify(XEvent *e);
static void maprequest(XEvent *e);
static void monocle(Monitor *m);
static void movemouse(const Arg *arg);
static Client *nexttiled(Client *c);
static void pop(Client *);
static void propertynotify(XEvent *e);
static Monitor *ptrtomon(int x, int y);
static void quit(const Arg *arg);
static void resize(Client *c, int x, int y, int w, int h, Bool interact);
static void resizeclient(Client *c, int x, int y, int w, int h);
static void resizemouse(const Arg *arg);
static void restack(Monitor *m);
static void run(void);
static void scan(void);
static Bool sendevent(Client *c, Atom proto);
static void sendmon(Client *c, Monitor *m);
static void setclientstate(Client *c, long state);
static void setfocus(Client *c);
static void setlayout(const Arg *arg);
static void setmfact(const Arg *arg);
static void setnmaster(const Arg *arg);
static void incnmaster(const Arg *arg);
static void setup(void);
static void showhide(Client *c);
static void sigchld(int unused);
static void spawn(const Arg *arg);
static void tag(const Arg *arg);
static void tagmon(const Arg *arg);
static int textnw(const char *text, unsigned int len);
static void ntile(Monitor *);
static void togglebar(const Arg *arg);
static void togglefloating(const Arg *arg);
static void toggletag(const Arg *arg);
static void toggleview(const Arg *arg);
static void unfocus(Client *c, Bool setfocus);
static void unmanage(Client *c, Bool destroyed);
static void unmapnotify(XEvent *e);
static Bool updategeom(void);
static void updatebarpos(Monitor *m);
static void updatebars(void);
static void updatenumlockmask(void);
static void updatesizehints(Client *c);
static void updatestatus(void);
static void updatetitle(Client *c);
static void updatewmhints(Client *c);
static void view(const Arg *arg);
static Client *wintoclient(Window w);
static Monitor *wintomon(Window w);
static int xerror(Display *dpy, XErrorEvent *ee);
static int xerrordummy(Display *dpy, XErrorEvent *ee);
static int xerrorstart(Display *dpy, XErrorEvent *ee);
static void zoom(const Arg *arg);
/* variables */
static const char broken[] = "broken";
static char stext[256];
static int screen;
static int sw, sh; /* X display screen geometry width, height */
static int bh, blw = 0; /* bar geometry */
static int (*xerrorxlib)(Display *, XErrorEvent *);
static unsigned int numlockmask = 0;
static void (*handler[LASTEvent]) (XEvent *) = {
[ButtonPress] = buttonpress,
[ClientMessage] = clientmessage,
[ConfigureRequest] = configurerequest,
[ConfigureNotify] = configurenotify,
[DestroyNotify] = destroynotify,
[EnterNotify] = enternotify,
[Expose] = expose,
[FocusIn] = focusin,
[KeyPress] = keypress,
[MappingNotify] = mappingnotify,
[MapRequest] = maprequest,
[PropertyNotify] = propertynotify,
[UnmapNotify] = unmapnotify
static Atom wmatom[WMLast], netatom[NetLast];
static Bool running = True;
static Cursor cursor[CurLast];
static Display *dpy;
static DC dc;
static Monitor *mons = NULL, *selmon = NULL;
static Window root;
/* configuration, allows nested code to access above variables */
#include "config.h"
/* compile-time check if all tags fit into an unsigned int bit array. */
struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
/* function implementations */
void
applyrules(Client *c) {
const char *class, *instance;
unsigned int i;
const Rule *r;
Monitor *m;
XClassHint ch = { 0 };
/* rule matching */
c->isfloating = c->tags = 0;
if(XGetClassHint(dpy, c->win, &ch)) {
class = ch.res_class ? ch.res_class : broken;
instance = ch.res_name ? ch.res_name : broken;
for(i = 0; i < LENGTH(rules); i++) {
r = &rules[i];
if((!r->title || strstr(c->name, r->title))
&& (!r->class || strstr(class, r->class))
&& (!r->instance || strstr(instance, r->instance)))
c->isfloating = r->isfloating;
c->tags |= r->tags;
for(m = mons; m && m->num != r->monitor; m = m->next);
if(m)
c->mon = m;
if(ch.res_class)
XFree(ch.res_class);
if(ch.res_name)
XFree(ch.res_name);
c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags];
Bool
applysizehints(Client *c, int *x, int *y, int *w, int *h, Bool interact) {
Bool baseismin;
Monitor *m = c->mon;
/* set minimum possible */
*w = MAX(1, *w);
*h = MAX(1, *h);
if(interact) {
if(*x > sw)
*x = sw - WIDTH(c);
if(*y > sh)
*y = sh - HEIGHT(c);
if(*x + *w + 2 * c->bw < 0)
*x = 0;
if(*y + *h + 2 * c->bw < 0)
*y = 0;
else {
if(*x > m->mx + m->mw)
*x = m->mx + m->mw - WIDTH(c);
if(*y > m->my + m->mh)
*y = m->my + m->mh - HEIGHT(c);
if(*x + *w + 2 * c->bw < m->mx)
*x = m->mx;
if(*y + *h + 2 * c->bw < m->my)
*y = m->my;
if(*h < bh)
*h = bh;
if(*w < bh)
*w = bh;
if(resizehints || c->isfloating) {
/* see last two sentences in ICCCM 4.1.2.3 */
baseismin = c->basew == c->minw && c->baseh == c->minh;
if(!baseismin) { /* temporarily remove base dimensions */
*w -= c->basew;
*h -= c->baseh;
/* adjust for aspect limits */
if(c->mina > 0 && c->maxa > 0) {
if(c->maxa < (float)*w / *h)
*w = *h * c->maxa + 0.5;
else if(c->mina < (float)*h / *w)
*h = *w * c->mina + 0.5;
if(baseismin) { /* increment calculation requires this */
*w -= c->basew;
*h -= c->baseh;
/* adjust for increment value */
if(c->incw)
*w -= *w % c->incw;
if(c->inch)
*h -= *h % c->inch;
/* restore base dimensions */
*w = MAX(*w + c->basew, c->minw);
*h = MAX(*h + c->baseh, c->minh);
if(c->maxw)
*w = MIN(*w, c->maxw);
if(c->maxh)
*h = MIN(*h, c->maxh);
return *x != c->x || *y != c->y || *w != c->w || *h != c->h;
void
arrange(Monitor *m) {
if(m)
showhide(m->stack);
else for(m = mons; m; m = m->next)
showhide(m->stack);
focus(NULL);
if(m)
arrangemon(m);
else for(m = mons; m; m = m->next)
arrangemon(m);
void
arrangemon(Monitor *m) {
strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol);
if(m->lt[m->sellt]->arrange)
m->lt[m->sellt]->arrange(m);
restack(m);
void
attach(Client *c) {
c->next = c->mon->clients;
c->mon->clients = c;
void
attachstack(Client *c) {
c->snext = c->mon->stack;
c->mon->stack = c;
void
buttonpress(XEvent *e) {
unsigned int i, x, click;
Arg arg = {0};
Client *c;
Monitor *m;
XButtonPressedEvent *ev = &e->xbutton;
click = ClkRootWin;
/* focus monitor if necessary */
if((m = wintomon(ev->window)) && m != selmon) {
unfocus(selmon->sel, True);
selmon = m;
focus(NULL);
if(ev->window == selmon->barwin) {
i = x = 0;
do {
x += TEXTW(tags[i].name);
} while(ev->x >= x && ++i < LENGTH(tags));
if(i < LENGTH(tags)) {
click = ClkTagBar;
arg.ui = 1 << i;
else if(ev->x < x + blw)
click = ClkLtSymbol;
else if(ev->x > selmon->ww - TEXTW(stext))
click = ClkStatusText;
else
click = ClkWinTitle;
else if((c = wintoclient(ev->window))) {
focus(c);
click = ClkClientWin;
for(i = 0; i < LENGTH(buttons); i++)
if(click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button
&& CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state))
buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg);
void
checkotherwm(void) {
xerrorxlib = XSetErrorHandler(xerrorstart);
/* this causes an error if some other window manager is running */
XSelectInput(dpy, DefaultRootWindow(dpy), SubstructureRedirectMask);
XSync(dpy, False);
XSetErrorHandler(xerror);
XSync(dpy, False);
void
cleanup(void) {
Arg a = {.ui = ~0};
Layout foo = { "", NULL };
Monitor *m;
view(&a);
selmon->lt[selmon->sellt] = &foo;
for(m = mons; m; m = m->next)
while(m->stack)
unmanage(m->stack, False);
if(dc.font.set)
XFreeFontSet(dpy, dc.font.set);
else
XFreeFont(dpy, dc.font.xfont);
XUngrabKey(dpy, AnyKey, AnyModifier, root);
XFreePixmap(dpy, dc.drawable);
XFreeGC(dpy, dc.gc);
XFreeCursor(dpy, cursor[CurNormal]);
XFreeCursor(dpy, cursor[CurResize]);
XFreeCursor(dpy, cursor[CurMove]);
while(mons)
cleanupmon(mons);
XSync(dpy, False);
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
void
cleanupmon(Monitor *mon) {
Monitor *m;
if(mon == mons)
mons = mons->next;
else {
for(m = mons; m && m->next != mon; m = m->next);
m->next = mon->next;
XUnmapWindow(dpy, mon->barwin);
XDestroyWindow(dpy, mon->barwin);
free(mon->mfacts);
free(mon->nmasters);
free(mon->lts);
free(mon);
void
clearurgent(Client *c) {
XWMHints *wmh;
c->isurgent = False;
if(!(wmh = XGetWMHints(dpy, c->win)))
return;
wmh->flags &= ~XUrgencyHint;
XSetWMHints(dpy, c->win, wmh);
XFree(wmh);
void
clientmessage(XEvent *e) {
XClientMessageEvent *cme = &e->xclient;
Client *c = wintoclient(cme->window);
if(!c)
return;
if(cme->message_type == netatom[NetWMState] && cme->data.l[1] == netatom[NetWMFullscreen]) {
if(cme->data.l[0] && !c->isfullscreen) {
XChangeProperty(dpy, cme->window, netatom[NetWMState], XA_ATOM, 32,
PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1);
c->isfullscreen = True;
c->oldstate = c->isfloating;
c->oldbw = c->bw;
c->bw = 0;
c->isfloating = True;
resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh);
XRaiseWindow(dpy, c->win);
else {
XChangeProperty(dpy, cme->window, netatom[NetWMState], XA_ATOM, 32,
PropModeReplace, (unsigned char*)0, 0);
c->isfullscreen = False;
c->isfloating = c->oldstate;
c->bw = c->oldbw;
c->x = c->oldx;
c->y = c->oldy;
c->w = c->oldw;
c->h = c->oldh;
resizeclient(c, c->x, c->y, c->w, c->h);
arrange(c->mon);
else if(cme->message_type == netatom[NetActiveWindow]) {
if(!ISVISIBLE(c)) {
c->mon->seltags ^= 1;
c->mon->tagset[c->mon->seltags] = c->tags;
pop(c);
void
configure(Client *c) {
XConfigureEvent ce;
ce.type = ConfigureNotify;
ce.display = dpy;
ce.event = c->win;
ce.window = c->win;
ce.x = c->x;
ce.y = c->y;
ce.width = c->w;
ce.height = c->h;
ce.border_width = c->bw;
ce.above = None;
ce.override_redirect = False;
XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&ce);
void
configurenotify(XEvent *e) {
Monitor *m;
XConfigureEvent *ev = &e->xconfigure;
Bool dirty;
if(ev->window == root) {
dirty = (sw != ev->width);
sw = ev->width;
sh = ev->height;
if(updategeom() || dirty) {
if(dc.drawable != 0)
XFreePixmap(dpy, dc.drawable);
dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen));
updatebars();
for(m = mons; m; m = m->next)
XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);
arrange(NULL);
void
configurerequest(XEvent *e) {
Client *c;
Monitor *m;
XConfigureRequestEvent *ev = &e->xconfigurerequest;
XWindowChanges wc;
if((c = wintoclient(ev->window))) {
if(ev->value_mask & CWBorderWidth)
c->bw = ev->border_width;
else if(c->isfloating || !selmon->lt[selmon->sellt]->arrange) {
m = c->mon;
if(ev->value_mask & CWX)
c->x = m->mx + ev->x;
if(ev->value_mask & CWY)
c->y = m->my + ev->y;
if(ev->value_mask & CWWidth)
c->w = ev->width;
if(ev->value_mask & CWHeight)
c->h = ev->height;
if((c->x + c->w) > m->mx + m->mw && c->isfloating)
c->x = m->mx + (m->mw / 2 - c->w / 2); /* center in x direction */
if((c->y + c->h) > m->my + m->mh && c->isfloating)
c->y = m->my + (m->mh / 2 - c->h / 2); /* center in y direction */
if((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight)))
configure(c);
if(ISVISIBLE(c))
XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
else
configure(c);
else {
wc.x = ev->x;
wc.y = ev->y;
wc.width = ev->width;
wc.height = ev->height;
wc.border_width = ev->border_width;
wc.sibling = ev->above;
wc.stack_mode = ev->detail;
XConfigureWindow(dpy, ev->window, ev->value_mask, &wc);
XSync(dpy, False);
/* TODO Check how many times createmon is called */
Monitor *
createmon(void) {
Monitor *m;
int i, numtags = LENGTH(tags) + 1;
if(!(m = (Monitor *)calloc(1, sizeof(Monitor))))
die("fatal: could not malloc() %u bytes\n", sizeof(Monitor));
if(!(m->mfacts = calloc(sizeof(double), numtags)))
die("fatal: could not malloc() %u bytes\n", sizeof(double) * numtags);
if(!(m->nmasters = calloc(sizeof(int), numtags)))
die("fatal: could not malloc() %u bytes\n", sizeof(int) * numtags);
if(!(m->lts = calloc(sizeof(Layout *), numtags)))
die("fatal: could not malloc() %u bytes\n", sizeof(Layout *) * numtags);
m->tagset[0] = m->tagset[1] = 1;
m->showbar = showbar;
m->topbar = topbar;
m->curtag = m->prevtag = 1;
for(i = 1; i < numtags; i++) {
m->mfacts[i] = tags[i - 1].mfact < 0 ? mfact : tags[i - 1].mfact;
m->nmasters[i] = tags[i - 1].nmaster < 0 ? nmaster : tags[i - 1].nmaster;
m->lts[i] = tags[i - 1].layout;
m->lt[0] = m->lts[m->curtag];
m->lt[1] = &layouts[1 % LENGTH(layouts)];
strncpy(m->ltsymbol, m->lt[0]->symbol, sizeof m->ltsymbol);
return m;
void
destroynotify(XEvent *e) {
Client *c;
XDestroyWindowEvent *ev = &e->xdestroywindow;
if((c = wintoclient(ev->window)))
unmanage(c, True);
void
detach(Client *c) {
Client **tc;
for(tc = &c->mon->clients; *tc && *tc != c; tc = &(*tc)->next);
*tc = c->next;
void
detachstack(Client *c) {
Client **tc, *t;
for(tc = &c->mon->stack; *tc && *tc != c; tc = &(*tc)->snext);
*tc = c->snext;
if(c == c->mon->sel) {
for(t = c->mon->stack; t && !ISVISIBLE(t); t = t->snext);
c->mon->sel = t;
void
die(const char *errstr, ...) {
va_list ap;
va_start(ap, errstr);
vfprintf(stderr, errstr, ap);
va_end(ap);
exit(EXIT_FAILURE);
Monitor *
dirtomon(int dir) {
Monitor *m = NULL;
if(dir > 0) {
if(!(m = selmon->next))
m = mons;
else {
if(selmon == mons)
for(m = mons; m->next; m = m->next);
else
for(m = mons; m->next != selmon; m = m->next);
return m;
void
drawbar(Monitor *m) {
int x;
unsigned int i, occ = 0, urg = 0;
unsigned long *col;
Client *c;
for(c = m->clients; c; c = c->next) {
occ |= c->tags;
if(c->isurgent)
urg |= c->tags;
dc.x = 0;
for(i = 0; i < LENGTH(tags); i++) {
dc.w = TEXTW(tags[i].name);
col = m->tagset[m->seltags] & 1 << i ? dc.sel : dc.norm;
drawtext(tags[i].name, col, urg & 1 << i);
drawsquare(m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
occ & 1 << i, urg & 1 << i, col);
dc.x += dc.w;
dc.w = blw = TEXTW(m->ltsymbol);
drawtext(m->ltsymbol, dc.norm, False);
dc.x += dc.w;
x = dc.x;
if(m == selmon) { /* status is only drawn on selected monitor */
dc.w = TEXTW(stext);
dc.x = m->ww - dc.w;
if(dc.x < x) {
dc.x = x;
dc.w = m->ww - x;
drawtext(stext, dc.norm, False);
else
dc.x = m->ww;
if((dc.w = dc.x - x) > bh) {
dc.x = x;
if(m->sel) {
col = m == selmon ? dc.sel : dc.norm;
drawtext(m->sel->name, col, False);
drawsquare(m->sel->isfixed, m->sel->isfloating, False, col);
else
drawtext(NULL, dc.norm, False);
XCopyArea(dpy, dc.drawable, m->barwin, dc.gc, 0, 0, m->ww, bh, 0, 0);
XSync(dpy, False);
void
drawbars(void) {
Monitor *m;
for(m = mons; m; m = m->next)
drawbar(m);
void
drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {
int x;
XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]);
x = (dc.font.ascent + dc.font.descent + 2) / 4;
if(filled)
XFillRectangle(dpy, dc.drawable, dc.gc, dc.x+1, dc.y+1, x+1, x+1);
else if(empty)
XDrawRectangle(dpy, dc.drawable, dc.gc, dc.x+1, dc.y+1, x, x);
void
drawtext(const char *text, unsigned long col[ColLast], Bool invert) {
char buf[256];
int i, x, y, h, len, olen;
XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG]);
XFillRectangle(dpy, dc.drawable, dc.gc, dc.x, dc.y, dc.w, dc.h);
if(!text)
return;
olen = strlen(text);
h = dc.font.ascent + dc.font.descent;
y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
x = dc.x + (h / 2);
/* shorten text if necessary */
for(len = MIN(olen, sizeof buf); len && textnw(text, len) > dc.w - h; len--);
if(!len)
return;
memcpy(buf, text, len);
if(len < olen)
for(i = len; i && i > len - 3; buf[--i] = '.');
XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]);
if(dc.font.set)
XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
else
XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
void
enternotify(XEvent *e) {
Client *c;
Monitor *m;
XCrossingEvent *ev = &e->xcrossing;
if((ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root)
return;
c = wintoclient(ev->window);
m = c ? c->mon : wintomon(ev->window);
if(m != selmon) {
unfocus(selmon->sel, True);
selmon = m;
else if(!c || c == selmon->sel)
return;
focus(c);
void
expose(XEvent *e) {
Monitor *m;
XExposeEvent *ev = &e->xexpose;
if(ev->count == 0 && (m = wintomon(ev->window)))
drawbar(m);
void
focus(Client *c) {
if(!c || !ISVISIBLE(c))
for(c = selmon->stack; c && !ISVISIBLE(c); c = c->snext);
/* was if(selmon->sel) */
if(selmon->sel && selmon->sel != c)
unfocus(selmon->sel, False);
if(c) {
if(c->mon != selmon)
selmon = c->mon;
if(c->isurgent)
clearurgent(c);
detachstack(c);
attachstack(c);
grabbuttons(c, True);
XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]);
setfocus(c);
else
XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
selmon->sel = c;
drawbars();
void
focusin(XEvent *e) { /* there are some broken focus acquiring clients */
XFocusChangeEvent *ev = &e->xfocus;
if(selmon->sel && ev->window != selmon->sel->win)
setfocus(selmon->sel);
void
focusmon(const Arg *arg) {
Monitor *m;
if(!mons->next)
return;
if((m = dirtomon(arg->i)) == selmon)
return;
unfocus(selmon->sel, True);
selmon = m;
focus(NULL);
void
focusstack(const Arg *arg) {
Client *c = NULL, *i;
if(!selmon->sel)
return;
if(arg->i > 0) {
for(c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next);
if(!c)
for(c = selmon->clients; c && !ISVISIBLE(c); c = c->next);
else {
for(i = selmon->clients; i != selmon->sel; i = i->next)
if(ISVISIBLE(i))
c = i;
if(!c)
for(; i; i = i->next)
if(ISVISIBLE(i))
c = i;
if(c) {
focus(c);
restack(selmon);
unsigned long
getcolor(const char *colstr) {
Colormap cmap = DefaultColormap(dpy, screen);
XColor color;
if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color))
die("error, cannot allocate color '%s'\n", colstr);
return color.pixel;
Bool
getrootptr(int *x, int *y) {
int di;
unsigned int dui;
Window dummy;
return XQueryPointer(dpy, root, &dummy, &dummy, x, y, &di, &di, &dui);
long
getstate(Window w) {
int format;
long result = -1;
unsigned char *p = NULL;
unsigned long n, extra;
Atom real;
if(XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState],
&real, &format, &n, &extra, (unsigned char **)&p) != Success)
return -1;
if(n != 0)
result = *p;
XFree(p);
return result;
Bool
gettextprop(Window w, Atom atom, char *text, unsigned int size) {
char **list = NULL;
int n;
XTextProperty name;
if(!text || size == 0)
return False;
text[0] = '\0';
XGetTextProperty(dpy, w, &name, atom);
if(!name.nitems)
return False;
if(name.encoding == XA_STRING)
strncpy(text, (char *)name.value, size - 1);
else {
if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success && n > 0 && *list) {
strncpy(text, *list, size - 1);
XFreeStringList(list);
text[size - 1] = '\0';
XFree(name.value);
return True;
void
grabbuttons(Client *c, Bool focused) {
updatenumlockmask();
unsigned int i, j;
unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
if(focused) {
for(i = 0; i < LENGTH(buttons); i++)
if(buttons[i].click == ClkClientWin)
for(j = 0; j < LENGTH(modifiers); j++)
XGrabButton(dpy, buttons[i].button,
buttons[i].mask | modifiers[j],
c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
else
XGrabButton(dpy, AnyButton, AnyModifier, c->win, False,
BUTTONMASK, GrabModeAsync, GrabModeSync, None, None);
void
grabkeys(void) {
updatenumlockmask();
unsigned int i, j;
unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
KeyCode code;
XUngrabKey(dpy, AnyKey, AnyModifier, root);
for(i = 0; i < LENGTH(keys); i++) {
if((code = XKeysymToKeycode(dpy, keys[i].keysym)))
for(j = 0; j < LENGTH(modifiers); j++)
XGrabKey(dpy, code, keys[i].mod | modifiers[j], root,
True, GrabModeAsync, GrabModeAsync);
void
initfont(const char *fontstr) {
char *def, **missing;
int n;
missing = NULL;
dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
if(missing) {
while(n--)
fprintf(stderr, "dwm: missing fontset: %s\n", missing[n]);
XFreeStringList(missing);
if(dc.font.set) {
XFontStruct **xfonts;
char **font_names;
dc.font.ascent = dc.font.descent = 0;
XExtentsOfFontSet(dc.font.set);
n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names);
while(n--) {
dc.font.ascent = MAX(dc.font.ascent, (*xfonts)->ascent);
dc.font.descent = MAX(dc.font.descent,(*xfonts)->descent);
xfonts++;
else {
if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr))
&& !(dc.font.xfont = XLoadQueryFont(dpy, "fixed")))
die("error, cannot load font: '%s'\n", fontstr);
dc.font.ascent = dc.font.xfont->ascent;
dc.font.descent = dc.font.xfont->descent;
dc.font.height = dc.font.ascent + dc.font.descent;
#ifdef XINERAMA
static Bool
isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info) {
while(n--)
if(unique[n].x_org == info->x_org && unique[n].y_org == info->y_org
&& unique[n].width == info->width && unique[n].height == info->height)
return False;
return True;
#endif /* XINERAMA */
void
keypress(XEvent *e) {
unsigned int i;
KeySym keysym;
XKeyEvent *ev;
ev = &e->xkey;
keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
for(i = 0; i < LENGTH(keys); i++)
if(keysym == keys[i].keysym
&& CLEANMASK(keys[i].mod) == CLEANMASK(ev->state)
&& keys[i].func)
keys[i].func(&(keys[i].arg));
void
killclient(const Arg *arg) {
if(!selmon->sel)
return;
if(!sendevent(selmon->sel, wmatom[WMDelete])) {
XGrabServer(dpy);
XSetErrorHandler(xerrordummy);
XSetCloseDownMode(dpy, DestroyAll);
XKillClient(dpy, selmon->sel->win);
XSync(dpy, False);
XSetErrorHandler(xerror);
XUngrabServer(dpy);
void
manage(Window w, XWindowAttributes *wa) {
Client *c, *t = NULL;
Window trans = None;
XWindowChanges wc;
if(!(c = calloc(1, sizeof(Client))))
die("fatal: could not malloc() %u bytes\n", sizeof(Client));
c->win = w;
updatetitle(c);
if(XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) {
c->mon = t->mon;
c->tags = t->tags;
else {
c->mon = selmon;
applyrules(c);
/* geometry */
c->x = c->oldx = wa->x;
c->y = c->oldy = wa->y;
c->w = c->oldw = wa->width;
c->h = c->oldh = wa->height;
c->oldbw = wa->border_width;
if(c->w == c->mon->mw && c->h == c->mon->mh) {
c->isfloating = True;
c->x = c->mon->mx;
c->y = c->mon->my;
c->bw = 0;
else {
if(c->x + WIDTH(c) > c->mon->mx + c->mon->mw)
c->x = c->mon->mx + c->mon->mw - WIDTH(c);
if(c->y + HEIGHT(c) > c->mon->my + c->mon->mh)
c->y = c->mon->my + c->mon->mh - HEIGHT(c);
c->x = MAX(c->x, c->mon->mx);
/* only fix client y-offset, if the client center might cover the bar */
c->y = MAX(c->y, ((c->mon->by == 0) && (c->x + (c->w / 2) >= c->mon->wx)
&& (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : c->mon->my);
c->bw = borderpx;
wc.border_width = c->bw;
XConfigureWindow(dpy, w, CWBorderWidth, &wc);
XSetWindowBorder(dpy, w, dc.norm[ColBorder]);
configure(c); /* propagates border_width, if size doesn't change */
updatesizehints(c);
updatewmhints(c);
XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);
grabbuttons(c, False);
if(!c->isfloating)
c->isfloating = c->oldstate = trans != None || c->isfixed;
if(c->isfloating)
XRaiseWindow(dpy, c->win);
attach(c);
attachstack(c);
XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */
XMapWindow(dpy, c->win);
setclientstate(c, NormalState);
arrange(c->mon);
void
mappingnotify(XEvent *e) {
XMappingEvent *ev = &e->xmapping;
XRefreshKeyboardMapping(ev);
if(ev->request == MappingKeyboard)
grabkeys();
void
maprequest(XEvent *e) {
static XWindowAttributes wa;
XMapRequestEvent *ev = &e->xmaprequest;
if(!XGetWindowAttributes(dpy, ev->window, &wa))
return;
if(wa.override_redirect)
return;
if(!wintoclient(ev->window))
manage(ev->window, &wa);
void
monocle(Monitor *m) {
unsigned int n = 0;
Client *c;
for(c = m->clients; c; c = c->next)
if(ISVISIBLE(c))
n++;
if(n > 0) /* override layout symbol */
snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n);
for(c = nexttiled(m->clients); c; c = nexttiled(c->next))
resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, False);
void
movemouse(const Arg *arg) {
int x, y, ocx, ocy, nx, ny;
Client *c;
Monitor *m;
XEvent ev;
if(!(c = selmon->sel))
return;
restack(selmon);
ocx = c->x;
ocy = c->y;
if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
None, cursor[CurMove], CurrentTime) != GrabSuccess)
return;
if(!getrootptr(&x, &y))
return;
do {
XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev);
switch(ev.type) {
case ConfigureRequest:
case Expose:
case MapRequest:
handler[ev.type](&ev);
break;
case MotionNotify:
nx = ocx + (ev.xmotion.x - x);
ny = ocy + (ev.xmotion.y - y);
if(nx >= selmon->wx && nx <= selmon->wx + selmon->ww
&& ny >= selmon->wy && ny <= selmon->wy + selmon->wh) {
if(abs(selmon->wx - nx) < snap)
nx = selmon->wx;
else if(abs((selmon->wx + selmon->ww) - (nx + WIDTH(c))) < snap)
nx = selmon->wx + selmon->ww - WIDTH(c);
if(abs(selmon->wy - ny) < snap)
ny = selmon->wy;
else if(abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap)
ny = selmon->wy + selmon->wh - HEIGHT(c);
if(!c->isfloating && selmon->lt[selmon->sellt]->arrange
&& (abs(nx - c->x) > snap || abs(ny - c->y) > snap))
togglefloating(NULL);
if(!selmon->lt[selmon->sellt]->arrange || c->isfloating)
resize(c, nx, ny, c->w, c->h, True);
break;
} while(ev.type != ButtonRelease);
XUngrabPointer(dpy, CurrentTime);
if((m = ptrtomon(c->x + c->w / 2, c->y + c->h / 2)) != selmon) {
sendmon(c, m);
selmon = m;
focus(NULL);
Client *
nexttiled(Client *c) {
for(; c && (c->isfloating || !ISVISIBLE(c)); c = c->next);
return c;
void
pop(Client *c) {
detach(c);
attach(c);
focus(c);
arrange(c->mon);
void
propertynotify(XEvent *e) {
Client *c;
Window trans;
XPropertyEvent *ev = &e->xproperty;
if((ev->window == root) && (ev->atom == XA_WM_NAME))
updatestatus();
else if(ev->state == PropertyDelete)
return; /* ignore */
else if((c = wintoclient(ev->window))) {
switch(ev->atom) {
default: break;
case XA_WM_TRANSIENT_FOR:
if(!c->isfloating && (XGetTransientForHint(dpy, c->win, &trans)) &&
(c->isfloating = (wintoclient(trans)) != NULL))
arrange(c->mon);
break;
case XA_WM_NORMAL_HINTS:
updatesizehints(c);
break;
case XA_WM_HINTS:
updatewmhints(c);
drawbars();
break;
if(ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) {
updatetitle(c);
if(c == c->mon->sel)
drawbar(c->mon);
Monitor *
ptrtomon(int x, int y) {
Monitor *m;
for(m = mons; m; m = m->next)
if(INRECT(x, y, m->wx, m->wy, m->ww, m->wh))
return m;
return selmon;
void
quit(const Arg *arg) {
running = False;
void
resize(Client *c, int x, int y, int w, int h, Bool interact) {
if(applysizehints(c, &x, &y, &w, &h, interact))
resizeclient(c, x, y, w, h);
void
resizeclient(Client *c, int x, int y, int w, int h) {
XWindowChanges wc;
c->oldx = c->x; c->x = wc.x = x;
c->oldy = c->y; c->y = wc.y = y;
c->oldw = c->w; c->w = wc.width = w;
c->oldh = c->h; c->h = wc.height = h;
wc.border_width = c->bw;
XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
configure(c);
XSync(dpy, False);
void
resizemouse(const Arg *arg) {
int ocx, ocy;
int nw, nh;
Client *c;
Monitor *m;
XEvent ev;
if(!(c = selmon->sel))
return;
restack(selmon);
ocx = c->x;
ocy = c->y;
if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
None, cursor[CurResize], CurrentTime) != GrabSuccess)
return;
XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1);
do {
XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev);
switch(ev.type) {
case ConfigureRequest:
case Expose:
case MapRequest:
handler[ev.type](&ev);
break;
case MotionNotify:
nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1);
nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1);
if(c->mon->wx + nw >= selmon->wx && c->mon->wx + nw <= selmon->wx + selmon->ww
&& c->mon->wy + nh >= selmon->wy && c->mon->wy + nh <= selmon->wy + selmon->wh)
if(!c->isfloating && selmon->lt[selmon->sellt]->arrange
&& (abs(nw - c->w) > snap || abs(nh - c->h) > snap))
togglefloating(NULL);
if(!selmon->lt[selmon->sellt]->arrange || c->isfloating)
resize(c, c->x, c->y, nw, nh, True);
break;
} while(ev.type != ButtonRelease);
XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1);
XUngrabPointer(dpy, CurrentTime);
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
if((m = ptrtomon(c->x + c->w / 2, c->y + c->h / 2)) != selmon) {
sendmon(c, m);
selmon = m;
focus(NULL);
void
restack(Monitor *m) {
Client *c;
XEvent ev;
XWindowChanges wc;
drawbar(m);
if(!m->sel)
return;
if(m->sel->isfloating || !m->lt[m->sellt]->arrange)
XRaiseWindow(dpy, m->sel->win);
if(m->lt[m->sellt]->arrange) {
wc.stack_mode = Below;
wc.sibling = m->barwin;
for(c = m->stack; c; c = c->snext)
if(!c->isfloating && ISVISIBLE(c)) {
XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc);
wc.sibling = c->win;
XSync(dpy, False);
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
void
run(void) {
XEvent ev;
/* main event loop */
XSync(dpy, False);
while(running && !XNextEvent(dpy, &ev)) {
if(handler[ev.type])
handler[ev.type](&ev); /* call handler */
void
scan(void) {
unsigned int i, num;
Window d1, d2, *wins = NULL;
XWindowAttributes wa;
if(XQueryTree(dpy, root, &d1, &d2, &wins, &num)) {
for(i = 0; i < num; i++) {
if(!XGetWindowAttributes(dpy, wins[i], &wa)
|| wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1))
continue;
if(wa.map_state == IsViewable || getstate(wins[i]) == IconicState)
manage(wins[i], &wa);
for(i = 0; i < num; i++) { /* now the transients */
if(!XGetWindowAttributes(dpy, wins[i], &wa))
continue;
if(XGetTransientForHint(dpy, wins[i], &d1)
&& (wa.map_state == IsViewable || getstate(wins[i]) == IconicState))
manage(wins[i], &wa);
if(wins)
XFree(wins);
void
sendmon(Client *c, Monitor *m) {
if(c->mon == m)
return;
unfocus(c, True);
detach(c);
detachstack(c);
c->mon = m;
c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
attach(c);
attachstack(c);
focus(NULL);
arrange(NULL);
void
setclientstate(Client *c, long state) {
long data[] = { state, None };
XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32,
PropModeReplace, (unsigned char *)data, 2);
Bool
sendevent(Client *c, Atom proto) {
int n;
Atom *protocols;
Bool exists = False;
XEvent ev;
if(XGetWMProtocols(dpy, c->win, &protocols, &n)) {
while(!exists && n--)
exists = protocols[n] == proto;
XFree(protocols);
if(exists) {
ev.type = ClientMessage;
ev.xclient.window = c->win;
ev.xclient.message_type = wmatom[WMProtocols];
ev.xclient.format = 32;
ev.xclient.data.l[0] = proto;
ev.xclient.data.l[1] = CurrentTime;
XSendEvent(dpy, c->win, False, NoEventMask, &ev);
return exists;
void
setfocus(Client *c) {
if(!c->neverfocus)
XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
sendevent(c, wmatom[WMTakeFocus]);
void
setlayout(const Arg *arg) {
if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
selmon->sellt ^= 1;
if(arg && arg->v)
selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag] = (Layout *)arg->v;
strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
if(selmon->sel)
arrange(selmon);
else
drawbar(selmon);
static void
incnmaster(const Arg *arg) {
int i;
if(!arg || !selmon->lt[selmon->sellt]->arrange)
return;
i = selmon->nmasters[selmon->curtag] + arg->i;
selmon->nmasters[selmon->curtag] = i < 0 ? 0 : i;
arrange(selmon);
static void
setnmaster(const Arg *arg) {
if(!arg || !selmon->lt[selmon->sellt]->arrange)
return;
selmon->nmasters[selmon->curtag] = arg->i > 0 ? arg->i : 0;
arrange(selmon);
/* arg > 1.0 will set mfact absolutly */
void
setmfact(const Arg *arg) {
float f;
if(!arg || !selmon->lt[selmon->sellt]->arrange)
return;
f = arg->f < 1.0 ? arg->f + selmon->mfacts[selmon->curtag] : arg->f - 1.0;
if(f < 0.1 || f > 0.9)
return;
selmon->mfacts[selmon->curtag] = f;
arrange(selmon);
void
setup(void) {
XSetWindowAttributes wa;
/* clean up any zombies immediately */
sigchld(0);
/* init screen */
screen = DefaultScreen(dpy);
root = RootWindow(dpy, screen);
initfont(font);
sw = DisplayWidth(dpy, screen);
sh = DisplayHeight(dpy, screen);
bh = dc.h = dc.font.height + 2;
updategeom();
/* init atoms */
wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False);
wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False);
netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False);
netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False);
netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False);
netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False);
netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False);
/* init cursors */
cursor[CurNormal] = XCreateFontCursor(dpy, XC_left_ptr);
cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing);
cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur);
/* init appearance */
dc.norm[ColBorder] = getcolor(normbordercolor);
dc.norm[ColBG] = getcolor(normbgcolor);
dc.norm[ColFG] = getcolor(normfgcolor);
dc.sel[ColBorder] = getcolor(selbordercolor);
dc.sel[ColBG] = getcolor(selbgcolor);
dc.sel[ColFG] = getcolor(selfgcolor);
dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, DefaultDepth(dpy, screen));
dc.gc = XCreateGC(dpy, root, 0, NULL);
XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
if(!dc.font.set)
XSetFont(dpy, dc.gc, dc.font.xfont->fid);
/* init bars */
updatebars();
updatestatus();
/* EWMH support per view */
XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32,
PropModeReplace, (unsigned char *) netatom, NetLast);
/* select for events */
wa.cursor = cursor[CurNormal];
wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask|ButtonPressMask
|EnterWindowMask|LeaveWindowMask|StructureNotifyMask
|PropertyChangeMask;
XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa);
XSelectInput(dpy, root, wa.event_mask);
grabkeys();
void
showhide(Client *c) {
if(!c)
return;
if(ISVISIBLE(c)) { /* show clients top down */
XMoveWindow(dpy, c->win, c->x, c->y);
if((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen)
resize(c, c->x, c->y, c->w, c->h, False);
showhide(c->snext);
else { /* hide clients bottom up */
showhide(c->snext);
XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
void
sigchld(int unused) {
if(signal(SIGCHLD, sigchld) == SIG_ERR)
die("Can't install SIGCHLD handler");
while(0 < waitpid(-1, NULL, WNOHANG));
void
spawn(const Arg *arg) {
if(fork() == 0) {
if(dpy)
close(ConnectionNumber(dpy));
setsid();
execvp(((char **)arg->v)[0], (char **)arg->v);
fprintf(stderr, "dwm: execvp %s", ((char **)arg->v)[0]);
perror(" failed");
exit(EXIT_SUCCESS);
void
tag(const Arg *arg) {
if(selmon->sel && arg->ui & TAGMASK) {
selmon->sel->tags = arg->ui & TAGMASK;
arrange(selmon);
void
tagmon(const Arg *arg) {
if(!selmon->sel || !mons->next)
return;
sendmon(selmon->sel, dirtomon(arg->i));
int
textnw(const char *text, unsigned int len) {
XRectangle r;
if(dc.font.set) {
XmbTextExtents(dc.font.set, text, len, NULL, &r);
return r.width;
return XTextWidth(dc.font.xfont, text, len);
void
ntile(Monitor *m) {
int x, y, h, w, mw, nmax, nm;
unsigned int i, n;
Client *c;
snprintf(m->ltsymbol, sizeof m->ltsymbol, "=%d]", m->nmasters[m->curtag]);
for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
c = nexttiled(m->clients);
nmax = m->nmasters[m->curtag];
nm = nmax == 1 ? 1 : MIN(n / 2, nmax);
if(nm > n)
nm = n;
/* master */
if(nm > 0) {
mw = selmon->mfacts[selmon->curtag] * m->ww;
h = m->wh / nm;
if(h < bh)
h = m->wh;
y = m->wy;
for(i = 0; i < nm; i++, c = nexttiled(c->next)) {
resize(c, m->wx, y, (n == nm ? m->ww : mw) - 2 * c->bw,
((i + 1 == nm) ? m->wy + m->wh - y : h) - 2 * c->bw, False);
if(h != m->wh)
y = c->y + HEIGHT(c);
n -= nm;
} else
mw = 0;
if(n == 0)
return;
/* tile stack */
x = m->wx + mw;
y = m->wy;
w = m->ww - mw;
h = m->wh / n;
if(h < bh)
h = m->wh;
for(i = 0; c; c = nexttiled(c->next), i++) {
resize(c, x, y, w - 2 * c->bw,
((i + 1 == n) ? m->wy + m->wh - y : h) - 2 * c->bw, False);
if(h != m->wh)
y = c->y + HEIGHT(c);
void
togglebar(const Arg *arg) {
selmon->showbar = !selmon->showbar;
updatebarpos(selmon);
XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
arrange(selmon);
void
togglefloating(const Arg *arg) {
if(!selmon->sel)
return;
selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed;
if(selmon->sel->isfloating)
resize(selmon->sel, selmon->sel->x, selmon->sel->y,
selmon->sel->w, selmon->sel->h, False);
arrange(selmon);
void
toggletag(const Arg *arg) {
unsigned int newtags;
unsigned int i;
if(!selmon->sel)
return;
newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
if(newtags) {
selmon->sel->tags = newtags;
if(newtags == ~0) {
selmon->prevtag = selmon->curtag;
selmon->curtag = 0;
if(!(newtags & 1 << (selmon->curtag - 1))) {
selmon->prevtag = selmon->curtag;
for (i=0; !(newtags & 1 << i); i++);
selmon->curtag = i + 1;
selmon->sel->tags = newtags;
selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag];
arrange(selmon);
void
toggleview(const Arg *arg) {
unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK);
if(newtagset) {
selmon->tagset[selmon->seltags] = newtagset;
arrange(selmon);
void
unfocus(Client *c, Bool setfocus) {
if(!c)
return;
grabbuttons(c, False);
XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]);
if(setfocus)
XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
void
unmanage(Client *c, Bool destroyed) {
Monitor *m = c->mon;
XWindowChanges wc;
/* The server grab construct avoids race conditions. */
detach(c);
detachstack(c);
if(!destroyed) {
wc.border_width = c->oldbw;
XGrabServer(dpy);
XSetErrorHandler(xerrordummy);
XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */
XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
setclientstate(c, WithdrawnState);
XSync(dpy, False);
XSetErrorHandler(xerror);
XUngrabServer(dpy);
free(c);
focus(NULL);
arrange(m);
void
unmapnotify(XEvent *e) {
Client *c;
XUnmapEvent *ev = &e->xunmap;
if((c = wintoclient(ev->window)))
unmanage(c, False);
void
updatebars(void) {
Monitor *m;
XSetWindowAttributes wa = {
.override_redirect = True,
.background_pixmap = ParentRelative,
.event_mask = ButtonPressMask|ExposureMask
for(m = mons; m; m = m->next) {
m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen),
CopyFromParent, DefaultVisual(dpy, screen),
CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
XDefineCursor(dpy, m->barwin, cursor[CurNormal]);
XMapRaised(dpy, m->barwin);
void
updatebarpos(Monitor *m) {
m->wy = m->my;
m->wh = m->mh;
if(m->showbar) {
m->wh -= bh;
m->by = m->topbar ? m->wy : m->wy + m->wh;
m->wy = m->topbar ? m->wy + bh : m->wy;
else
m->by = -bh;
Bool
updategeom(void) {
Bool dirty = False;
#ifdef XINERAMA
if(XineramaIsActive(dpy)) {
int i, j, n, nn;
Client *c;
Monitor *m;
XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn);
XineramaScreenInfo *unique = NULL;
for(n = 0, m = mons; m; m = m->next, n++);
/* only consider unique geometries as separate screens */
if(!(unique = (XineramaScreenInfo *)malloc(sizeof(XineramaScreenInfo) * nn)))
die("fatal: could not malloc() %u bytes\n", sizeof(XineramaScreenInfo) * nn);
for(i = 0, j = 0; i < nn; i++)
if(isuniquegeom(unique, j, &info[i]))
memcpy(&unique[j++], &info[i], sizeof(XineramaScreenInfo));
XFree(info);
nn = j;
if(n <= nn) {
for(i = 0; i < (nn - n); i++) { /* new monitors available */
for(m = mons; m && m->next; m = m->next);
if(m)
m->next = createmon();
else
mons = createmon();
for(i = 0, m = mons; i < nn && m; m = m->next, i++)
if(i >= n
|| (unique[i].x_org != m->mx || unique[i].y_org != m->my
|| unique[i].width != m->mw || unique[i].height != m->mh))
dirty = True;
m->num = i;
m->mx = m->wx = unique[i].x_org;
m->my = m->wy = unique[i].y_org;
m->mw = m->ww = unique[i].width;
m->mh = m->wh = unique[i].height;
updatebarpos(m);
else { /* less monitors available nn < n */
for(i = nn; i < n; i++) {
for(m = mons; m && m->next; m = m->next);
while(m->clients) {
dirty = True;
c = m->clients;
m->clients = c->next;
detachstack(c);
c->mon = mons;
attach(c);
attachstack(c);
if(m == selmon)
selmon = mons;
cleanupmon(m);
free(unique);
else
#endif /* XINERAMA */
/* default monitor setup */
if(!mons)
mons = createmon();
if(mons->mw != sw || mons->mh != sh) {
dirty = True;
mons->mw = mons->ww = sw;
mons->mh = mons->wh = sh;
updatebarpos(mons);
if(dirty) {
selmon = mons;
selmon = wintomon(root);
return dirty;
void
updatenumlockmask(void) {
unsigned int i, j;
XModifierKeymap *modmap;
numlockmask = 0;
modmap = XGetModifierMapping(dpy);
for(i = 0; i < 8; i++)
for(j = 0; j < modmap->max_keypermod; j++)
if(modmap->modifiermap[i * modmap->max_keypermod + j]
== XKeysymToKeycode(dpy, XK_Num_Lock))
numlockmask = (1 << i);
XFreeModifiermap(modmap);
void
updatesizehints(Client *c) {
long msize;
XSizeHints size;
if(!XGetWMNormalHints(dpy, c->win, &size, &msize))
/* size is uninitialized, ensure that size.flags aren't used */
size.flags = PSize;
if(size.flags & PBaseSize) {
c->basew = size.base_width;
c->baseh = size.base_height;
else if(size.flags & PMinSize) {
c->basew = size.min_width;
c->baseh = size.min_height;
else
c->basew = c->baseh = 0;
if(size.flags & PResizeInc) {
c->incw = size.width_inc;
c->inch = size.height_inc;
else
c->incw = c->inch = 0;
if(size.flags & PMaxSize) {
c->maxw = sizeThe diff you use rename tile() to ntile(), you should not have tile in your config.h. The rest of errors probably relate to what the diff has nerfed, or should be gone once you fix that tile.
I think you should stay on 5.8.2 until all the patches have support for 5.9 if you can't patch on patch on your own.
(edit) that github repo has issues, it might be good idea to create issue if that patch really have compatible issue with 5.9. That would benefit all other patch users.
Last edited by livibetter (2011-09-12 14:55:00) -
Looking for a good method or APP to have client sign a form in a text box
I am looking for a good method or App to take an existing form/Document and have a client sign, date etc. I will want to create the text boxes in a stationary location. Possibly to also take a picture to add to form.
Has anyone used any apps to accomplish this?
Apps I have tried.
Signnow
Sign PDF
Sign Easy
Sign Easy is about the best except the signatures (text boxes, dates, etc) are free floating and confuse people where to add them on form each time. Clients have no clue how to use it.
Any suggestions would be helpful. I may be over complicating this also, as there could just be a PDF app that I utilize.
Thanks,
JimMaybe more than you need...
PDF readers
PDF Expert – the PDF handling app for the iPad. "It allows you to markup documents with highlights and handwriting, insert text and stamps, sign and even merge PDFs."
https://itunes.apple.com/us/app/pdf-expert-5-fill-forms-annotate/id743974925?mt= 8
iAnnotate – turns your tablet into a world-class productivity tool for reading, marking up, and sharing PDFs, Word documents, PowerPoint files, and images. Has a secure document edition designed for corporations.
http://www.branchfire.com/iannotate/ -
[solved] problem with making dwm for configuration
hello everyone,
i installed and made the dwm following the instructions of this site
https://wiki.archlinux.org/index.php/dw … mmended.29 which seemed to work fine. now i was configuring my config.h in my ~/dwm folder, which leads to the followng error:
makepkg -efi
==> Making package: dwm 6.0-2 (Tue Sep 30 10:26:22 CEST 2014)
==> Checking runtime dependencies...
==> Checking buildtime dependencies...
==> WARNING: Using existing src/ tree
==> Removing existing pkg/ directory...
==> Starting build()...
dwm build options:
CFLAGS = -std=c99 -pedantic -Wall -Os -I. -I/usr/include -I/usr/include/X11 -D_FORTIFY_SOURCE=2 -DVERSION="6.0" -DXINERAMA
LDFLAGS = -s -L/usr/lib -lc -L/usr/lib/X11 -lX11 -L/usr/lib/X11 -lXinerama
CC = cc
CC dwm.c
In file included from dwm.c:288:0:
config.h:35:2: warning: missing braces around initializer [-Wmissing-braces]
1;
^
config.h:35:2: warning: (near initialization for 'layouts[3]') [-Wmissing-braces]
config.h:35:2: warning: initialization makes pointer from integer without a cast
config.h:35:2: warning: (near initialization for 'layouts[3].symbol')
config.h:35:3: error: expected '}' before ';' token
1;
^
dwm.c: In function 'keypress':
dwm.c:1087:2: warning: 'XKeycodeToKeysym' is deprecated (declared at /usr/include/X11/Xlib.h:1699) [-Wdeprecated-declarations]
keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
^
Makefile:18: recipe for target 'dwm.o' failed
make: *** [dwm.o] Error 1
==> ERROR: A failure occurred in build().
Aborting...
here is my config.h
/* See LICENSE file for copyright and license details. */
/* appearance */
static const char font[] = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*";
static const char normbordercolor[] = "#444444";
static const char normbgcolor[] = "#222222";
static const char normfgcolor[] = "#bbbbbb";
static const char selbordercolor[] = "#005577";
static const char selbgcolor[] = "#005577";
static const char selfgcolor[] = "#eeeeee";
static const unsigned int borderpx = 1; /* border pixel of windows */
static const unsigned int snap = 32; /* snap pixel */
static const Bool showbar = True; /* False means no bar */
static const Bool topbar = True; /* False means bottom bar */
/* tagging */
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
static const Rule rules[] = {
/* class instance title tags mask isfloating monitor */
{ "Gimp", NULL, NULL, 0, True, -1 },
{ "Firefox", NULL, NULL, 1 << 8, False, -1 },
/* layout(s) */
static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
static const int nmaster = 1; /* number of clients in master area */
static const Bool resizehints = True; /* True means respect size hints in tiled resizals */
static const Layout layouts[] = {
/* symbol arrange function */
{ "[]=", tile }, /* first entry is default */
{ "><>", NULL }, /* no layout function means floating behavior */
{ "[M]", monocle },
1;
/* key definitions */
#define MODKEY Mod1Mask
#define TAGKEYS(KEY,TAG) \
{ MODKEY, KEY, view, {.ui = 1 << TAG} }, \
{ MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \
{ MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \
{ MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} },
/* helper for spawning shell commands in the pre dwm-5.0 fashion */
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
/* commands */
static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
static const char *termcmd[] = { "lxterminal", NULL };
static const char *browsercmd[] = { "dwb", NULL };
static const char *surfcmd[] = { "surf", NULL };
static const char *mailcmd[] = { "thunderbird", NULL };
/*static const char *browsercmd[] = { "dwb", NULL };
static const char *browsercmd[] = { "dwb", NULL };
static const char *browsercmd[] = { "dwb", NULL };*/
static Key keys[] = {
/* modifier key function argument */
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
{ MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
{ MODKEY, XK_w, spawn, {.v = browsercmd } },
{ MODKEY, XK_s, spawn, {.v = surfcmd} },
{ MODKEY, XK_m, spawn, {.v = mailcmd} },
{ MODKEY, XK_b, togglebar, {0} },
{ MODKEY, XK_j, focusstack, {.i = +1 } },
{ MODKEY, XK_k, focusstack, {.i = -1 } },
{ MODKEY, XK_i, incnmaster, {.i = +1 } },
{ MODKEY, XK_d, incnmaster, {.i = -1 } },
{ MODKEY, XK_h, setmfact, {.f = -0.05} },
{ MODKEY, XK_l, setmfact, {.f = +0.05} },
{ MODKEY, XK_Return, zoom, {0} },
{ MODKEY, XK_Tab, view, {0} },
{ MODKEY|ShiftMask, XK_c, killclient, {0} },
{ MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
{ MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
{ MODKEY, XK_z, setlayout, {.v = &layouts[2]} },
{ MODKEY, XK_space, setlayout, {0} },
{ MODKEY|ShiftMask, XK_space, togglefloating, {0} },
{ MODKEY, XK_0, view, {.ui = ~0 } },
{ MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
{ MODKEY, XK_comma, focusmon, {.i = -1 } },
{ MODKEY, XK_period, focusmon, {.i = +1 } },
{ MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
{ MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
TAGKEYS( XK_1, 0)
TAGKEYS( XK_2, 1)
TAGKEYS( XK_3, 2)
TAGKEYS( XK_4, 3)
TAGKEYS( XK_5, 4)
TAGKEYS( XK_6, 5)
TAGKEYS( XK_7, 6)
TAGKEYS( XK_8, 7)
TAGKEYS( XK_9, 8)
{ MODKEY|ShiftMask, XK_q, quit, {0} },
/* button definitions */
/* click can be ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
static Button buttons[] = {
/* click event mask button function argument */
{ ClkLtSymbol, 0, Button1, setlayout, {0} },
{ ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
{ ClkWinTitle, 0, Button2, zoom, {0} },
{ ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
{ ClkClientWin, MODKEY, Button1, movemouse, {0} },
{ ClkClientWin, MODKEY, Button2, togglefloating, {0} },
{ ClkClientWin, MODKEY, Button3, resizemouse, {0} },
{ ClkTagBar, 0, Button1, view, {0} },
{ ClkTagBar, 0, Button3, toggleview, {0} },
{ ClkTagBar, MODKEY, Button1, tag, {0} },
{ ClkTagBar, MODKEY, Button3, toggletag, {0} },
i dont understand the error, but as i tried the same with the default config.h, its not due to my changes. i dont get the error when using
makepkg -i
but my changes weren't taken (obviously). for some reason, i cant overwrite the default package!?
greets lizzy
Last edited by caravanlizzy (2014-09-30 14:47:16)The warning messages are as clear as it gets:
config.h:35:2: warning: missing braces around initializer [-Wmissing-braces]
1;
^
'config.h' is the filename, '35:2' is the position - 35th line, 2nd column. You even get the line in question printed out: '1;' with and "arrow" pointing to it from below - '^'. -
After disasters in iDVD `05, should I bother with `06? Is it repaired?
Hello,
I appreciate any help possible, but am particularly interested in comments from "Len Goff" and "John Beatty1." This question involves a small experiment.
I found errors in iDVD 5 that went unrepaired (yes, I did report them, once). There was no patch for the problems and I noticed that after 6 months and two downloads, patch support vanishes for iApps until the new version (which = $$) comes out. Hmmmm.... (I've picked up DSP4 and will start learning it ASAP. However, for simpler jobs, such as archive video, iDVD would be useful.)
So here's a re-hash of the two old issues that were never fixed via patch.
First, iDVD 5 handled the menus strangely relative to version 4. Using menus did not work well in v5. If on menu A, the user selected a button that was to lead to menu B, then the cursor/focus would "land" on menu B on a button that was at an elevation nearest to the button last used on menu A. If that's not clear, I'll rephrase. Say that menu B has many (6-10) buttons (leading to chapters) arranged in a tidy verticle line. On menu A, the button leading to menu B sits about 2/3rd's down the screen. The focus/cursor would "land" on menu B at whatever button was about 2/3rd's down the screen instead of going to the upper left and proceding from the top left, L-R, T-B.
This "error" lost and confused people for whom I made disks. I was not expecting it either. It made navigating difficult for people because they were expecting something more intuitive. You can look back in discussions and see that one solution to this was text-editing the files after making a disk image to correct navigation. Was this "fixed" in version 6?
Second, the other oddity in version 5 is this. From v4, the "Wedding Bronze/Silver Two" themes were the most maleable for making near-custom DVD's. This was nice. In V4, in these themes, the "button" included both the little picture and the text label on the picture. This allowed us to use either no picture (text only buttons) or no text (picture only). Well, in v5, they changed something. The active button was only highlighting the text. Therefore, if one tried to make a no-text/picture-only menu (because it's fun), it wouldn't work. The preview did ok but without highlights around the pictures, and you could navigate by counting. (Funny how things work in Preview but not in reality.) But once the encoding and multiplexing was finished, the menus couldn't be set because iDVD couldn't program the menu navigation to "land" on any button, for whatever reason, without a highlight. V5 would return a "-1" or "1" error. In DSP, you might see that the picture was not included as part of the button.
Experiment: If someone would please snag 5 to 10 minutes of video with a few chapter markers in it (more than 2 sec apart and more than 2 sec from each end of the video) and toss it into v6 with chapter menus. Please try this situation (as disk image) especially using the same theme or a very similar one. Please let me know if the textless buttons can now be made again, like v4 was. Again, did they fix it?
If you've read all of this, then thank you for your time. If anyone takes up my experiment, then double thanks! and please respond.
If nothing has improved, than I'll stick to importing v4 archives into DSP and tweaking. (Can't wait until I learn DSP more.)Good thing for you I like to do experiments!
The theme "Wedding Bronze" in iDVD6 still only highlights text on the submenu buttons.
However, I think that's a theme change and not an iDVD6 limitation per se, as the theme "Porfolio Color" seems to makes buttons that highlight your movie clip, and not just the text.
So I opened Wedding Bronze and dragged in a short movie with 5 chapters. As in iDVD5, those buttons only highlighted the text. But you can change the button style from the default button used in the theme! So I selected a button, and then chose a new style from the button pallet (a heart shaped button or a formal frame button). These new buttons select the frame around the movie itself, not just the text. Then I selected "Save as Disk Image", and it worked fine, with two of the chapters with no text at all on the buttons. Navigation using the DVD Player on the disk image worked fine and highlighted the frames around the chapters with no text at all on the buttons. Could you have changed the buttons in iDVD5? I think so!
As for iDVD6 always starting submenus in the top left, it doesn't work that way. However, I must admit that I don’t find the behavior confusing, and could envision multiple schemes that might seem to make sense to different people for different reasons. They key to me is that the navigation within a menu makes sense, not where the starting point is as long as the "highlight" shows up well.
As for this experiment, the button to go to the chapter menu (scene selection) is in the middle right of the main menu, but when I click on it, it highlights chapter 2 (with no text, middle top row) on the submenu. This is not the closest to the previous button, but it is not the “beginning” chapter either. Maybe it's button #2 going to button #2???
So there you go, hope this helps…..
John B -
Mathematica Doesn't Quite Obey Tag Rule in DWM
I used the xprop command given here to identify Mathematica, as follows:
xprop |awk '
/^WM_CLASS/{sub(/.* =/, "instance:"); sub(/,/, "\nclass:"); print}
/^WM_NAME/{sub(/.* =/, "title:"); print}'
title: "Untitled-1"
instance: "XMathematica"
I then assigned Mathematica to tag 3, with this line in my config.h:
{ NULL, "XMathematica", NULL, 1 << 2, False },
But Mathematica only opens in tag 3 if I restart dwm (it's in a while loop, so I restart it using the script given in the dwm article at the Archwiki). Otherwise, it opens in the current tag. No other program doesn't follow my tag rules. Does anyone else have similar issue, or have an idea what could be up?
I'm running dwm 5.5, with the bstack, pertag, bstack.horiz, fibonacci, cellwriter, pango, tilemovemouse, and monocole patches.
My full config.h:
/* See LICENSE file for copyright and license details. */
/* appearance */
static const char font[] = "kroeger 05_55 caps 6";
static const char normbordercolor[] = "#ffffff";
static const char normbgcolor[] = "#ffffff";
static const char normfgcolor[] = "#222222";
static const char selbordercolor[] = "#42b1e1";
static const char selbgcolor[] = "#ffffff";
static const char selfgcolor[] = "#42b1e1";
static unsigned int borderpx = 0; /* border pixel of windows */
static unsigned int snap = 32; /* snap pixel */
static Bool showbar = True; /* False means no bar */
static Bool topbar = True; /* False means bottom bar */
/* tagging */
static const char tags[][MAXTAGLEN] = { "xoj", "pdf", "nb", "www", "cli"};
static unsigned int tagset[] = {1, 1}; /* after start, first tag is selected */
static Rule rules[] = {
/* class instance title tags mask isfloating */
{ "Cellwriter", NULL, NULL, ~0, True },
{ "Easystroke", NULL, NULL, 0, False },
{ "Pychrom", NULL, NULL, 0, True },
{ "Xournal", NULL, NULL, 1 << 0, False },
{ "MuPDF", NULL, NULL, 1 << 1, False },
{ NULL, "XMathematica", NULL, 1 << 2, False },
{ "Mplayer", NULL, NULL, 1 << 3, True },
{ "surf", NULL, NULL, 1 << 3, False },
{ "Chromium", NULL, NULL, 1 << 3, False },
{ "Pidgin", NULL, NULL, 1 << 3, True },
{ "URxvt", NULL, NULL, 1 << 4, False },
/* layout(s) */
static float mfact = 0.55; /* factor of master area size [0.05..0.95] */
static Bool resizehints = False; /* False means respect size hints in tiled resizals */
#include "bstack.c"
#include "bstackhoriz.c"
#include "fibonacci.c"
static Layout layouts[] = {
/* symbol arrange function */
{ "[]=", tile }, /* first entry is default */
{ "><>", NULL }, /* no layout function means floating behavior */
{ "[M]", monocle },
{ "TTT", bstack },
{ "===", bstackhoriz },
{ "[@]", spiral },
{ "[\\]", dwindle },
/* key definitions */
#define MODKEY Mod1Mask
#define TAGKEYS(KEY,TAG) \
{ MODKEY, KEY, view, {.ui = 1 << TAG} }, \
{ MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \
{ MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \
{ MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} },
/* helper for spawning shell commands in the pre dwm-5.0 fashion */
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
/* commands */
static const char *dmenucmd[] = { "dmenu_run", NULL};
static const char *termcmd[] = { "urxvt", NULL };
static const char *rotatecmd[] = { "/home/sara/.scripts/rotate.sh", NULL };
static const char *scrollupcmd[] = { "xte", "mouseclick 4", NULL };
static const char *scrolldncmd[] = { "xte", "mouseclick 5", NULL };
static const char *printcmd[] = { "scrot", NULL };
static const char *mathcmd[] = { "mathematica", NULL };
static const char *notecmd[] = { "xournal", NULL };
static const char *webcmd[] = { "sr", "-g", "google", NULL };
static const char *raisevolcmd[] = { "/home/sara/.scripts/raisevol.sh", NULL };
static const char *lowvolcmd[] = { "/home/sara/.scripts/lowvol.sh", NULL };
static const char *mutvolcmd[] = { "/home/sara/.scripts/mutevol.sh", NULL };
#include <X11/XF86keysym.h>
static Key keys[] = {
/* modifier key function argument */
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
{ MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
{ MODKEY, XF86XK_Launch3, spawn, {.v = webcmd } },
{ 0, XF86XK_Launch3, spawn, {.v = rotatecmd } },
{ 0, XF86XK_ScrollUp, spawn, {.v = scrollupcmd } },
{ MODKEY, XF86XK_ScrollUp, spawn, {.v = mathcmd } },
{ 0, XF86XK_ScrollDown, spawn, {.v = scrolldncmd } },
{ MODKEY, XF86XK_ScrollDown, spawn, {.v = notecmd } },
{ 0, XK_Print, spawn, {.v = printcmd } },
{ 0, XF86XK_AudioRaiseVolume, spawn, {.v = raisevolcmd } },
{ 0, XF86XK_AudioLowerVolume, spawn, {.v = lowvolcmd } },
{ 0, XF86XK_AudioMute, spawn, {.v = mutvolcmd } },
{ MODKEY, XK_b, togglebar, {0} },
{ MODKEY, XK_j, focusstack, {.i = +1 } },
{ MODKEY, XK_k, focusstack, {.i = -1 } },
{ MODKEY, XK_h, setmfact, {.f = -0.05} },
{ MODKEY, XK_l, setmfact, {.f = +0.05} },
{ MODKEY, XK_Return, zoom, {0} },
{ MODKEY, XK_Tab, view, {0} },
{ MODKEY|ShiftMask, XK_c, killclient, {0} },
{ MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
{ MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
{ MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
{ MODKEY, XK_r, setlayout, {.v = &layouts[3]} },
{ MODKEY, XK_o, setlayout, {.v = &layouts[4]} },
{ MODKEY, XK_s, setlayout, {.v = &layouts[5]} },
{ MODKEY, XK_d, setlayout, {.v = &layouts[6]} },
{ MODKEY, XK_space, setlayout, {0} },
{ MODKEY|ShiftMask, XK_space, togglefloating, {0} },
{ MODKEY, XK_0, view, {.ui = ~0 } },
{ MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
TAGKEYS( XK_1, 0)
TAGKEYS( XK_2, 1)
TAGKEYS( XK_3, 2)
TAGKEYS( XK_4, 3)
TAGKEYS( XK_5, 4)
{ MODKEY|ShiftMask, XK_q, quit, {0} },
#include "tilemovemouse.c"
/* button definitions */
/* click can be a tag number (starting at 0),
* ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
static Button buttons[] = {
/* click event mask button function argument */
{ ClkLtSymbol, 0, Button1, setlayout, {0} },
{ ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
{ ClkWinTitle, 0, Button2, zoom, {0} },
{ ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
{ ClkClientWin, MODKEY, Button1, tilemovemouse, {0} },
{ ClkClientWin, MODKEY, Button2, togglefloating, {0} },
{ ClkClientWin, MODKEY, Button3, resizemouse, {0} },
{ ClkTagBar, 0, Button1, view, {0} },
{ ClkTagBar, 0, Button3, toggleview, {0} },
{ ClkTagBar, MODKEY, Button1, tag, {0} },
{ ClkTagBar, MODKEY, Button3, toggletag, {0} },
Appreciate the help .
[Edit] Adding to the strangeness, Mathematica's documentation always starts up as a floating window, until I restart dwm with Mod-Shift-Q. This is wierd. Mathematica notebooks I create are properly tiled. [/Edit]
Last edited by Sara (2010-11-01 10:11:16)Pasted another example of my usb sd card reader.
there is no test_X symbol link in /dev/ directory after i un-pluged sd card reader and re-pluged it in on my computer
oh, I use systemd of course:
XSign rules.d # cat /boot/grub/menu.lst
# (0) Arch Linux
title Arch Linux
root (hd0,0)
kernel /boot/vmlinuz26 root=/dev/disk/by-label/root resume=/dev/sda7 ro vga=0x361 init=/usr/lib/systemd/systemd quiet
initrd /boot/kernel26.img
Hacksign wrote:
brebs wrote:You're mixing the hierarchy levels (i.e. subsystems) - can't do that. See working example.
no, I dont think I mixed te hierarchy level.
SUBSYSTEM=="input" matched '/devices/platform/i8042/serio1/serio2/input/input24/mouse2'
and
SUBSYSTEMS=="usb", ATTR{idVendor}=="1532",
matched its parent
and I'm so sorry that I pasted a wrong device tree...
sorry -
Hi,
I want to learn Business Object. With loads of informations floating around confuses me. Would anybody suggest me from where to start. If any document, would you please give me the link. It will be a great help.
Points will be assigned for all the helpful answers..
Regards,Hi bill,
The platform includes Crystal Reports®, the industry standard for enterprise reporting.
Refer to the following links:
http://www.businessobjects.com/pdf/products/businessobjects_xi_whats_new.pdf
http://www.businessobje[cts.com/]
Link to download the useru2019s Guide:
u2022 Please go to http://help.sap.com
u2022 Click on BusinessObjects tab
u2022 Select the product as Integration Kit for SAP
User guide: BusinessObjects Integration Kit for SAP Useru2019s Guide.
It will list all the documents for Integration Kit for SAP which will be helpful to you.
You can download free trial product from the following link:
http://www.businessobjects.com/product/freetrials.asp
I hope this information helps you.
Regards,
Shweta -
Greek letters in dwm status bar? How?
Is there a change in config.h that I could do to show Greek letters normally?
Thank youSorry..
The problem exists when I open a Greek web page in a browser. In dwm status bar the Greek characters of the title of the web page are not displayd correctly.
Here is my config.h:
/* See LICENSE file for copyright and license details. */
/* appearance */
static const char font[] = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*";
static const char normbordercolor[] = "#444444";
static const char normbgcolor[] = "#222222";
static const char normfgcolor[] = "#bbbbbb";
static const char selbordercolor[] = "#005577";
static const char selbgcolor[] = "#005577";
static const char selfgcolor[] = "#eeeeee";
static const unsigned int borderpx = 1; /* border pixel of windows */
static const unsigned int snap = 32; /* snap pixel */
static const Bool showbar = True; /* False means no bar */
static const Bool topbar = True; /* False means bottom bar */
/* tagging */
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
static const Rule rules[] = {
/* class instance title tags mask isfloating monitor */
{ "Gimp", NULL, NULL, 0, True, -1 },
/* { "Firefox", NULL, NULL, 1 << 8, False, -1 },*/
/* layout(s) */
static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
static const int nmaster = 1; /* number of clients in master area */
static const Bool resizehints = True; /* True means respect size hints in tiled resizals */
static const Layout layouts[] = {
/* symbol arrange function */
{ "[]=", tile }, /* first entry is default */
{ "><>", NULL }, /* no layout function means floating behavior */
{ "[M]", monocle },
/* key definitions */
#define MODKEY Mod4Mask
#define TAGKEYS(KEY,TAG) \
{ MODKEY, KEY, view, {.ui = 1 << TAG} }, \
{ MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \
{ MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \
{ MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} },
/* helper for spawning shell commands in the pre dwm-5.0 fashion */
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
/* commands */
static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
static const char *termcmd[] = { "st", NULL };
static const char *rebcmd[] = { "systemctl", "reboot", NULL };
static const char *shutcmd[] = { "systemctl", "poweroff", NULL };
static const char *dwbcmd[] = { "dwb", NULL };
static Key keys[] = {
/* modifier key function argument */
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
{ MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
{ MODKEY|ShiftMask, XK_d, spawn, {.v = dwbcmd } },
{ MODKEY, XK_b, togglebar, {0} },
{ MODKEY, XK_j, focusstack, {.i = +1 } },
{ MODKEY, XK_k, focusstack, {.i = -1 } },
{ MODKEY, XK_i, incnmaster, {.i = +1 } },
{ MODKEY, XK_d, incnmaster, {.i = -1 } },
{ MODKEY, XK_h, setmfact, {.f = -0.05} },
{ MODKEY, XK_l, setmfact, {.f = +0.05} },
{ MODKEY, XK_Return, zoom, {0} },
{ MODKEY, XK_Tab, view, {0} },
{ MODKEY|ShiftMask, XK_c, killclient, {0} },
{ MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
{ MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
{ MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
{ MODKEY, XK_space, setlayout, {0} },
{ MODKEY|ShiftMask, XK_space, togglefloating, {0} },
{ MODKEY, XK_0, view, {.ui = ~0 } },
{ MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
{ MODKEY, XK_comma, focusmon, {.i = -1 } },
{ MODKEY, XK_period, focusmon, {.i = +1 } },
{ MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
{ MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
TAGKEYS( XK_1, 0)
TAGKEYS( XK_2, 1)
TAGKEYS( XK_3, 2)
TAGKEYS( XK_4, 3)
TAGKEYS( XK_5, 4)
TAGKEYS( XK_6, 5)
TAGKEYS( XK_7, 6)
TAGKEYS( XK_8, 7)
TAGKEYS( XK_9, 8)
{ MODKEY|ShiftMask, XK_q, quit, {0} },
{ MODKEY|ShiftMask, XK_r, spawn, {.v = rebcmd } },
{ MODKEY|ShiftMask, XK_s, spawn, {.v = shutcmd } },
/* button definitions */
/* click can be ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
static Button buttons[] = {
/* click event mask button function argument */
{ ClkLtSymbol, 0, Button1, setlayout, {0} },
{ ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
{ ClkWinTitle, 0, Button2, zoom, {0} },
{ ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
{ ClkClientWin, MODKEY, Button1, movemouse, {0} },
{ ClkClientWin, MODKEY, Button2, togglefloating, {0} },
{ ClkClientWin, MODKEY, Button3, resizemouse, {0} },
{ ClkTagBar, 0, Button1, view, {0} },
{ ClkTagBar, 0, Button3, toggleview, {0} },
{ ClkTagBar, MODKEY, Button1, tag, {0} },
{ ClkTagBar, MODKEY, Button3, toggletag, {0} },
Last edited by hariskar (2013-10-02 13:46:57) -
Active window property/m​ethod?
Is there is property or method that will return whether or not a specific VI is the active (has focus) window?
Thanks,
Cristian(That's just the way code snippets work, nothing was done wrong)
back on topic:
In LV 8.2, the code "works", i.e. @ Floating, Frontmost = True
In LV 8.5, the code does not work, i.e. @ Floating, Frontmost = False.
I noticed in the Help re: Floating behavior, something was changed in 8.5. It says Focus will not immediately be relinquished when a floating window is selected (or something like that) and 8.2 does not mention that.
Message Edited by Broken Arrow on 12-23-2009 08:20 AM
Richard -
[SOLVED-ish] Useless gaps patch on dwm failing to build
Trying to apply uselessgaps unsuccessfully.
Here's the error at compilation:
┌─[parazyd][archbox][~/dwm]
└──╼ makepkg -efi
==> Making package: dwm 6.0-2 (Wed Feb 18 00:45:08 CET 2015)
==> Checking runtime dependencies...
==> Checking buildtime dependencies...
==> WARNING: Using existing $srcdir/ tree
==> Removing existing $pkgdir/ directory...
==> Starting build()...
dwm build options:
CFLAGS = -std=c99 -pedantic -Wall -Os -I. -I/usr/include -I/usr/include/X11 -I /usr/include/freetype2 -D_FORTIFY_SOURCE=2 -DVERSION="6.0" -DXINERAMA
LDFLAGS = -s -L/usr/lib -lc -L/usr/lib/X11 -lX11 -L/usr/lib/X11 -lXinerama -lXft -lfontconfig
CC = cc
CC dwm.c
In file included from dwm.c:336:0:
config.h:52:2: warning: initialization makes integer from pointer without a cast
{ "", tile }, /* first entry is default */
^
config.h:52:2: warning: (near initialization for ‘layouts[0].addgaps’)
config.h:52:2: error: initializer element is not computable at load time
config.h:52:2: error: (near initialization for ‘layouts[0].addgaps’)
config.h:53:2: warning: initialization makes integer from pointer without a cast
{ "", NULL }, /* no layout function means floating behavior */
^
config.h:53:2: warning: (near initialization for ‘layouts[1].addgaps’)
config.h:54:2: warning: initialization makes integer from pointer without a cast
{ "", monocle },
^
config.h:54:2: warning: (near initialization for ‘layouts[2].addgaps’)
config.h:54:2: error: initializer element is not computable at load time
config.h:54:2: error: (near initialization for ‘layouts[2].addgaps’)
config.h:55:2: warning: initialization makes integer from pointer without a cast
{ "", spiral },
^
config.h:55:2: warning: (near initialization for ‘layouts[3].addgaps’)
config.h:55:2: error: initializer element is not computable at load time
config.h:55:2: error: (near initialization for ‘layouts[3].addgaps’)
config.h:56:2: warning: initialization makes integer from pointer without a cast
{ "", dwindle },
^
config.h:56:2: warning: (near initialization for ‘layouts[4].addgaps’)
config.h:56:2: error: initializer element is not computable at load time
config.h:56:2: error: (near initialization for ‘layouts[4].addgaps’)
config.h:57:2: warning: initialization makes integer from pointer without a cast
{ "", bstack },
^
config.h:57:2: warning: (near initialization for ‘layouts[5].addgaps’)
config.h:57:2: error: initializer element is not computable at load time
config.h:57:2: error: (near initialization for ‘layouts[5].addgaps’)
In file included from dwm.c:336:0:
config.h:75:1: warning: initialization from incompatible pointer type
static const char *scratchpadcmd[] = { termcmd, "-title", scratchpadname, "-geometry", "160x40", NULL };
^
config.h:75:1: warning: (near initialization for ‘scratchpadcmd[0]’)
Makefile:18: recipe for target 'dwm.o' failed
make: *** [dwm.o] Error 1
==> ERROR: A failure occurred in build().
Aborting...
And here are dwm.c and config.h I want this to work with:
https://raw.githubusercontent.com/paraz … ster/dwm.c
https://raw.githubusercontent.com/paraz … r/config.h
Any ideas on making this work?
Last edited by parazyd (2015-02-19 06:01:15)jasonwryan wrote:
The scratchpad error is pretty evident from your config.h; the others look like the uselessgaps patch needs updating...
This, however, isn't a support thread as such.
It's the uselessgaps I'm trying to fix. Do I just open a new thread?
Maybe you are looking for
-
Why is my page not centered in browser view?
I am working on my home page. I set the container dimension to 700px and max width 960. I have tried other sizes. every time in Windows browser view my site shifts to the left with a large margin on the right. I can't get it to center. I have a
-
I am using LR5.6 on a Windows 7 machine with plenty of memory. LR, CS5 and all of my plug ins have been working just fine. Tonight I've found that if I make any kind of significant adjustments to an image, and the go to "Edit in.." that function do
-
Hey guys, I need some help here. I was uploading photos onto iphoto and a msg came up saying that it can upgrade my thumbnails and so I clicked on ok. All my pictures on my iphoto are now gone. When I search my computer for them I can find them, but
-
Email input xml as body of mail
Dear all I need to provide the input xml in the body of the mail. The body of the mail should be the input xml. I understand that in order to provide the content in the email body we need to use the XIMail30 package. However this is only for the tex
-
Hello, Can you please provide clarification regarding the pre-requisite certification/s required for the certification-E_HANAAW142- SAP Certified Development Specialist - ABAP for SAP HANA (Edition 2014). The following is the pre-requisites' descript