diff -cr aewm-1.1.2_original/aewm.1x aewm-1.1.2_with_virtual_desktops/aewm.1x *** aewm-1.1.2_original/aewm.1x Wed Jan 10 13:25:43 2001 --- aewm-1.1.2_with_virtual_desktops/aewm.1x Sat Nov 3 15:31:49 2001 *************** *** 41,46 **** --- 41,50 ---- .BI -fn font-spec Draw window titles with the font defined by .IR font-spec . + + .TP + .BI -md desktops + Specifies the number of virtual desktops you want. The default is 4. .TP .BI -bw width Draw window borders diff -cr aewm-1.1.2_original/aewm.h aewm-1.1.2_with_virtual_desktops/aewm.h *** aewm-1.1.2_original/aewm.h Wed Jan 10 13:22:58 2001 --- aewm-1.1.2_with_virtual_desktops/aewm.h Sat Nov 3 15:23:35 2001 *************** *** 11,16 **** --- 11,17 ---- #include #include #include + #include #ifdef SHAPE #include #endif *************** *** 39,44 **** --- 40,46 ---- #define DEF_BW 1 #define SPACE 3 #define MINSIZE 15 + #define MAX_DESKTOPS 4 /* A few useful masks made up out of X's basic ones. `ChildMask' is a * silly name, but oh well. */ *************** *** 88,93 **** --- 90,98 ---- #define WITHDRAW 0 #define REMAP 1 + /* How many keys we are looking for */ + #define AEWM_KEY_ALT_COUNT 2 + /* This structure keeps track of top-level windows (hereinafter * 'clients'). The clients we know about (i.e. all that don't set * override-redirect) are kept track of in linked list starting at the *************** *** 114,119 **** --- 119,127 ---- Colormap cmap; int x, y, width, height; int ignore_unmap; + int is_iconified; + int belongs_to_desktop; + #ifdef SHAPE Bool has_been_shaped; #endif *************** *** 132,137 **** --- 140,148 ---- extern Display *dpy; extern Window root; extern int screen; + extern int current_desktop; + extern int max_desktops; + extern KeySym AltKeys[]; extern Client *head_client; extern XFontStruct *font; #ifdef XFT *************** *** 147,152 **** --- 158,164 ---- #endif extern char *opt_font, *opt_fg, *opt_bg, *opt_bd, *opt_new1, *opt_new2, *opt_new3; extern int opt_bw; + extern int opt_max_desktops; #ifdef SHAPE extern int shape, shape_event; #endif *************** *** 174,180 **** --- 186,194 ---- extern void move(Client *); extern void resize(Client *); extern void hide(Client *); + extern void unhide(Client *); extern void send_wm_delete(Client *); + extern void goto_desktop(int d); /* misc.c */ void err(const char *, ...); diff -cr aewm-1.1.2_original/events.c aewm-1.1.2_with_virtual_desktops/events.c *** aewm-1.1.2_original/events.c Wed Jan 10 13:22:58 2001 --- aewm-1.1.2_with_virtual_desktops/events.c Sat Nov 3 14:18:40 2001 *************** *** 5,10 **** --- 5,11 ---- #include "aewm.h" #include + static void handle_key_press_event(XKeyEvent *); static void handle_button_event(XButtonEvent *); static void handle_configure_request(XConfigureRequestEvent *); static void handle_map_request(XMapRequestEvent *); *************** *** 19,24 **** --- 20,27 ---- static void handle_shape_change(XShapeEvent *); #endif + KeySym AltKeys[]={XK_Page_Up,XK_Page_Down}; + /* We may want to put in some sort of check for unknown events at some * point. TWM has an interesting and different way of doing this... */ *************** *** 32,38 **** show_event(ev); #endif switch (ev.type) { ! case ButtonPress: handle_button_event(&ev.xbutton); break; case ConfigureRequest: handle_configure_request(&ev.xconfigurerequest); break; --- 35,45 ---- show_event(ev); #endif switch (ev.type) { ! case KeyPress: ! handle_key_press_event(&ev.xkey); ! break; ! ! case ButtonPress: handle_button_event(&ev.xbutton); break; case ConfigureRequest: handle_configure_request(&ev.xconfigurerequest); break; *************** *** 49,55 **** case PropertyNotify: handle_property_change(&ev.xproperty); break; case EnterNotify: ! handle_enter_event(&ev.xcrossing); break; case Expose: handle_expose_event(&ev.xexpose); break; #ifdef SHAPE --- 56,66 ---- case PropertyNotify: handle_property_change(&ev.xproperty); break; case EnterNotify: ! if(ev.xcrossing.window==root) ! XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); ! ! handle_enter_event(&ev.xcrossing); ! break; case Expose: handle_expose_event(&ev.xexpose); break; #ifdef SHAPE *************** *** 61,66 **** --- 72,108 ---- } } + static void handle_key_press_event(XKeyEvent *e) + { + KeySym ks; + + ks=XKeycodeToKeysym(dpy,e->keycode,0); + if (ks==NoSymbol) return; + + switch(ks) + { + case XK_Page_Up: + { + if( current_desktop < max_desktops - 1 ) + { + current_desktop++; + goto_desktop(current_desktop); + } + } + break; + + case XK_Page_Down: + { + if( current_desktop > 0 ) + { + current_desktop--; + goto_desktop(current_desktop); + } + } + break; + } + } + /* Someone clicked a button. If it was on the root, we get the click * be default. If it's on a window frame, we get it as well. If it's * on a client window, it may still fall through to us if the client *************** *** 167,172 **** --- 209,215 ---- XMapWindow(dpy, c->window); XMapRaised(dpy, c->frame); set_wm_state(c, NormalState); + c->is_iconified=0; } } diff -cr aewm-1.1.2_original/main.c aewm-1.1.2_with_virtual_desktops/main.c *** aewm-1.1.2_original/main.c Wed Jan 10 13:22:59 2001 --- aewm-1.1.2_with_virtual_desktops/main.c Sat Nov 3 15:28:08 2001 *************** *** 10,15 **** --- 10,18 ---- Display *dpy; Window root; int screen; + int current_desktop; + int max_desktops; + int opt_max_desktops; XFontStruct *font; #ifdef XFT XftFont *xftfont; *************** *** 61,66 **** --- 64,70 ---- OPT_STR("-bg", opt_bg) OPT_STR("-bd", opt_bd) OPT_INT("-bw", opt_bw) + OPT_INT("-md", opt_max_desktops) OPT_STR("-new1", opt_new1) OPT_STR("-new2", opt_new2) OPT_STR("-new3", opt_new3) *************** *** 118,123 **** --- 122,136 ---- err("can't open display! check your DISPLAY variable."); exit(1); } + + if(opt_max_desktops>0) + max_desktops = opt_max_desktops; + else + max_desktops = 4; + + printf("max_desktops = %d\n", max_desktops); + + current_desktop=0; XSetErrorHandler(handle_xerror); screen = DefaultScreen(dpy); *************** *** 170,175 **** gv.subwindow_mode = IncludeInferiors; invert_gc = XCreateGC(dpy, root, GCFunction|GCSubwindowMode|GCLineWidth|GCFont, &gv); ! sattr.event_mask = ChildMask|ColormapChangeMask|ButtonMask; XChangeWindowAttributes(dpy, root, CWEventMask, &sattr); } --- 183,188 ---- gv.subwindow_mode = IncludeInferiors; invert_gc = XCreateGC(dpy, root, GCFunction|GCSubwindowMode|GCLineWidth|GCFont, &gv); ! sattr.event_mask = EnterWindowMask|ChildMask|ColormapChangeMask|ButtonMask|KeyPressMask; XChangeWindowAttributes(dpy, root, CWEventMask, &sattr); } diff -cr aewm-1.1.2_original/manage.c aewm-1.1.2_with_virtual_desktops/manage.c *** aewm-1.1.2_original/manage.c Wed Jan 10 13:22:59 2001 --- aewm-1.1.2_with_virtual_desktops/manage.c Sat Nov 3 14:19:34 2001 *************** *** 10,15 **** --- 10,46 ---- static void draw_outline(Client *); static int get_incsize(Client *, int *, int *, int); + void goto_desktop(int d) + { + unsigned int nwins, i; + Window dummyw1, dummyw2, *wins; + Client* c; + + if( (d < max_desktops) && (d >= 0) ) + { + current_desktop = d; + + /* Preserve stacking order */ + XQueryTree(dpy, root, &dummyw1, &dummyw2, &wins, &nwins); + for (i = 0; i < nwins; i++) + { + c = find_client(wins[i], FRAME); + + if(c) + { + if(c->belongs_to_desktop == current_desktop) + { + if(c->is_iconified==1) unhide(c); + } + else { + if(c->is_iconified==0) hide(c); + } + } + } + XFree(wins); + } + } + void move(Client *c) { drag(c); *************** *** 27,38 **** --- 58,78 ---- send_config(c); } + void unhide(Client *c) + { + XMapWindow(dpy, c->frame); + XMapWindow(dpy, c->window); + set_wm_state(c, NormalState); + c->is_iconified=0; + } + void hide(Client *c) { if (!c->ignore_unmap) c->ignore_unmap++; XUnmapWindow(dpy, c->frame); XUnmapWindow(dpy, c->window); set_wm_state(c, IconicState); + c->is_iconified=1; } /* The name of this function is a bit misleading: if the client diff -cr aewm-1.1.2_original/misc.c aewm-1.1.2_with_virtual_desktops/misc.c *** aewm-1.1.2_original/misc.c Wed Jan 10 13:22:59 2001 --- aewm-1.1.2_with_virtual_desktops/misc.c Sat Nov 3 13:41:56 2001 *************** *** 201,206 **** --- 201,209 ---- Window dummyw1, dummyw2, *wins; Client *c; + for(i=0;ihas_been_shaped = 0; #endif + + c->belongs_to_desktop = current_desktop; + c->is_iconified=0; c->x = attr.x; c->y = attr.y; c->width = attr.width; *************** *** 69,74 **** --- 72,78 ---- } else { init_position(c); set_wm_state(c, NormalState); + c->is_iconified=0; if ((hints = XGetWMHints(dpy, w))) { if (hints->flags & StateHint) set_wm_state(c, hints->initial_state); XFree(hints); *************** *** 88,102 **** --- 92,109 ---- if (get_wm_state(c) == IconicState) { c->ignore_unmap++; XUnmapWindow(dpy, c->window); + c->is_iconified=1; } else { XMapWindow(dpy, c->window); XMapRaised(dpy, c->frame); set_wm_state(c, NormalState); + c->is_iconified=0; } } else { if (get_wm_state(c) == NormalState) { XMapWindow(dpy, c->window); XMapRaised(dpy, c->frame); + c->is_iconified=0; } }