changeset 18996:ef81a8b79506

(dumpglyphs): Check the dimension of FONT while setting `byte1' and `byte2' members of *CP. (XTread_socket): Trap the BadMatch error that can occur after a XSetInputFocus if window is not visible.
author Richard M. Stallman <rms@gnu.org>
date Sat, 26 Jul 1997 01:43:07 +0000
parents fbda8510ca84
children 32ad93e073f2
files src/xterm.c
diffstat 1 files changed, 28 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/xterm.c	Sat Jul 26 01:41:59 1997 +0000
+++ b/src/xterm.c	Sat Jul 26 01:43:07 1997 +0000
@@ -733,7 +733,12 @@
 		      ccl->reg[0] = charset;
 		      ccl->reg[1] = cp->byte2;
 		      ccl_driver (ccl, NULL, NULL, 0, 0, NULL);
-		      cp->byte2 = ccl->reg[1];
+		      /* We assume that MSBs are appropriately
+                         set/reset by CCL program.  */
+		      if (font->max_byte1 == 0)	/* 1-byte font */
+			cp->byte2 = ccl->reg[1];
+		      else
+			cp->byte1 = ccl->reg[1], cp->byte2 = ccl->reg[2];
 		    }
 		else
 		  for (cp = x_2byte_buffer; cp < x_2byte_buffer + len; cp++)
@@ -741,7 +746,12 @@
 		      ccl->reg[0] = charset;
 		      ccl->reg[1] = cp->byte1, ccl->reg[2] = cp->byte2;
 		      ccl_driver (ccl, NULL, NULL, 0, 0, NULL);
-		      cp->byte1 = ccl->reg[1], cp->byte2 = ccl->reg[2];
+		      /* We assume that MSBs are appropriately
+                         set/reset by CCL program.  */
+		      if (font->max_byte1 == 0)	/* 1-byte font */
+			cp->byte2 = ccl->reg[1];
+		      else
+			cp->byte1 = ccl->reg[1], cp->byte2 = ccl->reg[2];
 		    }
 	      }
 	    else if (fontp->encoding[charset])
@@ -3825,19 +3835,28 @@
 			   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 && FRAME_XIC (f))
 			  XSetICFocus (FRAME_XIC (f));
 #endif
+			/* 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.  */
 			if (f)
-			  XSetInputFocus (event.xclient.display,
-					  event.xclient.window,
-					  RevertToPointerRoot,
-					  event.xclient.data.l[1]);
+			  {
+			    Display *d = event.xclient.display;
+			    /* Catch and ignore errors, in case window has been
+			       iconified by a window manager such as GWM.  */
+			    int count = x_catch_errors (d);
+			    XSetInputFocus (d, event.xclient.window,
+					    RevertToPointerRoot,
+					    event.xclient.data.l[1]);
+			    /* This is needed to detect the error
+			       if there is an error.  */
+			    XSync (d, False);
+			    x_uncatch_errors (d, count);
+			  }  
 			/* Not certain about handling scroll bars here */
 		      }
 		    else if (event.xclient.data.l[0]