Tue Mar 14 19:11:26 PST 2000 Michael Jennings <mej@eterm.org>

Some further fixes for inline functions, 2 new winop actions, brand
	new and improved profiling macros, some miscellaneous fixes for SGI
	from Kimball Thurston <kimball@sgrail.com>, and more robust checking
	in the pasting code.


SVN revision: 2235
eterm-0.10
Michael Jennings 23 years ago
parent b46e5b0ae9
commit 4d1fd23d7e
  1. 8
      ChangeLog
  2. 2
      configure.in
  3. 2
      doc/Eterm.1.in
  4. 4
      src/buttons.c
  5. 24
      src/command.c
  6. 4
      src/debug.h
  7. 30
      src/e.c
  8. 36
      src/events.c
  9. 16
      src/menus.c
  10. 10
      src/misc.c
  11. 1
      src/misc.h
  12. 8
      src/options.c
  13. 5
      src/pixmap.c
  14. 2
      src/pixmap.h
  15. 109
      src/profile.h
  16. 65
      src/screen.c
  17. 2
      src/startup.h
  18. 19
      src/term.c
  19. 8
      utils/Etwinop

@ -3339,3 +3339,11 @@ Wed Mar 8 19:35:36 PST 2000 Michael Jennings <mej@eterm.org>
named pipe rather than to /dev/tty0.
-------------------------------------------------------------------------------
Tue Mar 14 19:11:26 PST 2000 Michael Jennings <mej@eterm.org>
Some further fixes for inline functions, 2 new winop actions, brand
new and improved profiling macros, some miscellaneous fixes for SGI
from Kimball Thurston <kimball@sgrail.com>, and more robust checking
in the pasting code.
-------------------------------------------------------------------------------

@ -6,7 +6,7 @@ AM_INIT_AUTOMAKE(Eterm, 0.9.1)
dnl# Set some basic variables
DATE="`date '+%d %B %Y'`"
AC_SUBST(DATE)
AUTHORS="Michael Jennings (mej@eterm.org) and Tuomo Venäläinen (vendu@cc.hut.fi) "
AUTHORS="Michael Jennings (mej@eterm.org) "
AC_SUBST(AUTHORS)
AC_DEFINE_UNQUOTED(AUTHORS, "$AUTHORS")

@ -1542,7 +1542,7 @@ directive to allow for separation of the configuration information into
multiple files.
.SH AUTHORS
Michael Jennings (mej@eterm.org) and Tuomo Venäläinen (vendu@cc.hut.fi).
Michael Jennings (mej@eterm.org)
Man page re-written for version 0.8 by Shaleh (shaleh@debian.org).
.SH URL(s)

