Loading ...
Sorry, an error occurred while loading the content.

vim60b gtk gui OnTheSpot _2nd_ patch

Expand Messages
  • Sung-Hyun Nam
    Hello, This gtk gui OnTheSpot patch (made by Chi-Deok Hwang) is fixed the hang problem (The 1st patch had). Bram, I hope you include this patch in next
    Message 1 of 2 , Jul 18 11:57 PM
    • 0 Attachment
      Hello,

      This gtk gui OnTheSpot patch (made by Chi-Deok Hwang)
      is fixed the 'hang' problem (The 1st patch had).

      Bram, I hope you include this patch in next vim60.

      regards,

      namsh

      diff -u -u -r1.2 gui_gtk_x11.c
      --- ./src/gui_gtk_x11.c 2000/07/17 00:34:31 1.2
      +++ ./src/gui_gtk_x11.c 2000/07/18 12:42:52
      @@ -566,6 +566,14 @@
      state = event->state;
      g_assert(len <= sizeof(string));

      +#ifdef FEAT_XIM
      + {
      + extern int xim_queue_key_press_event(GdkEvent *ev);
      + if (xim_queue_key_press_event((GdkEvent *) event))
      + return TRUE;
      + }
      +#endif
      +
      #ifdef FEAT_HANGULIN
      if (event->keyval == GDK_space && (state & GDK_SHIFT_MASK))
      {
      @@ -1108,6 +1116,14 @@
      */
      if (event->type != GDK_BUTTON_PRESS)
      return FALSE;
      +
      +#ifdef FEAT_XIM
      + {
      + extern void xim_reset(void);
      +
      + xim_reset();
      + }
      +#endif

      x = event->x;
      y = event->y;
      diff -u -u -r1.2 multibyte.c
      --- ./src/multibyte.c 2000/07/17 00:34:32 1.2
      +++ ./src/multibyte.c 2000/07/19 05:07:08
      @@ -1484,6 +1484,8 @@
      GdkIMStyle supported_style = GDK_IM_PREEDIT_NONE |
      GDK_IM_PREEDIT_NOTHING |
      GDK_IM_PREEDIT_POSITION |
      + GDK_IM_PREEDIT_CALLBACKS |
      + /* GDK_IM_STATUS_CALLBACKS | */
      GDK_IM_STATUS_AREA |
      GDK_IM_STATUS_NONE |
      GDK_IM_STATUS_NOTHING;
      @@ -1511,8 +1513,149 @@
      }
      }

      +#include <gdk/gdkx.h>
      +
      + static void
      +preedit_start_cbproc(XIC xic, XPointer client_data, XPointer call_data)
      +{
      +}
      +
      + static void
      +xim_back_delete(int n)
      +{
      + char str[3];
      +
      + str[0] = CSI;
      + str[1] = 'k';
      + str[2] = 'b';
      + while (n-- > 0)
      + add_to_input_buf(str, 3);
      +}
      +
      +static GSList *key_press_event_queue = NULL;
      +static int preedit_buf_len = 0;
      +static gboolean processing_queued_event = FALSE;
      +
      + static void
      +preedit_draw_cbproc(XIC xic, XPointer client_data, XPointer call_data)
      +{
      + XIMPreeditDrawCallbackStruct *draw_data;
      + XIMText *text;
      + GdkWChar *wstr = NULL;
      + char *src;
      + GSList *event_queue;
      +
      + draw_data = (XIMPreeditDrawCallbackStruct *) call_data;
      + text = (XIMText *) draw_data->text;
      +
      + if (draw_data->chg_length > 0)
      + {
      + xim_back_delete(draw_data->chg_length);
      + preedit_buf_len -= draw_data->chg_length;
      + }
      + if (text && (src = text->string.multi_byte))
      + {
      + int len = strlen(src);
      +
      + wstr = g_new(GdkWChar, len);
      + preedit_buf_len += gdk_mbstowcs(wstr, src, len);
      + g_free(wstr);
      + add_to_input_buf(src, len);
      + }
      + event_queue = key_press_event_queue;
      + processing_queued_event = TRUE;
      + while (event_queue)
      + {
      + GdkEvent *ev = event_queue->data;
      + gboolean *ret;
      + gtk_signal_emit_by_name((GtkObject*)gui.mainwin, "key_press_event",
      + ev, &ret);
      + gdk_event_free(ev);
      + event_queue = event_queue->next;
      + }
      + processing_queued_event = FALSE;
      + if (key_press_event_queue)
      + {
      + g_slist_free(key_press_event_queue);
      + key_press_event_queue = NULL;
      + }
      + if (gtk_main_level() > 0)
      + gtk_main_quit();
      +}
      +
      + static void
      +preedit_caret_cbproc(XIC xic, XPointer client_data, XPointer call_data)
      +{
      +}
      +
      + static void
      +preedit_done_cbproc(XIC xic, XPointer client_data, XPointer call_data)
      +{
      +}
      +
      + void
      +xim_reset(void)
      +{
      + char * text;
      +
      + if (xic)
      + {
      + text = XmbResetIC(((GdkICPrivate *)xic)->xic);
      + if (!(xim_input_style & GDK_IM_PREEDIT_CALLBACKS))
      + add_to_input_buf(text, strlen(text));
      + else
      + preedit_buf_len = 0;
      + if (text)
      + XFree(text);
      + }
      +}
      +
      + int
      +xim_queue_key_press_event(GdkEvent *ev)
      +{
      + if (preedit_buf_len <= 0 || processing_queued_event)
      + return FALSE;
      +
      + key_press_event_queue = g_slist_append(key_press_event_queue,
      + gdk_event_copy(ev));
      + return TRUE;
      +}
      +
      + static void
      +preedit_callback_setup(GdkIC *ic)
      +{
      + XIC xxic;
      + XVaNestedList preedit_attr;
      + XIMCallback preedit_start_cb;
      + XIMCallback preedit_draw_cb;
      + XIMCallback preedit_caret_cb;
      + XIMCallback preedit_done_cb;
      +
      + xxic = ((GdkICPrivate*)xic)->xic;
      + preedit_start_cb.callback = (XIMProc)preedit_start_cbproc;
      + preedit_draw_cb.callback = (XIMProc)preedit_draw_cbproc;
      + preedit_caret_cb.callback = (XIMProc)preedit_caret_cbproc;
      + preedit_done_cb.callback = (XIMProc)preedit_done_cbproc;
      + preedit_attr
      + = XVaCreateNestedList (0,
      + XNPreeditStartCallback, &preedit_start_cb,
      + XNPreeditDrawCallback, &preedit_draw_cb,
      + XNPreeditCaretCallback, &preedit_caret_cb,
      + XNPreeditDoneCallback, &preedit_done_cb,
      + 0);
      + XSetICValues (xxic, XNPreeditAttributes, preedit_attr, 0);
      + XFree(preedit_attr);
      +}
      +
      + static void
      +reset_state_setup(GdkIC *ic)
      +{
      + /* don't change the input context when we call reset */
      + XSetICValues(((GdkICPrivate*)ic)->xic, XNResetState, XIMPreserveState, 0);
      +}
      +
      void
      -xim_init()
      +xim_init(void)
      {
      xic = NULL;
      xic_attr = NULL;
      @@ -1584,6 +1727,11 @@
      attr->status_fontset = gui.fontset;
      }
      }
      + else if ((xim_input_style & GDK_IM_STATUS_MASK)
      + == GDK_IM_STATUS_CALLBACKS)
      + {
      + /* FIXME */
      + }
      #endif

      xic = gdk_ic_new(attr, attrmask);
      @@ -1595,6 +1743,9 @@
      mask = gdk_window_get_events(widget->window);
      mask |= gdk_ic_get_events(xic);
      gdk_window_set_events(widget->window, mask);
      + if (xim_input_style & GDK_IM_PREEDIT_CALLBACKS)
      + preedit_callback_setup(xic);
      + reset_state_setup(xic);
      }
      }
      }
    • Bram Moolenaar
      Sung-Hyun - ... I will include this. I trust you (and others) will fix any problems that are encountered. -- Females are strictly forbidden to appear unshaven
      Message 2 of 2 , Jul 19 3:54 AM
      • 0 Attachment
        Sung-Hyun -

        > This gtk gui OnTheSpot patch (made by Chi-Deok Hwang)
        > is fixed the 'hang' problem (The 1st patch had).
        >
        > Bram, I hope you include this patch in next vim60.

        I will include this. I trust you (and others) will fix any problems that are
        encountered.

        --
        Females are strictly forbidden to appear unshaven in public.
        [real standing law in New Mexico, United States of America]

        /// Bram Moolenaar Bram@... http://www.moolenaar.net \\\
        \\\ Vim: http://www.vim.org ICCF Holland: http://iccf-holland.org ///
      Your message has been successfully submitted and would be delivered to recipients shortly.