--- rxvt-unicode/src/rxvtperl.xs 2006/02/04 16:12:48 1.97 +++ rxvt-unicode/src/rxvtperl.xs 2006/07/06 23:48:11 1.102 @@ -357,10 +357,7 @@ for (i = AvFILL (overlay_av); i >= 0; i--) if (SvIV (*av_fetch (overlay_av, i, 1)) == (long)this) - { - av_delete (overlay_av, i, G_DISCARD); - break; - } + break; for (; i < AvFILL (overlay_av); i++) av_store (overlay_av, i, SvREFCNT_inc (*av_fetch (overlay_av, i + 1, 0))); @@ -793,6 +790,10 @@ const_iv (Button5Mask), const_iv (AnyModifier), + const_iv (NoSymbol), + const_iv (GrabModeSync), + const_iv (GrabModeAsync), + const_iv (EVENT_NONE), const_iv (EVENT_READ), const_iv (EVENT_WRITE), @@ -925,14 +926,14 @@ int SET_FGCOLOR (int rend, int new_color) CODE: - RETVAL = SET_FGCOLOR (rend, new_color); + RETVAL = SET_FGCOLOR (rend, clamp (new_color, 0, TOTAL_COLORS - 1)); OUTPUT: RETVAL int SET_BGCOLOR (int rend, int new_color) CODE: - RETVAL = SET_BGCOLOR (rend, new_color); + RETVAL = SET_BGCOLOR (rend, clamp (new_color, 0, TOTAL_COLORS - 1)); OUTPUT: RETVAL @@ -1017,31 +1018,35 @@ CODE: THIS->perl.should_invoke [htype] += inc; -void +int rxvt_term::grab_button (int button, U32 modifiers, Window window = THIS->vt) CODE: - XGrabButton (THIS->dpy, button, modifiers, window, 1, - ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask, - GrabModeSync, GrabModeSync, None, GRAB_CURSOR); + RETVAL = XGrabButton (THIS->dpy, button, modifiers, window, 1, + ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask, + GrabModeSync, GrabModeSync, None, GRAB_CURSOR); + OUTPUT: RETVAL -void +int rxvt_term::ungrab_button (int button, U32 modifiers, Window window = THIS->vt) CODE: - XUngrabButton (THIS->dpy, button, modifiers, window); - -#if 0 + RETVAL = XUngrabButton (THIS->dpy, button, modifiers, window); + OUTPUT: RETVAL void -XGrabKey (rxvt_term *THIS, int keycode, U32 modifiers, Window window = THIS->vt) - C_ARGS: - THIS->dpy, keycode, modifiers, window, 1, - GrabModeSync, GrabModeSync +rxvt_term::XGrabKey (int keycode, U32 modifiers, Window window = THIS->vt, \ + int owner_events = 1, int pointer_mode = GrabModeAsync, int keyboard_mode = GrabModeAsync) + CODE: + XGrabKey (THIS->dpy, keycode, modifiers, window, owner_events, pointer_mode, keyboard_mode); void -XUngrabKey (rxvt_term *THIS, int keycode, U32 modifiers, Window window = THIS->vt) - C_ARGS: THIS->dpy, keycode, modifiers, window +rxvt_term::XUngrabKey (int keycode, U32 modifiers, Window window = THIS->vt) + CODE: + XUngrabKey (THIS->dpy, keycode, modifiers, window); -#endif +void +rxvt_term::XUngrabKeyboard (Time eventtime) + CODE: + XUngrabKeyboard (THIS->dpy, eventtime); bool rxvt_term::grab (Time eventtime, int sync = 0) @@ -1086,6 +1091,30 @@ ungrab (THIS); int +rxvt_term::XStringToKeysym (char *string) + CODE: + RETVAL = XStringToKeysym (string); + OUTPUT: RETVAL + +char * +rxvt_term::XKeysymToString (int sym) + CODE: + RETVAL = XKeysymToString (sym); + OUTPUT: RETVAL + +int +rxvt_term::XKeysymToKeycode (int sym) + CODE: + RETVAL = XKeysymToKeycode (THIS->dpy, sym); + OUTPUT: RETVAL + +int +rxvt_term::XKeycodeToKeysym (int code, int index) + CODE: + RETVAL = XKeycodeToKeysym (THIS->dpy, code, index); + OUTPUT: RETVAL + +int rxvt_term::strwidth (SV *str) CODE: { @@ -1211,24 +1240,19 @@ RETVAL SV * -rxvt_term::_env () - CODE: +rxvt_term::envv () + ALIAS: + argv = 1 + PPCODE: { - if (THIS->envv) - { - AV *av = newAV (); + stringvec *vec = ix ? THIS->argv : THIS->envv; - for (char **i = THIS->envv->begin (); i != THIS->envv->end (); ++i) - if (*i) - av_push (av, newSVpv (*i, 0)); + EXTEND (SP, vec->size ()); - RETVAL = newRV_noinc ((SV *)av); - } - else - RETVAL = &PL_sv_undef; + for (char **i = vec->begin (); i != vec->end (); ++i) + if (*i) + PUSHs (sv_2mortal (newSVpv (*i, 0))); } - OUTPUT: - RETVAL int rxvt_term::pty_ev_events (int events = EVENT_UNDEF) @@ -1294,6 +1318,32 @@ rxvt_term::focus_out () void +rxvt_term::key_press (unsigned int state, unsigned int keycode, Time time = CurrentTime) + ALIAS: + key_release = 1 + CODE: +{ + XKeyEvent xkey; + + memset (&xkey, 0, sizeof (xkey)); + + xkey.time = time; + xkey.state = state; + xkey.keycode = keycode; + + xkey.type = ix ? KeyRelease : KeyPress; + xkey.display = THIS->dpy; + xkey.window = THIS->vt; + xkey.root = THIS->display->root; + xkey.subwindow = THIS->vt; + + if (ix) + THIS->key_release (xkey); + else + THIS->key_press (xkey); +} + +void rxvt_term::want_refresh () CODE: THIS->want_refresh = 1; @@ -1788,7 +1838,6 @@ XChangeProperty (THIS->dpy, window, property, type, format, PropModeReplace, (unsigned char *)data_, len / elemsize); - XSync (THIS->dpy, 0); } Atom