Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!uwm.edu!uakari.primate.wisc.edu!aplcen!haven!decuac!elijah!tarsa From: tarsa@elijah.UUCP (Greg Tarsa) Newsgroups: comp.windows.x Subject: X11 under Sunview: How to do it Message-ID: <341@elijah.UUCP> Date: 8 Oct 89 00:55:06 GMT Organization: Tarsa Software Consultants, Bedford, NH Lines: 255 A few weeks ago I requested information on trying to run X11 under Sunview. I got a number of replies, requests and encouragements from my message requesting information on how to use X11 with Sunview. What follows here is a consolidation of what I learned. Thanks to Jan Peterson ({ ...!utah-cs!caeco | quad1 }!olyis!jlp), Tom Olin (...!uunet!adiron!tro), Susan Bickford (susan@gotham.East.Sun.COM) and, indirectly, Dana Chee (dana@bellcore.com) for this information. 1) An official announcement of an X11/NeWS, with binary SunView compatibility is imminent. 2) For those unwilling to wait, or too poor to pay, I have included the information necessary to get X to run under Sunview. This should work for monochrome systems on Sun-3's at a minimum, since that is what our shop has and it runs well here. a) Compile the server with -DSUN_WINDOWS to include support for Sunview/X co-existence. See site.def and Sun.macros to see how to do this. This will allow overview -w xinit to work properly with X11. When X11 terminates, control will return to Sunview. 2) If you want to be able to *suspend* X11, then you must patch xinit and the server with the patch file that I have included in this message. With the patch, META-L2 will suspend the server and iconify it on the Sunview screen. Opening the icon will restart the X11 server. On my 12meg Sun-3 it all happens very quickly. Smaller memory systems may have some pauses while everything swaps around. By the way, for the 386i, the Meta key mentioned below is really the left-diamond key (next to the spacebar). Tarsa Software Consulting -------------------------------- 33 Seabee Street Bedford, NH 03102 tarsa@elijah.mv.com (603)668-9226 {decuac,decvax}!elijah!tarsa --------------CUT HERE for metakey.suntools------------------- Below are the changes: Dana Chee Bellcore MRE 2Q-250 (201) 829-4488 dana@bellcore.com ------------ report.metakey ---------------- VERSION: X11 release 3 CLIENT MACHINE: Sun 3/75 [and 3/160 -greg] CLIENT OPERATING SYSTEM: SunOS 3.2 DISPLAY: Sun [Monochrome] SYNOPSIS: Add Meta-L2 support for running X under Sunview. DESCRIPTION: These diff add the Meta-L2 support present in X10R4 which allowed an X server running under Sunview to return to Sunview by typing Meta-L2. When the overview icon was clicked, the X server was restarted. Affected files: clients/xinit/xinit.c server/ddx/sun/sunInit.c server/ddx/sun/sunKbd.c FIX: *** clients/xinit/xinit.c.orig Thu Feb 25 23:53:54 1988 --- clients/xinit/xinit.c Thu Apr 21 14:29:11 1988 *************** *** 148,156 **** #endif /* SYSV */ if ((serverpid = startServer(server)) > 0 && (clientpid = startClient(client)) > 0) { ! pid = -1; ! while (pid != clientpid && pid != serverpid) ! pid = wait(NULL); } signal(SIGQUIT, SIG_IGN); signal(SIGINT, SIG_IGN); --- 148,173 ---- #endif /* SYSV */ if ((serverpid = startServer(server)) > 0 && (clientpid = startClient(client)) > 0) { ! while( 1 ) ! { ! union wait status; ! ! do ! { ! pid = wait3(&status, WUNTRACED, NULL); ! } while (pid != clientpid && pid != serverpid); ! ! if (pid == serverpid && ! (WIFSTOPPED(status))) ! { ! kill (getpid(), SIGSTOP); ! kill (serverpid, SIGCONT); ! } ! else ! { ! break; ! } ! } } signal(SIGQUIT, SIG_IGN); signal(SIGINT, SIG_IGN); *************** *** 222,227 **** --- 239,245 ---- break; } laststring = string; + fprintf(stderr, "\n"); return( pid != pidfound ); } *** server/ddx/sun/sunInit.c.orig Sat Jan 16 12:40:55 1988 --- server/ddx/sun/sunInit.c Thu Apr 21 14:20:51 1988 *************** *** 63,68 **** --- 63,69 ---- extern void SetInputCheck(); extern char *strncpy(); extern GCPtr CreateScratchGC(); + extern WindowRec WindowTable[]; #define XDEVICE "XDEVICE" #define PARENT "WINDOW_GFX" *************** *** 704,706 **** --- 705,773 ---- return (fd); } + + /* + * stopme - stop window for suntools + */ + #ifdef SUN_WINDOWS + stopme() + { + DevicePtr pKbd; + int i; + + if( !sunUseSunWindows()) + return; + + /* + * on our way out -- shut down keyboard and mouse + * and remove the window + */ + pKbd = LookupKeyboardDevice(); + sunKbdProc(pKbd, DEVICE_OFF); + sunMouseProc(pKbd, DEVICE_OFF); + win_remove(windowFd); + kill(0, SIGSTOP); + + /* + * we're back, restore the window, and turn on the + * keyboard and mouse + */ + win_insert(windowFd); + sunMouseProc(pKbd, DEVICE_ON); + sunKbdProc(pKbd, DEVICE_ON); + + /* + * refresh all screens + */ + for( i = 0; i < screenInfo.numScreens; i++ ) + { + ExposeEveryone(&WindowTable[i], &screenInfo.screen[i]); + HandleExposures(&WindowTable[i]); + } + } + + static + ExposeEveryone(pWin, pScreen) + WindowPtr pWin; + ScreenPtr pScreen; + { + WindowPtr pChild; + + pChild = pWin; + while( pChild ) + { + if( pChild->mapped ) + { + (* pScreen->RegionCopy)(pChild->exposed, pChild->clipList); + (* pScreen->RegionCopy)(pChild->borderExposed, pChild->borderClip); + ExposeEveryone(pChild->firstChild, pScreen); + } + pChild = pChild->nextSib; + } + } + #endif SUN_WINDOWS + + + + + *** server/ddx/sun/sunKbd.c.orig Tue Feb 9 17:19:51 1988 --- server/ddx/sun/sunKbd.c Thu Apr 21 14:23:58 1988 *************** *** 734,744 **** --- 734,763 ---- register struct inputevent *se; { Firm_event fe; + int loc; + static Meta_On, Meta_hold; fe.time = event_time(se); fe.id = event_id(se); fe.value = (event_is_up(se) ? VKEY_UP : VKEY_DOWN); + loc = (fe.id - 1) * sunKeySyms[sysKbPriv.type].mapWidth; + + if( sunKeySyms[sysKbPriv.type].map[loc] == XK_Meta_L || + sunKeySyms[sysKbPriv.type].map[loc] == XK_Meta_R ) /* Meta */ + { + Meta_hold = fe.id; + Meta_On = (fe.value == VKEY_DOWN); + } + if( sunKeySyms[sysKbPriv.type].map[loc] == XK_L2 ) /* L2 */ + { + if( fe.value == VKEY_DOWN && Meta_On ) + { + stopme(); + fe.id = Meta_hold; + fe.value = VKEY_UP; + } + } sunKbdProcessEvent (pKeyboard, &fe); } #endif SUN_WINDOWS