* 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-2007 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
#if ENABLE_TRANSPARENCY || ENABLE_PERL
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
#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
- display->flush (); /* ideally .put should do this */
- 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);
#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
_exit (EXIT_FAILURE);
}
-/*----------------------------------------------------------------------*/
-void
-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])
- {
- const char *p = rs[Rs_backgroundPixmap];
-
- if ((p = strchr (p, ';')) != 0)
- {
- 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);
-
- 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]);
-}
-
static struct sig_handlers
{
ev::sig sw_term, sw_int;
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,
void
rxvt_term::update_background ()
{
- bgPixmap.invalidate ();
+ if (update_background_ev.is_active ())
+ return;
- /* no chance of real time refresh if we are blurring! */
- if (bgPixmap.invalid_since + 0.50 < ev::now ()
- && !(bgPixmap.flags & bgPixmap_t::blurNeeded))
- {
- update_background_ev.stop ();
- bgPixmap.render ();
- }
- else
- {
- ev_tstamp refresh;
+ bgPixmap.invalidate ();
- if (!bgPixmap.need_client_side_rendering ())
- refresh = .05;
- else if (bgPixmap.flags & bgPixmap_t::blurNeeded)
- refresh = .20; /* very slow !!! */
- else
- refresh = .07;
+ ev_tstamp to_wait = 0.5 - (ev::now () - bgPixmap.valid_since);
- update_background_ev.start (refresh);
- }
+ if (to_wait <= 0.)
+ bgPixmap.render ();
+ else
+ 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 ();
}