changeset 18885:f7b6579204b8

(XTread_socket) <ClientMessage>: For wm_take_focus, use x_any_window_to_frame. Don't use FRAME_XIC if it is null, here. (dumpglyphs): Use 8-bit output to X, rather than 16-bit, if the character values permit that.
author Richard M. Stallman <rms@gnu.org>
date Sun, 20 Jul 1997 17:44:22 +0000
parents 04d36f3e7fa6
children c24b5da01b1f
files src/xterm.c
diffstat 1 files changed, 56 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/src/xterm.c	Sun Jul 20 17:41:31 1997 +0000
+++ b/src/xterm.c	Sun Jul 20 17:44:22 1997 +0000
@@ -543,8 +543,11 @@
      struct cmpchar_info *cmpcharp;
 {
   /* Holds characters to be displayed. */
-  XChar2b *buf = (XChar2b *) alloca (FRAME_WINDOW_WIDTH (f) * sizeof (*buf));
-  register XChar2b *cp;		/* Steps through buf[]. */
+  XChar2b *x_2byte_buffer
+    = (XChar2b *) alloca (FRAME_WINDOW_WIDTH (f) * sizeof (*x_2byte_buffer));
+  register XChar2b *cp;		/* Steps through x_2byte_buffer[]. */
+  char *x_1byte_buffer
+    = (char *) alloca (FRAME_WINDOW_WIDTH (f) * sizeof (*x_1byte_buffer));
   register int tlen = GLYPH_TABLE_LENGTH;
   register Lisp_Object *tbase = GLYPH_TABLE_BASE;
   Window window = FRAME_X_WINDOW (f);
@@ -592,10 +595,10 @@
 
       /* Find the run of consecutive glyphs which can be drawn with
 	 the same GC (i.e. the same charset and the same face-code).
-	 Extract their character codes into BUF.
+	 Extract their character codes into X_2BYTE_BUFFER.
 	 If CMPCHARP is not NULL, face-code is not checked because we
 	 use only the face specified in `cmpcharp->face_work'.  */
-      cp = buf;
+      cp = x_2byte_buffer;
       while (n > 0)
 	{
 	  int this_charset, c1, c2;
@@ -619,7 +622,7 @@
 	}
 
       /* LEN gets the length of the run.  */
-      len = cp - buf;
+      len = cp - x_2byte_buffer;
       /* Now output this run of chars, with the font and pixel values
 	 determined by the face code CF.  */
       {
@@ -725,7 +728,7 @@
 		struct ccl_program *ccl = fontp->font_encoder;
 
 		if (CHARSET_DIMENSION (charset) == 1)
-		  for (cp = buf; cp < buf + len; cp++)
+		  for (cp = x_2byte_buffer; cp < x_2byte_buffer + len; cp++)
 		    {
 		      ccl->reg[0] = charset;
 		      ccl->reg[1] = cp->byte2;
@@ -733,7 +736,7 @@
 		      cp->byte2 = ccl->reg[1];
 		    }
 		else
-		  for (cp = buf; cp < buf + len; cp++)
+		  for (cp = x_2byte_buffer; cp < x_2byte_buffer + len; cp++)
 		    {
 		      ccl->reg[0] = charset;
 		      ccl->reg[1] = cp->byte1, ccl->reg[2] = cp->byte2;
@@ -746,10 +749,10 @@
 		int enc = fontp->encoding[charset];
 
 		if ((enc == 1 || enc == 2) && CHARSET_DIMENSION (charset) == 2)
-		  for (cp = buf; cp < buf + len; cp++)
+		  for (cp = x_2byte_buffer; cp < x_2byte_buffer + len; cp++)
 		    cp->byte1 |= 0x80;
 		if (enc == 1 || enc == 3)
-		  for (cp = buf; cp < buf + len; cp++)
+		  for (cp = x_2byte_buffer; cp < x_2byte_buffer + len; cp++)
 		    cp->byte2 |= 0x80;
 	      }
 	  }
@@ -769,7 +772,7 @@
 		      font = NULL;
 		    else
 		      {
-			for (cp = buf; cp < buf + len; cp++)
+			for (cp = x_2byte_buffer; cp < x_2byte_buffer + len; cp++)
 			  cp->byte2 |= 0x80;
 		      }
 		  }
