[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

patch status



back to my original patch, providing UTF8_STRING to
ui.c and gui_gtk_x11.c when FEAT_MBYTE is on, I have
gotten vim from cvs and applied the changes such that
they wont break a non- FEAT_MBYTE system.

the latest is at:
http://members.telocity.com/~seer26/UTF8_STRING.patch

I dont know if anybody else besides me has tested it
whatsoever. It works fine for me. if there is
anything else I should do to it, let me know.
Index: src/ui.c
===================================================================
RCS file: /cvsroot/vim/vim/src/ui.c,v
retrieving revision 1.46
diff -u -u -r1.46 ui.c
--- src/ui.c	29 Apr 2002 14:00:38 -0000	1.46
+++ src/ui.c	5 Sep 2002 21:18:19 -0000
@@ -1822,6 +1822,12 @@
 }
 
 static Atom	vim_atom;	/* Vim's own special selection format */
+#ifdef FEAT_MBYTE
+static Atom     utf8_string_atom;
+#define NUM_VIM_CB_ENC_TYPES 5
+#else
+#define NUM_VIM_CB_ENC_TYPES 4
+#endif
 static Atom	compound_text_atom;
 static Atom	text_atom;
 static Atom	targets_atom;
@@ -1831,6 +1837,9 @@
     Display	*dpy;
 {
     vim_atom	       = XInternAtom(dpy, VIM_ATOM_NAME,   False);
+#ifdef FEAT_MBYTE
+    utf8_string_atom   = XInternAtom(dpy, "UTF8_STRING",   False);
+#endif
     compound_text_atom = XInternAtom(dpy, "COMPOUND_TEXT", False);
     text_atom	       = XInternAtom(dpy, "TEXT",	   False);
     targets_atom       = XInternAtom(dpy, "TARGETS",       False);
@@ -1881,6 +1890,32 @@
 	motion_type = *p++;
 	len--;
     }
