This commit is contained in:
Julien Danjou 2007-09-16 22:51:11 +02:00
parent 873eb2cfb3
commit c74c9c80a4
1 changed files with 57 additions and 14 deletions

View File

@ -45,11 +45,14 @@ Client *sel = NULL;
Client *stack = NULL; Client *stack = NULL;
DC *dc; DC *dc;
/* static */
static int (*xerrorxlib) (Display *, XErrorEvent *); static int (*xerrorxlib) (Display *, XErrorEvent *);
static Bool readin = True, running = True; static Bool readin = True, running = True;
/** Cleanup everything on quit
* \param disp Display ref
* \param drawcontext Drawcontext ref
* \param awesomeconf awesome config
*/
static void static void
cleanup(Display *disp, DC *drawcontext, awesome_config *awesomeconf) cleanup(Display *disp, DC *drawcontext, awesome_config *awesomeconf)
{ {
@ -92,6 +95,11 @@ cleanup(Display *disp, DC *drawcontext, awesome_config *awesomeconf)
p_delete(&dc); p_delete(&dc);
} }
/** Get a window state (WM_STATE)
* \param disp Display ref
* \param w Client window
* \return state
*/
static long static long
getstate(Display *disp, Window w) getstate(Display *disp, Window w)
{ {
@ -111,6 +119,12 @@ getstate(Display *disp, Window w)
return result; return result;
} }
/** Scan X to find windows to manage
* \param disp Display ref
* \param screen Screen number
* \param drawcontext Drawcontext ref
* \param awesomeconf awesome config
*/
static void static void
scan(Display *disp, int screen, DC *drawcontext, awesome_config *awesomeconf) scan(Display *disp, int screen, DC *drawcontext, awesome_config *awesomeconf)
{ {
@ -159,36 +173,51 @@ setup(Display *disp, int screen, DC *drawcontext, awesome_config *awesomeconf)
drawcontext->cursor[CurNormal] = XCreateFontCursor(disp, XC_left_ptr); drawcontext->cursor[CurNormal] = XCreateFontCursor(disp, XC_left_ptr);
drawcontext->cursor[CurResize] = XCreateFontCursor(disp, XC_sizing); drawcontext->cursor[CurResize] = XCreateFontCursor(disp, XC_sizing);
drawcontext->cursor[CurMove] = XCreateFontCursor(disp, XC_fleur); drawcontext->cursor[CurMove] = XCreateFontCursor(disp, XC_fleur);
/* select for events */ /* select for events */
wa.event_mask = SubstructureRedirectMask | SubstructureNotifyMask wa.event_mask = SubstructureRedirectMask | SubstructureNotifyMask
| EnterWindowMask | LeaveWindowMask | StructureNotifyMask; | EnterWindowMask | LeaveWindowMask | StructureNotifyMask;
wa.cursor = drawcontext->cursor[CurNormal]; wa.cursor = drawcontext->cursor[CurNormal];
XChangeWindowAttributes(disp, RootWindow(disp, screen), CWEventMask | CWCursor, &wa); XChangeWindowAttributes(disp, RootWindow(disp, screen), CWEventMask | CWCursor, &wa);
XSelectInput(disp, RootWindow(disp, screen), wa.event_mask); XSelectInput(disp, RootWindow(disp, screen), wa.event_mask);
grabkeys(disp, screen, awesomeconf); grabkeys(disp, screen, awesomeconf);
compileregs(awesomeconf->rules, awesomeconf->nrules); compileregs(awesomeconf->rules, awesomeconf->nrules);
/* bar */ /* bar */
drawcontext->h = awesomeconf->statusbar.height = drawcontext->font.height + 2; drawcontext->h = awesomeconf->statusbar.height = drawcontext->font.height + 2;
initstatusbar(disp, screen, drawcontext, &awesomeconf->statusbar); initstatusbar(disp, screen, drawcontext, &awesomeconf->statusbar);
drawcontext->gc = XCreateGC(disp, RootWindow(disp, screen), 0, 0); drawcontext->gc = XCreateGC(disp, RootWindow(disp, screen), 0, 0);
XSetLineAttributes(disp, drawcontext->gc, 1, LineSolid, CapButt, JoinMiter); XSetLineAttributes(disp, drawcontext->gc, 1, LineSolid, CapButt, JoinMiter);
if(!drawcontext->font.set) if(!drawcontext->font.set)
XSetFont(disp, drawcontext->gc, drawcontext->font.xfont->fid); XSetFont(disp, drawcontext->gc, drawcontext->font.xfont->fid);
loadawesomeprops(disp, screen, awesomeconf); loadawesomeprops(disp, screen, awesomeconf);
} }
/* /** Startup Error handler to check if another window manager
* Startup Error handler to check if another window manager
* is already running. * is already running.
* \param disp Display ref
* \param ee Error event
*/ */
static int __attribute__ ((noreturn)) static int __attribute__ ((noreturn))
xerrorstart(Display * dsply __attribute__ ((unused)), XErrorEvent * ee __attribute__ ((unused))) xerrorstart(Display * disp __attribute__ ((unused)), XErrorEvent * ee __attribute__ ((unused)))
{ {
eprint("awesome: another window manager is already running\n"); eprint("awesome: another window manager is already running\n");
} }
/* extern */ /** Quit awesome
* \param disp Display ref
* \param screen Screen number
* \param drawcontext Drawcontext ref
* \param awesomeconf awesome config
* \param arg nothing
* \ingroup ui_callback
*/
void void
uicb_quit(Display *disp __attribute__ ((unused)), uicb_quit(Display *disp __attribute__ ((unused)),
int screen __attribute__ ((unused)), int screen __attribute__ ((unused)),
@ -254,6 +283,11 @@ xerror(Display * edpy, XErrorEvent * ee)
return xerrorxlib(edpy, ee); /* may call exit */ return xerrorxlib(edpy, ee); /* may call exit */
} }
/** Hello, this is main
* \param argc who knows
* \param argv who knows
* \return EXIT_SUCCESS I hope
*/
int int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
@ -269,16 +303,27 @@ main(int argc, char *argv[])
Atom netatom[NetLast]; Atom netatom[NetLast];
if(argc == 2 && !strcmp("-v", argv[1])) if(argc == 2 && !strcmp("-v", argv[1]))
eprint("awesome-" VERSION " © 2007 Julien Danjou\n"); {
printf("awesome-" VERSION " © 2007 Julien Danjou\n");
return 0;
}
else if(argc != 1) else if(argc != 1)
eprint("usage: awesome [-v]\n"); eprint("usage: awesome [-v]\n");
/* Tag won't be printed otherwised */
setlocale(LC_CTYPE, ""); setlocale(LC_CTYPE, "");
if(!(dpy = XOpenDisplay(NULL))) if(!(dpy = XOpenDisplay(NULL)))
eprint("awesome: cannot open display\n"); eprint("awesome: cannot open display\n");
xfd = ConnectionNumber(dpy);
XSetErrorHandler(xerrorstart);
xfd = ConnectionNumber(dpy);
XSetErrorHandler(xerrorstart);
for(screen = 0; screen < ScreenCount(dpy); screen++)
/* this causes an error if some other window manager is running */
XSelectInput(dpy, RootWindow(dpy, screen), SubstructureRedirectMask);
/* need to XSync to validate errorhandler */
XSync(dpy, False); XSync(dpy, False);
XSetErrorHandler(NULL); XSetErrorHandler(NULL);
xerrorxlib = XSetErrorHandler(xerror); xerrorxlib = XSetErrorHandler(xerror);
@ -287,12 +332,10 @@ main(int argc, char *argv[])
netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False);
netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False);
/* allocate stuff */
dc = p_new(DC, ScreenCount(dpy)); dc = p_new(DC, ScreenCount(dpy));
awesomeconf = p_new(awesome_config, ScreenCount(dpy)); awesomeconf = p_new(awesome_config, ScreenCount(dpy));
for(screen = 0; screen < ScreenCount(dpy); screen++)
/* this causes an error if some other window manager is running */
XSelectInput(dpy, RootWindow(dpy, screen), SubstructureRedirectMask);
for(screen = 0; screen < ScreenCount(dpy); screen++) for(screen = 0; screen < ScreenCount(dpy); screen++)
{ {
parse_config(dpy, screen, &dc[screen], &awesomeconf[screen]); parse_config(dpy, screen, &dc[screen], &awesomeconf[screen]);
@ -381,5 +424,5 @@ main(int argc, char *argv[])
cleanup(dpy, dc, awesomeconf); cleanup(dpy, dc, awesomeconf);
XCloseDisplay(dpy); XCloseDisplay(dpy);
return 0; return EXIT_SUCCESS;
} }