Tue Dec 14 17:22:23 2004 Michael Jennings (mej)

The benefits of being a passenger on a long road trip...  The
beginnings of EWMH opacity (a la xcompmgr) support and (hopefully)
UTF-8 support.  Both as yet untested.
----------------------------------------------------------------------


SVN revision: 12471
This commit is contained in:
Michael Jennings 2004-12-14 23:24:33 +00:00
parent f8a0003371
commit 19cae1a53d
12 changed files with 132 additions and 47 deletions

View File

@ -5265,3 +5265,9 @@ Tue Dec 14 17:13:02 2004 Michael Jennings (mej)
0.9.3 release
----------------------------------------------------------------------
Tue Dec 14 17:22:23 2004 Michael Jennings (mej)
The benefits of being a passenger on a long road trip... The
beginnings of EWMH opacity (a la xcompmgr) support and (hopefully)
UTF-8 support. Both as yet untested.
----------------------------------------------------------------------

View File

@ -4,11 +4,14 @@
Summary: Enlightened terminal emulator
Name: Eterm
Version: 0.9.3
Release: 1
Version: 0.9.4
#Release: 1
Release: 0.%(date '+%Y%m%d')
License: BSD
Group: User Interface/X
Requires: imlib2, imlib2-loader_jpeg, imlib2-loader_png
#BuildSuggests: XFree86-devel xorg-x11-devel freetype-devel
BuildRequires: imlib2-devel
Source0: ftp://ftp.eterm.org/pub/Eterm/%{name}-%{version}.tar.%{compression}
Source1: ftp://ftp.eterm.org/pub/Eterm/%{name}-bg-%{version}.tar.%{compression}
URL: http://www.eterm.org/

View File

@ -22,7 +22,7 @@ SAVE_AUTOMAKE="$AUTOMAKE"
SAVE_AUTOCONF="$AUTOCONF"
AC_INIT(src/feature.h)
AM_INIT_AUTOMAKE(Eterm, 0.9.3)
AM_INIT_AUTOMAKE(Eterm, 0.9.4)
dnl# Set some basic variables
DATE="`date '+%d %B %Y'`"

View File

