ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/command.C
(Generate patch)

Comparing rxvt-unicode/src/command.C (file contents):
Revision 1.478 by root, Thu Feb 24 12:42:41 2011 UTC vs.
Revision 1.481 by root, Thu Mar 24 17:34:28 2011 UTC

936 else if (keysym == XK_Control_L || keysym == XK_Control_R) 936 else if (keysym == XK_Control_L || keysym == XK_Control_R)
937 mouse_slip_wheel_speed = 0; 937 mouse_slip_wheel_speed = 0;
938#endif 938#endif
939} 939}
940 940
941#if defined (KEYSYM_RESOURCE)
942unsigned int
943rxvt_term::cmd_write (const char *str, unsigned int count)
944{
945 unsigned int n, s;
946
947 n = cmdbuf_ptr - cmdbuf_base;
948 s = cmdbuf_base + CBUFSIZ - 1 - cmdbuf_endp;
949
950 if (n > 0 && s < count)
951 {
952 memmove (cmdbuf_base, cmdbuf_ptr,
953 (unsigned int) (cmdbuf_endp - cmdbuf_ptr));
954 cmdbuf_ptr = cmdbuf_base;
955 cmdbuf_endp -= n;
956 s += n;
957 }
958
959 if (count > s)
960 {
961 rxvt_warn ("data loss: cmd_write too large, continuing.\n");
962 count = s;
963 }
964
965 for (; count--;)
966 *cmdbuf_endp++ = *str++;
967
968 cmd_parse ();
969
970 return 0;
971}
972#endif
973
974void 941void
975rxvt_term::flush () 942rxvt_term::flush ()
976{ 943{
977 flush_ev.stop (); 944 flush_ev.stop ();
978 945
1152 { 1119 {
1153 } 1120 }
1154} event_handler; 1121} event_handler;
1155#endif 1122#endif
1156 1123
1124/* make sure all the cmd data is at beginning of cmdbuf */
1125void
1126rxvt_term::cmdbuf_reify ()
1127{
1128 if (cmdbuf_ptr == cmdbuf_base)
1129 return;
1130
1131 ssize_t used = cmdbuf_endp - cmdbuf_ptr;
1132
1133 memmove (cmdbuf_base, cmdbuf_ptr, used);
1134 cmdbuf_ptr = cmdbuf_base;
1135 cmdbuf_endp = cmdbuf_ptr + used;
1136
1137}
1138
1139#if defined (KEYSYM_RESOURCE)
1140void
1141rxvt_term::cmdbuf_append (const char *str, size_t count)
1142{
1143 cmdbuf_reify ();
1144
1145 size_t avail = cmdbuf_base + CBUFSIZ - cmdbuf_endp;
1146
1147 if (count > avail)
1148 return;
1149
1150 memcpy (cmdbuf_endp, str, count);
1151 cmdbuf_endp += count;
1152
1153 cmd_parse ();
1154}
1155#endif
1156
1157bool 1157bool
1158rxvt_term::pty_fill () 1158rxvt_term::pty_fill ()
1159{ 1159{
1160 ssize_t n = cmdbuf_endp - cmdbuf_ptr; 1160 cmdbuf_reify ();
1161 1161
1162 if (CBUFSIZ == n) 1162 size_t avail = cmdbuf_base + CBUFSIZ - cmdbuf_endp;
1163
1164 if (!avail)
1165 {
1163 n = 0; // normally this indicates a "too long" command sequence - just drop the data we have 1166 // normally this indicates a "too long" command sequence - just drop the data we have
1164
1165 memmove (cmdbuf_base, cmdbuf_ptr, n);
1166 cmdbuf_ptr = cmdbuf_base; 1167 cmdbuf_ptr = cmdbuf_base;
1167 cmdbuf_endp = cmdbuf_ptr + n; 1168 cmdbuf_endp = cmdbuf_ptr;
1169 avail = CBUFSIZ;
1170 }
1168 1171
1169 ssize_t r = read (pty->pty, cmdbuf_endp, CBUFSIZ - n); 1172 ssize_t r = read (pty->pty, cmdbuf_endp, avail);
1170 1173
1171 if (r > 0) 1174 if (r > 0)
1172 { 1175 {
1173 cmdbuf_endp += r; 1176 cmdbuf_endp += r;
1174 return true; 1177 return true;
2688 } 2691 }
2689 break; 2692 break;
2690 2693
2691 /* kidnapped escape sequence: Should be 8.3.48 */ 2694 /* kidnapped escape sequence: Should be 8.3.48 */
2692 case C1_ESA: /* ESC G */ 2695 case C1_ESA: /* ESC G */
2693 process_graphics (); 2696 // used by original rxvt for rob nations own graphics mode
2697 if (cmd_getc () == 'Q')
2698 tt_printf ("\033G0\012"); /* query graphics - no graphics */
2694 break; 2699 break;
2695 2700
2696 /* 8.3.63: CHARACTER TABULATION SET */ 2701 /* 8.3.63: CHARACTER TABULATION SET */
2697 case C1_HTS: /* ESC H */ 2702 case C1_HTS: /* ESC H */
2698 scr_set_tab (1); 2703 scr_set_tab (1);
3969 } 3974 }
3970 } 3975 }
3971} 3976}
3972/*}}} */ 3977/*}}} */
3973 3978
3974/*{{{ (do not) process Rob Nation's own graphics mode sequences */
3975void
3976rxvt_term::process_graphics ()
3977{
3978 unicode_t ch, cmd = cmd_getc ();
3979
3980 if (cmd == 'Q')
3981 {
3982 /* query graphics */
3983 tt_printf ("\033G0\012"); /* no graphics */
3984 return;
3985 }
3986 /* swallow other graphics sequences until terminating ':' */
3987 do
3988 ch = cmd_getc ();
3989 while (ch != ':');
3990}
3991/*}}} */
3992
3993/* ------------------------------------------------------------------------- */ 3979/* ------------------------------------------------------------------------- */
3994 3980
3995/* 3981/*
3996 * Send printf () formatted output to the command. 3982 * Send printf () formatted output to the command.
3997 * Only use for small amounts of data. 3983 * Only use for small amounts of data.
4025 4011
4026 if (v_buflen == 0) 4012 if (v_buflen == 0)
4027 { 4013 {
4028 ssize_t written = write (pty->pty, data, min (len, MAX_PTY_WRITE)); 4014 ssize_t written = write (pty->pty, data, min (len, MAX_PTY_WRITE));
4029 4015
4016 max_it (written, 0);
4017
4030 if ((unsigned int)written == len) 4018 if (written == len)
4031 return; 4019 return;
4032 4020
4033 data += written; 4021 data += written;
4034 len -= written; 4022 len -= written;
4035 } 4023 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines