* Copyright (c) 1997,1998 Oezguer Kesim <kesim@math.fu-berlin.de>
* Copyright (c) 1998-2001 Geoff Wing <gcw@pobox.com>
* - extensive modifications
- * Copyright (c) 2003-2006 Marc Lehmann <pcg@goof.com>
+ * Copyright (c) 2003-2008 Marc Lehmann <pcg@goof.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
slip_wheel_ev.set <rxvt_term, &rxvt_term::slip_wheel_cb> (this);
#endif
#if ENABLE_TRANSPARENCY || ENABLE_PERL
- rootwin_ev.set <rxvt_term, &rxvt_term::x_cb> (this),
+ rootwin_ev.set <rxvt_term, &rxvt_term::rootwin_cb> (this),
#endif
-#ifdef HAVE_SCROLLBARS
scrollbar_ev.set <rxvt_term, &rxvt_term::x_cb> (this),
-#endif
#ifdef USE_XIM
im_ev.set <rxvt_term, &rxvt_term::im_cb> (this),
#endif
bell_ev.set <rxvt_term, &rxvt_term::bell_cb> (this);
#endif
child_ev.set <rxvt_term, &rxvt_term::child_cb> (this);
- prepare_ev.set <rxvt_term, &rxvt_term::prepare_cb> (this);
flush_ev.set <rxvt_term, &rxvt_term::flush_cb> (this);
destroy_ev.set <rxvt_term, &rxvt_term::destroy_cb> (this);
pty_ev.set <rxvt_term, &rxvt_term::pty_cb> (this);
#endif
delete fontset[0];
+#ifdef HAVE_BG_PIXMAP
+ bgPixmap.destroy ();
+#endif
+#ifdef HAVE_AFTERIMAGE
+ if (asv)
+ destroy_asvisual (asv, 0);
+ if (asimman)
+ destroy_image_manager (asimman, 0);
+#endif
+
if (display)
{
selection_clear ();
+ selection_clear (true);
#ifdef USE_XIM
im_destroy ();
#endif
-#ifdef XTERM_SCROLLBAR
- if (xscrollbarGC) XFreeGC (dpy, xscrollbarGC);
- if (ShadowGC) XFreeGC (dpy, ShadowGC);
-#endif
-#ifdef PLAIN_SCROLLBAR
- if (pscrollbarGC) XFreeGC (dpy, pscrollbarGC);
-#endif
-#ifdef NEXT_SCROLLBAR
- if (blackGC) XFreeGC (dpy, blackGC);
- if (whiteGC) XFreeGC (dpy, whiteGC);
- if (grayGC) XFreeGC (dpy, grayGC);
- if (darkGC) XFreeGC (dpy, darkGC);
- if (stippleGC) XFreeGC (dpy, stippleGC);
- if (dimple) XFreePixmap (dpy, dimple);
- if (upArrow) XFreePixmap (dpy, upArrow);
- if (downArrow) XFreePixmap (dpy, downArrow);
- if (upArrowHi) XFreePixmap (dpy, upArrowHi);
- if (downArrowHi) XFreePixmap (dpy, downArrowHi);
-#endif
-#ifdef RXVT_SCROLLBAR
- if (topShadowGC) XFreeGC (dpy, topShadowGC);
- if (botShadowGC) XFreeGC (dpy, botShadowGC);
- if (scrollbarGC) XFreeGC (dpy, scrollbarGC);
-#endif
+ scrollBar.destroy ();
if (gc) XFreeGC (dpy, gc);
delete drawable;
}
clear ();
- }
- delete [] pix_colors_focused;
-#if OFF_FOCUS_FADING
- delete [] pix_colors_unfocused;
-#endif
-
-#ifdef HAVE_BG_PIXMAP
- bgPixmap.destroy ();
-#endif
- displays.put (display);
+ display->flush (); /* ideally .put should do this */
+ displays.put (display);
+ }
scr_release ();
free (allocated [i]);
free (selection.text);
+ free (selection.clip_text);
// TODO: manage env vars in child only(!)
free (env_display);
free (env_term);
void
rxvt_term::destroy ()
{
- if (ev_is_active (&destroy_ev))
+ if (destroy_ev.is_active ())
return;
HOOK_INVOKE ((this, HOOK_DESTROY, DT_END));
#if USE_XIM
im_ev.stop (display);
#endif
-#if HAVE_SCROLLBARS
scrollbar_ev.stop (display);
-#endif
#if ENABLE_TRANSPARENCY || ENABLE_PERL
rootwin_ev.stop (display);
#endif
vt_ev.stop (display);
}
- prepare_ev.stop ();
+ flush_ev.stop ();
pty_ev.stop ();
#ifdef CURSOR_BLINK
cursor_blink_ev.stop ();
_exit (EXIT_FAILURE);
}
-/*----------------------------------------------------------------------*/
-bool
-rxvt_term::init (int argc, const char *const *argv, stringvec *envv)
-{
- this->envv = envv;
-
- SET_R (this);
- set_locale ("");
- set_environ (envv); // few things in X do not call setlocale :(
-
- init_vars ();
-
- init_secondary ();
-
- const char **cmd_argv = init_resources (argc, argv);
-
-#ifdef KEYSYM_RESOURCE
- keyboard->register_done ();
-#endif
-
-#ifdef HAVE_SCROLLBARS
- if (option (Opt_scrollBar))
- scrollBar.setIdle (); /* set existence for size calculations */
-#endif
-
- pty = ptytty::create ();
-
- create_windows (argc, argv);
-
- init_xlocale ();
-
- scr_reset (); // initialize screen
-
-#if 0
- XSynchronize (dpy, True);
-#endif
-
-#ifdef HAVE_SCROLLBARS
- if (option (Opt_scrollBar))
- resize_scrollbar (); /* create and map scrollbar */
-#endif
-#ifdef HAVE_BG_PIXMAP
- {
- bgPixmap.set_target (this);
-
-#ifdef ENABLE_TRANSPARENCY
- if (option (Opt_transparent))
- {
- bgPixmap.set_transparent ();
-#ifdef HAVE_AFTERIMAGE
- if (rs [Rs_blurradius])
- bgPixmap.set_blur_radius (rs [Rs_blurradius]);
-#endif
- if (ISSET_PIXCOLOR (Color_tint))
- bgPixmap.set_tint (pix_colors_focused [Color_tint]);
- if (rs [Rs_shade])
- bgPixmap.set_shade (rs [Rs_shade]);
-
- bgPixmap.set_root_pixmap ();
- XSelectInput (dpy, display->root, PropertyChangeMask);
- rootwin_ev.start (display, display->root);
- }
-#endif
-
-#ifdef BG_IMAGE_FROM_FILE
- if (rs[Rs_backgroundPixmap] != NULL)
- {
- const char *p = rs[Rs_backgroundPixmap];
-
- if ((p = strchr (p, ';')) != NULL)
- {
- p++;
- bgPixmap.set_geometry (p);
- }
- else
- bgPixmap.set_defaultGeometry ();
-
- if (bgPixmap.set_file (rs[Rs_backgroundPixmap]))
- if (!bgPixmap.window_position_sensitive ())
- update_background ();
- }
-#endif
- }
-#endif
-
-#if ENABLE_PERL
- rootwin_ev.start (display, display->root);
-#endif
-
- set_colorfgbg ();
-
- init_command (cmd_argv);
-
- free (cmd_argv);
-
- if (pty->pty >= 0)
- pty_ev.start (pty->pty, ev::READ);
-
- prepare_ev.start ();
-
- HOOK_INVOKE ((this, HOOK_START, DT_END));
-
-#if ENABLE_XEMBED
- if (rs[Rs_embed])
- {
- long info[2] = { 0, XEMBED_MAPPED };
-
- XChangeProperty (dpy, parent[0], xa[XA_XEMBED_INFO], xa[XA_XEMBED_INFO],
- 32, PropModeReplace, (unsigned char *)&info, 2);
- }
-#endif
-
- XMapWindow (dpy, vt);
- XMapWindow (dpy, parent[0]);
-
- return true;
-}
-
static struct sig_handlers
{
ev::sig sw_term, sw_int;
XrmInitialize ();
}
-/* ------------------------------------------------------------------------- *
- * MEMORY ALLOCATION WRAPPERS *
- * ------------------------------------------------------------------------- */
-void *
-rxvt_malloc (size_t size)
-{
- void *p = malloc (size);
-
- if (!p)
- rxvt_fatal ("memory allocation failure. aborting.\n");
-
- return p;
-}
-
-void *
-rxvt_calloc (size_t number, size_t size)
-{
- void *p = calloc (number, size);
-
- if (!p)
- rxvt_fatal ("memory allocation failure. aborting.\n");
-
- return p;
-}
-
-void *
-rxvt_realloc (void *ptr, size_t size)
-{
- void *p = realloc (ptr, size);
-
- if (!p)
- rxvt_fatal ("memory allocation failure. aborting.\n");
-
- return p;
-}
-
/*----------------------------------------------------------------------*/
/*
* window size/position calculations for XSizeHint and other storage.
rxvt_term::window_calc (unsigned int newwidth, unsigned int newheight)
{
short recalc_x, recalc_y;
- int x, y, sb_w, flags;
+ int x, y, flags;
unsigned int w, h;
unsigned int max_width, max_height;
if (flags & WidthValue)
{
- ncol = clamp (w, 0, std::numeric_limits<int16_t>::max ());
+ if (!w)
+ rxvt_fatal ("illegal window geometry (width and height must be non-zero), aborting.\n");
+
+ ncol = clamp (w, 1, std::numeric_limits<int16_t>::max ());
szHint.flags |= USSize;
}
if (flags & HeightValue)
{
- nrow = clamp (h, 0, std::numeric_limits<int16_t>::max ());
+ if (!h)
+ rxvt_fatal ("illegal window geometry (width and height must be non-zero), aborting.\n");
+
+ nrow = clamp (h, 1, std::numeric_limits<int16_t>::max ());
szHint.flags |= USSize;
}
szHint.base_width = szHint.base_height = 2 * int_bwidth;
- sb_w = 0;
window_vt_x = window_vt_y = int_bwidth;
if (scrollBar.state)
{
- sb_w = scrollbar_TotalWidth ();
+ int sb_w = scrollBar.total_width ();
szHint.base_width += sb_w;
if (!option (Opt_scrollBar_right))
szHint.height = szHint.base_height + height;
}
- if (scrollBar.state && option (Opt_scrollBar_right))
- window_sb_x = szHint.width - sb_w;
-
if (recalc_x)
szHint.x += DisplayWidth (dpy, display->screen) - szHint.width - 2 * ext_bwidth;
if (recalc_y)
szHint.y += DisplayHeight (dpy, display->screen) - szHint.height - 2 * ext_bwidth;
- ncol = width / fwidth;
+ ncol = width / fwidth;
nrow = height / fheight;
}
ws.ws_row = nrow;
ws.ws_xpixel = width;
ws.ws_ypixel = height;
- (void)ioctl (pty->pty, TIOCSWINSZ, &ws);
+ ioctl (pty->pty, TIOCSWINSZ, &ws);
#if 0
// TIOCSWINSZ is supposed to do this automatically and correctly
prop = (*fs)[1]->properties ();
prop.height += lineSpace;
+ prop.width += letterSpace;
fs->set_prop (prop, false);
{
#ifdef XTERM_COLOR_CHANGE
rxvt_color xcol;
- int i;
if (color == NULL || *color == '\0')
return;
/* handle color aliases */
if (isdigit (*color))
{
- i = atoi (color);
+ int i = atoi (color);
if (i >= 8 && i <= 15)
{
window_calc (newwidth, newheight);
- if (!HOOK_INVOKE ((this, HOOK_RESIZE_ALL_WINDOWS, DT_INT, newwidth, DT_INT, newheight, DT_END)))
- XSetWMNormalHints (dpy, parent[0], &szHint);
+ bool set_hint = !HOOK_INVOKE ((this, HOOK_RESIZE_ALL_WINDOWS, DT_INT, newwidth, DT_INT, newheight, DT_END));
+
+ // to avoid races between us and the wm, we clear the incremental size hints around the xresizewindow
+ if (set_hint)
+ {
+ szHint.flags &= ~(PBaseSize | PResizeInc);
+ XSetWMNormalHints (dpy, parent[0], &szHint);
+ szHint.flags |= PBaseSize | PResizeInc;
+ }
if (!ignoreparent)
{
#endif
}
+ if (set_hint)
+ XSetWMNormalHints (dpy, parent[0], &szHint);
+
fix_screen = ncol != prev_ncol || nrow != prev_nrow;
if (fix_screen || newwidth != old_width || newheight != old_height)
{
if (scrollBar.state)
- {
- XMoveResizeWindow (dpy, scrollBar.win,
- window_sb_x, 0,
- scrollbar_TotalWidth (), szHint.height);
- resize_scrollbar ();
- }
+ scrollBar.resize ();
XMoveResizeWindow (dpy, vt,
window_vt_x, window_vt_y,
if (bgPixmap.window_size_sensitive ())
update_background ();
#endif
-
- scr_clear ();
}
if (fix_screen || old_height == 0)
bool
rxvt_term::IMisRunning ()
{
- char *p;
Atom atom;
Window win;
char server[IMBUFSIZ];
/* get current locale modifier */
- if ((p = XSetLocaleModifiers (NULL)) != NULL)
+ if (char *p = XSetLocaleModifiers (0))
{
strcpy (server, "@server=");
- strncat (server, & (p[4]), IMBUFSIZ - 9); /* skip "@im=" */
+ strncat (server, p + 4, IMBUFSIZ - 9); /* skip "@im=" */
- if ((p = strchr (server + 1, '@')) != NULL) /* first one only */
+ if (p = strchr (server + 1, '@')) /* first one only */
*p = '\0';
atom = XInternAtom (dpy, server, False);
if (text)
{
- void *str;
+ wchar_t *str;
if (!text->encoding_is_wchar && text->string.multi_byte)
{
if (term->rs[Rs_imLocale])
SET_LOCALE (term->rs[Rs_imLocale]);
- str = rxvt_temp_buf ((text->length + 1) * sizeof (wchar_t));
- mbstowcs ((wchar_t *)str, text->string.multi_byte, text->length + 1);
+ str = rxvt_temp_buf<wchar_t> (text->length + 1);
+ mbstowcs (str, text->string.multi_byte, text->length + 1);
if (term->rs[Rs_imLocale])
SET_LOCALE (term->locale);
}
else
- str = (void *)text->string.wide_char;
+ str = text->string.wide_char;
HOOK_INVOKE ((term, HOOK_XIM_PREEDIT_DRAW,
DT_INT, call_data->caret,
{
Window cr;
XTranslateCoordinates (dpy, parent[0], display->root, 0, 0, &x, &y, &cr);
-/* fprintf( stderr, "origin is %+d%+d\n", x, y);*/
+/* fprintf (stderr, "origin is %+d%+d\n", x, y);*/
}
Pixmap
0L, 1L, False, XA_PIXMAP, &atype, &aformat,
&nitems, &bytes_after, &prop);
if (result == Success && prop && atype == XA_PIXMAP)
- {
- return *(Pixmap *)prop;
- }
+ return *(Pixmap *)prop;
}
+
return None;
}
#ifdef HAVE_BG_PIXMAP
# if TRACE_PIXMAPS
# undef update_background
-int rxvt_term::trace_update_background (const char *file, int line)
+void
+rxvt_term::trace_update_background (const char *file, int line)
{
fprintf (stderr, "%s:%d:update_background()\n", file, line);
update_background ();
}
# endif
-int
+void
rxvt_term::update_background ()
{
+ if (update_background_ev.is_active ())
+ return;
+
bgPixmap.invalidate ();
- /* no chance of real time refresh if we are blurring! */
- if (bgPixmap.invalid_since + 0.5 < ev::now () && !(bgPixmap.flags & bgPixmap_t::blurNeeded))
+ ev_tstamp to_wait = 0.5 - (ev::now () - bgPixmap.valid_since);
+
+ if (to_wait <= 0.)
bgPixmap.render ();
else
- {
- update_background_ev.stop ();
-
- if (!bgPixmap.need_client_side_rendering())
- update_background_ev.start (.05);
- else if (bgPixmap.flags & bgPixmap_t::blurNeeded)
- update_background_ev.start (.20); /* very slow !!! */
- else
- update_background_ev.start (.07);
- }
-
- return 0;
+ update_background_ev.start (to_wait);
}
void
rxvt_term::update_background_cb (ev::timer &w, int revents)
{
+ make_current ();
+
+ update_background_ev.stop ();
bgPixmap.render ();
+ refresh_check ();
}
#endif /* HAVE_BG_PIXMAP */