@ -46,12 +46,12 @@ static const char cvs_ident[] = "$Id$";
#include "term.h"
#include "windows.h"
static __inline__ void draw_string(buttonbar_t *, Drawable, GC, int, int, char *, size_t);
static inline void draw_string(buttonbar_t *, Drawable, GC, int, int, char *, size_t);
buttonbar_t *buttonbar = NULL;
long bbar_total_h = -1;
static __inline__ void
static inline void
draw_string(buttonbar_t *bbar, Drawable d, GC gc, int x, int y, char *str, size_t len)
{

@ -45,6 +45,7 @@ static const char cvs_ident[] = "$Id$";
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
#include <string.h>
#ifdef HAVE_FCNTL_H
# include <fcntl.h>
#endif
@ -106,9 +107,6 @@ static const char cvs_ident[] = "$Id$";
#if defined(linux)
# include <linux/tty.h> /* For N_TTY_BUF_SIZE. */
#endif
#if defined(linux)
# include <string.h> /* For strsep(). -vendu */
#endif
/* Eterm-specific Headers */
#include "command.h"
@ -1130,9 +1128,9 @@ clean_exit(void)
*/
#ifdef __sgi
__inline__ int sgi_get_pty(void);
inline int sgi_get_pty(void);
__inline__ int
inline int
sgi_get_pty(void)
{
int fd = -1;
@ -1146,9 +1144,9 @@ sgi_get_pty(void)
#endif
#ifdef HAVE_DEV_PTC
__inline__ int aix_get_pty(void);
inline int aix_get_pty(void);
__inline__ int
inline int
aix_get_pty(void)
{
@ -1163,9 +1161,9 @@ aix_get_pty(void)
#endif
#ifdef HAVE_SCO_PTYS
__inline__ int sco_get_pty(void);
inline int sco_get_pty(void);
__inline__ int
inline int
sco_get_pty(void)
{
@ -1197,9 +1195,9 @@ sco_get_pty(void)
#endif
#ifdef HAVE_DEV_PTMX
__inline__ int svr_get_pty(void);
inline int svr_get_pty(void);
__inline__ int
inline int
svr_get_pty(void)
{
@ -1230,9 +1228,9 @@ svr_get_pty(void)
#define PTYCHAR1 "pqrstuvwxyz"
#define PTYCHAR2 "0123456789abcdefghijklmnopqrstuvwxyz"
__inline__ int gen_get_pty(void);
inline int gen_get_pty(void);
__inline__ int
inline int
gen_get_pty(void)
{

@ -27,6 +27,10 @@
#include <stdlib.h>
#include <time.h>
#if defined(__GNUC__) && !defined(inline)
# define inline __inline__
#endif
extern unsigned int debug_level;
/* Assert macros stolen from my work on Ebar. If these macros break with your cpp, let me know -- mej@eterm.org */

@ -369,6 +369,36 @@ eterm_handle_winop(char *action)
XMapWindow(Xdisplay, win);
} else if (!BEG_STRCASECMP(action, "unmap")) {
XUnmapWindow(Xdisplay, win);
} else if (!BEG_STRCASECMP(action, "move")) {
int x, y, n;
char *xx, *yy;
n = NumWords(action);
if (n == 3 || n == 4) {
if (n == 3) {
win = TermWin.parent;
}
xx = PWord(n - 1, action);
yy = PWord(n, action);
x = (int) strtol(xx, (char **) NULL, 0);
y = (int) strtol(yy, (char **) NULL, 0);
XMoveWindow(Xdisplay, win, x, y);
}
} else if (!BEG_STRCASECMP(action, "resize")) {
int w, h, n;
char *ww, *hh;
n = NumWords(action);
if (n == 3 || n == 4) {
if (n == 3) {
win = TermWin.parent;
}
ww = PWord(n - 1, action);
hh = PWord(n, action);
w = (int) strtol(ww, (char **) NULL, 0);
h = (int) strtol(hh, (char **) NULL, 0);
XResizeWindow(Xdisplay, win, w, h);
}
} else if (!BEG_STRCASECMP(action, "kill")) {
XKillClient(Xdisplay, win);
} else if (!BEG_STRCASECMP(action, "iconify")) {

@ -46,6 +46,7 @@ static const char cvs_ident[] = "$Id$";
#include "menus.h"
#include "options.h"
#include "pixmap.h"
#include "profile.h"
#include "screen.h"
#include "scrollbar.h"
#include "term.h"
@ -199,21 +200,18 @@ event_win_is_parent(register event_dispatcher_data_t * data, Window win)
unsigned char
handle_key_press(event_t * ev)
{
#ifdef COUNT_X_EVENTS
static long long keypress_cnt = 0;
#endif
#ifdef PROFILE_X_EVENTS
struct timeval keypress_start, keypress_stop;
#endif
P_SETTIMEVAL(keypress_start);
PROF_INIT(handle_key_press);
D_EVENTS(("handle_key_press(ev [%8p] on window 0x%08x)\n", ev, ev->xany.window));
COUNT_EVENT(keypress_cnt);
REQUIRE_RVAL(XEVENT_IS_MYWIN(ev, &primary_data), 0);
COUNT_EVENT(keypress_cnt);
lookup_key(ev);
P_SETTIMEVAL(keypress_stop);
P_EVENT_TIME("KeyPress", keypress_start, keypress_stop);
PROF_DONE(handle_key_press);
PROF_TIME(handle_key_press);
return 1;
}
@ -550,15 +548,11 @@ handle_selection_request(event_t * ev)
unsigned char
handle_expose(event_t * ev)
{
#ifdef COUNT_X_EVENTS
static long long expose_cnt = 0;
#endif
#ifdef PROFILE_X_EVENTS
struct timeval expose_start, expose_stop;
#endif
P_SETTIMEVAL(expose_start);
PROF_INIT(handle_expose);
D_EVENTS(("handle_expose(ev [%8p] on window 0x%08x)\n", ev, ev->xany.window));
REQUIRE_RVAL(XEVENT_IS_MYWIN(ev, &primary_data), 0);
@ -581,8 +575,8 @@ handle_expose(event_t * ev)
XSelectInput(Xdisplay, desktop_window, PropertyChangeMask);
}
#endif
P_SETTIMEVAL(expose_stop);
P_EVENT_TIME("Expose", expose_start, expose_stop);
PROF_DONE(handle_expose);
PROF_TIME(handle_expose);
return 1;
}
@ -712,18 +706,14 @@ handle_button_release(event_t * ev)
unsigned char
handle_motion_notify(event_t * ev)
{
#ifdef COUNT_X_EVENTS
static long long motion_cnt = 0;
#endif
#ifdef PROFILE_X_EVENTS
struct timeval motion_start, motion_stop;
#endif
PROF_INIT(handle_motion_notify);
D_EVENTS(("handle_motion_notify(ev [%8p] on window 0x%08x)\n", ev, ev->xany.window));
COUNT_EVENT(motion_cnt);
P_SETTIMEVAL(motion_start);
REQUIRE_RVAL(XEVENT_IS_MYWIN(ev, &primary_data), 0);
if ((PrivateModes & PrivMode_mouse_report) && !(button_state.bypass_keystate))
@ -743,10 +733,12 @@ handle_motion_notify(event_t * ev)
#endif
selection_extend((ev->xbutton.x), (ev->xbutton.y), (ev->xbutton.state & Button3Mask));
}
P_SETTIMEVAL(motion_stop);
P_EVENT_TIME("MotionNotify", motion_start, motion_stop);
PROF_DONE(handle_motion_notify);
PROF_TIME(handle_motion_notify);
return 1;
}
PROF_DONE(handle_motion_notify);
PROF_TIME(handle_motion_notify);
return 1;
}

@ -52,12 +52,12 @@ static Time button_press_time;
static int button_press_x = 0, button_press_y = 0;
static menu_t *current_menu;
static __inline__ void grab_pointer(Window win);
static __inline__ void ungrab_pointer(void);
static __inline__ void draw_string(Drawable d, GC gc, int x, int y, char *str, size_t len);
static __inline__ unsigned short center_coords(register unsigned short c1, register unsigned short c2);
static inline void grab_pointer(Window win);
static inline void ungrab_pointer(void);
static inline void draw_string(Drawable d, GC gc, int x, int y, char *str, size_t len);
static inline unsigned short center_coords(register unsigned short c1, register unsigned short c2);
static __inline__ void
static inline void
grab_pointer(Window win)
{
@ -88,7 +88,7 @@ grab_pointer(Window win)
}
}
static __inline__ void
static inline void
ungrab_pointer(void)
{
@ -96,7 +96,7 @@ ungrab_pointer(void)
XUngrabPointer(Xdisplay, CurrentTime);
}
static __inline__ void
static inline void
draw_string(Drawable d, GC gc, int x, int y, char *str, size_t len)
{
@ -110,7 +110,7 @@ draw_string(Drawable d, GC gc, int x, int y, char *str, size_t len)
XDrawString(Xdisplay, d, gc, x, y, str, len);
}
static __inline__ unsigned short
static inline unsigned short
center_coords(register unsigned short c1, register unsigned short c2)
{

@ -297,9 +297,17 @@ safe_print_string(char *str, unsigned long len)
char *p;
unsigned long n = 0, i;
if (len == ((unsigned long) -1)) {
FREE(ret_buff);
rb_size = 0;
return ((char *) NULL);
}
if (ret_buff == NULL) {
ret_buff = (char *) MALLOC(len + 1);
rb_size = len;
ret_buff = (char *) MALLOC(rb_size + 1);
} else if (len > rb_size) {
rb_size = len;
ret_buff = (char *) REALLOC(ret_buff, rb_size + 1);
}
for (i = 0, p = ret_buff; i < len; i++, str++, n++) {
if (n + 2 >= rb_size) {

@ -42,6 +42,7 @@ extern char *str_trim(char *str);
extern int parse_escaped_string(char *str);
extern const char *search_path(const char *pathlist, const char *file, const char *ext);
extern const char *find_file(const char *file, const char *ext);
extern char *safe_print_string(char *buff, unsigned long len);
extern unsigned long add_carriage_returns(unsigned char *buff, unsigned long cnt);
_XFUNCPROTOEND

@ -2504,7 +2504,7 @@ parse_image(char *buff, void *state)
tmp = (int *) MALLOC(sizeof(int));
return ((void *) tmp);
}
ASSERT_RVAL(state != NULL, (file_skip_to_end(), NULL));
ASSERT_RVAL(state != NULL, (void *)(file_skip_to_end(), NULL));
if (*buff == CONF_END_CHAR) {
int *tmp;
@ -2973,7 +2973,7 @@ parse_menu(char *buff, void *state)
menu = menu_create(title);
return ((void *) menu);
}
ASSERT_RVAL(state != NULL, (file_skip_to_end(), NULL));
ASSERT_RVAL(state != NULL, (void *)(file_skip_to_end(), NULL));
menu = (menu_t *) state;
if (*buff == CONF_END_CHAR) {
if (!(*(menu->title))) {
@ -3021,7 +3021,7 @@ parse_menuitem(char *buff, void *state)
static menu_t *menu;
menuitem_t *curitem;
ASSERT_RVAL(state != NULL, (file_skip_to_end(), NULL));
ASSERT_RVAL(state != NULL, (void *)(file_skip_to_end(), NULL));
if (*buff == CONF_BEGIN_CHAR) {
menu = (menu_t *) state;
curitem = menuitem_create(NULL);
@ -3096,7 +3096,7 @@ parse_bbar(char *buff, void *state)
bbar = bbar_create();
return ((void *) bbar);
}
ASSERT_RVAL(state != NULL, (file_skip_to_end(), NULL));
ASSERT_RVAL(state != NULL, (void *)(file_skip_to_end(), NULL));
bbar = (buttonbar_t *) state;
if (*buff == CONF_END_CHAR) {
bbar_add(bbar);

@ -45,6 +45,7 @@ static const char cvs_ident[] = "$Id$";
#include "screen.h"
#include "scrollbar.h"
#include "term.h"
#include "windows.h"
#ifdef PIXMAP_SUPPORT
static ImlibBorder bord_none = { 0, 0, 0, 0 };
@ -1556,7 +1557,7 @@ get_desktop_pixmap(void)
if (desktop_window == None) {
D_PIXMAP(("No desktop window. Aborting.\n"));
free_desktop_pixmap();
return (desktop_pixmap = None);
return (None);
}
prop = XInternAtom(Xdisplay, "_XROOTPMAP_ID", True);
@ -1564,7 +1565,7 @@ get_desktop_pixmap(void)
if (prop == None && prop2 == None) {
free_desktop_pixmap();
return (desktop_pixmap = None);
return (None);
}
if (color_pixmap != None) {
D_PIXMAP(("Removing old solid color pixmap 0x%08x.\n", color_pixmap));

@ -51,7 +51,7 @@
# define delete_simage(simg) NOP
#endif
#define PIXMAP_EXT NULL
/* '[', 2*4 + 2*3 digits + 3 delimiters, ']'. -vendu */
#define GEOM_LEN 19
enum {

@ -1,78 +1,49 @@
/* profile.h for Eterm.
* 25 Mar 1998, vendu.
/*
* Copyright (C) 1997-2000, Michael Jennings
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies of the Software, its documentation and marketing & publicity
* materials, and acknowledgment shall be given in the documentation, materials
* and software packages that this Software was used.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef _PROFILE_H
# define _PROFILE_H
/* included for a possible #define PROFILE */
# include <stdio.h>
#ifdef ENABLE_PROFILE
# include <sys/time.h>
# include <unistd.h>
/* NOTE: if PROFILE is not defined, all macros in this file will
* be set to (void)0 so they won't get compiled into binaries.
*/
# ifdef ENABLE_PROFILE
/* Data structures */
typedef struct {
long long total;
struct timeval start;
struct timeval stop;
} P_counter_t;
/* Profiling macros */
/* Sets tv to current time.
* struct timeval tv;
* Usage: P_SETTIMEVAL(struct timeval tv);
*/
# define P_SETTIMEVAL(tv) gettimeofday(&(tv), NULL)
/* NOT FINISHED YET */
# define P_UPDATETOTAL(cnt) { \
cnt.total += P_CMPTIMEVALS_USEC(cnt.start, cnt.stop); \
}
/* Declare cnt and initialize by setting to zero.
* P_counter_t cnt;
* Usage: P_INITCOUNTER(counter);
* NOTES: cnt will be declared. This means that you'll
* probably need to localize a block where to use this; see
* the definition of P_CALL() elsewhere in this file.
*/
# define P_INITCOUNTER(cnt) \
P_counter_t cnt = { 0, { 0, 0 }, { 0, 0 } }
/* Time from start to stop in microseconds
* struct timeval start, stop;
*/
# define P_CMPTIMEVALS_USEC(start, stop) \
((stop.tv_sec - start.tv_sec)*1000000 \
+ (stop.tv_usec - start.tv_usec))
/* Counts the time spent in the call f and outputs
* str: <time spent in f in microseconds> to stderr.
* NOTE: f can be any function call, for example sqrt(5).
*/
# define P_CALL(f, str) { \
P_INITCOUNTER(cnt); \
P_SETTIMEVAL(cnt.start); \
f; \
P_SETTIMEVAL(cnt.stop); \
fprintf(stderr, "%s: %ld\n", str, \
P_CMPTIMEVALS_USEC(cnt.start, cnt.stop)); \
}
# else /* ENABLE_PROFILE */
# define P_SETTIMEVAL(tv) ((void)0)
# define P_UPDATETOTAL(cnt) ((void)0)
# define P_INITCOUNTER(cnt) ((void)0)
# define P_CMPTIMEVALS_USEC(start, stop) ((void)0)
# define P_CALL(f, str) f
# endif /* ENABLE_PROFILE */
#endif /* _PROFILE_H */
const char *func_name;
struct timeval start_time, end_time;
} prof_time_t;
# define PROF_INIT(f) prof_time_t f##_prof_time = { #f, { 0, 0 }, { 0, 0 } }; gettimeofday(& f##_prof_time.start_time, NULL)
# define PROF_DONE(f) gettimeofday(& f##_prof_time.end_time, NULL)
# define PROF_TIME(f) do {prof_time_t t = f##_prof_time; unsigned long s, u; s = t.end_time.tv_sec - t.start_time.tv_sec; u = t.end_time.tv_usec - t.start_time.tv_usec; \
if (u > 1000000UL) {s--; u += 1000000UL;} D_PROFILE(("Elapsed time for function %s: %d.%06d seconds.\n", #f, s, u));} while (0)
# define PROF_FUNC(f, c) do {PROF_INIT(f); c; PROF_DONE(f); PROF_TIME(f);} while (0)
#else
# define PROF_INIT(f) NOP
# define PROF_DONE(f) NOP
# define PROF_TIME(f) NOP
# define PROF_FUNC(f, c) NOP
#endif /* ENABLE_PROFILE */
#endif /* _PROFILE_H */

@ -41,9 +41,7 @@ static const char cvs_ident[] = "$Id$";
#ifdef PIXMAP_SUPPORT
# include "pixmap.h"
#endif
#ifdef PROFILE_SCREEN
# include "profile.h"
#endif
#include "profile.h"
#include "term.h"
/* These arrays store the text and rendering info that were last drawn to the screen. */
@ -107,8 +105,8 @@ static short lost_multi = 0;
#endif
/* Fill part/all of a drawn line with blanks. */
__inline__ void blank_line(text_t *, rend_t *, int, rend_t);
__inline__ void
inline void blank_line(text_t *, rend_t *, int, rend_t);
inline void
blank_line(text_t * et, rend_t * er, int width, rend_t efs)
{
/* int i = width; */
@ -121,8 +119,8 @@ blank_line(text_t * et, rend_t * er, int width, rend_t efs)
}
/* Create a new row in the screen buffer and initialize it. */
__inline__ void blank_screen_mem(text_t **, rend_t **, int, rend_t);
__inline__ void
inline void blank_screen_mem(text_t **, rend_t **, int, rend_t);
inline void
blank_screen_mem(text_t **tp, rend_t **rp, int row, rend_t efs)
{
register unsigned int i = TermWin.ncol;
@ -582,14 +580,7 @@ scroll_text(int row1, int row2, int count, int spec)
{
register int i, j;
#ifdef PROFILE_SCREEN
static long call_cnt = 0;
static long long total_time = 0;
P_INITCOUNTER(cnt);
P_SETTIMEVAL(cnt.start);
#endif
PROF_INIT(scroll_text);
D_SCREEN(("scroll_text(%d,%d,%d,%d): %s\n", row1, row2, count, spec, (current_screen == PRIMARY) ? "Primary" : "Secondary"));
if (count == 0 || (row1 > row2))
@ -679,12 +670,8 @@ scroll_text(int row1, int row2, int count, int spec)
}
count = -count;
}
#ifdef PROFILE_SCREEN
P_SETTIMEVAL(cnt.stop);
total_time += P_CMPTIMEVALS_USEC(cnt.start, cnt.stop);
fprintf(stderr, "scroll_text(%ld): %ld microseconds (%d)\n",
++call_cnt, P_CMPTIMEVALS_USEC(cnt.start, cnt.stop), total_time);
#endif
PROF_DONE(scroll_text);
PROF_TIME(scroll_text);
return count;
}
@ -1612,12 +1599,8 @@ scr_refresh(int type)
register int nrows = TermWin.nrow;
register int ncols = TermWin.ncol;
#endif
#ifdef PROFILE_SCREEN
static long call_cnt = 0;
static long long total_time = 0;
P_INITCOUNTER(cnt);
#endif
PROF_INIT(scr_refresh);
switch (type) {
case NO_REFRESH:
@ -1633,10 +1616,6 @@ scr_refresh(int type)
if (type == NO_REFRESH)
return;
#ifdef PROFILE_SCREEN
P_SETTIMEVAL(cnt.start);
#endif
if (buffer_pixmap) {
draw_buffer = buffer_pixmap;
} else {
@ -1999,12 +1978,8 @@ scr_refresh(int type)
refresh_all = 0;
D_SCREEN(("Exiting.\n"));
#ifdef PROFILE_SCREEN
P_SETTIMEVAL(cnt.stop);
total_time += P_CMPTIMEVALS_USEC(cnt.start, cnt.stop);
fprintf(stderr, "scr_refresh(%ld): %ld microseconds (%d)\n",
++call_cnt, P_CMPTIMEVALS_USEC(cnt.start, cnt.stop), total_time);
#endif
PROF_DONE(scr_refresh);
PROF_TIME(scr_refresh);
}
int
@ -2259,7 +2234,9 @@ selection_paste(Window win, unsigned prop, int Delete)
return;
for (nread = 0, bytes_after = 1; bytes_after > 0;) {
if ((XGetWindowProperty(Xdisplay, win, prop, (nread / 4), PROP_SIZE, Delete, AnyPropertyType, &actual_type, &actual_fmt, &nitems, &bytes_after, &data) != Success)) {
XFree(data);
if (data != NULL) {
XFree(data);
}
return;
}
nread += nitems;
@ -2277,12 +2254,18 @@ selection_paste(Window win, unsigned prop, int Delete)
xtextp.nitems = nitems;
XmbTextPropertyToTextList(Xdisplay, &xtextp, &cl, &size);
for (i = 0 ; i < size ; i ++) {
PasteIt(cl[i], strlen(cl[i]));
if (cl) {
for (i = 0 ; i < size ; i ++) {
if (cl[i]) {
PasteIt(cl[i], strlen(cl[i]));
}
}
XFreeStringList(cl);
}
XFreeStringList(cl);
}
XFree(data);
if (data) {
XFree(data);
}
}
}

@ -41,7 +41,7 @@
#define THEME_CFG "theme.cfg"
#define USER_CFG "user.cfg"
#define MAX_COLS 200
#define MAX_COLS 250
#define MAX_ROWS 128
#ifdef MIN

@ -41,6 +41,7 @@ static const char cvs_ident[] = "$Id$";
#include "e.h"
#include "events.h"
#include "font.h"
#include "misc.h"
#include "startup.h"
#include "options.h"
#include "pixmap.h"
@ -220,21 +221,27 @@ lookup_key(XEvent * ev)
kbuf[0] = '\0';
/* Lookup the string equivalent in terms of the XIM input context. */
len = XmbLookupString(xim_input_context, &ev->xkey, (char *) kbuf, sizeof(short_buf), &keysym, &status_return);
D_TTY(("XmbLookupString() gave us len %d, keysym 0x%04x, and buffer \"%s\" based on the XIM input context %010p\n",
len, keysym, safe_print_string(kbuf, len), xim_input_context));
/* Whoops, it's too long. Allocate a new buffer and repeat the call. */
if (status_return == XBufferOverflow) {
kbuf = (unsigned char *) MALLOC(len + 1);
kbuf_alloced = 1;
len = XmbLookupString(xim_input_context, &ev->xkey, (char *) kbuf, len, &keysym, &status_return);
D_TTY(("XmbLookupString() gave us len %d, keysym 0x%04x, and buffer \"%s\" based on the XIM input context %010p\n",
len, keysym, safe_print_string(kbuf, len), xim_input_context));
}
valid_keysym = (status_return == XLookupKeySym) || (status_return == XLookupBoth);
} else {
/* No XIM input context. Do it the normal way. */
len = XLookupString(&ev->xkey, (char *) kbuf, sizeof(short_buf), &keysym, NULL);
D_TTY(("XLookupString() gave us len %d, keysym 0x%04x, and buffer \"%s\"\n", len, keysym, safe_print_string(kbuf, len)));
valid_keysym = 1;
}
#else /* USE_XIM */
/* Translate the key event into its corresponding string according to X. This also gets us a keysym. */
len = XLookupString(&ev->xkey, (char *) kbuf, sizeof(kbuf), &keysym, NULL);
D_TTY(("XLookupString() gave us len %d, keysym 0x%04x, and buffer \"%s\"\n", len, keysym, safe_print_string(kbuf, len)));
/* If there is no string and it's a Latin2-4 character, replace it with the Latin1 character instead. */
if (!len && (keysym >= 0x0100) && (keysym < 0x0400)) {
@ -741,17 +748,7 @@ sprintf((char *) kbuf,"\033[%02d~", (int)((n) + (keysym - fkey))); \
tt_write(&ch, 1);
}
#if DEBUG >= DEBUG_CMD
if (debug_level >= DEBUG_CMD) {
char *p;
int i;
fprintf(stderr, "key 0x%04x[%d]: `", (unsigned int) keysym, len);
for (i = 0, p = (char *) kbuf; i < len; i++, p++)
fprintf(stderr, (*p >= ' ' && *p < '\177' ? "%c" : "\\%03o"), *p);
fprintf(stderr, "'\n");
}
#endif /* DEBUG_CMD */
D_TTY(("After handling: len %d, keysym 0x%04x, and buffer \"%s\"\n", len, keysym, safe_print_string(kbuf, len)));
tt_write(kbuf, len); /* Send the resulting string to the child process */
LK_RET();

@ -5,7 +5,7 @@
# $Id$
if [ $# -eq 0 ]; then
echo "Syntax: Etwinop { raise | lower | map | unmap | iconify | kill } [windowid]"
echo "Syntax: Etwinop { raise | lower | map | unmap | move | resize | iconify | kill } [windowid]"
echo
exit 0
fi
@ -23,10 +23,6 @@ else
ac_n= ac_c='\c'
fi
if [ "X$2" = "X" ]; then
winop="$1"
else
winop="$1 $2"
fi
winop="$*"
echo $ac_n "]7;winop:$winop$ac_c"

Loading…
Cancel
Save