diff options
| -rw-r--r-- | dmenu.1 | 46 | ||||
| -rw-r--r-- | dmenu.c | 84 | 
2 files changed, 59 insertions, 71 deletions
| @@ -14,12 +14,22 @@ dmenu \- dynamic menu  .RB [ \-sb " <color>]"  .RB [ \-sf " <color>]"  .RB [ \-v ] + +.B dmenu_run +[<options...>] + +.BR dmenu_path  .SH DESCRIPTION  .SS Overview  dmenu is a generic menu for X, originally designed for  .BR dwm (1).  It manages huge amounts (up to 10.000 and more) of user defined menu items  efficiently. + +dmenu_run is a dmenu script used by dwm which lists executables in the user's PATH +and executes the selected item. + +dmenu_path is a script used by dmenu_run to find and cache a list of executables.  .SS Options  .TP  .B \-i @@ -33,7 +43,7 @@ reparents dmenu to the window specified by xid.  .TP  .B \-l <lines>  activates vertical list mode. -The given number of lines will be displayed. Window height will get adjusted. +The given number of lines will be displayed. Window height will be adjusted.  .TP  .B \-fn <font>  defines the font. @@ -60,20 +70,9 @@ dmenu reads a list of newline-separated items from standard input and creates a  menu.  When the user selects an item or enters any text and presses Return, his/her  choice is printed to standard output and dmenu terminates.  .P -dmenu is completely controlled by the keyboard. The following keys are recognized: -.TP -.B Any printable character -Appends the character to the text in the input field.  This works as a filter: -only items containing this text will be displayed. -.TP -.B Left/Right (Up/Down) (Mod1\-h/Mod1\-l) -Select the previous/next item. -.TP -.B PageUp/PageDown (Mod1\-k/Mod1\-j) -Select the first item of the previous/next 'page' of items. -.TP -.B Home/End (Mod1\-g/Mod1\-G) -Select the first/last item. +dmenu is completely controlled by the keyboard. Besides standard Unix line editing, +and item selection (Up/Down or Left/Right, PageUp/PageDown, Home/End), the following +keys are recognized:  .TP  .B Tab (Control\-i)  Copy the selected item to the input field. @@ -84,24 +83,19 @@ Confirm selection and quit (print the selected item to standard output). Returns  on termination.  .TP  .B Shift\-Return (Control\-Shift\-j) -Confirm selection and quit (print the text in the input field to standard output). +Confirm input and quit (print the text in the input field to standard output).  Returns  .B 0  on termination.  .TP -.B Escape (Control\-bracketleft) +.B Escape (Control\-c)  Quit without selecting an item. Returns  .B 1  on termination.  .TP -.B Backspace (Control\-h) -Remove a character from the input field. -.TP -.B Control\-u -Remove all characters from the input field. -.TP -.B Control\-w -Remove all characters of current word from the input field. +.B Control\-y +Pastes the X selection into the input field. This requires +.BR sselp (1).  .SH SEE ALSO  .BR dwm (1), -.BR wmii (1) . +.BR wmii (1). @@ -355,17 +355,23 @@ kpress(XKeyEvent * e) {  	/* first check if a control mask is omitted */  	if(e->state & ControlMask) {  		switch(tolower(ksym)) { -		default:	/* ignore other control sequences */ +		default:  			return;  		case XK_a:  			ksym = XK_Home;  			break; +		case XK_b: +			ksym = XK_Left; +			break;  		case XK_c:  			ksym = XK_Escape;  			break;  		case XK_e:  			ksym = XK_End;  			break; +		case XK_f: +			ksym = XK_Right; +			break;  		case XK_h:  			ksym = XK_BackSpace;  			break; @@ -378,6 +384,12 @@ kpress(XKeyEvent * e) {  		case XK_k:  			text[cursor] = '\0';  			break; +		case XK_n: +			ksym = XK_Down; +			break; +		case XK_p: +			ksym = XK_Up; +			break;  		case XK_u:  			memmove(text, text + cursor, sizeof text - cursor + 1);  			cursor = 0; @@ -393,31 +405,7 @@ kpress(XKeyEvent * e) {  				match(text);  			}  			break; -		} -	} -	if(CLEANMASK(e->state) & Mod1Mask) { -		switch(ksym) { -		default: -			return; -		case XK_h: -			ksym = XK_Left; -			break; -		case XK_l: -			ksym = XK_Right; -			break; -		case XK_j: -			ksym = XK_Next; -			break; -		case XK_k: -			ksym = XK_Prior; -			break; -		case XK_g: -			ksym = XK_Home; -			break; -		case XK_G: -			ksym = XK_End; -			break; -		case XK_p: +		case XK_y:  			{  				FILE *fp;  				char *s; @@ -453,6 +441,8 @@ kpress(XKeyEvent * e) {  		match(text);  		break;  	case XK_Delete: +		if(cursor == len) +			return;  		for(i = 1; cursor + i < len && !IS_UTF8_1ST_CHAR(text[cursor + i]); i++);  		memmove(text + cursor, text + cursor + i, sizeof text - cursor);  		match(text); @@ -482,18 +472,20 @@ kpress(XKeyEvent * e) {  		calcoffsets();  		break;  	case XK_Left: -	case XK_Up: -		if(sel && sel->left){ -			sel = sel->left; -			if(sel->right == curr) { -				curr = prev; -				calcoffsets(); -			} -		} -		else if(cursor > 0) +		if(cursor > 0 && (!sel || !sel->left)) {  			while(cursor-- > 0 && !IS_UTF8_1ST_CHAR(text[cursor])); -		else +			break; +		} +		if(lines > 0)  			return; +	case XK_Up: +		if(!sel || !sel->left) +			return; +		sel = sel->left; +		if(sel->right == curr) { +			curr = prev; +			calcoffsets(); +		}  		break;  	case XK_Next:  		if(!next) @@ -516,18 +508,20 @@ kpress(XKeyEvent * e) {  		running = False;  		return;  	case XK_Right: -	case XK_Down: -		if(cursor < len) +		if(cursor < len) {  			while(cursor++ < len && !IS_UTF8_1ST_CHAR(text[cursor])); -		else if(sel && sel->right) { -			sel = sel->right; -			if(sel == next) { -				curr = next; -				calcoffsets(); -			} +			break;  		} -		else +		if(lines > 0) +			return; +	case XK_Down: +		if(!sel || !sel->right)  			return; +		sel = sel->right; +		if(sel == next) { +			curr = next; +			calcoffsets(); +		}  		break;  	case XK_Tab:  		if(!sel) | 
