19477028 Toshiba laptop - external monitor cannot be enabled after booting
authorhenryzh <henry.zhao@oracle.com>
Mon, 27 Apr 2015 15:15:13 -0700
changeset 1459 f624eee89e0b
parent 1458 34b08166bf33
child 1460 4c8eb9886928
19477028 Toshiba laptop - external monitor cannot be enabled after booting 20185088 Fix parfait errors for dispswitch
open-src/app/dispswitch/sun-src/dispswitch.c
--- a/open-src/app/dispswitch/sun-src/dispswitch.c	Fri Apr 24 08:05:44 2015 -0700
+++ b/open-src/app/dispswitch/sun-src/dispswitch.c	Mon Apr 27 15:15:13 2015 -0700
@@ -24,7 +24,7 @@
  */
 
 /*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -545,7 +545,7 @@
 crtc_disable (crtc_t *crtc)
 {
     if (verbose)
-    	fprintf (stderr, "crtc %d (%x) : disable\n", crtc->crtc.index, crtc->crtc.xid);
+    	fprintf (stderr, "crtc %d (0x%lx) : disable\n", crtc->crtc.index, crtc->crtc.xid);
 	
     if (dryrun)
 	return RRSetConfigSuccess;
@@ -588,7 +588,7 @@
 	rr_outputs[o] = crtc->outputs[o]->output.xid;
     mode = crtc->mode_info->id;
     if (verbose) {
-	fprintf (stderr, "crtc %d (%x) : %12s %6.1f +%d+%d", crtc->crtc.index,
+	fprintf (stderr, "crtc %d (0x%lx) : %12s %6.1f +%d+%d", crtc->crtc.index,
 		crtc->crtc.xid,
 		crtc->mode_info->name, mode_refresh (crtc->mode_info),
 		crtc->x, crtc->y);
@@ -1119,7 +1119,7 @@
 		    break;
 		else {
 		    if (verbose)
-			fprintf(stderr, "picked crtc %x for output %d (%s)\n",
+			fprintf(stderr, "picked crtc 0x%lx for output %d (%s)\n",
 			    output->crtc_info->crtc.xid, i, output->output_info->name);
 		}
 	    }
@@ -1466,8 +1466,8 @@
 		con_outputs[j].smodes[0]->name,
 		con_outputs[j].output->rotation); 
 	    for (i = 0; i < con_outputs[j].output->output_info->ncrtc; i++)
-		fprintf(stderr, " %x", con_outputs[j].output->output_info->crtcs[i]);
-	    fprintf(stderr, ", using %x", con_outputs[j].output->output_info->crtc);
+		fprintf(stderr, " 0x%lx", con_outputs[j].output->output_info->crtcs[i]);
+	    fprintf(stderr, ", using 0x%lx", con_outputs[j].output->output_info->crtc);
 	    fprintf(stderr, "\n");
 	}
 	fprintf(stderr, "Total disconnected outputs = %d :\n", dis_ncon);
@@ -1476,8 +1476,8 @@
 		dis_con_outputs[j].output->output_info->name, 
 		dis_con_outputs[j].output->output_info->ncrtc);
 	    for (i = 0; i < dis_con_outputs[j].output->output_info->ncrtc; i++)
-		fprintf(stderr, " %x", dis_con_outputs[j].output->output_info->crtcs[i]);
-	    fprintf(stderr, ", using %x", dis_con_outputs[j].output->output_info->crtc);
+		fprintf(stderr, " 0x%lx", dis_con_outputs[j].output->output_info->crtcs[i]);
+	    fprintf(stderr, ", using 0x%lx", dis_con_outputs[j].output->output_info->crtc);
 	    fprintf(stderr, "\n");
 	}
     }
@@ -1501,7 +1501,7 @@
 
     if ((ncon < 1) || (ncon > 3)) {
 	if ((ncon < 1) && verbose)
-	    fprintf (stderr, "warn: no connection\n", ncon);
+	    fprintf (stderr, "warn: no connection\n");
 	else if ((ncon > 3) && verbose)
 	    fprintf (stderr, "warn: too many (more than 3) connections: %d: can't switch\n", ncon);
 	do_not_switch = True;
@@ -1520,7 +1520,7 @@
     int keycode = XKeysymToKeycode(dpy, keysym);
 
     if (keycode ==  NoSymbol)
-	fatal ("grab_key: keycode not defined for keysym %x\n", keysym);
+	fatal ("grab_key: keycode not defined for keysym 0x%x\n", keysym);
 
     had_error = 0;
     prev_handler = XSetErrorHandler (cur_handler);
@@ -1550,14 +1550,15 @@
 {
     int 	i, j;
     int		single;
-    int		save;
+    int		save = -1;
 
-    for (i = 0; i < ncon; i++) 
-	new_mode[i] = NULL;
+    if (ncon <= 0)
+	return True; 
 
     for (i = 0; i < ncon; i++) {
 	output_t	*output = con_outputs[i].output;
 
+	new_mode[i] = NULL;
 	output->relation = same_as;
 	output->relative_to = NULL;
 	if (use_init_pos) {
@@ -1723,7 +1724,7 @@
     set_crtcs ();
     apply();
 
-    if (need_off_deferred) {
+    if (need_off_deferred && (save != -1)) {
 	/* Now, take the deferred output off */
 	output_t    *output;
 	crtc_t      *crtc;
@@ -1751,7 +1752,7 @@
 }
 
 static Bool 
-do_toggle ()
+do_toggle (void)
 {
     Atom		atom;
     XEvent		xev;
@@ -1958,8 +1959,8 @@
     res = XRRGetScreenResources (dpy, root);
     if (!res)
 	fatal ("could not get screen resources\n");
-    if (res->ncrtc != 2)
-	fatal ("too few (less than 2) or too many (more than 2) crtcs: %d\n", res->ncrtc);
+    if (res->ncrtc < 2)
+	fatal ("too few crtcs: %d\n", res->ncrtc);
 
     do_init();