summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Sorg <jay.sorg@gmail.com>2013-07-17 01:22:59 -0700
committerJay Sorg <jay.sorg@gmail.com>2013-07-17 01:22:59 -0700
commita8c42c51c111f5e9e62e8aaf493258feb2183aec (patch)
tree68ae05ddce3a868041e6c77e452fcf854a98813c
parente7741d040c62259932f28286acfad6dd908d95ea (diff)
downloadxrdp-proprietary-a8c42c51c111f5e9e62e8aaf493258feb2183aec.tar.gz
xrdp-proprietary-a8c42c51c111f5e9e62e8aaf493258feb2183aec.zip
xorg driver, work on randr
-rw-r--r--xorg/server/module/rdp.h6
-rw-r--r--xorg/server/module/rdpRandR.c141
-rw-r--r--xorg/server/xrdpdev/xrdpdev.c11
3 files changed, 150 insertions, 8 deletions
diff --git a/xorg/server/module/rdp.h b/xorg/server/module/rdp.h
index f90baa1a..7bb2fbc1 100644
--- a/xorg/server/module/rdp.h
+++ b/xorg/server/module/rdp.h
@@ -35,8 +35,12 @@ struct _rdpRec
{
int width;
int height;
+ int depth;
+ int paddedWidthInBytes;
+ int sizeInBytes;
int num_modes;
- char *ptr;
+ int bitsPerPixel;
+ char *pfbMemory;
ScreenPtr pScreen;
rdpDevPrivateKey privateKeyRecGC;
rdpDevPrivateKey privateKeyRecPixmap;
diff --git a/xorg/server/module/rdpRandR.c b/xorg/server/module/rdpRandR.c
index 6c568b14..b481ae8e 100644
--- a/xorg/server/module/rdpRandR.c
+++ b/xorg/server/module/rdpRandR.c
@@ -39,16 +39,36 @@ RandR draw calls
#include "rdp.h"
+#define PixelDPI 100
+#define PixelToMM(_size) (((_size) * 254 + (PixelDPI) * 5) / ((PixelDPI) * 10))
+
/******************************************************************************/
#define LOG_LEVEL 1
#define LLOGLN(_level, _args) \
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
/******************************************************************************/
+static WindowPtr
+rdpGetRootWindowPtr(ScreenPtr pScreen)
+{
+ /* in globals.c */
+ return WindowTable[pScreen->myNum];
+}
+
+/******************************************************************************/
Bool
rdpRRRegisterSize(ScreenPtr pScreen, int width, int height)
{
- LLOGLN(0, ("rdpRRRegisterSize:"));
+ int mmwidth;
+ int mmheight;
+ RRScreenSizePtr pSize;
+
+ LLOGLN(0, ("rdpRRRegisterSize: width %d height %d", width, height));
+ mmwidth = PixelToMM(width);
+ mmheight = PixelToMM(height);
+ pSize = RRRegisterSize(pScreen, width, height, mmwidth, mmheight);
+ /* Tell RandR what the current config is */
+ RRSetCurrentConfig(pScreen, RR_Rotate_0, 0, pSize);
return TRUE;
}
@@ -65,7 +85,18 @@ rdpRRSetConfig(ScreenPtr pScreen, Rotation rotateKind, int rate,
Bool
rdpRRGetInfo(ScreenPtr pScreen, Rotation *pRotations)
{
+ int width;
+ int height;
+ ScrnInfoPtr pScrn;
+ rdpPtr dev;
+
LLOGLN(0, ("rdpRRGetInfo:"));
+ pScrn = xf86Screens[pScreen->myNum];
+ dev = XRDPPTR(pScrn);
+ *pRotations = RR_Rotate_0;
+ width = dev->width;
+ height = dev->height;
+ rdpRRRegisterSize(pScreen, width, height);
return TRUE;
}
@@ -74,7 +105,63 @@ Bool
rdpRRScreenSetSize(ScreenPtr pScreen, CARD16 width, CARD16 height,
CARD32 mmWidth, CARD32 mmHeight)
{
- LLOGLN(0, ("rdpRRScreenSetSize:"));
+ WindowPtr root;
+ PixmapPtr screenPixmap;
+ BoxRec box;
+ ScrnInfoPtr pScrn;
+ rdpPtr dev;
+
+ LLOGLN(0, ("rdpRRScreenSetSize: width %d height %d mmWidth %d mmHeight %d",
+ width, height, (int)mmWidth, (int)mmHeight));
+ pScrn = xf86Screens[pScreen->myNum];
+ dev = XRDPPTR(pScrn);
+ root = rdpGetRootWindowPtr(pScreen);
+
+ if ((width < 1) || (height < 1))
+ {
+ LLOGLN(10, (" error width %d height %d", width, height));
+ return FALSE;
+ }
+
+ dev->width = width;
+ dev->height = height;
+ dev->paddedWidthInBytes = PixmapBytePad(dev->width, dev->depth);
+ dev->sizeInBytes = dev->paddedWidthInBytes * dev->height;
+ pScreen->width = width;
+ pScreen->height = height;
+ pScreen->mmWidth = mmWidth;
+ pScreen->mmHeight = mmHeight;
+
+ screenPixmap = pScreen->GetScreenPixmap(pScreen);
+
+ if (screenPixmap != 0)
+ {
+ LLOGLN(0, (" resizing screenPixmap [%p] to %dx%d, "
+ "currently at %dx%d", (void *)screenPixmap, width, height,
+ screenPixmap->drawable.width, screenPixmap->drawable.height));
+ pScreen->ModifyPixmapHeader(screenPixmap, width, height,
+ dev->depth, dev->bitsPerPixel,
+ dev->paddedWidthInBytes,
+ dev->pfbMemory);
+ LLOGLN(0, (" pixmap resized to %dx%d",
+ screenPixmap->drawable.width, screenPixmap->drawable.height));
+ }
+
+ LLOGLN(10, (" root window %p", (void *)root));
+ box.x1 = 0;
+ box.y1 = 0;
+ box.x2 = width;
+ box.y2 = height;
+ REGION_INIT(pScreen, &root->winSize, &box, 1);
+ REGION_INIT(pScreen, &root->borderSize, &box, 1);
+ REGION_RESET(pScreen, &root->borderClip, &box);
+ REGION_BREAK(pScreen, &root->clipList);
+ root->drawable.width = width;
+ root->drawable.height = height;
+ ResizeChildrenWinSize(root, 0, 0, 0, 0);
+ RRGetInfo(pScreen, 1);
+ //rdpInvalidateArea(g_pScreen, 0, 0, dev->width, dev->height);
+ LLOGLN(0, (" screen resized to %dx%d", pScreen->width, pScreen->height));
return TRUE;
}
@@ -100,7 +187,21 @@ rdpRRCrtcSetGamma(ScreenPtr pScreen, RRCrtcPtr crtc)
Bool
rdpRRCrtcGetGamma(ScreenPtr pScreen, RRCrtcPtr crtc)
{
- LLOGLN(0, ("rdpRRCrtcGetGamma:"));
+ LLOGLN(0, ("rdpRRCrtcGetGamma: %p %p %p", crtc->gammaRed,
+ crtc->gammaBlue, crtc->gammaGreen));
+ crtc->gammaSize = 1;
+ if (crtc->gammaRed == NULL)
+ {
+ crtc->gammaRed = xnfcalloc(2, 16);
+ }
+ if (crtc->gammaBlue == NULL)
+ {
+ crtc->gammaBlue = xnfcalloc(2, 16);
+ }
+ if (crtc->gammaGreen == NULL)
+ {
+ crtc->gammaGreen = xnfcalloc(2, 16);
+ }
return TRUE;
}
@@ -139,16 +240,46 @@ rdpRROutputGetProperty(ScreenPtr pScreen, RROutputPtr output, Atom property)
/******************************************************************************/
Bool
-rdpRRGetPanning(ScreenPtr pScrn, RRCrtcPtr crtc, BoxPtr totalArea,
+rdpRRGetPanning(ScreenPtr pScreen, RRCrtcPtr crtc, BoxPtr totalArea,
BoxPtr trackingArea, INT16 *border)
{
+ ScrnInfoPtr pScrn;
+ rdpPtr dev;
+
LLOGLN(0, ("rdpRRGetPanning:"));
+ pScrn = xf86Screens[pScreen->myNum];
+ dev = XRDPPTR(pScrn);
+
+ if (totalArea != 0)
+ {
+ totalArea->x1 = 0;
+ totalArea->y1 = 0;
+ totalArea->x2 = dev->width;
+ totalArea->y2 = dev->height;
+ }
+
+ if (trackingArea != 0)
+ {
+ trackingArea->x1 = 0;
+ trackingArea->y1 = 0;
+ trackingArea->x2 = dev->width;
+ trackingArea->y2 = dev->height;
+ }
+
+ if (border != 0)
+ {
+ border[0] = 0;
+ border[1] = 0;
+ border[2] = 0;
+ border[3] = 0;
+ }
+
return TRUE;
}
/******************************************************************************/
Bool
-rdpRRSetPanning(ScreenPtr pScrn, RRCrtcPtr crtc, BoxPtr totalArea,
+rdpRRSetPanning(ScreenPtr pScreen, RRCrtcPtr crtc, BoxPtr totalArea,
BoxPtr trackingArea, INT16 *border)
{
LLOGLN(0, ("rdpRRSetPanning:"));
diff --git a/xorg/server/xrdpdev/xrdpdev.c b/xorg/server/xrdpdev/xrdpdev.c
index 4fad95b6..c68d8700 100644
--- a/xorg/server/xrdpdev/xrdpdev.c
+++ b/xorg/server/xrdpdev/xrdpdev.c
@@ -348,8 +348,15 @@ rdpScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
miSetPixmapDepths();
LLOGLN(0, ("rdpScreenInit: virtualX %d virtualY %d",
pScrn->virtualX, pScrn->virtualY));
- dev->ptr = malloc(dev->width * dev->height * 4);
- if (!fbScreenInit(pScreen, dev->ptr, pScrn->virtualX, pScrn->virtualY,
+
+ dev->depth = 24;
+ dev->paddedWidthInBytes = PixmapBytePad(dev->width, dev->depth);
+ dev->bitsPerPixel = 32;
+ dev->sizeInBytes = dev->paddedWidthInBytes * dev->height;
+ LLOGLN(0, ("pfbMemory bytes %d", dev->sizeInBytes));
+ dev->pfbMemory = (char *) malloc(dev->sizeInBytes);
+ if (!fbScreenInit(pScreen, dev->pfbMemory,
+ pScrn->virtualX, pScrn->virtualY,
pScrn->xDpi, pScrn->yDpi, pScrn->displayWidth,
pScrn->bitsPerPixel))
{