diff options
author | Michael Jennings <mej@kainx.org> | 2004-12-14 23:24:33 +0000 |
---|---|---|
committer | Michael Jennings <mej@kainx.org> | 2004-12-14 23:24:33 +0000 |
commit | 19cae1a53d440fa0de02bf6c27f1bd9012a17a71 (patch) | |
tree | 2ff66002005d86266d8039d29d36316ecdb964ed | |
parent | f8a0003371cbaa0bf81180edd0920dc31b4877ab (diff) | |
download | eterm-19cae1a53d440fa0de02bf6c27f1bd9012a17a71.tar.gz |
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
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | Eterm.spec | 7 | ||||
-rw-r--r-- | configure.in | 2 | ||||
-rw-r--r-- | src/command.c | 58 | ||||
-rw-r--r-- | src/feature.h | 2 | ||||
-rw-r--r-- | src/options.c | 8 | ||||
-rw-r--r-- | src/options.h | 1 | ||||
-rw-r--r-- | src/screen.c | 18 | ||||
-rw-r--r-- | src/startup.c | 1 | ||||
-rw-r--r-- | src/startup.h | 1 | ||||
-rw-r--r-- | src/term.c | 50 | ||||
-rw-r--r-- | src/windows.c | 25 |
12 files changed, 132 insertions, 47 deletions
@@ -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. +---------------------------------------------------------------------- @@ -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/ diff --git a/configure.in b/configure.in index c851a98..854ccb2 100644 --- a/configure.in +++ b/configure.in @@ -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'`" diff --git a/src/command.c b/src/command.c index a3544b5..54a85c6 100644 --- a/src/command.c +++ b/src/command.c @@ -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 diff --git a/src/feature.h b/src/feature.h index 193841f..6259c38 100644 --- a/src/feature.h +++ b/src/feature.h @@ -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 *********************/ diff --git a/src/options.c b/src/options.c index a6c85c2..6f066a3 100644 --- a/src/options.c +++ b/src/options.c @@ -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; diff --git a/src/options.h b/src/options.h index 47777c9..e830a3b 100644 --- a/src/options.h +++ b/src/options.h @@ -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 diff --git a/src/screen.c b/src/screen.c index 5062f49..1f63b7d 100644 --- a/src/screen.c +++ b/src/screen.c @@ -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) diff --git a/src/startup.c b/src/startup.c index 1cfeec6..ce3031d 100644 --- a/src/startup.c +++ b/src/startup.c @@ -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; diff --git a/src/startup.h b/src/startup.h index 8a8b500..9358ae8 100644 --- a/src/startup.h +++ b/src/startup.h @@ -103,6 +103,7 @@ enum { PROP_DND_PROTOCOL, PROP_DND_SELECTION, PROP_EWMH_ICON, + PROP_EWMH_OPACITY, NUM_PROPS }; @@ -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, ";"); diff --git a/src/windows.c b/src/windows.c index 3807520..927bc90 100644 --- a/src/windows.c +++ b/src/windows.c @@ -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. */ |