From 689d52b6242434507a64a8fff27b01607628c393 Mon Sep 17 00:00:00 2001 From: Jens Granseuer Date: Mon, 5 Mar 2007 15:31:44 -0800 Subject: [PATCH 01/15] Bugzilla #7145: fix build with gcc 2.95 Bugzilla #7145: Patch #8987: --- GL/glx/glxcmdsswap.c | 4 ++-- randr/rrcrtc.c | 2 +- randr/rroutput.c | 2 +- randr/rrpointer.c | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/GL/glx/glxcmdsswap.c b/GL/glx/glxcmdsswap.c index d59dfdb4c..1857bc1eb 100644 --- a/GL/glx/glxcmdsswap.c +++ b/GL/glx/glxcmdsswap.c @@ -496,11 +496,11 @@ int __glXDispSwap_CopySubBufferMESA(__GLXclientState *cl, GLbyte *pc) GLXDrawable *drawId; int *buffer; + __GLX_DECLARE_SWAP_VARIABLES; + (void) drawId; (void) buffer; - __GLX_DECLARE_SWAP_VARIABLES; - pc += __GLX_VENDPRIV_HDR_SIZE; __GLX_SWAP_SHORT(&req->length); diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c index 1f7462f28..db506f4b0 100644 --- a/randr/rrcrtc.c +++ b/randr/rrcrtc.c @@ -490,7 +490,7 @@ RRCrtcInit (void) int ProcRRGetCrtcInfo (ClientPtr client) { - REQUEST(xRRGetCrtcInfoReq);; + REQUEST(xRRGetCrtcInfoReq); xRRGetCrtcInfoReply rep; RRCrtcPtr crtc; CARD8 *extra; diff --git a/randr/rroutput.c b/randr/rroutput.c index a66433015..df1741f5c 100644 --- a/randr/rroutput.c +++ b/randr/rroutput.c @@ -366,7 +366,7 @@ RROutputInit (void) int ProcRRGetOutputInfo (ClientPtr client) { - REQUEST(xRRGetOutputInfoReq);; + REQUEST(xRRGetOutputInfoReq); xRRGetOutputInfoReply rep; RROutputPtr output; CARD8 *extra; diff --git a/randr/rrpointer.c b/randr/rrpointer.c index 802dcb2c4..c88a0f83e 100644 --- a/randr/rrpointer.c +++ b/randr/rrpointer.c @@ -103,7 +103,7 @@ void RRPointerMoved (ScreenPtr pScreen, int x, int y) { rrScrPriv (pScreen); - RRCrtcPtr pointerCrtc = pScrPriv->pointerCrtc;; + RRCrtcPtr pointerCrtc = pScrPriv->pointerCrtc; int c; /* Check last known CRTC */ From 33d2cf93fb50464941e74efe246b10aee212223a Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 3 Mar 2007 23:10:31 -0800 Subject: [PATCH 02/15] Move xf86SetSingleMode into X server from intel driver. This function applies a single mode to the screen (as from RandR 1.1, XFree86-VidModeExtension or XFree86-DGA) using a policy that selects one output to reconfigure to the requested mode and then makes all other outputs fit within that size. (cherry picked from commit 5a595c1f767a8d666348b845d18934aee0cfe38f) --- hw/xfree86/modes/xf86Crtc.c | 126 ++++++++++++++++++++++++++++++++++++ hw/xfree86/modes/xf86Crtc.h | 6 ++ 2 files changed, 132 insertions(+) diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index 2ffa9567c..3d28293c8 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -1542,6 +1542,132 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow) return TRUE; } +/** + * In the current world order, there are lists of modes per output, which may + * or may not include the mode that was asked to be set by XFree86's mode + * selection. Find the closest one, in the following preference order: + * + * - Equality + * - Closer in size to the requested mode, but no larger + * - Closer in refresh rate to the requested mode. + */ + +DisplayModePtr +xf86OutputFindClosestMode (xf86OutputPtr output, DisplayModePtr desired) +{ + DisplayModePtr best = NULL, scan = NULL; + + for (scan = output->probed_modes; scan != NULL; scan = scan->next) + { + /* If there's an exact match, we're done. */ + if (xf86ModesEqual(scan, desired)) { + best = desired; + break; + } + + /* Reject if it's larger than the desired mode. */ + if (scan->HDisplay > desired->HDisplay || + scan->VDisplay > desired->VDisplay) + { + continue; + } + + /* + * If we haven't picked a best mode yet, use the first + * one in the size range + */ + if (best == NULL) + { + best = scan; + continue; + } + + /* Find if it's closer to the right size than the current best + * option. + */ + if ((scan->HDisplay > best->HDisplay && + scan->VDisplay >= best->VDisplay) || + (scan->HDisplay >= best->HDisplay && + scan->VDisplay > best->VDisplay)) + { + best = scan; + continue; + } + + /* Find if it's still closer to the right refresh than the current + * best resolution. + */ + if (scan->HDisplay == best->HDisplay && + scan->VDisplay == best->VDisplay && + (fabs(scan->VRefresh - desired->VRefresh) < + fabs(best->VRefresh - desired->VRefresh))) { + best = scan; + } + } + return best; +} + +/** + * When setting a mode through XFree86-VidModeExtension or XFree86-DGA, + * take the specified mode and apply it to the crtc connected to the compat + * output. Then, find similar modes for the other outputs, as with the + * InitialConfiguration code above. The goal is to clone the desired + * mode across all outputs that are currently active. + */ + +Bool +xf86SetSingleMode (ScrnInfoPtr pScrn, DisplayModePtr desired, Rotation rotation) +{ + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); + Bool ok = TRUE; + xf86OutputPtr compat_output = config->output[config->compat_output]; + DisplayModePtr compat_mode; + int c; + + /* + * Let the compat output drive the final mode selection + */ + compat_mode = xf86OutputFindClosestMode (compat_output, desired); + if (compat_mode) + desired = compat_mode; + + for (c = 0; c < config->num_crtc; c++) + { + xf86CrtcPtr crtc = config->crtc[c]; + DisplayModePtr crtc_mode = NULL; + int o; + + if (!crtc->enabled) + continue; + + for (o = 0; o < config->num_output; o++) + { + xf86OutputPtr output = config->output[o]; + DisplayModePtr output_mode; + + /* skip outputs not on this crtc */ + if (output->crtc != crtc) + continue; + + if (crtc_mode) + { + output_mode = xf86OutputFindClosestMode (output, crtc_mode); + if (output_mode != crtc_mode) + output->crtc = NULL; + } + else + crtc_mode = xf86OutputFindClosestMode (output, desired); + } + if (!xf86CrtcSetMode (crtc, crtc_mode, rotation, 0, 0)) + ok = FALSE; + else + crtc->desiredMode = *crtc_mode; + } + xf86DisableUnusedFunctions(pScrn); + return ok; +} + + /** * Set the DPMS power mode of all outputs and CRTCs. * diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h index 537df3a3b..56c7769cf 100644 --- a/hw/xfree86/modes/xf86Crtc.h +++ b/hw/xfree86/modes/xf86Crtc.h @@ -594,6 +594,12 @@ xf86SaveScreen(ScreenPtr pScreen, int mode); void xf86DisableUnusedFunctions(ScrnInfoPtr pScrn); +DisplayModePtr +xf86OutputFindClosestMode (xf86OutputPtr output, DisplayModePtr desired); + +Bool +xf86SetSingleMode (ScrnInfoPtr pScrn, DisplayModePtr desired, Rotation rotation); + /** * Set the EDID information for the specified output */ From 47f8361c3a64834587e54507653d8d5b258c2530 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 5 Mar 2007 22:07:01 -0800 Subject: [PATCH 03/15] Add xf86SetDesiredModes to apply desired modes to crtcs. xf86SetDesiredModes applies the desired modes to each crtc (as selected by xf86InitialConfiguration initially and modified by successful mode settings afterwards). For crtcs without a desired mode, pScrn->currentMode is used to select something workable. (cherry picked from commit bcade98ccaa18298d844a606cb44271f0254c185) --- hw/xfree86/modes/xf86Crtc.c | 57 +++++++++++++++++++++++++++++++++++ hw/xfree86/modes/xf86Crtc.h | 8 +++++ hw/xfree86/modes/xf86Rename.h | 3 ++ 3 files changed, 68 insertions(+) diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index 3d28293c8..c38da62ce 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -1542,6 +1542,63 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow) return TRUE; } +/* + * Using the desired mode information in each crtc, set + * modes (used in EnterVT functions, or at server startup) + */ + +Bool +xf86SetDesiredModes (ScrnInfoPtr scrn) +{ + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); + int c; + + for (c = 0; c < config->num_crtc; c++) + { + xf86CrtcPtr crtc = config->crtc[c]; + xf86OutputPtr output = NULL; + int o; + + if (config->output[config->compat_output]->crtc == crtc) + output = config->output[config->compat_output]; + else + { + for (o = 0; o < config->num_output; o++) + if (config->output[o]->crtc == crtc) + { + output = config->output[o]; + break; + } + } + /* + * Skip disabled crtcs + */ + if (!output) + continue; + + /* Mark that we'll need to re-set the mode for sure */ + memset(&crtc->mode, 0, sizeof(crtc->mode)); + if (!crtc->desiredMode.CrtcHDisplay) + { + DisplayModePtr mode = xf86OutputFindClosestMode (output, scrn->currentMode); + + if (!mode) + return FALSE; + crtc->desiredMode = *mode; + crtc->desiredRotation = RR_Rotate_0; + crtc->desiredX = 0; + crtc->desiredY = 0; + } + + if (!xf86CrtcSetMode (crtc, &crtc->desiredMode, crtc->desiredRotation, + crtc->desiredX, crtc->desiredY)) + return FALSE; + } + + xf86DisableUnusedFunctions(scrn); + return TRUE; +} + /** * In the current world order, there are lists of modes per output, which may * or may not include the mode that was asked to be set by XFree86's mode diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h index 56c7769cf..062a2dbec 100644 --- a/hw/xfree86/modes/xf86Crtc.h +++ b/hw/xfree86/modes/xf86Crtc.h @@ -644,4 +644,12 @@ xf86CrtcSetScreenSubpixelOrder (ScreenPtr pScreen); char * xf86ConnectorGetName(xf86ConnectorType connector); +/* + * Using the desired mode information in each crtc, set + * modes (used in EnterVT functions, or at server startup) + */ + +Bool +xf86SetDesiredModes (ScrnInfoPtr pScrn); + #endif /* _XF86CRTC_H_ */ diff --git a/hw/xfree86/modes/xf86Rename.h b/hw/xfree86/modes/xf86Rename.h index 6cfa5caa1..eae6d64d5 100644 --- a/hw/xfree86/modes/xf86Rename.h +++ b/hw/xfree86/modes/xf86Rename.h @@ -76,5 +76,8 @@ #define xf86CrtcSetScreenSubpixelOrder XF86NAME(xf86CrtcSetScreenSubpixelOrder) #define xf86ModeWidth XF86NAME(xf86ModeWidth) #define xf86ModeHeight XF86NAME(xf86ModeHeight) +#define xf86OutputFindClosestMode XF86NAME(xf86OutputFindClosestMode) +#define xf86SetSingleMode XF86NAME(xf86SetSingleMode) +#define xf86SetDesiredModes XF86NAME(xf86SetDesiredModes) #endif /* _XF86RENAME_H_ */ From bed76caa6caaea6a6598755b82a54425a9d9f73e Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 5 Mar 2007 23:36:00 -0800 Subject: [PATCH 04/15] Use EDID data to set screen physical size at server startup. Screen physical size is set to a random value before the RandR code gets control, override that and reset it to a value based on the compat_output physical size (if available). If that output has no physical size, just use 96dpi as the default resolution and set the physical size as appropriate. (cherry picked from commit 843077f23a1b49bd712d931421753e3a09d4008c) --- hw/xfree86/modes/xf86RandR12.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c index 052d12aa3..ce780b6ef 100644 --- a/hw/xfree86/modes/xf86RandR12.c +++ b/hw/xfree86/modes/xf86RandR12.c @@ -422,8 +422,28 @@ xf86RandR12CreateScreenResources (ScreenPtr pScreen) } else { - mmWidth = pScreen->mmWidth; - mmHeight = pScreen->mmHeight; + xf86OutputPtr output = config->output[config->compat_output]; + xf86CrtcPtr crtc = output->crtc; + + if (crtc && crtc->mode.HDisplay && + output->mm_width && output->mm_height) + { + /* + * If the output has a mode and a declared size, use that + * to scale the screen size + */ + DisplayModePtr mode = &crtc->mode; + mmWidth = output->mm_width * width / mode->HDisplay; + mmHeight = output->mm_height * height / mode->VDisplay; + } + else + { + /* + * Otherwise, just set the screen to 96dpi + */ + mmWidth = width * 25.4 / 96; + mmHeight = height * 25.4 / 96; + } } xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Setting screen physical size to %d x %d\n", From 9b6bb06f13a71f6078f762b4a78fa516faccb638 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 5 Mar 2007 23:49:35 -0800 Subject: [PATCH 05/15] Allow relative positions to use output names or monitor identifiers. Previous version used monitor identifiers if present, otherwise output names. That caused existing working configurations to break when additional information was added to the configuration file. (cherry picked from commit 3f5cedf00a82f08a433c95ffbb7f8ac69dcf6a50) --- hw/xfree86/modes/xf86Crtc.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index c38da62ce..46515fdcc 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -879,13 +879,17 @@ xf86InitialOutputPositions (ScrnInfoPtr scrn, DisplayModePtr *modes) { xf86OutputPtr out_rel = config->output[or]; XF86ConfMonitorPtr rel_mon = out_rel->conf_monitor; - char *name; if (rel_mon) - name = rel_mon->mon_identifier; - else - name = out_rel->name; - if (!strcmp (relative_name, name)) + { + if (xf86nameCompare (rel_mon->mon_identifier, + relative_name) == 0) + { + relative = config->output[or]; + break; + } + } + if (strcmp (out_rel->name, relative_name) == 0) { relative = config->output[or]; break; From ec1ef8a56d6217ca2b04899043874ce0bcad9784 Mon Sep 17 00:00:00 2001 From: Ben Byer Date: Tue, 6 Mar 2007 00:57:23 -0800 Subject: [PATCH 06/15] Fixed Darwin's Makefile.am to fix a problem building X11.app --- hw/darwin/Makefile.am | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hw/darwin/Makefile.am b/hw/darwin/Makefile.am index 75d028ea5..3e28d3212 100644 --- a/hw/darwin/Makefile.am +++ b/hw/darwin/Makefile.am @@ -112,7 +112,7 @@ macos_PROGRAMS = XDarwinApp macos_SCRIPTS = x11app x11app: - cd apple && xcodebuild + cd apple && xcodebuild CFLAGS="$(XSERVERCFLAGS_CFLAGS)" LDFLAGS="$(XSERVERCFLAGS_LIBS)" XDarwinApp_SOURCES = \ $(top_srcdir)/fb/fbcmap.c \ @@ -275,7 +275,7 @@ install-data-hook: $(HOOK_TARGETS) xquartz-install-hook: mv $(DESTDIR)$(macosdir)/XDarwinApp $(DESTDIR)$(macosdir)/XDarwin - cd apple && xcodebuild CFLAGS="$(XSERVERCFLAGS_CFLAGS)" LDFLAGS="$(XSERVERCFLAGS_LIBS)" + cd apple && xcodebuild install EXTRA_DIST = \ darwin.c \ From 3206e9225897989638ad553e1f392b918ac4d21f Mon Sep 17 00:00:00 2001 From: Ben Byer Date: Tue, 6 Mar 2007 02:31:59 -0800 Subject: [PATCH 07/15] moved new event-handling code from X11Application.m to darwinEvents.c in preparation for making all Darwin servers use it --- hw/darwin/apple/X11Application.m | 42 ------------------------------- hw/darwin/darwinEvents.c | 43 ++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 42 deletions(-) diff --git a/hw/darwin/apple/X11Application.m b/hw/darwin/apple/X11Application.m index cfc975037..34c0307a5 100644 --- a/hw/darwin/apple/X11Application.m +++ b/hw/darwin/apple/X11Application.m @@ -855,48 +855,6 @@ convert_flags (unsigned int nsflags) { return xflags; } -/* Sends a null byte down darwinEventWriteFD, which will cause the - Dispatch() event loop to check out event queue */ -void DarwinPokeEQ(void) { - char nullbyte=0; - input_check_flag++; - // bushing: oh, i ... er ... christ. - write(darwinEventWriteFD, &nullbyte, 1); -} - -void DarwinSendPointerEvents(int ev_type, int ev_button, int pointer_x, int pointer_y) { - int i; - int valuators[2] = {pointer_x, pointer_y}; - int num_events = GetPointerEvents(darwinEvents, darwinPointer, ev_type, ev_button, - POINTER_ABSOLUTE, 0, 2, valuators); - - for(i=0; i 0.0f ? 4 : 5; - int valuators[2] = {pointer_x, pointer_y}; - - for (count = fabs(count); count > 0.0; count = count - 1.0f) { - int num_events = GetPointerEvents(darwinEvents, darwinPointer, ButtonPress, ev_button, - POINTER_ABSOLUTE, 0, 2, valuators); - for(i=0; i bushing: oh, i ... er ... christ. + write(darwinEventWriteFD, &nullbyte, 1); +} + +void DarwinSendPointerEvents(int ev_type, int ev_button, int pointer_x, int pointer_y) { + int i; + int valuators[2] = {pointer_x, pointer_y}; + int num_events = GetPointerEvents(darwinEvents, darwinPointer, ev_type, ev_button, + POINTER_ABSOLUTE, 0, 2, valuators); + + for(i=0; i 0.0f ? 4 : 5; + int valuators[2] = {pointer_x, pointer_y}; + + for (count = fabs(count); count > 0.0; count = count - 1.0f) { + int num_events = GetPointerEvents(darwinEvents, darwinPointer, ButtonPress, ev_button, + POINTER_ABSOLUTE, 0, 2, valuators); + for(i=0; i Date: Tue, 6 Mar 2007 23:53:23 +1100 Subject: [PATCH 08/15] Xprint: shorten font filename to fit in tar length limit The length of the Xprint font file NewCenturySchlbk-BoldItalic.pmf pushes the full path over the traditional 100 character limit for tarballs (when module version number is included). Shorten it to NewCentSchlbk-BoldItal.pmf to get back below the limit and rename other font files in that family to match. --- .../C/print/models/CANONC3200-PS/fonts/Makefile.am | 8 ++++---- .../C/print/models/HPLJ4050-PS/fonts/Makefile.am | 8 ++++---- .../C/print/models/PSdefault/fonts/Makefile.am | 8 ++++---- ...enturySchlbk-Bold.pmf => NewCentSchlbk-Bold.pmf} | Bin ...bk-BoldItalic.pmf => NewCentSchlbk-BoldItal.pmf} | Bin ...turySchlbk-Italic.pmf => NewCentSchlbk-Ital.pmf} | Bin ...turySchlbk-Roman.pmf => NewCentSchlbk-Roman.pmf} | Bin 7 files changed, 12 insertions(+), 12 deletions(-) rename hw/xprint/config/C/print/models/PSdefault/fonts/{NewCenturySchlbk-Bold.pmf => NewCentSchlbk-Bold.pmf} (100%) rename hw/xprint/config/C/print/models/PSdefault/fonts/{NewCenturySchlbk-BoldItalic.pmf => NewCentSchlbk-BoldItal.pmf} (100%) rename hw/xprint/config/C/print/models/PSdefault/fonts/{NewCenturySchlbk-Italic.pmf => NewCentSchlbk-Ital.pmf} (100%) rename hw/xprint/config/C/print/models/PSdefault/fonts/{NewCenturySchlbk-Roman.pmf => NewCentSchlbk-Roman.pmf} (100%) diff --git a/hw/xprint/config/C/print/models/CANONC3200-PS/fonts/Makefile.am b/hw/xprint/config/C/print/models/CANONC3200-PS/fonts/Makefile.am index c574c5cde..7a7ecc31a 100644 --- a/hw/xprint/config/C/print/models/CANONC3200-PS/fonts/Makefile.am +++ b/hw/xprint/config/C/print/models/CANONC3200-PS/fonts/Makefile.am @@ -19,10 +19,10 @@ XPFONTS = \ LubalinGraph-BookOblique.pmf \ LubalinGraph-Demi.pmf \ LubalinGraph-DemiOblique.pmf \ - NewCenturySchlbk-Bold.pmf \ - NewCenturySchlbk-BoldItalic.pmf \ - NewCenturySchlbk-Italic.pmf \ - NewCenturySchlbk-Roman.pmf \ + NewCentSchlbk-Bold.pmf \ + NewCentSchlbk-BoldItal.pmf \ + NewCentSchlbk-Ital.pmf \ + NewCentSchlbk-Roman.pmf \ Souvenir-Demi.pmf \ Souvenir-DemiItalic.pmf \ Souvenir-Light.pmf \ diff --git a/hw/xprint/config/C/print/models/HPLJ4050-PS/fonts/Makefile.am b/hw/xprint/config/C/print/models/HPLJ4050-PS/fonts/Makefile.am index 634db1f39..f4f4243e9 100644 --- a/hw/xprint/config/C/print/models/HPLJ4050-PS/fonts/Makefile.am +++ b/hw/xprint/config/C/print/models/HPLJ4050-PS/fonts/Makefile.am @@ -19,10 +19,10 @@ XPFONTS = \ LubalinGraph-BookOblique.pmf \ LubalinGraph-Demi.pmf \ LubalinGraph-DemiOblique.pmf \ - NewCenturySchlbk-Bold.pmf \ - NewCenturySchlbk-BoldItalic.pmf \ - NewCenturySchlbk-Italic.pmf \ - NewCenturySchlbk-Roman.pmf \ + NewCentSchlbk-Bold.pmf \ + NewCentSchlbk-BoldItal.pmf \ + NewCentSchlbk-Ital.pmf \ + NewCentSchlbk-Roman.pmf \ Souvenir-Demi.pmf \ Souvenir-DemiItalic.pmf \ Souvenir-Light.pmf \ diff --git a/hw/xprint/config/C/print/models/PSdefault/fonts/Makefile.am b/hw/xprint/config/C/print/models/PSdefault/fonts/Makefile.am index 1e8c8a781..40f1e3da5 100644 --- a/hw/xprint/config/C/print/models/PSdefault/fonts/Makefile.am +++ b/hw/xprint/config/C/print/models/PSdefault/fonts/Makefile.am @@ -17,10 +17,10 @@ dist_xpc_DATA = \ LubalinGraph-Book.pmf \ LubalinGraph-DemiOblique.pmf \ LubalinGraph-Demi.pmf \ - NewCenturySchlbk-Bold.pmf \ - NewCenturySchlbk-BoldItalic.pmf \ - NewCenturySchlbk-Italic.pmf \ - NewCenturySchlbk-Roman.pmf \ + NewCentSchlbk-Bold.pmf \ + NewCentSchlbk-BoldItal.pmf \ + NewCentSchlbk-Ital.pmf \ + NewCentSchlbk-Roman.pmf \ Souvenir-DemiItalic.pmf \ Souvenir-Demi.pmf \ Souvenir-LightItalic.pmf \ diff --git a/hw/xprint/config/C/print/models/PSdefault/fonts/NewCenturySchlbk-Bold.pmf b/hw/xprint/config/C/print/models/PSdefault/fonts/NewCentSchlbk-Bold.pmf similarity index 100% rename from hw/xprint/config/C/print/models/PSdefault/fonts/NewCenturySchlbk-Bold.pmf rename to hw/xprint/config/C/print/models/PSdefault/fonts/NewCentSchlbk-Bold.pmf diff --git a/hw/xprint/config/C/print/models/PSdefault/fonts/NewCenturySchlbk-BoldItalic.pmf b/hw/xprint/config/C/print/models/PSdefault/fonts/NewCentSchlbk-BoldItal.pmf similarity index 100% rename from hw/xprint/config/C/print/models/PSdefault/fonts/NewCenturySchlbk-BoldItalic.pmf rename to hw/xprint/config/C/print/models/PSdefault/fonts/NewCentSchlbk-BoldItal.pmf diff --git a/hw/xprint/config/C/print/models/PSdefault/fonts/NewCenturySchlbk-Italic.pmf b/hw/xprint/config/C/print/models/PSdefault/fonts/NewCentSchlbk-Ital.pmf similarity index 100% rename from hw/xprint/config/C/print/models/PSdefault/fonts/NewCenturySchlbk-Italic.pmf rename to hw/xprint/config/C/print/models/PSdefault/fonts/NewCentSchlbk-Ital.pmf diff --git a/hw/xprint/config/C/print/models/PSdefault/fonts/NewCenturySchlbk-Roman.pmf b/hw/xprint/config/C/print/models/PSdefault/fonts/NewCentSchlbk-Roman.pmf similarity index 100% rename from hw/xprint/config/C/print/models/PSdefault/fonts/NewCenturySchlbk-Roman.pmf rename to hw/xprint/config/C/print/models/PSdefault/fonts/NewCentSchlbk-Roman.pmf From a05ffca8dd0da9bdb5c1bf4c481028aeabf21e34 Mon Sep 17 00:00:00 2001 From: Ben Byer Date: Tue, 6 Mar 2007 10:36:51 -0800 Subject: [PATCH 09/15] rewrote event handling, Xquartz now has working mouse and keyboard. use it\! --- hw/darwin/apple/X11Application.m | 6 +- hw/darwin/darwinEvents.c | 250 +++++++++++-------------------- 2 files changed, 88 insertions(+), 168 deletions(-) diff --git a/hw/darwin/apple/X11Application.m b/hw/darwin/apple/X11Application.m index 34c0307a5..57795f452 100644 --- a/hw/darwin/apple/X11Application.m +++ b/hw/darwin/apple/X11Application.m @@ -919,11 +919,7 @@ static void send_nsevent (NSEventType type, NSEvent *e) { break; case NSFlagsChanged: - bzero(&xe, sizeof(xe)); - xe.u.u.type = kXDarwinUpdateModifiers; - xe.u.clientMessage.u.l.longs0 = [e modifierFlags]; - DarwinEQEnqueue (&xe); - DarwinPokeEQ(); + DarwinUpdateModKeys([e modifierFlags]); break; default: break; /* for gcc */ } diff --git a/hw/darwin/darwinEvents.c b/hw/darwin/darwinEvents.c index cb30a90ab..3d7f268ca 100644 --- a/hw/darwin/darwinEvents.c +++ b/hw/darwin/darwinEvents.c @@ -63,6 +63,8 @@ typedef struct _Event { int input_check_zero, input_check_flag; +static int old_flags = 0; // last known modifier state + typedef struct _EventQueue { HWEventQueueType head, tail; /* long for SetInputCheck */ CARD32 lastEventTime; /* to avoid time running backwards */ @@ -81,18 +83,15 @@ xEvent *darwinEvents; * Press or release the given modifier key, specified by its mask. */ static void DarwinPressModifierMask( - xEvent *xe, // must already have type, time and mouse location + int pressed, int mask) // one of NX_*MASK constants { int key = DarwinModifierNXMaskToNXKey(mask); if (key != -1) { int keycode = DarwinModifierNXKeyToNXKeycode(key, 0); - if (keycode != 0) { - xe->u.u.detail = keycode + MIN_KEYCODE; - (*darwinEventQueue.pKbd->processInputProc)(xe, - (DeviceIntPtr)darwinEventQueue.pKbd, 1); - } + if (keycode != 0) + DarwinSendKeyboardEvents(pressed, keycode); } } @@ -125,28 +124,26 @@ static void DarwinPressModifierMask( * Send events to update the modifier state. */ static void DarwinUpdateModifiers( - xEvent *xe, // event template with time and mouse position set int pressed, // KeyPress or KeyRelease int flags ) // modifier flags that have changed { - xe->u.u.type = pressed; if (flags & NX_ALPHASHIFTMASK) { - DarwinPressModifierMask(xe, NX_ALPHASHIFTMASK); + DarwinPressModifierMask(pressed, NX_ALPHASHIFTMASK); } if (flags & NX_COMMANDMASK) { - DarwinPressModifierMask(xe, COMMAND_MASK(flags)); + DarwinPressModifierMask(pressed, COMMAND_MASK(flags)); } if (flags & NX_CONTROLMASK) { - DarwinPressModifierMask(xe, CONTROL_MASK(flags)); + DarwinPressModifierMask(pressed, CONTROL_MASK(flags)); } if (flags & NX_ALTERNATEMASK) { - DarwinPressModifierMask(xe, ALTERNATE_MASK(flags)); + DarwinPressModifierMask(pressed, ALTERNATE_MASK(flags)); } if (flags & NX_SHIFTMASK) { - DarwinPressModifierMask(xe, SHIFT_MASK(flags)); + DarwinPressModifierMask(pressed, SHIFT_MASK(flags)); } if (flags & NX_SECONDARYFNMASK) { - DarwinPressModifierMask(xe, NX_SECONDARYFNMASK); + DarwinPressModifierMask(pressed, NX_SECONDARYFNMASK); } } @@ -163,19 +160,20 @@ static void DarwinUpdateModifiers( * simulate a button 2 press instead of Command-button 2. */ static void DarwinSimulateMouseClick( - xEvent *xe, // event template with time and - // mouse position filled in + int pointer_x, + int pointer_y, int whichButton, // mouse button to be pressed int modifierMask) // modifiers used for the fake click { // first fool X into forgetting about the keys - DarwinUpdateModifiers(xe, KeyRelease, modifierMask); + DarwinUpdateModifiers(KeyRelease, modifierMask); // push the mouse button - xe->u.u.type = ButtonPress; - xe->u.u.detail = whichButton; - (*darwinEventQueue.pPtr->processInputProc) - (xe, (DeviceIntPtr)darwinEventQueue.pPtr, 1); + DarwinSendPointerEvents(ButtonPress, whichButton, pointer_x, pointer_y); + DarwinSendPointerEvents(ButtonRelease, whichButton, pointer_x, pointer_y); + + // restore old modifiers + DarwinUpdateModifiers(KeyPress, modifierMask); } @@ -234,7 +232,7 @@ void DarwinEQEnqueue(const xEvent *e) { darwinEventQueue.tail = newtail; // Signal there is an event ready to handle - write(darwinEventWriteFD, &byte, 1); + DarwinPokeEQ(); } @@ -265,8 +263,6 @@ void ProcessInputEvents(void) { xEvent xe; static int old_flags = 0; // last known modifier state // button number and modifier mask of currently pressed fake button - static int darwinFakeMouseButtonDown = 0; - static int darwinFakeMouseButtonMask = 0; input_check_flag=0; // ErrorF("calling mieqProcessInputEvents\n"); @@ -318,155 +314,35 @@ void ProcessInputEvents(void) { darwinEventQueue.head = 0; else ++darwinEventQueue.head; - switch (xe.u.u.type) - { + switch (xe.u.u.type) { case KeyPress: - if (old_flags == 0 - && darwinSyncKeymap && darwinKeymapFile == NULL) - { - /* See if keymap has changed. */ - - static unsigned int last_seed; - unsigned int this_seed; - - this_seed = DarwinModeSystemKeymapSeed(); - if (this_seed != last_seed) - { - last_seed = this_seed; - DarwinKeyboardReload(darwinKeyboard); - } - } - /* fall through */ - case KeyRelease: - xe.u.u.detail += MIN_KEYCODE; - (*darwinEventQueue.pKbd->processInputProc) - (&xe, (DeviceIntPtr)darwinEventQueue.pKbd, 1); - break; + ErrorF("Unexpected Keyboard event in DarwinProcessInputEvents\n"); + break; case ButtonPress: - miPointerAbsoluteCursor(xe.u.keyButtonPointer.rootX, - xe.u.keyButtonPointer.rootY, - xe.u.keyButtonPointer.time); - if (darwinFakeButtons && xe.u.u.detail == 1) { - // Mimic multi-button mouse with modifier-clicks - // If both sets of modifiers are pressed, - // button 2 is clicked. - if ((old_flags & darwinFakeMouse2Mask) == - darwinFakeMouse2Mask) - { - DarwinSimulateMouseClick(&xe, 2, darwinFakeMouse2Mask); - darwinFakeMouseButtonDown = 2; - darwinFakeMouseButtonMask = darwinFakeMouse2Mask; - break; - } - else if ((old_flags & darwinFakeMouse3Mask) == - darwinFakeMouse3Mask) - { - DarwinSimulateMouseClick(&xe, 3, darwinFakeMouse3Mask); - darwinFakeMouseButtonDown = 3; - darwinFakeMouseButtonMask = darwinFakeMouse3Mask; - break; - } - } - (*darwinEventQueue.pPtr->processInputProc) - (&xe, (DeviceIntPtr)darwinEventQueue.pPtr, 1); + ErrorF("Unexpected ButtonPress event in DarwinProcessInputEvents\n"); break; case ButtonRelease: - miPointerAbsoluteCursor(xe.u.keyButtonPointer.rootX, - xe.u.keyButtonPointer.rootY, - xe.u.keyButtonPointer.time); - if (darwinFakeButtons && xe.u.u.detail == 1 && - darwinFakeMouseButtonDown) - { - // If last mousedown was a fake click, don't check for - // mouse modifiers here. The user may have released the - // modifiers before the mouse button. - xe.u.u.detail = darwinFakeMouseButtonDown; - darwinFakeMouseButtonDown = 0; - (*darwinEventQueue.pPtr->processInputProc) - (&xe, (DeviceIntPtr)darwinEventQueue.pPtr, 1); - - // Bring modifiers back up to date - DarwinUpdateModifiers(&xe, KeyPress, - darwinFakeMouseButtonMask & old_flags); - darwinFakeMouseButtonMask = 0; - } else { - (*darwinEventQueue.pPtr->processInputProc) - (&xe, (DeviceIntPtr)darwinEventQueue.pPtr, 1); - } + ErrorF("Unexpected ButtonRelease event in DarwinProcessInputEvents\n"); break; case MotionNotify: - miPointerAbsoluteCursor(xe.u.keyButtonPointer.rootX, - xe.u.keyButtonPointer.rootY, - xe.u.keyButtonPointer.time); + ErrorF("Unexpected ButtonRelease event in DarwinProcessInputEvents\n"); break; case kXDarwinUpdateModifiers: - { - // Update modifier state. - // Any amount of modifiers may have changed. - int flags = xe.u.clientMessage.u.l.longs0; - DarwinUpdateModifiers(&xe, KeyRelease, - old_flags & ~flags); - DarwinUpdateModifiers(&xe, KeyPress, - ~old_flags & flags); - old_flags = flags; - break; - } + ErrorF("Unexpected ButtonRelease event in DarwinProcessInputEvents\n"); + break; case kXDarwinUpdateButtons: - { - long hwDelta = xe.u.clientMessage.u.l.longs0; - long hwButtons = xe.u.clientMessage.u.l.longs1; - int i; + ErrorF("Unexpected XDarwinScrollWheel event in DarwinProcessInputEvents\n"); + break; - for (i = 1; i < 5; i++) { - if (hwDelta & (1 << i)) { - // IOKit and X have different numbering for the - // middle and right mouse buttons. - if (i == 1) { - xe.u.u.detail = 3; - } else if (i == 2) { - xe.u.u.detail = 2; - } else { - xe.u.u.detail = i + 1; - } - if (hwButtons & (1 << i)) { - xe.u.u.type = ButtonPress; - } else { - xe.u.u.type = ButtonRelease; - } - (*darwinEventQueue.pPtr->processInputProc) - (&xe, (DeviceIntPtr)darwinEventQueue.pPtr, 1); - } - } - break; - } - - case kXDarwinScrollWheel: - { - short count = xe.u.clientMessage.u.s.shorts0; - - if (count > 0) { - xe.u.u.detail = SCROLLWHEELUPFAKE; - } else { - xe.u.u.detail = SCROLLWHEELDOWNFAKE; - count = -count; - } - - for (; count; --count) { - xe.u.u.type = ButtonPress; - (*darwinEventQueue.pPtr->processInputProc) - (&xe, (DeviceIntPtr)darwinEventQueue.pPtr, 1); - xe.u.u.type = ButtonRelease; - (*darwinEventQueue.pPtr->processInputProc) - (&xe, (DeviceIntPtr)darwinEventQueue.pPtr, 1); - } - break; - } + case kXDarwinScrollWheel: + ErrorF("Unexpected XDarwinScrollWheel event in DarwinProcessInputEvents\n"); + break; default: // Check for mode specific event @@ -475,7 +351,7 @@ void ProcessInputEvents(void) { } } - miPointerUpdate(); + // miPointerUpdate(); } /* Sends a null byte down darwinEventWriteFD, which will cause the @@ -488,18 +364,58 @@ void DarwinPokeEQ(void) { } void DarwinSendPointerEvents(int ev_type, int ev_button, int pointer_x, int pointer_y) { - int i; + static int darwinFakeMouseButtonDown = 0; + static int darwinFakeMouseButtonMask = 0; + int i, num_events; int valuators[2] = {pointer_x, pointer_y}; - int num_events = GetPointerEvents(darwinEvents, darwinPointer, ev_type, ev_button, - POINTER_ABSOLUTE, 0, 2, valuators); + if (ev_type == ButtonPress && darwinFakeButtons && ev_button == 1) { + // Mimic multi-button mouse with modifier-clicks + // If both sets of modifiers are pressed, + // button 2 is clicked. + if ((old_flags & darwinFakeMouse2Mask) == darwinFakeMouse2Mask) { + DarwinSimulateMouseClick(pointer_x, pointer_y, 2, darwinFakeMouse2Mask); + darwinFakeMouseButtonDown = 2; + darwinFakeMouseButtonMask = darwinFakeMouse2Mask; + } else if ((old_flags & darwinFakeMouse3Mask) == darwinFakeMouse3Mask) { + DarwinSimulateMouseClick(pointer_x, pointer_y, 3, darwinFakeMouse3Mask); + darwinFakeMouseButtonDown = 3; + darwinFakeMouseButtonMask = darwinFakeMouse3Mask; + } + } + if (ev_type == ButtonRelease && darwinFakeButtons && darwinFakeMouseButtonDown) { + // If last mousedown was a fake click, don't check for + // mouse modifiers here. The user may have released the + // modifiers before the mouse button. + ev_button = darwinFakeMouseButtonDown; + darwinFakeMouseButtonDown = 0; + // Bring modifiers back up to date + DarwinUpdateModifiers(KeyPress, darwinFakeMouseButtonMask & old_flags); + darwinFakeMouseButtonMask = 0; + } + + num_events = GetPointerEvents(darwinEvents, darwinPointer, ev_type, ev_button, + POINTER_ABSOLUTE, 0, 2, valuators); for(i=0; i Date: Tue, 6 Mar 2007 11:09:30 -0800 Subject: [PATCH 10/15] updated todo list --- hw/darwin/README.apple | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/hw/darwin/README.apple b/hw/darwin/README.apple index 68bc692c9..229ab17ad 100644 --- a/hw/darwin/README.apple +++ b/hw/darwin/README.apple @@ -22,20 +22,14 @@ The server builds 4 targets: Known issues: * AGL and CGL support for 3D indirect acceleration does not work; - indirect.c needs to be rewritten. + indirect.c has been rewritten, but not yet integrated into this source tree. * Fullscreen mode does not work; I don't know why. -* The keyboard and mouse do not work at all; they worked in X11R7.1, - and I believe that they were broken by the events changes in dix/. - * Some features in X11.app are not yet implemented; these are marked with #ifdef DARWIN_DDX_MISSING in the code. * The build system code could probably be cleaned up slightly. -* Most testing of this code has occurred under 10.5, but it should - also work under 10.4. - Any patches or code contributions would be most welcome and may be sent to me at bbyer@apple.com. From 024bbc7cbb924daaf3e305ddfc8e74509acd1e15 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Tue, 6 Mar 2007 16:18:59 -0800 Subject: [PATCH 11/15] Bug #9931: Fix linear allocations with a non-1-byte granularity. This was introduced in 83080809f9a1c1d24b0318e54632f25f5940da25. Instead of aligning the offset, it doubled it. Results were appropriately spectacular. --- hw/xfree86/common/xf86fbman.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/xfree86/common/xf86fbman.c b/hw/xfree86/common/xf86fbman.c index d64cfaee4..537d53d7d 100644 --- a/hw/xfree86/common/xf86fbman.c +++ b/hw/xfree86/common/xf86fbman.c @@ -968,7 +968,7 @@ localAllocateOffscreenLinear( linear->size = h * w; linear->offset = (pitch * area->box.y1) + area->box.x1; if (gran > 1) - linear->offset += ((linear->offset + gran - 1) / gran) * gran; + linear->offset = ((linear->offset + gran - 1) / gran) * gran; linear->granularity = gran; linear->MoveLinearCallback = moveCB; linear->RemoveLinearCallback = removeCB; From a7cd53deb99957dec27a55ffd75e548b322ae0ce Mon Sep 17 00:00:00 2001 From: Eamon Walsh Date: Tue, 6 Mar 2007 15:32:13 -0500 Subject: [PATCH 12/15] remove PIXPRIV checks as this flag is always set. --- Xext/shm.c | 23 ----------------------- afb/afbpixmap.c | 4 ---- cfb/cfbpixmap.c | 4 ---- dix/main.c | 6 ------ dix/privates.c | 2 -- fb/fbpixmap.c | 4 ---- hw/dmx/dmxpixmap.c | 4 ---- hw/dmx/dmxscrinit.c | 6 ------ hw/xfree86/loader/dixsym.c | 2 -- hw/xfree86/xf4bpp/ppcPixmap.c | 4 ---- hw/xnest/Pixmap.c | 6 ------ hw/xnest/Screen.c | 4 ---- hw/xnest/XNPixmap.h | 7 ------- include/pixmapstr.h | 2 -- include/screenint.h | 4 ---- include/scrnintstr.h | 2 -- mfb/mfbpixmap.c | 4 ---- 17 files changed, 88 deletions(-) diff --git a/Xext/shm.c b/Xext/shm.c index 7cfaa6808..ac587bef7 100644 --- a/Xext/shm.c +++ b/Xext/shm.c @@ -119,9 +119,7 @@ static int pixmapFormat; static int shmPixFormat[MAXSCREENS]; static ShmFuncsPtr shmFuncs[MAXSCREENS]; static DestroyPixmapProcPtr destroyPixmap[MAXSCREENS]; -#ifdef PIXPRIV static int shmPixmapPrivate; -#endif static ShmFuncs miFuncs = {NULL, miShmPutImage}; static ShmFuncs fbFuncs = {fbShmCreatePixmap, fbShmPutImage}; @@ -237,7 +235,6 @@ ShmExtensionInit(INITARGS) destroyPixmap[i] = screenInfo.screens[i]->DestroyPixmap; screenInfo.screens[i]->DestroyPixmap = ShmDestroyPixmap; } -#ifdef PIXPRIV shmPixmapPrivate = AllocatePixmapPrivateIndex(); for (i = 0; i < screenInfo.numScreens; i++) { @@ -245,7 +242,6 @@ ShmExtensionInit(INITARGS) shmPixmapPrivate, 0)) return; } -#endif } } ShmSegType = CreateNewResourceType(ShmDetachSegment); @@ -299,22 +295,7 @@ ShmDestroyPixmap (PixmapPtr pPixmap) if (pPixmap->refcnt == 1) { ShmDescPtr shmdesc; -#ifdef PIXPRIV shmdesc = (ShmDescPtr) pPixmap->devPrivates[shmPixmapPrivate].ptr; -#else - char *base = (char *) pPixmap->devPrivate.ptr; - - if (base != (pointer) (pPixmap + 1)) - { - for (shmdesc = Shmsegs; shmdesc; shmdesc = shmdesc->next) - { - if (shmdesc->addr <= base && base <= shmdesc->addr + shmdesc->size) - break; - } - } - else - shmdesc = 0; -#endif if (shmdesc) ShmDetachSegment ((pointer) shmdesc, pPixmap->drawable.id); } @@ -781,9 +762,7 @@ CreatePmap: shmdesc->addr + stuff->offset); if (pMap) { -#ifdef PIXPRIV pMap->devPrivates[shmPixmapPrivate].ptr = (pointer) shmdesc; -#endif shmdesc->refcnt++; pMap->drawable.serialNumber = NEXT_SERIAL_NUMBER; pMap->drawable.id = newPix->info[j].id; @@ -1097,9 +1076,7 @@ CreatePmap: shmdesc->addr + stuff->offset); if (pMap) { -#ifdef PIXPRIV pMap->devPrivates[shmPixmapPrivate].ptr = (pointer) shmdesc; -#endif shmdesc->refcnt++; pMap->drawable.serialNumber = NEXT_SERIAL_NUMBER; pMap->drawable.id = stuff->pid; diff --git a/afb/afbpixmap.c b/afb/afbpixmap.c index 6801960c6..6a3a48518 100644 --- a/afb/afbpixmap.c +++ b/afb/afbpixmap.c @@ -102,12 +102,8 @@ afbCreatePixmap(pScreen, width, height, depth) pPixmap->drawable.height = height; pPixmap->devKind = paddedWidth; pPixmap->refcnt = 1; -#ifdef PIXPRIV pPixmap->devPrivate.ptr = datasize ? (pointer)((char *)pPixmap + pScreen->totalPixmapSize) : NULL; -#else - pPixmap->devPrivate.ptr = (pointer)(pPixmap + 1); -#endif return(pPixmap); } diff --git a/cfb/cfbpixmap.c b/cfb/cfbpixmap.c index d51c5187c..6fdf3eae6 100644 --- a/cfb/cfbpixmap.c +++ b/cfb/cfbpixmap.c @@ -96,12 +96,8 @@ cfbCreatePixmap (pScreen, width, height, depth) pPixmap->drawable.height = height; pPixmap->devKind = paddedWidth; pPixmap->refcnt = 1; -#ifdef PIXPRIV pPixmap->devPrivate.ptr = datasize ? (pointer)((char *)pPixmap + pScreen->totalPixmapSize) : NULL; -#else - pPixmap->devPrivate.ptr = (pointer)(pPixmap + 1); -#endif return pPixmap; } diff --git a/dix/main.c b/dix/main.c index 3a77533a5..92c30b639 100644 --- a/dix/main.c +++ b/dix/main.c @@ -361,9 +361,7 @@ main(int argc, char *argv[], char *envp[]) ResetScreenPrivates(); ResetWindowPrivates(); ResetGCPrivates(); -#ifdef PIXPRIV ResetPixmapPrivates(); -#endif ResetColormapPrivates(); ResetFontPrivateIndex(); ResetDevicePrivateIndex(); @@ -731,11 +729,9 @@ AddScreen( pScreen->GCPrivateSizes = (unsigned *)NULL; pScreen->totalGCSize = ((sizeof(GC) + sizeof(long) - 1) / sizeof(long)) * sizeof(long); -#ifdef PIXPRIV pScreen->PixmapPrivateLen = 0; pScreen->PixmapPrivateSizes = (unsigned *)NULL; pScreen->totalPixmapSize = BitmapBytePad(sizeof(PixmapRec)*8); -#endif pScreen->ClipNotify = 0; /* for R4 ddx compatibility */ pScreen->CreateScreenResources = 0; @@ -799,9 +795,7 @@ FreeScreen(ScreenPtr pScreen) { xfree(pScreen->WindowPrivateSizes); xfree(pScreen->GCPrivateSizes); -#ifdef PIXPRIV xfree(pScreen->PixmapPrivateSizes); -#endif xfree(pScreen->devPrivates); xfree(pScreen); } diff --git a/dix/privates.c b/dix/privates.c index b20a1dbf0..a61c3cbb6 100644 --- a/dix/privates.c +++ b/dix/privates.c @@ -309,7 +309,6 @@ AllocateGCPrivate(register ScreenPtr pScreen, int index2, unsigned amount) /* * pixmap private machinery */ -#ifdef PIXPRIV static int pixmapPrivateCount; void @@ -355,7 +354,6 @@ AllocatePixmapPrivate(register ScreenPtr pScreen, int index2, unsigned amount) pScreen->totalPixmapSize = BitmapBytePad(pScreen->totalPixmapSize * 8); return TRUE; } -#endif /* diff --git a/fb/fbpixmap.c b/fb/fbpixmap.c index c2ddcb0e9..18c120440 100644 --- a/fb/fbpixmap.c +++ b/fb/fbpixmap.c @@ -43,11 +43,7 @@ fbCreatePixmapBpp (ScreenPtr pScreen, int width, int height, int depth, int bpp) if (paddedWidth / 4 > 32767 || height > 32767) return NullPixmap; datasize = height * paddedWidth; -#ifdef PIXPRIV base = pScreen->totalPixmapSize; -#else - base = sizeof (PixmapRec); -#endif adjust = 0; if (base & 7) adjust = 8 - (base & 7); diff --git a/hw/dmx/dmxpixmap.c b/hw/dmx/dmxpixmap.c index 4a669fdd9..934060675 100644 --- a/hw/dmx/dmxpixmap.c +++ b/hw/dmx/dmxpixmap.c @@ -49,15 +49,11 @@ /** Initialize a private area in \a pScreen for pixmap information. */ Bool dmxInitPixmap(ScreenPtr pScreen) { -#ifdef PIXPRIV if (!AllocatePixmapPrivate(pScreen, dmxPixPrivateIndex, sizeof(dmxPixPrivRec))) return FALSE; return TRUE; -#else -#error Must define PIXPRIV to compile DMX X server -#endif } /** Create a pixmap on the back-end server. */ diff --git a/hw/dmx/dmxscrinit.c b/hw/dmx/dmxscrinit.c index 5bfb4df0a..7c315d89f 100644 --- a/hw/dmx/dmxscrinit.c +++ b/hw/dmx/dmxscrinit.c @@ -70,9 +70,7 @@ static unsigned long *dmxCursorGeneration; int dmxGCPrivateIndex; /**< Private index for GCs */ int dmxWinPrivateIndex; /**< Private index for Windows */ -#ifdef PIXPRIV int dmxPixPrivateIndex; /**< Private index for Pixmaps */ -#endif int dmxFontPrivateIndex; /**< Private index for Fonts */ int dmxScreenPrivateIndex; /**< Private index for Screens */ int dmxColormapPrivateIndex; /**< Private index for Colormaps */ @@ -233,14 +231,10 @@ Bool dmxScreenInit(int idx, ScreenPtr pScreen, int argc, char *argv[]) if (dmxWinPrivateIndex == -1) return FALSE; -#ifdef PIXPRIV /* Allocate pixmap private index */ dmxPixPrivateIndex = AllocatePixmapPrivateIndex(); if (dmxPixPrivateIndex == -1) return FALSE; -#else -#error Must define PIXPRIV to compile DMX X server -#endif /* Allocate font private index */ dmxFontPrivateIndex = AllocateFontPrivateIndex(); diff --git a/hw/xfree86/loader/dixsym.c b/hw/xfree86/loader/dixsym.c index 32e0e4f68..594bf4377 100644 --- a/hw/xfree86/loader/dixsym.c +++ b/hw/xfree86/loader/dixsym.c @@ -271,10 +271,8 @@ _X_HIDDEN void *dixLookupTab[] = { SYMFUNC(AllocateColormapPrivateIndex) SYMFUNC(AllocateDevicePrivateIndex) SYMFUNC(AllocateDevicePrivate) -#ifdef PIXPRIV SYMFUNC(AllocatePixmapPrivateIndex) SYMFUNC(AllocatePixmapPrivate) -#endif /* resource.c */ SYMFUNC(AddResource) SYMFUNC(ChangeResourceValue) diff --git a/hw/xfree86/xf4bpp/ppcPixmap.c b/hw/xfree86/xf4bpp/ppcPixmap.c index 9f4cdc99a..9b2defda1 100644 --- a/hw/xfree86/xf4bpp/ppcPixmap.c +++ b/hw/xfree86/xf4bpp/ppcPixmap.c @@ -120,12 +120,8 @@ xf4bppCreatePixmap( pScreen, width, height, depth ) pPixmap->devKind = size; pPixmap->refcnt = 1 ; size = height * pPixmap->devKind ; -#ifdef PIXPRIV pPixmap->devPrivate.ptr = (pointer) (((CARD8*)pPixmap) + pScreen->totalPixmapSize); -#else - pPixmap->devPrivate.ptr = (pointer) (pPixmap + 1); -#endif bzero( (char *) pPixmap->devPrivate.ptr, size ) ; return pPixmap ; } diff --git a/hw/xnest/Pixmap.c b/hw/xnest/Pixmap.c index aa8bed933..612df8dac 100644 --- a/hw/xnest/Pixmap.c +++ b/hw/xnest/Pixmap.c @@ -32,9 +32,7 @@ is" without express or implied warranty. #include "Screen.h" #include "XNPixmap.h" -#ifdef PIXPRIV int xnestPixmapPrivateIndex; -#endif PixmapPtr xnestCreatePixmap(ScreenPtr pScreen, int width, int height, int depth) @@ -57,12 +55,8 @@ xnestCreatePixmap(ScreenPtr pScreen, int width, int height, int depth) pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER; pPixmap->refcnt = 1; pPixmap->devKind = PixmapBytePad(width, depth); -#ifdef PIXPRIV pPixmap->devPrivates[xnestPixmapPrivateIndex].ptr = (pointer)((char *)pPixmap + pScreen->totalPixmapSize); -#else - pPixmap->devPrivate.ptr = (pointer)(pPixmap + 1); -#endif if (width && height) xnestPixmapPriv(pPixmap)->pixmap = XCreatePixmap(xnestDisplay, diff --git a/hw/xnest/Screen.c b/hw/xnest/Screen.c index 8e86efbdb..e6870e702 100644 --- a/hw/xnest/Screen.c +++ b/hw/xnest/Screen.c @@ -49,9 +49,7 @@ Window xnestScreenSaverWindows[MAXSCREENS]; extern void GlxWrapInitVisuals(miInitVisualsProcPtr *); #endif -#ifdef PIXPRIV int xnestScreenGeneration = -1; -#endif ScreenPtr xnestScreen(Window window) @@ -154,7 +152,6 @@ xnestOpenScreen(int index, ScreenPtr pScreen, int argc, char *argv[]) sizeof(xnestPrivGC)))) return False; -#ifdef PIXPRIV if (xnestScreenGeneration != serverGeneration) { if ((xnestPixmapPrivateIndex = AllocatePixmapPrivateIndex()) < 0) return False; @@ -164,7 +161,6 @@ xnestOpenScreen(int index, ScreenPtr pScreen, int argc, char *argv[]) if (!AllocatePixmapPrivate(pScreen,xnestPixmapPrivateIndex, sizeof (xnestPrivPixmap))) return False; -#endif visuals = (VisualPtr)xalloc(xnestNumVisuals * sizeof(VisualRec)); numVisuals = 0; diff --git a/hw/xnest/XNPixmap.h b/hw/xnest/XNPixmap.h index 77cba24af..6971b1162 100644 --- a/hw/xnest/XNPixmap.h +++ b/hw/xnest/XNPixmap.h @@ -15,21 +15,14 @@ is" without express or implied warranty. #ifndef XNESTPIXMAP_H #define XNESTPIXMAP_H -#ifdef PIXPRIV extern int xnestPixmapPrivateIndex; -#endif typedef struct { Pixmap pixmap; } xnestPrivPixmap; -#ifdef PIXPRIV #define xnestPixmapPriv(pPixmap) \ ((xnestPrivPixmap *)((pPixmap)->devPrivates[xnestPixmapPrivateIndex].ptr)) -#else -#define xnestPixmapPriv(pPixmap) \ - ((xnestPrivPixmap *)((pPixmap)->devPrivate.ptr)) -#endif #define xnestPixmap(pPixmap) (xnestPixmapPriv(pPixmap)->pixmap) diff --git a/include/pixmapstr.h b/include/pixmapstr.h index 628465b97..93bd45db8 100644 --- a/include/pixmapstr.h +++ b/include/pixmapstr.h @@ -86,9 +86,7 @@ typedef struct _Pixmap { int refcnt; int devKind; DevUnion devPrivate; -#ifdef PIXPRIV DevUnion *devPrivates; /* real devPrivates like gcs & windows */ -#endif #ifdef COMPOSITE short screen_x; short screen_y; diff --git a/include/screenint.h b/include/screenint.h index e60c2480c..1f1434a84 100644 --- a/include/screenint.h +++ b/include/screenint.h @@ -86,8 +86,6 @@ extern int AddScreen( int /*argc*/, char** /*argv*/); -#ifdef PIXPRIV - extern void ResetPixmapPrivates(void); extern int AllocatePixmapPrivateIndex(void); @@ -97,8 +95,6 @@ extern Bool AllocatePixmapPrivate( int /* index */, unsigned /* amount */); -#endif /* PIXPRIV */ - extern void ResetColormapPrivates(void); diff --git a/include/scrnintstr.h b/include/scrnintstr.h index 36135153f..110f4dce9 100644 --- a/include/scrnintstr.h +++ b/include/scrnintstr.h @@ -558,11 +558,9 @@ typedef struct _Screen { PixmapPtr pScratchPixmap; /* scratch pixmap "pool" */ -#ifdef PIXPRIV int PixmapPrivateLen; unsigned int *PixmapPrivateSizes; unsigned int totalPixmapSize; -#endif MarkWindowProcPtr MarkWindow; MarkOverlappedWindowsProcPtr MarkOverlappedWindows; diff --git a/mfb/mfbpixmap.c b/mfb/mfbpixmap.c index 5ec8502cb..e34972451 100644 --- a/mfb/mfbpixmap.c +++ b/mfb/mfbpixmap.c @@ -101,12 +101,8 @@ mfbCreatePixmap (pScreen, width, height, depth) pPixmap->drawable.height = height; pPixmap->devKind = paddedWidth; pPixmap->refcnt = 1; -#ifdef PIXPRIV pPixmap->devPrivate.ptr = datasize ? (pointer)((char *)pPixmap + pScreen->totalPixmapSize) : NULL; -#else - pPixmap->devPrivate.ptr = (pointer)(pPixmap + 1); -#endif return pPixmap; } From 81526232bc0119d2ec7b8590be4f78cf066ae359 Mon Sep 17 00:00:00 2001 From: Eamon Walsh Date: Tue, 6 Mar 2007 17:19:11 -0500 Subject: [PATCH 13/15] remove PIXPRIV check as this flag is always set. --- dix/pixmap.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/dix/pixmap.c b/dix/pixmap.c index a5b7b064d..c280a3b94 100644 --- a/dix/pixmap.c +++ b/dix/pixmap.c @@ -109,7 +109,6 @@ _X_EXPORT PixmapPtr AllocatePixmap(ScreenPtr pScreen, int pixDataSize) { PixmapPtr pPixmap; -#ifdef PIXPRIV char *ptr; DevUnion *ppriv; unsigned *sizes; @@ -136,9 +135,6 @@ AllocatePixmap(ScreenPtr pScreen, int pixDataSize) else ppriv->ptr = (pointer)NULL; } -#else - pPixmap = (PixmapPtr)xalloc(sizeof(PixmapRec) + pixDataSize); -#endif #ifdef _XSERVER64 if (pPixmap) { From 72a23d88d73a8c72ed18847b004db05092d3e7be Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Tue, 6 Mar 2007 23:15:34 -0800 Subject: [PATCH 14/15] Add xf86CrtcScreenInit to share initialization across drivers. xf86CrtcScreenInit performs initialization that needs to happen at ScreenInit time. (cherry picked from commit 558a4f5588ad2ec11254e0b5d6ce9515b137369e) --- hw/xfree86/modes/xf86Crtc.c | 54 +++++++++++++++++++++++++++++++++++ hw/xfree86/modes/xf86Crtc.h | 23 +++------------ hw/xfree86/modes/xf86Rename.h | 1 + 3 files changed, 59 insertions(+), 19 deletions(-) diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index 46515fdcc..279449688 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -545,6 +545,60 @@ xf86OutputDestroy (xf86OutputPtr output) xfree (output); } +/* + * Called during CreateScreenResources to hook up RandR + */ +static Bool +xf86CrtcCreateScreenResources (ScreenPtr screen) +{ + ScrnInfoPtr scrn = xf86Screens[screen->myNum]; + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); + + screen->CreateScreenResources = config->CreateScreenResources; + + if (!(*screen->CreateScreenResources)(screen)) + return FALSE; + + if (!xf86RandR12CreateScreenResources (screen)) + return FALSE; + + return TRUE; +} + +/* + * Called at ScreenInit time to set up + */ +Bool +xf86CrtcScreenInit (ScreenPtr screen) +{ + ScrnInfoPtr scrn = xf86Screens[screen->myNum]; + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); + int c; + + /* Rotation */ + xf86DrvMsg(scrn->scrnIndex, X_INFO, "RandR 1.2 enabled, ignore the following RandR disabled message.\n"); + xf86DisableRandR(); /* Disable old RandR extension support */ + xf86RandR12Init (screen); + + /* support all rotations if every crtc has the shadow alloc funcs */ + for (c = 0; c < config->num_crtc; c++) + { + xf86CrtcPtr crtc = config->crtc[c]; + if (!crtc->funcs->shadow_allocate || !crtc->funcs->shadow_create) + break; + } + if (c == config->num_crtc) + xf86RandR12SetRotations (screen, RR_Rotate_0 | RR_Rotate_90 | + RR_Rotate_180 | RR_Rotate_270); + else + xf86RandR12SetRotations (screen, RR_Rotate_0); + + /* Wrap CreateScreenResources so we can initialize the RandR code */ + config->CreateScreenResources = screen->CreateScreenResources; + screen->CreateScreenResources = xf86CrtcCreateScreenResources; + return TRUE; +} + static DisplayModePtr xf86DefaultMode (xf86OutputPtr output, int width, int height) { diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h index 062a2dbec..6152ae4c9 100644 --- a/hw/xfree86/modes/xf86Crtc.h +++ b/hw/xfree86/modes/xf86Crtc.h @@ -494,6 +494,7 @@ typedef struct _xf86CrtcConfig { const xf86CrtcConfigFuncsRec *funcs; + CreateScreenResourcesProcPtr CreateScreenResources; } xf86CrtcConfigRec, *xf86CrtcConfigPtr; extern int xf86CrtcConfigPrivateIndex; @@ -524,25 +525,6 @@ void xf86CrtcDestroy (xf86CrtcPtr crtc); -/** - * Allocate a crtc for the specified output - * - * Find a currently unused CRTC which is suitable for - * the specified output - */ - -xf86CrtcPtr -xf86AllocCrtc (xf86OutputPtr output); - -/** - * Free a crtc - * - * Mark the crtc as unused by any outputs - */ - -void -xf86FreeCrtc (xf86CrtcPtr crtc); - /** * Sets the given video mode on the given crtc */ @@ -582,6 +564,9 @@ xf86ProbeOutputModes (ScrnInfoPtr pScrn, int maxX, int maxY); void xf86SetScrnInfoModes (ScrnInfoPtr pScrn); +Bool +xf86CrtcScreenInit (ScreenPtr pScreen); + Bool xf86InitialConfiguration (ScrnInfoPtr pScrn, Bool canGrow); diff --git a/hw/xfree86/modes/xf86Rename.h b/hw/xfree86/modes/xf86Rename.h index eae6d64d5..9dcfef5da 100644 --- a/hw/xfree86/modes/xf86Rename.h +++ b/hw/xfree86/modes/xf86Rename.h @@ -31,6 +31,7 @@ #define xf86CrtcDestroy XF86NAME(xf86CrtcDestroy) #define xf86CrtcInUse XF86NAME(xf86CrtcInUse) #define xf86CrtcRotate XF86NAME(xf86CrtcRotate) +#define xf86CrtcScreenInit XF86NAME(xf86CrtcScreenInit) #define xf86CrtcSetMode XF86NAME(xf86CrtcSetMode) #define xf86CrtcSetSizeRange XF86NAME(xf86CrtcSetSizeRange) #define xf86CVTMode XF86NAME(xf86CVTMode) From e9bfb2b3d7dfaafd90d2ad0fa3d0e1acced4380b Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Tue, 6 Mar 2007 23:19:30 -0800 Subject: [PATCH 15/15] Add hw/xfree86/docs/README.modes, documenting new mode setting APIs. This document covers both API and xorg.conf usage of the new mode setting APIs. (cherry picked from commit a59c31b0f7b94ed1f395c7586c37ef5fe7ba2a25) --- hw/xfree86/doc/README.modes | 474 ++++++++++++++++++++++++++++++++++++ 1 file changed, 474 insertions(+) create mode 100644 hw/xfree86/doc/README.modes diff --git a/hw/xfree86/doc/README.modes b/hw/xfree86/doc/README.modes new file mode 100644 index 000000000..894e21313 --- /dev/null +++ b/hw/xfree86/doc/README.modes @@ -0,0 +1,474 @@ + Multi-monitor Mode Setting APIs + Keith Packard, SaveScreen and the core X screen saver will be +implemented by disabling outputs and crtcs using their dpms functions. + + void + xf86DPMSSet(ScrnInfoPtr scrn, int mode, int flags) + +Pass this function to xf86DPMSInit and all DPMS mode switching will be +managed by using the dpms functions provided by the Outputs and CRTCs. + + Bool + xf86CrtcScreenInit (ScreenPtr screen) + +This function completes the screen initialization process for the crtc and +output objects. Call it near the end of the ScreenInit function, after the +frame buffer and acceleration layers have been added. + +3.3 EnterVT functions + +Functions used during EnterVT, or whenever the current configuration needs +to be applied to the hardware. + + Bool + xf86SetDesiredModes (ScrnInfoPtr scrn) + +xf86InitialConfiguration selects the desired configuration at PreInit time; +when the server finally hits ScreenInit, xf86SetDesiredModes is used by the +driver to take that configuration and apply it to the hardware. In addition, +successful mode selection at other times updates the configuration that will +be used by this function, so LeaveVT/EnterVT pairs can simply invoke this +and return to the previous configuration. + +3.4 SwitchMode functions + +Functions called from the pScrn->SwitchMode hook, which is used by the +XFree86-VidModeExtension and the keypad mode switch commands. + + Bool + xf86SetSingleMode (ScrnInfoPtr scrn, + DisplayModePtr desired, + Rotation rotation) + +This function applies the specified mode to all active outputs. Which is to +say, it picks reasonable modes for all active outputs, attempting to get the +screen to the specified size while not breaking anything that is currently +working. + +3.7 get_modes functions + +Functions called during output->get_modes to help build lists of modes + + xf86MonPtr + xf86OutputGetEDID (xf86OutputPtr output, I2CBusPtr pDDCBus) + +This returns the EDID data structure for the 'output' using the I2C bus +'pDDCBus'. This has no effect on 'output' itself. + + void + xf86OutputSetEDID (xf86OutputPtr output, xf86MonPtr edid_mon) + +Once the EDID data has been fetched, this call applies the EDID data to the +output object, setting the physical size and also various properties, like +the DDC root window property (when output is the 'compat' output), and the +RandR 1.2 EDID output properties. + + DisplayModePtr + xf86OutputGetEDIDModes (xf86OutputPtr output) + +Given an EDID data structure, this function computes a list of suitable +modes. This function also applies a sequence of 'quirks' during this process +so that the returned modes may not actually match the mode data present in +the EDID data. + +3.6 Other functions + +These remaining functions in the API can be used by the driver as needed. + + Bool + xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation, + int x, int y) + +Applies a mode to a CRTC. All of the outputs which are currently using the +specified CRTC are included in the mode setting process. 'x' and 'y' are the +offset within the frame buffer that the crtc is placed at. No checking is +done in this function to ensure that the mode is usable by the active +outputs. + + void + xf86ProbeOutputModes (ScrnInfoPtr pScrn, int maxX, int maxY) + +This discards the mode lists for all outputs, re-detects monitor presence +and then acquires new mode lists for all monitors which are not disconnected. +Monitor configuration data is used to modify the mode lists returned by the +outputs. 'maxX' and 'maxY' limit the maximum size modes that will be +returned. + + void + xf86SetScrnInfoModes (ScrnInfoPtr pScrn) + +This copies the 'compat' output mode list into the pScrn modes list which is +used by the XFree86-VidModeExtension and the keypad mode switching +operations. The current 'desired' mode for the CRTC associated with the +'compat' output is placed first in this list to indicate the current mode. +Usually, the driver won't need to call this function as +xf86InitialConfiguration will do so automatically, as well as any RandR +functions which reprobe for modes. However, if the driver reprobes for modes +at other times using xf86ProbeOutputModes, this function needs to be called. + + Bool + xf86DiDGAReInit (ScreenPtr pScreen) + +This is similar to xf86SetScrnInfoModes, but it applies the 'compat' output +mode list to the set of modes advertised by the DGA extension; it needs to +be called whenever xf86ProbeOutputModes is invoked. + + void + xf86DisableUnusedFunctions(ScrnInfoPtr pScrn) + +After any sequence of calls using xf86CrtcSetMode, this function cleans up +any leftover Output and CRTC objects by disabling them, saving power. It is +safe to call this whenever the server is running as it only disables objects +which are not currently in use. + +4. CRTC operations + +4.1 CRTC functions + +These functions provide an abstract interface for the CRTC object; most +manipulation of the CRTC object is done through these functions. + + void + crtc->funcs->dpms (xf86CrtcPtr crtc, int mode) + +Where 'mode' is one of DPMSModeOff, DPMSModeSuspend, DPMSModeStandby or +DPMSModeOn. This requests that the crtc go to the specified power state. +When changing power states, the output dpms functions are invoked before the +crtc dpms functions. + + void + crtc->funcs->save (xf86CrtcPtr crtc) + + void + crtc->funcs->restore (xf86CrtcPtr crtc) + +Preserve/restore any register contents related to the CRTC. These are +strictly a convenience for the driver writer; if the existing driver has +fully operation save/restore functions, you need not place any additional +code here. In particular, the server itself never uses this function. + + Bool + crtc->funcs->lock (xf86CrtcPtr crtc) + + void + crtc->funcs->unlock (xf86CrtcPtr crtc) + +These functions are invoked around mode setting operations; the intent is +that DRI locking be done here to prevent DRI applications from manipulating +the hardware while the server is busy changing the output configuration. If +the lock function returns FALSE, the unlock function will not be invoked. + + Bool + crtc->funcs->mode_fixup (xf86CrtcPtr crtc, + DisplayModePtr mode, + DisplayModePtr adjusted_mode) + +This call gives the CRTC a chance to see what mode will be set and to +comment on the mode by changing 'adjusted_mode' as needed. This function +shall not modify the state of the crtc hardware at all. If the CRTC cannot +accept this mode, this function may return FALSE. + + void + crtc->funcs->prepare (xf86CrtcPtr crtc) + +This call is made just before the mode is set to make the hardware ready for +the operation. A usual function to perform here is to disable the crtc so +that mode setting can occur with clocks turned off and outputs deactivated. + + void + crtc->funcs->mode_set (xf86CrtcPtr crtc, + DisplayModePtr mode, + DisplayModePtr adjusted_mode) + +This function applies the specified mode (possibly adjusted by the CRTC +and/or Outputs). + + void + crtc->funcs->commit (xf86CrtcPtr crtc) + +Once the mode has been applied to the CRTC and Outputs, this function is +invoked to let the hardware turn things back on. + + void + crtc->funcs->gamma_set (xf86CrtcPtr crtc, CARD16 *red, + CARD16 *green, CARD16 *blue, int size) + +This function adjusts the gamma ramps for the specified crtc. + + void * + crtc->funcs->shadow_allocate (xf86CrtcPtr crtc, int width, int height) + +This function allocates frame buffer space for a shadow frame buffer. When +allocated, the crtc must scan from the shadow instead of the main frame +buffer. This is used for rotation. The address returned is passed to the +shadow_create function. This function should return NULL on failure. + + PixmapPtr + crtc->funcs->shadow_create (xf86CrtcPtr crtc, void *data, + int width, int height) + +This function creates a pixmap object that will be used as a shadow of the +main frame buffer for CRTCs which are rotated or reflected. 'data' is the +value returned by shadow_allocate. + + void + crtc->funcs->shadow_destroy (xf86CrtcPtr crtc, PixmapPtr pPixmap, + void *data) + +Destroys any associated shadow objects. If pPixmap is NULL, then a pixmap +was not created, but 'data' may still be non-NULL indicating that the shadow +had been allocated. + + void + crtc->funcs->destroy (xf86CrtcPtr crtc) + +When a CRTC is destroyed (which only happens in error cases), this function +can clean up any driver-specific data. + +4.2 CRTC fields + +The CRTC object is not opaque; there are several fields of interest to the +driver writer. + + struct _xf86Crtc { + /** + * Associated ScrnInfo + */ + ScrnInfoPtr scrn; + + /** + * Active state of this CRTC + * + * Set when this CRTC is driving one or more outputs + */ + Bool enabled; + + /** Track whether cursor is within CRTC range */ + Bool cursorInRange; + + /** Track state of cursor associated with this CRTC */ + Bool cursorShown; + + /** + * Active mode + * + * This reflects the mode as set in the CRTC currently + * It will be cleared when the VT is not active or + * during server startup + */ + DisplayModeRec mode; + Rotation rotation; + PixmapPtr rotatedPixmap; + void *rotatedData; + + /** + * Position on screen + * + * Locates this CRTC within the frame buffer + */ + int x, y; + + /** + * Desired mode + * + * This is set to the requested mode, independent of + * whether the VT is active. In particular, it receives + * the startup configured mode and saves the active mode + * on VT switch. + */ + DisplayModeRec desiredMode; + Rotation desiredRotation; + int desiredX, desiredY; + + /** crtc-specific functions */ + const xf86CrtcFuncsRec *funcs; + + /** + * Driver private + * + * Holds driver-private information + */ + void *driver_private; + #ifdef RANDR_12_INTERFACE + /** + * RandR crtc + * + * When RandR 1.2 is available, this + * points at the associated crtc object + */ + RRCrtcPtr randr_crtc; + #else + void *randr_crtc; + #endif + }; + + +5. Output functions. + +6. Configuration + +Because the configuration file syntax is fixed, +this was done by creating new "Driver" section options that hook specific +outputs to specific "Monitor" sections in the file. The option: +section of the form: + + Option "monitor-VGA" "My VGA Monitor" + +connects the VGA output of this driver to the "Monitor" section with +Identifier "My VGA Monitor". All of the usual monitor options can now be +placed in that "Monitor" section and will be applied to the VGA output +configuration.