+#ifdef FEAT_MBYTE
+    else if (*type == utf8_string_atom)
+    {
+	/*convert "utf-8" to "p_enc"*/
+	vimconv_T cvrt;
+	
+# ifdef USE_ICONV
+	cvrt.vc_fd = (iconv_t)-1;
+# endif
+	convert_setup(&cvrt,"utf-8",p_enc);
+
+	if (cvrt.vc_type != CONV_NONE)
+	{
+	    int temp;
+
+	    p = string_convert(&cvrt, p, &temp);
+	    len = (long_u)temp;
+	    if(!p)
+	    {
+		*(int *)success = FALSE;
+		return;
+	    }
+	}
+	convert_setup(&cvrt, (char_u *)"", (char_u *)"");
+    }
+#endif
     else if (*type == compound_text_atom || (
 #ifdef FEAT_MBYTE
 		enc_dbcs != 0 &&
@@ -1927,13 +1962,19 @@
     int		nbytes = 0;
     char_u	*buffer;
 
-    for (i = 0; i < 4; i++)
+    for (i = 0; i < NUM_VIM_CB_ENC_TYPES; i++)
     {
 	switch (i)
 	{
 	    case 0:  type = vim_atom;	break;
+#ifdef FEAT_MBYTE
+	    case 1:  type = utf8_string_atom;	break;
+	    case 2:  type = compound_text_atom; break;
+	    case 3:  type = text_atom;	break;
+#else
 	    case 1:  type = compound_text_atom; break;
 	    case 2:  type = text_atom;	break;
+#endif
 	    default: type = XA_STRING;
 	}
 	XtGetSelectionValue(myShell, cbd->sel_atom, type,
@@ -2007,7 +2048,7 @@
     {
 	Atom *array;
 
-	if ((array = (Atom *)XtMalloc((unsigned)(sizeof(Atom) * 5))) == NULL)
+	if ((array = (Atom *)XtMalloc((unsigned)(sizeof(Atom) * (NUM_VIM_CB_ENC_TYPES+1)))) == NULL)
 	    return False;
 	*value = (XtPointer)array;
 	array[0] = XA_STRING;
@@ -2015,6 +2056,9 @@
 	array[2] = vim_atom;
 	array[3] = text_atom;
 	array[4] = compound_text_atom;
+#ifdef FEAT_MBYTE
+        array[5] = utf8_string_atom;
+#endif
 	*type = XA_ATOM;
 	/* This used to be: *format = sizeof(Atom) * 8; but that caused
 	 * crashes on 64 bit machines. (Peter Derr) */
@@ -2026,7 +2070,11 @@
     if (       *target != XA_STRING
 	    && *target != vim_atom
 	    && *target != text_atom
-	    && *target != compound_text_atom)
+	    && *target != compound_text_atom
+#ifdef FEAT_MBYTE
+            && *target != utf8_string_atom
+#endif
+	    )
 	return False;
 
     clip_get_selection(cbd);
@@ -2034,46 +2082,80 @@
     if (motion_type < 0)
 	return False;
 
-    /* For our own format, the first byte contains the motion type */
-    if (*target == vim_atom)
-	(*length)++;
-
-    *value = XtMalloc((Cardinal)*length);
-    result = (char_u *)*value;
-    if (result == NULL)
+#ifdef FEAT_MBYTE
+    if (*target == utf8_string_atom)
     {
-	vim_free(string);
-	return False;
-    }
+	/*convert "p_enc" to "utf-8" */
+	vimconv_T cvrt;
+	
+# ifdef USE_ICONV
+	cvrt.vc_fd = (iconv_t)-1;
+# endif
+	convert_setup(&cvrt,p_enc,"utf-8");
 
-    if (*target == XA_STRING)
-    {
-	mch_memmove(result, string, (size_t)(*length));
-	*type = XA_STRING;
-    }
-    else if (*target == compound_text_atom
-	    || *target == text_atom)
-    {
-	XTextProperty	text_prop;
-	char		*string_nt = (char *)alloc((unsigned)*length + 1);
+	if (cvrt.vc_type == CONV_NONE)
+	{
+	    *value=(XtPointer)string;
+	    string=NULL;
+	}
+	else
+	{
+	    int temp = (int)length;
+	    *value = (XtPointer)string_convert(&cvrt, string, &temp);
+	    *length = (long_u)temp;
+	}
+
+	*type = utf8_string_atom;
+	convert_setup(&cvrt, (char_u *)"", (char_u *)"");
 
-	/* create NUL terminated string which XmbTextListToTextProperty wants */
-	mch_memmove(string_nt, string, (size_t)*length);
-	string_nt[*length] = NUL;
-	XmbTextListToTextProperty(X_DISPLAY, (char **)&string_nt, 1,
-					      XCompoundTextStyle, &text_prop);
-	vim_free(string_nt);
-	XtFree(*value);			/* replace with COMPOUND text */
-	*value = (XtPointer)(text_prop.value);	/*    from plain text */
-	*length = text_prop.nitems;
-	*type = compound_text_atom;
+	if(!*value)
+	    return False;
     }
     else
+#endif
     {
-	result[0] = motion_type;
-	mch_memmove(result + 1, string, (size_t)(*length - 1));
-	*type = vim_atom;
+	/* For our own format, the first byte contains the motion type */
+	if (*target == vim_atom)
+	    (*length)++;
+
+	*value = XtMalloc((Cardinal)*length);
+	result = (char_u *)*value;
+	if (result == NULL)
+	{
+	    vim_free(string);
+	    return False;
+	}
+
+	if (*target == XA_STRING)
+	{
+	    mch_memmove(result, string, (size_t)(*length));
+	    *type = XA_STRING;
+	}
+	else if (*target == compound_text_atom
+		|| *target == text_atom)
+	{
+	    XTextProperty	text_prop;
+	    char		*string_nt = (char *)alloc((unsigned)*length + 1);
+
+	    /* create NUL terminated string which XmbTextListToTextProperty wants */
+	    mch_memmove(string_nt, string, (size_t)*length);
+	    string_nt[*length] = NUL;
+	    XmbTextListToTextProperty(X_DISPLAY, (char **)&string_nt, 1,
+						  XCompoundTextStyle, &text_prop);
+	    vim_free(string_nt);
+	    XtFree(*value);			/* replace with COMPOUND text */
+	    *value = (XtPointer)(text_prop.value);	/*    from plain text */
+	    *length = text_prop.nitems;
+	    *type = compound_text_atom;
+	}
+	else
+	{
+	    result[0] = motion_type;
+	    mch_memmove(result + 1, string, (size_t)(*length - 1));
+	    *type = vim_atom;
+	}
     }
+
     *format = 8;	    /* 8 bits per char */
     vim_free(string);
     return True;
Index: src/gui_gtk_x11.c
===================================================================
RCS file: /cvsroot/vim/vim/src/gui_gtk_x11.c,v
retrieving revision 1.63
diff -u -u -r1.63 gui_gtk_x11.c
--- src/gui_gtk_x11.c	3 Aug 2002 17:15:15 -0000	1.63
+++ src/gui_gtk_x11.c	5 Sep 2002 21:18:31 -0000
@@ -84,6 +84,9 @@
     SELECTION_TEXT,
     SELECTION_COMPOUND_TEXT,
     SELECTION_VIM
+#ifdef FEAT_MBYTE
+    ,SELECTION_UTF8_STRING
+#endif
 };
 
 /*
@@ -133,6 +136,9 @@
 static GdkAtom compound_text_atom = GDK_NONE;
 static GdkAtom text_atom = GDK_NONE;
 static GdkAtom vim_atom = GDK_NONE;	/* Vim's own special selection format */
+#ifdef FEAT_MBYTE
+static GdkAtom utf8_string_atom = GDK_NONE;
+#endif
 
 /*
  * Keycodes recognized by vim.
@@ -941,6 +947,40 @@
 	g_string_free(str, FALSE);
 	free_p = TRUE;
     }
+#ifdef FEAT_MBYTE
+    else if (data->type == utf8_string_atom)
+    {
+	/*convert "utf-8" to "p_enc"*/
+	vimconv_T cvrt;
+	
+# ifdef USE_ICONV
+	cvrt.vc_fd = (iconv_t)-1;
+# endif
+	convert_setup(&cvrt,"utf-8",p_enc);
+
+	if (cvrt.vc_type == CONV_NONE)
+	{
+	    p = (char_u *)data->data;
+	    len = data->length;
+	}
+	else
+	{
+	    int temp;
+
+	    p = string_convert(&cvrt, (char_u *)data->data, &temp);
+	    len = (long_u)temp;
+	    if(!p)
+	    {
+		received_selection = RS_FAIL;
+		if (gtk_main_level() > 0)
+		    gtk_main_quit();
+		return;
+	    }
+	    free_p = TRUE;
+	}
+	convert_setup(&cvrt, (char_u *)"", (char_u *)"");
+    }
+#endif
     else
     {
 	p = (char_u *)data->data;
@@ -990,6 +1030,9 @@
 
     if (info != (guint)SELECTION_STRING
 	    && info != (guint)SELECTION_VIM
+#ifdef FEAT_MBYTE
+	    && info != (guint)SELECTION_UTF8_STRING
+#endif
 	    && info != (guint)SELECTION_COMPOUND_TEXT
 	    && info != (guint)SELECTION_TEXT)
 	return;
@@ -1000,47 +1043,81 @@
     if (motion_type < 0)
 	return;
 
-    /* For our own format, the first byte contains the motion type */
-    if (info == (guint)SELECTION_VIM)
-	length++;
-
-    result = lalloc((long_u)(2 * length), FALSE);
-    if (result == NULL)
+#ifdef FEAT_MBYTE
+    if( info == (guint)SELECTION_UTF8_STRING)
     {
-	vim_free(string);
-	return;
-    }
+	/*convert "p_enc" to "utf-8" */
+	vimconv_T cvrt;
+	
+# ifdef USE_ICONV
+	cvrt.vc_fd = (iconv_t)-1;
+# endif
+	convert_setup(&cvrt,p_enc,"utf-8");
 
-    if (info == (guint)SELECTION_VIM)
-    {
-	result[0] = motion_type;
-	mch_memmove(result + 1, string, (size_t)(length - 1));
-	type = vim_atom;
-    }
-    else if (info == (guint)SELECTION_COMPOUND_TEXT
-					     || info == (guint)SELECTION_TEXT)
-    {
-	char *str;
-	gint format, new_len;
-
-	vim_free(result);
-	str = g_new(char, length + 1);
-	mch_memmove(str, string, (size_t) length);
-	vim_free(string);
-	str[length] = '\0';
-	gdk_string_to_compound_text(str, &type, &format, &result, &new_len);
-	g_free(str);
-	selection_data->type = type;
-	selection_data->format = format;
-	gtk_selection_data_set(selection_data, type, format, result, new_len);
-	gdk_free_compound_text(result);
-	return;
+	if (cvrt.vc_type == CONV_NONE)
+	{
+	    result=string;
+	    string=NULL;
+	}
+	else
+	{
+	    int temp = (int)length;
+	    result = string_convert(&cvrt, string, &temp);
+	    length = (long_u)temp;
+	}
+
+	type = utf8_string_atom;
+	convert_setup(&cvrt, (char_u *)"", (char_u *)"");
+
+	if(!result)
+	    return;
     }
     else
+#endif
     {
-	mch_memmove(result, string, (size_t)length);
-	type = GDK_TARGET_STRING;
+	/* For our own format, the first byte contains the motion type */
+	if (info == (guint)SELECTION_VIM)
+	    length++;
+
+	result = lalloc((long_u)(2 * length), FALSE);
+	if (result == NULL)
+	{
+	    vim_free(string);
+	    return;
+	}
+
+	if (info == (guint)SELECTION_VIM)
+	{
+	    result[0] = motion_type;
+	    mch_memmove(result + 1, string, (size_t)(length - 1));
+	    type = vim_atom;
+	}
+	else if (info == (guint)SELECTION_COMPOUND_TEXT
+						 || info == (guint)SELECTION_TEXT)
+	{
+	    char *str;
+	    gint format, new_len;
+
+	    vim_free(result);
+	    str = g_new(char, length + 1);
+	    mch_memmove(str, string, (size_t) length);
+	    vim_free(string);
+	    str[length] = '\0';
+	    gdk_string_to_compound_text(str, &type, &format, &result, &new_len);
+	    g_free(str);
+	    selection_data->type = type;
+	    selection_data->format = format;
+	    gtk_selection_data_set(selection_data, type, format, result, new_len);
+	    gdk_free_compound_text(result);
+	    return;
+	}
+	else
+	{
+	    mch_memmove(result, string, (size_t)length);
+	    type = GDK_TARGET_STRING;
+	}
     }
+
     selection_data->type = selection_data->target;
     selection_data->format = 8;	/* 8 bits per char */
 
@@ -1787,6 +1864,9 @@
 
 static const GtkTargetEntry primary_targets[] = {
     {VIM_ATOM_NAME,   0, SELECTION_VIM},
+#ifdef FEAT_MBYTE
+    {"UTF8_STRING", 0, SELECTION_UTF8_STRING},
+#endif
     {"COMPOUND_TEXT", 0, SELECTION_COMPOUND_TEXT},
     {"TEXT",	      0, SELECTION_TEXT},
     {"STRING",	      0, SELECTION_STRING}
@@ -1812,6 +1892,9 @@
     /* Initialise atoms */
     compound_text_atom = gdk_atom_intern("COMPOUND_TEXT", FALSE);
     text_atom = gdk_atom_intern("TEXT", FALSE);
+#ifdef FEAT_MBYTE
+    utf8_string_atom = gdk_atom_intern("UTF8_STRING", FALSE);
+#endif
 
     /* Set default foreground and background colors. */
     gui.norm_pixel = gui.def_norm_pixel;
@@ -3525,6 +3608,19 @@
     while (received_selection == RS_NONE)
 	gtk_main();		/* wait for selection_received_event */
 
+#ifdef FEAT_MBYTE
+    //Lets use UTF8_STRING if available!!
+    if (received_selection == RS_FAIL)
+    {
+	/* Now try to get it out of the usual string selection. */
+	received_selection = RS_NONE;
+	(void)gtk_selection_convert(gui.drawarea, cbd->gtk_sel_atom,
+				    gdk_atom_intern("UTF8_STRING", FALSE),
+				    (guint32)GDK_CURRENT_TIME);
+	while (received_selection == RS_NONE)
+	    gtk_main();		/* wait for selection_received_event */
+    }
+#endif
     if (received_selection == RS_FAIL)
     {
 	/* Now try to get it out of the usual string selection. */