X11rdp: merge multimon from Xorg driver

ulab-next-nosound
Jay Sorg 9 years ago
parent 00a11f77ce
commit 473f3dcd0c

@ -38,6 +38,14 @@ extern WindowPtr g_invalidate_window; /* in rdpmain.c */
static XID g_wid = 0; static XID g_wid = 0;
static int g_panning = 0;
#define LOG_LEVEL 1
#define LLOG(_level, _args) \
do { if (_level < LOG_LEVEL) { ErrorF _args ; } } while (0)
#define LLOGLN(_level, _args) \
do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
/******************************************************************************/ /******************************************************************************/
Bool Bool
rdpRRRegisterSize(ScreenPtr pScreen, int width, int height) rdpRRRegisterSize(ScreenPtr pScreen, int width, int height)
@ -68,15 +76,8 @@ rdpRRSetConfig(ScreenPtr pScreen, Rotation rotateKind, int rate,
Bool Bool
rdpRRGetInfo(ScreenPtr pScreen, Rotation *pRotations) rdpRRGetInfo(ScreenPtr pScreen, Rotation *pRotations)
{ {
int width;
int height;
ErrorF("rdpRRGetInfo:\n"); ErrorF("rdpRRGetInfo:\n");
*pRotations = RR_Rotate_0; *pRotations = RR_Rotate_0;
width = g_rdpScreen.width;
height = g_rdpScreen.height;
rdpRRRegisterSize(pScreen, width, height);
return TRUE; return TRUE;
} }
@ -214,6 +215,19 @@ Bool
rdpRRCrtcGetGamma(ScreenPtr pScreen, RRCrtcPtr crtc) rdpRRCrtcGetGamma(ScreenPtr pScreen, RRCrtcPtr crtc)
{ {
ErrorF("rdpRRCrtcGetGamma:\n"); ErrorF("rdpRRCrtcGetGamma:\n");
crtc->gammaSize = 1;
if (crtc->gammaRed == NULL)
{
crtc->gammaRed = g_malloc(32, 1);
}
if (crtc->gammaBlue == NULL)
{
crtc->gammaBlue = g_malloc(32, 1);
}
if (crtc->gammaGreen == NULL)
{
crtc->gammaGreen = g_malloc(32, 1);
}
return TRUE; return TRUE;
} }
@ -257,6 +271,11 @@ rdpRRGetPanning(ScreenPtr pScrn, RRCrtcPtr crtc, BoxPtr totalArea,
{ {
ErrorF("rdpRRGetPanning:\n"); ErrorF("rdpRRGetPanning:\n");
if (!g_panning)
{
return FALSE;
}
if (totalArea != 0) if (totalArea != 0)
{ {
totalArea->x1 = 0; totalArea->x1 = 0;
@ -292,3 +311,140 @@ rdpRRSetPanning(ScreenPtr pScrn, RRCrtcPtr crtc, BoxPtr totalArea,
ErrorF("rdpRRSetPanning:\n"); ErrorF("rdpRRSetPanning:\n");
return TRUE; return TRUE;
} }
/******************************************************************************/
static RROutputPtr
rdpRRAddOutput(const char *aname, int x, int y, int width, int height)
{
RRModePtr mode;
RRCrtcPtr crtc;
RROutputPtr output;
xRRModeInfo modeInfo;
char name[64];
sprintf (name, "%dx%d", width, height);
memset (&modeInfo, 0, sizeof(modeInfo));
modeInfo.width = width;
modeInfo.height = height;
modeInfo.nameLength = strlen(name);
mode = RRModeGet(&modeInfo, name);
if (mode == 0)
{
LLOGLN(0, ("rdpRRAddOutput: RRModeGet failed"));
return 0;
}
crtc = RRCrtcCreate(g_pScreen, NULL);
if (crtc == 0)
{
LLOGLN(0, ("rdpRRAddOutput: RRCrtcCreate failed"));
RRModeDestroy(mode);
return 0;
}
output = RROutputCreate(g_pScreen, aname, strlen(aname), NULL);
if (output == 0)
{
LLOGLN(0, ("rdpRRAddOutput: RROutputCreate failed"));
RRCrtcDestroy(crtc);
RRModeDestroy(mode);
return 0;
}
if (!RROutputSetClones(output, NULL, 0))
{
LLOGLN(0, ("rdpRRAddOutput: RROutputSetClones failed"));
}
if (!RROutputSetModes(output, &mode, 1, 0))
{
LLOGLN(0, ("rdpRRAddOutput: RROutputSetModes failed"));
}
if (!RROutputSetCrtcs(output, &crtc, 1))
{
LLOGLN(0, ("rdpRRAddOutput: RROutputSetCrtcs failed"));
}
if (!RROutputSetConnection(output, RR_Connected))
{
LLOGLN(0, ("rdpRRAddOutput: RROutputSetConnection failed"));
}
RRCrtcNotify(crtc, mode, x, y, RR_Rotate_0, NULL, 1, &output);
return output;
}
/******************************************************************************/
static void
RRSetPrimaryOutput(rrScrPrivPtr pScrPriv, RROutputPtr output)
{
if (pScrPriv->primaryOutput == output)
{
return;
}
/* clear the old primary */
if (pScrPriv->primaryOutput)
{
RROutputChanged(pScrPriv->primaryOutput, 0);
pScrPriv->primaryOutput = NULL;
}
/* set the new primary */
if (output)
{
pScrPriv->primaryOutput = output;
RROutputChanged(output, 0);
}
pScrPriv->layoutChanged = TRUE;
}
/******************************************************************************/
int
rdpRRSetRdpOutputs(void)
{
rrScrPrivPtr pRRScrPriv;
int index;
int width;
int height;
char text[256];
RROutputPtr output;
pRRScrPriv = rrGetScrPriv(g_pScreen);
LLOGLN(0, ("rdpRRSetRdpOutputs: numCrtcs %d", pRRScrPriv->numCrtcs));
while (pRRScrPriv->numCrtcs > 0)
{
RRCrtcDestroy(pRRScrPriv->crtcs[0]);
}
LLOGLN(0, ("rdpRRSetRdpOutputs: numOutputs %d", pRRScrPriv->numOutputs));
while (pRRScrPriv->numOutputs > 0)
{
RROutputDestroy(pRRScrPriv->outputs[0]);
}
if (g_rdpScreen.client_info.monitorCount == 0)
{
rdpRRAddOutput("rdp0", 0, 0, g_rdpScreen.width, g_rdpScreen.height);
}
else
{
for (index = 0; index < g_rdpScreen.client_info.monitorCount; index++)
{
snprintf(text, 255, "rdp%d", index);
width = g_rdpScreen.client_info.minfo[index].right - g_rdpScreen.client_info.minfo[index].left + 1;
height = g_rdpScreen.client_info.minfo[index].bottom - g_rdpScreen.client_info.minfo[index].top + 1;
output = rdpRRAddOutput(text,
g_rdpScreen.client_info.minfo[index].left,
g_rdpScreen.client_info.minfo[index].top,
width, height);
if ((output != 0) && (g_rdpScreen.client_info.minfo[index].is_primary))
{
RRSetPrimaryOutput(pRRScrPriv, output);
}
}
}
for (index = 0; index < pRRScrPriv->numOutputs; index++)
{
RROutputSetCrtcs(pRRScrPriv->outputs[index], pRRScrPriv->crtcs,
pRRScrPriv->numCrtcs);
}
return 0;
}

@ -57,4 +57,7 @@ Bool
rdpRRSetPanning(ScreenPtr pScrn, RRCrtcPtr crtc, BoxPtr totalArea, rdpRRSetPanning(ScreenPtr pScrn, RRCrtcPtr crtc, BoxPtr totalArea,
BoxPtr trackingArea, INT16* border); BoxPtr trackingArea, INT16* border);
int
rdpRRSetRdpOutputs(void);
#endif #endif

@ -22,6 +22,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "rdp.h" #include "rdp.h"
#include "xrdp_rail.h" #include "xrdp_rail.h"
#include "rdpglyph.h" #include "rdpglyph.h"
#include "rdprandr.h"
#include <signal.h> #include <signal.h>
#include <sys/ipc.h> #include <sys/ipc.h>
@ -930,6 +931,7 @@ rdpup_process_msg(struct stream *s)
int y; int y;
int cx; int cx;
int cy; int cy;
int index;
RegionRec reg; RegionRec reg;
BoxRec box; BoxRec box;
@ -1119,16 +1121,45 @@ rdpup_process_msg(struct stream *s)
{ {
LLOGLN(0, (" client can not do new(color) cursor")); LLOGLN(0, (" client can not do new(color) cursor"));
} }
if (g_rdpScreen.client_info.monitorCount > 0) if (g_rdpScreen.client_info.monitorCount > 0)
{ {
LLOGLN(0, (" client can do multimon")); LLOGLN(0, (" client can do multimon"));
LLOGLN(0, (" client monitor data, monitorCount= %d", g_rdpScreen.client_info.monitorCount)); LLOGLN(0, (" client monitor data, monitorCount= %d", g_rdpScreen.client_info.monitorCount));
box.x1 = g_rdpScreen.client_info.minfo[0].left;
box.y1 = g_rdpScreen.client_info.minfo[0].top;
box.x2 = g_rdpScreen.client_info.minfo[0].right;
box.y2 = g_rdpScreen.client_info.minfo[0].bottom;
g_do_multimon = 1; g_do_multimon = 1;
/* adjust monitor info so it's not negitive */
for (index = 1; index < g_rdpScreen.client_info.monitorCount; index++)
{
box.x1 = min(box.x1, g_rdpScreen.client_info.minfo[index].left);
box.y1 = min(box.y1, g_rdpScreen.client_info.minfo[index].top);
box.x2 = max(box.x2, g_rdpScreen.client_info.minfo[index].right);
box.y2 = max(box.y2, g_rdpScreen.client_info.minfo[index].bottom);
}
for (index = 0; index < g_rdpScreen.client_info.monitorCount; index++)
{
g_rdpScreen.client_info.minfo[index].left -= box.x1;
g_rdpScreen.client_info.minfo[index].top -= box.y1;
g_rdpScreen.client_info.minfo[index].right -= box.x1;
g_rdpScreen.client_info.minfo[index].bottom -= box.y1;
LLOGLN(0, (" left %d top %d right %d bottom %d",
g_rdpScreen.client_info.minfo[index].left,
g_rdpScreen.client_info.minfo[index].top,
g_rdpScreen.client_info.minfo[index].right,
g_rdpScreen.client_info.minfo[index].bottom));
}
rdpRRSetRdpOutputs();
RRTellChanged(g_pScreen);
} }
else else
{ {
LLOGLN(0, (" client can not do multimon")); LLOGLN(0, (" client can not do multimon"));
g_do_multimon = 0; g_do_multimon = 0;
rdpRRSetRdpOutputs();
RRTellChanged(g_pScreen);
} }
rdpLoadLayout(&(g_rdpScreen.client_info)); rdpLoadLayout(&(g_rdpScreen.client_info));

Loading…
Cancel
Save