@@ -913,24 +916,50 @@
 		      if (background_filled)
 			XDrawString16 (FRAME_X_DISPLAY (f), window, gc,
 				       left + glyph_width * i,
-				       top + baseline, buf + i, 1);
+				       top + baseline, x_2byte_buffer + i, 1);
 		      else
 			XDrawImageString16 (FRAME_X_DISPLAY (f), window, gc,
 					    left + glyph_width * i,
-					    top + baseline, buf + i, 1);
+					    top + baseline, x_2byte_buffer + i, 1);
 		    }
 		else
 		  {
-		    if (background_filled)
-		      XDrawString16 (FRAME_X_DISPLAY (f), window, gc,
-				     left, top + baseline, buf, len);
+		    /* See if this whole buffer can be output as 8-bit chars.
+		       If so, copy x_2byte_buffer to x_1byte_buffer
+		       and do it as 8-bit chars.  */
+		    for (i = 0; i < len; i++)
+		      {
+			if (x_2byte_buffer[i].byte1 != 0)
+			  break;
+			x_1byte_buffer[i] = x_2byte_buffer[i].byte2;
+		      }
+
+		    if (i == len)
+		      {
+			if (background_filled)
+			  XDrawString (FRAME_X_DISPLAY (f), window, gc,
+				       left, top + baseline, x_1byte_buffer, len);
+			else
+			  XDrawImageString (FRAME_X_DISPLAY (f), window, gc,
+					    left, top + baseline, x_1byte_buffer, len);
+		      }
 		    else
-		      XDrawImageString16 (FRAME_X_DISPLAY (f), window, gc,
-					  left, top + baseline, buf, len);
+		      {
+			/* We can't output them as 8-bit chars,
+			   so do it as 16-bit chars.  */
+
+			if (background_filled)
+			  XDrawString16 (FRAME_X_DISPLAY (f), window, gc,
+					 left, top + baseline, x_2byte_buffer, len);
+			else
+			  XDrawImageString16 (FRAME_X_DISPLAY (f), window, gc,
+					      left, top + baseline, x_2byte_buffer, len);
+		      }
 		  }
 	      }
 	    else
 	      {
+		/* Handle composite characters.  */
 		XCharStruct *pcm; /* Pointer to per char metric info.  */
 
 		if ((cmpcharp->cmp_rule || relative_compose)
@@ -950,7 +979,7 @@
 		      }
 		    else
 		      {
-			pcm = PER_CHAR_METRIC (font, buf);
+			pcm = PER_CHAR_METRIC (font, x_2byte_buffer);
 			highest = pcm->ascent + 1;
 			lowest = - pcm->descent;
 		      }
@@ -960,7 +989,7 @@
 				  * FONT_WIDTH (f->output_data.x->font));
 		    /* Draw the first character at the normal position.  */
 		    XDrawString16 (FRAME_X_DISPLAY (f), window, gc,
-				   left + x_offset, top + baseline, buf, 1);
+				   left + x_offset, top + baseline, x_2byte_buffer, 1);
 		    i = 1;
 		    gidx++;
 		  }
@@ -973,7 +1002,7 @@
 
 		    if (relative_compose)
 		      {
-			pcm = PER_CHAR_METRIC (font, buf + i);
+			pcm = PER_CHAR_METRIC (font, x_2byte_buffer + i);
 			if (- pcm->descent >= relative_compose)
 			  {
 			    /* Draw above the current glyphs.  */
@@ -999,7 +1028,7 @@
 			gref = gref / 3 + (gref == 4) * 2;
 			nref = nref / 3 + (nref == 4) * 2;
 
-			pcm = PER_CHAR_METRIC (font, buf + i);
+			pcm = PER_CHAR_METRIC (font, x_2byte_buffer + i);
 			bottom = ((gref == 0 ? highest : gref == 1 ? 0
 				   : gref == 2 ? lowest
 				   : (highest + lowest) / 2)
@@ -1017,7 +1046,7 @@
 		      }
 		    XDrawString16 (FRAME_X_DISPLAY (f), window, gc,
 				   left + x_offset, top + baseline - y_offset,
-				   buf + i, 1);
+				   x_2byte_buffer + i, 1);
 		  }
 	      }
 	    if (require_clipping)
@@ -3792,13 +3821,16 @@
 		    if (event.xclient.data.l[0]
 			== dpyinfo->Xatom_wm_take_focus)
 		      {
-			f = x_window_to_frame (dpyinfo, event.xclient.window);
+			/* Use x_any_window_to_frame because this
+			   could be the shell widget window
+			   if the frame has no title bar.  */
+			f = x_any_window_to_frame (dpyinfo, event.xclient.window);
 			/* Since we set WM_TAKE_FOCUS, we must call
 			   XSetInputFocus explicitly.  But not if f is null,
 			   since that might be an event for a deleted frame.  */
 #ifdef HAVE_X_I18N
 			/* Not quite sure this is needed -pd */
-			if (f)
+			if (f && FRAME_XIC (f))
 			  XSetICFocus (FRAME_XIC (f));
 #endif
 			if (f)