@ -107,6 +107,11 @@ static const char cvs_ident[] = "$Id$";
#if defined(linux)
# include <linux/tty.h> /* For N_TTY_BUF_SIZE. */
#endif
#ifdef MULTI_CHARSET
# include <locale.h>
# include <langinfo.h>
# include <iconv.h>
#endif
/* Eterm-specific Headers */
#include "command.h"
@ -3464,9 +3469,7 @@ main_loop(void)
if (ch >= ' ' || ch == '\t' || ch == '\n' || ch == '\r') {
/* Read a text string from the input buffer */
int nlines = 0;
/* unsigned char * str; */
register unsigned char *str;
unsigned char *str;
D_CMD(("Command buffer contains %d characters.\n", cmdbuf_endp - cmdbuf_ptr));
D_VT(("\n%s\n\n", safe_print_string(cmdbuf_ptr - 1, cmdbuf_endp - cmdbuf_ptr + 1)));
@ -3489,18 +3492,59 @@ main_loop(void)
}
#endif
if (ch >= ' ' || ch == '\t' || ch == '\r') {
/* nothing */
NOP;
} else if (ch == '\n') {
nlines++;
if (++refresh_count >= (refresh_limit * (TERM_WINDOW_GET_ROWS() - 1)))
break;
} else { /* unprintable */
} else {
/* unprintable */
cmdbuf_ptr--;
break;
}
}
D_SCREEN(("Adding %d lines (%d chars); str == %8p, cmdbuf_ptr == %8p, cmdbuf_endp == %8p\n", nlines, cmdbuf_ptr - str, str, cmdbuf_ptr, cmdbuf_endp));
scr_add_lines(str, nlines, (cmdbuf_ptr - str));
D_SCREEN(("Adding %d lines (%d chars); str == %8p, cmdbuf_ptr == %8p, cmdbuf_endp == %8p\n",
nlines, cmdbuf_ptr - str, str, cmdbuf_ptr, cmdbuf_endp));
#ifdef MULTI_CHARSET
if (!strcmp(nl_langinfo(CODESET), "UTF-8")) {
iconv_t handle;
handle = iconv_open("UTF-8", "UCS2");
if (handle == SPIF_CAST_C(iconv_t) -1) {
print_error("Unable to decode UTF-8 locale %s to UCS-2. Defaulting to portable C locale.\n",
setlocale(LC_ALL, ""));
setlocale(LC_ALL, "C");
} else {
char *outbuff, *pinbuff, *poutbuff;
size_t bufflen, outlen = 0, retval;
pinbuff = (char *) str;
bufflen = cmdbuf_ptr - str;
poutbuff = outbuff = SPIF_CAST_C(char *) MALLOC(bufflen * 6);
errno = 0;
retval = iconv(handle, &pinbuff, &bufflen, &poutbuff, &outlen);
if (retval != (size_t) -1) {
errno = 0;
}
if (errno == E2BIG) {
print_error("My UTF-8 decode buffer was too small by %lu bytes?!", bufflen);
} else if (errno == EILSEQ) {
print_error("Illegal multibyte sequence encountered at \'%c\' (0x%02x); skipping.\n",
*pinbuff, *pinbuff);
*pinbuff = ' ';
pinbuff++;
} else if (errno == EINVAL) {
D_VT(("Incomplete multibyte sequence encountered.\n"));
}
if (pinbuff > (char *) str) {
cmdbuf_ptr = (unsigned char *) pinbuff;
scr_add_lines(str, nlines, (cmdbuf_ptr - str));
}
}
} else
#endif
scr_add_lines(str, nlines, (cmdbuf_ptr - str));
} else {
switch (ch) {
# ifdef NO_ENQ_ANS

View File

@ -202,7 +202,7 @@
#define META8_OPTION
/* Attempt to deactivate UTF-8 and similar locales. */
#define NO_UTF8_LOCALE
/* #define NO_UTF8_LOCALE */
/********************* Miscellaneous options *********************/

View File

@ -150,6 +150,7 @@ int rs_delay = -1;
unsigned char rs_es_dock = BBAR_DOCKED_BOTTOM;
char *rs_es_font = NULL;
#endif
spif_uint32_t rs_opacity = 0xffffffff;
unsigned int rs_line_space = 0;
unsigned int rs_meta_mod = 0, rs_alt_mod = 0, rs_numlock_mod = 0;
#ifdef KEYSYM_ATTRIBUTE
@ -245,6 +246,7 @@ spifopt_t option_list[] = {
SPIFOPT_STR_LONG("trough-pixmap", "scrollbar background (trough) pixmap", rs_pixmaps[image_sb]),
SPIFOPT_STR_LONG("anchor-pixmap", "scrollbar anchor pixmap", rs_pixmaps[image_sa]),
SPIFOPT_STR_LONG("menu-pixmap", "menu pixmap", rs_pixmaps[image_menu]),
SPIFOPT_INT('o', "opacity", "window opacity (0-255; requires X COMPOSITE extension)", rs_opacity),
SPIFOPT_BOOL('O', "trans", "creates a pseudo-transparent Eterm", image_options, IMAGE_OPTIONS_TRANS),
SPIFOPT_BOOL('0', "itrans", "use immotile-optimized transparency", image_options, IMAGE_OPTIONS_ITRANS),
SPIFOPT_BOOL_LONG("viewport-mode", "use viewport mode for the background image", image_options, IMAGE_OPTIONS_VIEWPORT),
@ -2962,6 +2964,12 @@ post_parse(void)
}
#endif
if (rs_opacity < 0x100) {
rs_opacity |= (rs_opacity << 24) | (rs_opacity << 16) | (rs_opacity << 8);
} else {
rs_opacity = 0xffffffff;
}
if (BITFIELD_IS_SET(vt_options, VT_OPTIONS_REVERSE_VIDEO)) {
char *tmp;

View File

@ -125,6 +125,7 @@ extern int rs_delay;
extern unsigned char rs_es_dock;
extern char *rs_es_font;
#endif
extern spif_uint32_t rs_opacity;
extern unsigned int rs_line_space;
extern unsigned int rs_meta_mod, rs_alt_mod, rs_numlock_mod;
#ifndef NO_BOLDFONT

View File

@ -183,7 +183,8 @@ scr_reset(void)
buf_rend = CALLOC(rend_t *, total_rows);
drawn_rend = CALLOC(rend_t *, TERM_WINDOW_GET_REPORTED_ROWS());
swap.rend = CALLOC(rend_t *, TERM_WINDOW_GET_REPORTED_ROWS());
D_SCREEN(("screen.text == %8p, screen.rend == %8p, swap.text == %8p, swap.rend == %8p\n", screen.text, screen.rend, swap.text, swap.rend));
D_SCREEN(("screen.text == %8p, screen.rend == %8p, swap.text == %8p, swap.rend == %8p\n",
screen.text, screen.rend, swap.text, swap.rend));
for (i = 0; i < TERM_WINDOW_GET_REPORTED_ROWS(); i++) {
j = i + TermWin.saveLines;
@ -226,7 +227,8 @@ scr_reset(void)
buf_rend = REALLOC(buf_rend, total_rows * sizeof(rend_t *));
drawn_rend = REALLOC(drawn_rend, TERM_WINDOW_GET_REPORTED_ROWS() * sizeof(rend_t *));
swap.rend = REALLOC(swap.rend, TERM_WINDOW_GET_REPORTED_ROWS() * sizeof(rend_t *));
D_SCREEN(("screen.text == %8p, screen.rend == %8p, swap.text == %8p, swap.rend == %8p\n", screen.text, screen.rend, swap.text, swap.rend));
D_SCREEN(("screen.text == %8p, screen.rend == %8p, swap.text == %8p, swap.rend == %8p\n",
screen.text, screen.rend, swap.text, swap.rend));
/* we have fewer rows so fix up number of scrolled lines */
UPPER_BOUND(screen.row, TERM_WINDOW_GET_REPORTED_ROWS() - 1);
@ -242,7 +244,8 @@ scr_reset(void)
buf_rend = REALLOC(buf_rend, total_rows * sizeof(rend_t *));
drawn_rend = REALLOC(drawn_rend, TERM_WINDOW_GET_REPORTED_ROWS() * sizeof(rend_t *));
swap.rend = REALLOC(swap.rend, TERM_WINDOW_GET_REPORTED_ROWS() * sizeof(rend_t *));
D_SCREEN(("screen.text == %8p, screen.rend == %8p, swap.text == %8p, swap.rend == %8p\n", screen.text, screen.rend, swap.text, swap.rend));
D_SCREEN(("screen.text == %8p, screen.rend == %8p, swap.text == %8p, swap.rend == %8p\n",
screen.text, screen.rend, swap.text, swap.rend));
k = MIN(TermWin.nscrolled, TERM_WINDOW_GET_REPORTED_ROWS() - prev_nrow);
for (i = prev_total_rows; i < total_rows - k; i++) {
@ -279,7 +282,8 @@ scr_reset(void)
screen.rend[i] = REALLOC(screen.rend[i], TERM_WINDOW_GET_REPORTED_COLS() * sizeof(rend_t));
screen.text[i][TERM_WINDOW_GET_REPORTED_COLS()] = MIN(tc, TERM_WINDOW_GET_REPORTED_COLS());
if (TERM_WINDOW_GET_REPORTED_COLS() > prev_ncol)
blank_line(&(screen.text[i][prev_ncol]), &(screen.rend[i][prev_ncol]), TERM_WINDOW_GET_REPORTED_COLS() - prev_ncol, DEFAULT_RSTYLE);
blank_line(&(screen.text[i][prev_ncol]), &(screen.rend[i][prev_ncol]),
TERM_WINDOW_GET_REPORTED_COLS() - prev_ncol, DEFAULT_RSTYLE);
}
}
for (i = 0; i < TERM_WINDOW_GET_REPORTED_ROWS(); i++) {
@ -291,10 +295,12 @@ scr_reset(void)
swap.rend[i] = REALLOC(swap.rend[i], TERM_WINDOW_GET_REPORTED_COLS() * sizeof(rend_t));
swap.text[i][TERM_WINDOW_GET_REPORTED_COLS()] = MIN(tc, TERM_WINDOW_GET_REPORTED_COLS());
if (TERM_WINDOW_GET_REPORTED_COLS() > prev_ncol)
blank_line(&(swap.text[i][prev_ncol]), &(swap.rend[i][prev_ncol]), TERM_WINDOW_GET_REPORTED_COLS() - prev_ncol, DEFAULT_RSTYLE);
blank_line(&(swap.text[i][prev_ncol]), &(swap.rend[i][prev_ncol]),
TERM_WINDOW_GET_REPORTED_COLS() - prev_ncol, DEFAULT_RSTYLE);
}
if (TERM_WINDOW_GET_REPORTED_COLS() > prev_ncol)
blank_line(&(drawn_text[i][prev_ncol]), &(drawn_rend[i][prev_ncol]), TERM_WINDOW_GET_REPORTED_COLS() - prev_ncol, DEFAULT_RSTYLE);
blank_line(&(drawn_text[i][prev_ncol]), &(drawn_rend[i][prev_ncol]),
TERM_WINDOW_GET_REPORTED_COLS() - prev_ncol, DEFAULT_RSTYLE);
}
}
if (tabs)

View File

@ -150,6 +150,7 @@ eterm_bootstrap(int argc, char *argv[])
props[PROP_DND_PROTOCOL] = XInternAtom(Xdisplay, "DndProtocol", False);
props[PROP_DND_SELECTION] = XInternAtom(Xdisplay, "DndSelection", False);
props[PROP_EWMH_ICON] = XInternAtom(Xdisplay, "_NET_WM_ICON", False);
props[PROP_EWMH_OPACITY] = XInternAtom(Xdisplay, "_NET_WM_WINDOW_OPACITY", True);
if ((theme_dir = conf_parse_theme(&rs_theme, THEME_CFG, PARSE_TRY_ALL)) != NULL) {
char *tmp;

View File

@ -103,6 +103,7 @@ enum {
PROP_DND_PROTOCOL,
PROP_DND_SELECTION,
PROP_EWMH_ICON,
PROP_EWMH_OPACITY,
NUM_PROPS
};

View File

@ -2017,7 +2017,8 @@ xterm_seq(int op, const char *str)
if ((valptr = (char *) strsep(&tnstr, ";")) == NULL) {
break;
}
D_CMD(("Modifying the %s attribute of the %s color modifier of the %s image to be %s\n", mod, color, get_image_type(which), valptr));
D_CMD(("Modifying the %s attribute of the %s color modifier of the %s image to be %s\n",
mod, color, get_image_type(which), valptr));
changed = 1;
# ifdef PIXMAP_OFFSET
if (image_mode_is(which, MODE_TRANS) && (desktop_pixmap != None)) {
@ -2365,30 +2366,37 @@ xterm_seq(int op, const char *str)
xev.message_type = props[PROP_DESKTOP];
xev.format = 32;
xev.data.l[0] = rs_desktop;
XChangeProperty(Xdisplay, TermWin.parent, xev.message_type, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &rs_desktop, 1);
XChangeProperty(Xdisplay, TermWin.parent, xev.message_type, XA_CARDINAL, 32,
PropModeReplace, (unsigned char *) &rs_desktop, 1);
XSendEvent(Xdisplay, Xroot, False, SubstructureNotifyMask, (XEvent *) & xev);
}
break;
#if 0
case 70:
/* Exit Eterm */
exit(0);
break;
case 71:
/* Save current config */
case 51:
/* Change opacity */
nstr = (char *) strsep(&tnstr, ";");
if (nstr && *nstr) {
valptr = (char *) strsep(&tnstr, ";");
if (!strcasecmp(nstr, "theme")) {
save_config(valptr, SAVE_THEME_CONFIG);
XClientMessageEvent xev;
spif_uint32_t tmp;
tmp = (int) strtol(nstr, (char **) NULL, 0);
if (tmp < 0x100) {
rs_opacity = tmp | (tmp << 24) | (tmp << 16) | (tmp << 8);
} else {
save_config(valptr, SAVE_USER_CONFIG);
rs_opacity = 0xffffffff;
}
} else {
save_config(NULL, SAVE_USER_CONFIG);
xev.type = ClientMessage;
xev.window = TermWin.parent;
xev.message_type = props[PROP_EWMH_OPACITY];
xev.format = 32;
xev.data.l[0] = rs_opacity;
XChangeProperty(Xdisplay, TermWin.parent, xev.message_type, XA_CARDINAL, 32,
PropModeReplace, (unsigned char *) &rs_opacity, 1);
XChangeProperty(Xdisplay, TermWin.vt, xev.message_type, XA_CARDINAL, 32,
PropModeReplace, (unsigned char *) &rs_opacity, 1);
XSendEvent(Xdisplay, Xroot, False, SubstructureNotifyMask, (XEvent *) (&xev));
}
break;
#endif
case 72:
/* Search scrollback buffer for a string. NULL to clear. */
nstr = (char *) strsep(&tnstr, ";");
@ -2398,15 +2406,7 @@ xterm_seq(int op, const char *str)
scr_search_scrollback(NULL);
}
break;
#if 0
case 73:
/* Spawn a subprogram */
nstr = (char *) strsep(&tnstr, ";");
if (nstr && *nstr) {
system_no_wait(nstr);
}
break;
#endif
case 80:
/* Set debugging level */
nstr = (char *) strsep(&tnstr, ";");

View File

@ -380,7 +380,8 @@ Create_Windows(int argc, char *argv[])
}
Attributes.colormap = cmap;
szHint.base_width = (2 * TermWin.internalBorder + ((BITFIELD_IS_SET(eterm_options, ETERM_OPTIONS_SCROLLBAR)) ? (scrollbar_get_width() + (2 * scrollbar_get_shadow())) : 0));
szHint.base_width = (2 * TermWin.internalBorder + ((BITFIELD_IS_SET(eterm_options, ETERM_OPTIONS_SCROLLBAR))
? (scrollbar_get_width() + (2 * scrollbar_get_shadow())) : 0));
szHint.base_height = (2 * TermWin.internalBorder) + bbar_calc_docked_height(BBAR_DOCKED);
flags = (rs_geometry ? XParseGeometry(rs_geometry, &x, &y, &width, &height) : 0);
@ -447,8 +448,10 @@ Create_Windows(int argc, char *argv[])
XSelectInput(Xdisplay, TermWin.parent, (KeyPressMask | FocusChangeMask | StructureNotifyMask | VisibilityChangeMask | PropertyChangeMask));
if (mwmhints.flags) {
prop = XInternAtom(Xdisplay, "_MOTIF_WM_HINTS", False);
XChangeProperty(Xdisplay, TermWin.parent, prop, prop, 32, PropModeReplace, (unsigned char *) &mwmhints, PROP_MWM_HINTS_ELEMENTS);
XChangeProperty(Xdisplay, TermWin.parent, prop, prop, 32,
PropModeReplace, (unsigned char *) &mwmhints, PROP_MWM_HINTS_ELEMENTS);
}
/* vt cursor: Black-on-White is standard, but this is more popular */
TermWin_cursor = XCreateFontCursor(Xdisplay, XC_xterm);
set_pointer_colors(NULL, NULL);
@ -457,9 +460,12 @@ Create_Windows(int argc, char *argv[])
cursor = XCreateFontCursor(Xdisplay, XC_left_ptr);
/* the vt window */
TermWin.x = (((BITFIELD_IS_SET(eterm_options, ETERM_OPTIONS_SCROLLBAR)) && !(BITFIELD_IS_SET(eterm_options, ETERM_OPTIONS_SCROLLBAR_RIGHT))) ? (scrollbar_get_width() + (2 * scrollbar_get_shadow())) : 0);
TermWin.x = (((BITFIELD_IS_SET(eterm_options, ETERM_OPTIONS_SCROLLBAR))
&& !(BITFIELD_IS_SET(eterm_options, ETERM_OPTIONS_SCROLLBAR_RIGHT)))
? (scrollbar_get_width() + (2 * scrollbar_get_shadow())) : 0);
TermWin.y = bbar_calc_docked_height(BBAR_DOCKED_TOP);
TermWin.vt = XCreateWindow(Xdisplay, TermWin.parent, TermWin.x, TermWin.y, szHint.width, szHint.height, 0, Xdepth, InputOutput, CopyFromParent,
TermWin.vt = XCreateWindow(Xdisplay, TermWin.parent, TermWin.x, TermWin.y, szHint.width, szHint.height,
0, Xdepth, InputOutput, CopyFromParent,
CWBackPixel | CWBorderPixel | CWOverrideRedirect | CWColormap, &Attributes);
D_X11(("Created terminal window 0x%08x at %dx%d\n", TermWin.vt, TermWin.x, TermWin.y));
if (!(background_is_pixmap()) && !(BITFIELD_IS_SET(eterm_options, ETERM_OPTIONS_BORDERLESS))) {
@ -475,7 +481,16 @@ Create_Windows(int argc, char *argv[])
/* If the user wants a specific desktop, tell the WM that */
if (rs_desktop != -1) {
val = rs_desktop;
XChangeProperty(Xdisplay, TermWin.parent, props[PROP_DESKTOP], XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &val, 1);
XChangeProperty(Xdisplay, TermWin.parent, props[PROP_DESKTOP],
XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &val, 1);
}
/* Set window opacity if needed. */
if ((props[PROP_EWMH_OPACITY] != None) && (rs_opacity != 0xff)) {
XChangeProperty(Xdisplay, TermWin.parent, props[PROP_EWMH_OPACITY],
XA_CARDINAL, 32, PropModeReplace, SPIF_CAST_PTR(uchar) &rs_opacity, 1);
XChangeProperty(Xdisplay, TermWin.vt, props[PROP_EWMH_OPACITY],
XA_CARDINAL, 32, PropModeReplace, SPIF_CAST_PTR(uchar) &rs_opacity, 1);
}
/* We're done creating our windows. Now let's initialize the event subsystem to handle them. */