--- src/command.c.mdr 2007-09-17 09:19:28.875000000 +1000 +++ src/command.c 2007-09-17 17:44:47.687500000 +1000 @@ -52,6 +52,19 @@ /*----------------------------------------------------------------------*/ +/*{{{ Swap middle and right mouse buttons */ +/* INTPROTO */ +XButtonEvent * +rxvt_swap_buttons(rxvt_t *r, XButtonEvent *ev) +{ + if (r->Options & Opt_swapButtons) + if (ev->button == Button2) + ev->button = Button3; + else if (ev->button == Button3) + ev->button = Button2; + return ev; +} + /*{{{ Convert the keypress event into a string */ /* INTPROTO */ void @@ -135,19 +148,25 @@ if (r->TermWin.saveLines) { #ifdef UNSHIFTED_SCROLLKEYS - if (!ctrl && !meta) { + static int key_scrolling = 0; #else - if (IS_SCROLL_MOD) { + if (IS_SCROLL_MOD) #endif - int lnsppg; - + { +#ifdef RXVT_SCROLL_FULL #ifdef PAGING_CONTEXT_LINES - lnsppg = r->TermWin.nrow - PAGING_CONTEXT_LINES; + int lnsppg = r->TermWin.nrow - PAGING_CONTEXT_LINES; #else - lnsppg = r->TermWin.nrow * 4 / 5; + int lnsppg = r->TermWin.nrow - 1; +# endif +#else + int lnsppg = r->TermWin.nrow * 4 / 5; #endif if (keysym == XK_Prior) { rxvt_scr_page(r, UP, lnsppg); +#ifdef UNSHIFTED_SCROLLKEYS + key_scrolling = 1; +#endif return; } else if (keysym == XK_Next) { rxvt_scr_page(r, DN, lnsppg); @@ -155,7 +174,11 @@ } } #ifdef SCROLL_ON_UPDOWN_KEYS +#ifdef UNSHIFTED_SCROLLKEYS + if (key_scrolling) { +#else if (IS_SCROLL_MOD) { +#endif if (keysym == XK_Up) { rxvt_scr_page(r, UP, 1); return; @@ -166,16 +189,26 @@ } #endif #ifdef SCROLL_ON_HOMEEND_KEYS +#ifdef UNSHIFTED_SCROLLKEYS + if (key_scrolling) { +#else if (IS_SCROLL_MOD) { +#endif if (keysym == XK_Home) { rxvt_scr_move_to(r, 0, 1); return; } else if (keysym == XK_End) { rxvt_scr_move_to(r, 1, 0); +#ifdef UNSHIFTED_SCROLLKEYS + key_scrolling = 0; +#endif return; } } #endif +#ifdef UNSHIFTED_SCROLLKEYS + key_scrolling = 0; +#endif } if (shft) { @@ -1161,11 +1194,11 @@ #endif case ButtonPress: - rxvt_button_press(r, (XButtonEvent *)ev); + rxvt_button_press(r, rxvt_swap_buttons(r, (XButtonEvent *)ev)); break; case ButtonRelease: - rxvt_button_release(r, (XButtonEvent *)ev); + rxvt_button_release(r, rxvt_swap_buttons(r, (XButtonEvent *)ev)); break; case ClientMessage: @@ -1625,18 +1658,19 @@ case Button3: if (r->scrollBar.style != R_SB_XTERM) { - if (scrollbar_above_slider(ev->y)) # ifdef RXVT_SCROLL_FULL - rxvt_scr_page(r, UP, r->TermWin.nrow - 1); +# ifdef PAGING_CONTEXT_LINES + int lnsppg = r->TermWin.nrow - PAGING_CONTEXT_LINES; # else - rxvt_scr_page(r, UP, r->TermWin.nrow / 4); + int lnsppg = r->TermWin.nrow - 1; # endif - else if (scrollbar_below_slider(ev->y)) -# ifdef RXVT_SCROLL_FULL - rxvt_scr_page(r, DN, r->TermWin.nrow - 1); # else - rxvt_scr_page(r, DN, r->TermWin.nrow / 4); + int lnsppg = r->TermWin.nrow / 4; # endif + if (scrollbar_above_slider(ev->y)) + rxvt_scr_page(r, UP, lnsppg); + else if (scrollbar_below_slider(ev->y)) + rxvt_scr_page(r, DN, lnsppg); else scrollbar_setMotion(); } else { --- src/init.c.mdr 2007-09-17 17:56:55.437500000 +1000 +++ src/init.c 2007-09-17 17:56:59.484375000 +1000 @@ -36,6 +36,7 @@ #include "init.h" #include +#include const char *const def_colorName[] = { COLOR_FOREGROUND, @@ -846,6 +847,29 @@ /*----------------------------------------------------------------------*/ /* EXTPROTO */ void +rxvt_change_directory(rxvt_t *r) +{ +/* + * Change to requested directory. + */ + char directory[PATH_MAX]; + + if (r->h->rs[Rs_changeDirectory] != NULL) { + STRCPY(directory, r->h->rs[Rs_changeDirectory]); +#if defined(__CYGWIN32__) + /* on a UNC drive the first backslash is lost!! */ + if (directory[0] == '\\' && directory[1] != '\\') + memmove(directory+1, directory, strlen(directory)+1); + cygwin_conv_to_full_posix_path(directory, directory); +#endif + if (chdir(directory)) + rxvt_print_error(strerror(errno)); + } +} + +/*----------------------------------------------------------------------*/ +/* EXTPROTO */ +void rxvt_init_command(rxvt_t *r, const char *const *argv) { /* --- src/main.c.mdr 2007-09-17 15:20:26.812500000 +1000 +++ src/main.c 2007-09-17 15:20:30.484375000 +1000 @@ -114,6 +114,7 @@ XMapWindow(r->Xdisplay, r->TermWin.parent[0]); rxvt_init_env(r); + rxvt_change_directory(r); rxvt_init_command(r, cmd_argv); return r; } --- src/rxvt.h.mdr 2007-09-17 09:37:36.406250000 +1000 +++ src/rxvt.h 2007-09-17 16:17:27.437500000 +1000 @@ -588,6 +588,8 @@ Rs_cursorBlink, Rs_pointerBlank, Rs_pointerBlankDelay, + Rs_changeDirectory, + Rs_swapButtons, NUM_RESOURCES } ; --- src/rxvtlib.h.in.mdr 2007-09-17 09:26:25.000000000 +1000 +++ src/rxvtlib.h.in 2007-09-17 16:16:45.000000000 +1000 @@ -220,6 +220,8 @@ #define Opt_mouseWheelScrollPage (1LU<<19) #define Opt_pointerBlank (1LU<<20) #define Opt_cursorBlink (1LU<<21) +#define Opt_changeDirectory (1LU<<22) +#define Opt_swapButtons (1LU<<23) /* place holder used for parsing command-line options */ #define Opt_Reverse (1LU<<30) #define Opt_Boolean (1LU<<31) --- src/xdefaults.c.mdr 2007-09-17 09:19:39.968750000 +1000 +++ src/xdefaults.c 2007-09-17 16:48:08.359375000 +1000 @@ -314,6 +314,8 @@ RSTRG(Rs_acs_chars, "acsChars", "string"), #endif /* ACS_ASCII */ RSTRG(Rs_answerbackstring, "answerbackString", "string"), + STRG(Rs_changeDirectory, NULL, "cd", "directory", "change directory"), + BOOL(Rs_swapButtons, "swapButtons", "bs", Opt_swapButtons, "swap middle and right buttons"), INFO("e", "command arg ...", "command to execute") };