jensens pages

Hauptseite

Software von mir

linux

VIA Epia

Linux & Laptop

WindowMaker

eine ergonomische Tastatur

Programmieren und Elektronik

Liegerad: Quantum Toxy

Pentominos

Zeugs


SourceForge Logo

vote_against_spam!

Seitenübersicht

Änderungen nach Datum sortiert

  english version Mail an Jens
b    
 

Fine-tuning WindowMaker

When looking for a fast, small and powerful-to-use window-manager I found Window Maker. I really tried some others (enlightement, kwm, icewm, ratpoison, blackbox, ...), but WindowMaker is fine. icewm is smaller and surely faster, but I couldn't make it fit my needs.

What I wanted it to be

windows shouldn't have borders or buttons or things like that. Using the mouse is just good for surfing, everything else is slowed down by it (OK, except moving and resizing windows, which is done very well with WindowMaker: press ALT and left mouse to drag a window around or ALT and right mouse to resize it. You DON'T HAVE TO hit certain little parts of the window to do it, that's what speeds it up).

Why show fancy effects? Just be fast. If we want to see nice things, we can watch a movie...

How to achieve it

configure

Before running ./configure, do export LINGUAS="de" or whatever your native language is.
Use the options --disable-kde --disable-sound --disable-gnome for ./configure.

Add
"*" = {NoTitlebar = Yes;NoResizebar = Yes;NoBorder = Yes;NoAppIcon = YES;};
to your WMWindowAttributes to get rid of space-wasting borders.

wconfig.h

To get a fast response to actions in the menu, you have to turn off the blinking shit that shows up when you select something. Edit the following values in wconfig.h:
  MENU_SELECT_DELAY 1
  MENU_BLINK_DELAY 42
  MENU_BLINK_COUNT 1

You'll notice that maximized windows won't fill the whole screen, but leave some space on the right and at the bottom. There's something to change in the same file: #define FRAME_BORDER_WIDTH 0

Maybe you also want to do this:

#undef ANIMATIONS
#undef SHAPED_BALLOON	
	

event.c

Something which really upset me: When opening the root-menu or the windows-menu via hotkeys, they show up at the mouse's position. Shit. I want them to be at a fixed position, where they fit on the screen without scrolling. Here you have to edit code in event.c:
Old code:
    switch (command) {
#ifndef LITE
     case WKBD_ROOTMENU:
 	OpenRootMenu(scr, event->xkey.x_root, event->xkey.y_root, True);  
	break;
     case WKBD_WINDOWLIST:
	OpenSwitchMenu(scr, event->xkey.x_root, event->xkey.y_root, True);  
	break;
#endif /* !LITE */

New code:
    switch (command) {
#ifndef LITE
     case WKBD_ROOTMENU:
      OpenRootMenu(scr, 200, 0, True);
	break;
     case WKBD_WINDOWLIST:
      OpenSwitchMenu(scr, 200, 0, True);
	break;
#endif /* !LITE */
This is round about line 1500 in function static void handleKeyPress(XEvent *event). In newer versions of WindowMaker this has been changed so that the menu opens in the screen's center, so there's no need to change it.

menu.c

I use the keyboard for navigating the menu, and one thing is not quite good: you have to use the arrow keys OR the first character of an entry to move to it, but to execute it you need to hit return, to open a submenu you need to use arrow keys again. The following code implements lynx-like navigation/execution AND the possibility to open submenus using return. It has to be changed in menu.c, round about line 1017:
	     case XK_Right:
	      /* JWW */
	     case XK_Return:
	      /* JWW */
#ifdef ARROWLESS_KBD
	     case XK_l:
#endif
#ifdef XK_KP_Right
	     case XK_KP_Right:
#endif
		if (menu->selected_entry>=0) {
		    WMenuEntry *entry;
		    entry = menu->entries[menu->selected_entry];

		    if (entry->cascade >= 0 && menu->cascades
			&& menu->cascades[entry->cascade]->entry_no > 0) {

			XUngrabKeyboard(dpy, CurrentTime);

			selectEntry(menu->cascades[entry->cascade], 0);
			if (!keyboardMenu(menu->cascades[entry->cascade]))
			    done = 1;

			XGrabKeyboard(dpy, menu->frame->core->window, True,
				      GrabModeAsync, GrabModeAsync,
				      CurrentTime);
		    }
		  /* JWW */
		  else
		    {
		      /* wwarning(_("Executing menu command (1)")); */
		      done = 2;
		    }
		  /* JWW */
		}
		break;
	
	

rootmenu.c

Autogenerated submenus didn't work for me, so I modified rootmenu.c, line 655:
      /* pipe menu */

      /* JWW: always reload submenu   START      */
      /* if (!menu->cascades[entry->cascade] ||  */
      /* 	  menu->cascades[entry->cascade]->timestamp == 0)  */
      /* 	{ */
      	  /* parse pipe */	   
      /* 	  submenu = readMenuPipe(menu->frame->screen_ptr, path);	   */
       	  /* there's no automatic reloading */ 
      /* 	  if(submenu != NULL) */
      /* 	    submenu->timestamp = 1; */
      /* 	}  */
      /* else  */
      /* 	{  */
      /* 	  submenu = NULL;  */
      /* 	} */
      wwarning(_("re-reading generated submenu"));
      submenu = readMenuPipe(menu->frame->screen_ptr, path);	  
      /* JWW: always reload submenu   END */

	
This is fixed in newer versions of WindowMaker. You only need to make the menu entry like this:
  (Laufwerke, OPEN_MENU, "|| /usr/local/bin/scripte/outputMountMenu.sh"),        
        
instead of
  (Laufwerke, OPEN_MENU, "| /usr/local/bin/scripte/outputMountMenu.sh"),        
        

Related things

Call your xterm with the option -b 1 to make its border smaller.

Last non-automatic update of this page: 07.02.2004 Jens Wilhelm Wulfhome