--- rxvt-unicode/src/main.C 2006/01/20 12:16:28 1.192 +++ rxvt-unicode/src/main.C 2006/01/25 02:42:06 1.203 @@ -172,6 +172,9 @@ #ifdef USE_XIM im_ev (this, &rxvt_term::im_cb), #endif +#ifndef NO_BELL + bell_ev (this, &rxvt_term::bell_cb), +#endif termwin_ev (this, &rxvt_term::x_cb), vt_ev (this, &rxvt_term::x_cb), child_ev (this, &rxvt_term::child_cb), @@ -304,8 +307,7 @@ if (destroy_ev.active) return; - if (HOOK_INVOKE ((this, HOOK_DESTROY, DT_END))) - return; + HOOK_INVOKE ((this, HOOK_DESTROY, DT_END)); #if ENABLE_OVERLAY scr_overlay_off (); @@ -449,8 +451,10 @@ /*----------------------------------------------------------------------*/ bool -rxvt_term::init (int argc, const char *const *argv) +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 :( @@ -471,7 +475,7 @@ scrollBar.setIdle (); /* set existence for size calculations */ #endif - pty = rxvt_new_ptytty (); + pty = ptytty::create (); create_windows (argc, argv); @@ -511,6 +515,16 @@ HOOK_INVOKE ((this, HOOK_START, DT_END)); +#if ENABLE_XEMBED + if (rs[Rs_embed]) + { + long info[2] = { 0, XEMBED_MAPPED }; + + XChangeProperty (display->display, parent[0], xa[XA_XEMBED_INFO], xa[XA_XEMBED_INFO], + 32, PropModeReplace, (unsigned char *)&info, 2); + } +#endif + XMapWindow (disp, vt); XMapWindow (disp, parent[0]); @@ -527,9 +541,6 @@ void sig_term (sig_watcher &w) { -#ifdef DEBUG_CMD - rxvt_warn ("caught signal %d, exiting.\n", w.signum); -#endif rxvt_emergency_cleanup (); signal (w.signum, SIG_DFL); kill (getpid (), w.signum); @@ -547,36 +558,7 @@ void rxvt_init () { - uid_t uid = getuid (); - gid_t gid = getgid (); - - // before doing anything else, check for setuid/setgid operation, - // start the helper process and drop privileges - if (uid != geteuid () - || gid != getegid ()) - { -#if PTYTTY_HELPER - rxvt_ptytty_server (); -#else - rxvt_warn ("running setuid/setgid without pty helper compiled in, continuing unprivileged.\n"); -#endif - - // drop privileges -#if HAVE_SETRESUID - setresgid (gid, gid, gid); - setresuid (uid, uid, uid); -#elif HAVE_SETREUID - setregid (gid, gid); - setreuid (uid, uid); -#elif HAVE_SETUID - setgid (gid); - setuid (uid); -#endif - - if (uid != geteuid () - || gid != getegid ()) - rxvt_fatal ("unable to drop privileges, aborting.\n"); - } + ptytty::init (); rxvt_environ = environ; @@ -646,9 +628,6 @@ unsigned int max_width, max_height; dDisp; - D_SIZE ((stderr, "< Cols/Rows: %3d x %3d ; Width/Height: %4d x %4d", - ncol, nrow, szHint.width, szHint.height)); - szHint.flags = PMinSize | PResizeInc | PBaseSize | PWinGravity; szHint.win_gravity = NorthWestGravity; /* szHint.min_aspect.x = szHint.min_aspect.y = 1; */ @@ -760,10 +739,6 @@ ncol = width / fwidth; nrow = height / fheight; - D_SIZE ((stderr, "> Cols/Rows: %3d x %3d ; Width/Height: %4d x %4d", - ncol, nrow, szHint.width, - szHint.height)); - return; } /*----------------------------------------------------------------------*/ @@ -1057,7 +1032,8 @@ rxvt_term::resize_all_windows (unsigned int newwidth, unsigned int newheight, int ignoreparent) { int fix_screen; - int old_width = szHint.width, old_height = szHint.height; + int old_width = szHint.width; + int old_height = szHint.height; dDisp; window_calc (newwidth, newheight); @@ -1089,9 +1065,9 @@ y -= y1; } - x1 = (DisplayWidth (disp, display->screen) - old_width) / 2; + x1 = (DisplayWidth (disp, display->screen) - old_width ) / 2; y1 = (DisplayHeight (disp, display->screen) - old_height) / 2; - dx = old_width - szHint.width; + dx = old_width - szHint.width; dy = old_height - szHint.height; /* Check position of the center of the window */ @@ -1134,30 +1110,7 @@ } if (fix_screen || old_height == 0) - { - int curr_screen = -1; - int old_ncol = prev_ncol; - - /* scr_reset only works on the primary screen */ - if (old_height) /* this is not the first time through */ - { - unsigned int ocol = ncol; - ncol = prev_ncol; // save b/c scr_blank_screen_mem uses this - curr_screen = scr_change_screen (PRIMARY); - ncol = ocol; - } - - scr_reset (); - - if (curr_screen >= 0) /* this is not the first time through */ - { - scr_change_screen (curr_screen); - selection_check (old_ncol != ncol ? 4 : 0); - } - } - - old_width = szHint.width; - old_height = szHint.height; + scr_reset (); #ifdef XPM_BACKGROUND if (pixmap) @@ -1270,7 +1223,7 @@ if (!Input_Context || !focus - || !(input_style & XIMPreeditPosition)) + || !(input_style & (XIMPreeditPosition | XIMPreeditCallbacks))) return; im_set_position (nspot); @@ -1300,6 +1253,80 @@ Input_Context = 0; } +#ifdef ENABLE_XIM_ONTHESPOT + +static void +xim_preedit_start (XIC ic, XPointer client_data, XPointer call_data) +{ + ((rxvt_term *)client_data)->make_current (); + HOOK_INVOKE (((rxvt_term *)client_data, HOOK_XIM_PREEDIT_START, DT_END)); +} + +static void +xim_preedit_done (XIC ic, XPointer client_data, XPointer call_data) +{ + ((rxvt_term *)client_data)->make_current (); + HOOK_INVOKE (((rxvt_term *)client_data, HOOK_XIM_PREEDIT_DONE, DT_END)); +} + +static void +xim_preedit_draw (XIC ic, XPointer client_data, XIMPreeditDrawCallbackStruct *call_data) +{ + rxvt_term *term = (rxvt_term *)client_data; + XIMText *text = call_data->text; + + term->make_current (); + + if (text) + { + void *str; + + if (!text->encoding_is_wchar && text->string.multi_byte) + { + // of course, X makes it ugly again + 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); + + if (term->rs[Rs_imLocale]) + SET_LOCALE (term->locale); + } + else + str = (void *)text->string.wide_char; + + HOOK_INVOKE ((term, HOOK_XIM_PREEDIT_DRAW, + DT_INT, call_data->caret, + DT_INT, call_data->chg_first, + DT_INT, call_data->chg_length, + DT_LCS_LEN, (void *)text->feedback, text->feedback ? (int)text->length : 0, + DT_WCS_LEN, str, str ? (int)text->length : 0, + DT_END)); + } + else + HOOK_INVOKE ((term, HOOK_XIM_PREEDIT_DRAW, + DT_INT, call_data->caret, + DT_INT, call_data->chg_first, + DT_INT, call_data->chg_length, + DT_END)); +} + +#if 0 +static void +xim_preedit_caret (XIC ic, XPointer client_data, XIMPreeditCaretCallbackStruct *call_data) +{ + ((rxvt_term *)client_data)->make_current (); + HOOK_INVOKE (((rxvt_term *)client_data, HOOK_XIM_PREEDIT_CARET, + DT_INT, call_data->position, + DT_INT, call_data->direction, + DT_INT, call_data->style, + DT_END)); +} +#endif + +#endif + /* * Try to open a XIM with the current modifiers, then see if we can * open a suitable preedit type @@ -1315,13 +1342,15 @@ const char *p; char **s; XIMStyles *xim_styles; +#ifdef ENABLE_XIM_ONTHESPOT + XIMCallback xcb[4]; +#endif set_environ (envv); if (! ((p = XSetLocaleModifiers (modifiers)) && *p)) return false; - D_MAIN ((stderr, "rxvt_IM_get_IC ()")); input_method = display->get_xim (locale, modifiers); if (input_method == NULL) return false; @@ -1351,13 +1380,19 @@ for (i = found = 0; !found && s[i]; i++) { if (!strcmp (s[i], "OverTheSpot")) - input_style = (XIMPreeditPosition | XIMStatusNothing); + input_style = XIMPreeditPosition | XIMStatusNothing; else if (!strcmp (s[i], "OffTheSpot")) - input_style = (XIMPreeditArea | XIMStatusArea); + input_style = XIMPreeditArea | XIMStatusArea; else if (!strcmp (s[i], "Root")) - input_style = (XIMPreeditNothing | XIMStatusNothing); + input_style = XIMPreeditNothing | XIMStatusNothing; else if (!strcmp (s[i], "None")) - input_style = (XIMPreeditNone | XIMStatusNone); + input_style = XIMPreeditNone | XIMStatusNone; +#ifdef ENABLE_XIM_ONTHESPOT + else if (SHOULD_INVOKE (HOOK_XIM_PREEDIT_START) && !strcmp (s[i], "OnTheSpot")) + input_style = XIMPreeditCallbacks | XIMStatusNothing; +#endif + else + input_style = XIMPreeditNothing | XIMStatusNothing; for (j = 0; j < xim_styles->count_styles; j++) if (input_style == xim_styles->supported_styles[j]) @@ -1456,6 +1491,27 @@ XNFontSet, fs, NULL); } + else if (input_style & XIMPreeditCallbacks) + { + im_set_position (spot); + + xcb[0].client_data = (XPointer)this; xcb[0].callback = (XIMProc)xim_preedit_start; + xcb[1].client_data = (XPointer)this; xcb[1].callback = (XIMProc)xim_preedit_done; + xcb[2].client_data = (XPointer)this; xcb[2].callback = (XIMProc)xim_preedit_draw; +#if 0 + xcb[3].client_data = (XPointer)this; xcb[3].callback = (XIMProc)xim_preedit_caret; +#endif + + preedit_attr = XVaCreateNestedList (0, + XNSpotLocation, &spot, + XNPreeditStartCallback, &xcb[0], + XNPreeditDoneCallback , &xcb[1], + XNPreeditDrawCallback , &xcb[2], +#if 0 + XNPreeditCaretCallback, &xcb[3], +#endif + NULL); + } Input_Context = XCreateIC (xim, XNInputStyle, input_style, @@ -1477,10 +1533,15 @@ return false; } +#if 0 + // unfortunately, only the focus window is used by XIM, hard to fix + if (!XGetICValues (Input_Context, XNFilterEvents, &vt_emask_xim, NULL)) + vt_select_input (); +#endif + if (input_style & XIMPreeditArea) IMSetStatusPosition (); - D_MAIN ((stderr, "rxvt_IM_get_IC () - successful connection")); return true; } @@ -1496,7 +1557,6 @@ im_destroy (); - D_MAIN ((stderr, "rxvt_IMInstantiateCallback ()")); if (Input_Context) return;