Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
nx-libs
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
dimbor
nx-libs
Commits
15cee47a
Commit
15cee47a
authored
Oct 10, 2011
by
Reinhard Tartler
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Imported nx-X11-3.5.0-2.tar.gz
Summary: Imported nx-X11-3.5.0-2.tar.gz Keywords: Imported nx-X11-3.5.0-2.tar.gz into Git repository
parent
964f5396
Show whitespace changes
Inline
Side-by-side
Showing
50 changed files
with
19913 additions
and
1153 deletions
+19913
-1153
CHANGELOG
nx-X11/CHANGELOG
+6
-0
CHANGELOG.NX.original
nx-X11/CHANGELOG.NX.original
+12
-0
XKBMAlloc.c
nx-X11/lib/X11/XKBMAlloc.c
+29
-0
XKBMAlloc.c.NX.original
nx-X11/lib/X11/XKBMAlloc.c.NX.original
+1023
-0
XKBMAlloc.c.X.original
nx-X11/lib/X11/XKBMAlloc.c.X.original
+994
-0
Imakefile
nx-X11/programs/Xserver/randr.X.original/Imakefile
+18
-0
mirandr.c
nx-X11/programs/Xserver/randr.X.original/mirandr.c
+102
-0
randr.c
nx-X11/programs/Xserver/randr.X.original/randr.c
+1319
-0
randrstr.h
nx-X11/programs/Xserver/randr.X.original/randrstr.h
+142
-0
Imakefile
nx-X11/programs/Xserver/randr/Imakefile
+20
-2
Imakefile.NX.original
nx-X11/programs/Xserver/randr/Imakefile.NX.original
+36
-0
Imakefile.X.original
nx-X11/programs/Xserver/randr/Imakefile.X.original
+0
-0
Makefile.am
nx-X11/programs/Xserver/randr/Makefile.am
+28
-0
Makefile.in
nx-X11/programs/Xserver/randr/Makefile.in
+698
-0
mirandr.c
nx-X11/programs/Xserver/randr/mirandr.c
+112
-60
panoramiXproto.h
nx-X11/programs/Xserver/randr/panoramiXproto.h
+192
-0
panoramiXproto.h.NX.original
nx-X11/programs/Xserver/randr/panoramiXproto.h.NX.original
+192
-0
panoramiXproto.h.X.original
nx-X11/programs/Xserver/randr/panoramiXproto.h.X.original
+0
-0
randr.c
nx-X11/programs/Xserver/randr/randr.c
+257
-1055
randr.c.NX.original
nx-X11/programs/Xserver/randr/randr.c.NX.original
+521
-0
randr.c.X.original
nx-X11/programs/Xserver/randr/randr.c.X.original
+487
-0
randr.h
nx-X11/programs/Xserver/randr/randr.h
+141
-0
randr.h.NX.original
nx-X11/programs/Xserver/randr/randr.h.NX.original
+141
-0
randr.h.X.original
nx-X11/programs/Xserver/randr/randr.h.X.original
+0
-0
randrproto.h
nx-X11/programs/Xserver/randr/randrproto.h
+655
-0
randrproto.h.NX.original
nx-X11/programs/Xserver/randr/randrproto.h.NX.original
+655
-0
randrproto.h.X.original
nx-X11/programs/Xserver/randr/randrproto.h.X.original
+0
-0
randrstr.h
nx-X11/programs/Xserver/randr/randrstr.h
+782
-36
registry.h
nx-X11/programs/Xserver/randr/registry.h
+64
-0
registry.h.NX.original
nx-X11/programs/Xserver/randr/registry.h.NX.original
+64
-0
registry.h.X.original
nx-X11/programs/Xserver/randr/registry.h.X.original
+0
-0
rrcrtc.c
nx-X11/programs/Xserver/randr/rrcrtc.c
+984
-0
rrcrtc.c.NX.original
nx-X11/programs/Xserver/randr/rrcrtc.c.NX.original
+984
-0
rrcrtc.c.X.original
nx-X11/programs/Xserver/randr/rrcrtc.c.X.original
+960
-0
rrdispatch.c
nx-X11/programs/Xserver/randr/rrdispatch.c
+219
-0
rrdispatch.c.X.original
nx-X11/programs/Xserver/randr/rrdispatch.c.X.original
+214
-0
rrinfo.c
nx-X11/programs/Xserver/randr/rrinfo.c
+335
-0
rrmode.c
nx-X11/programs/Xserver/randr/rrmode.c
+420
-0
rrmode.c.NX.original
nx-X11/programs/Xserver/randr/rrmode.c.NX.original
+420
-0
rrmode.c.X.original
nx-X11/programs/Xserver/randr/rrmode.c.X.original
+398
-0
rroutput.c
nx-X11/programs/Xserver/randr/rroutput.c
+535
-0
rrpointer.c
nx-X11/programs/Xserver/randr/rrpointer.c
+145
-0
rrproperty.c
nx-X11/programs/Xserver/randr/rrproperty.c
+736
-0
rrscreen.c
nx-X11/programs/Xserver/randr/rrscreen.c
+1030
-0
rrscreen.c.NX.original
nx-X11/programs/Xserver/randr/rrscreen.c.NX.original
+1030
-0
rrscreen.c.X.original
nx-X11/programs/Xserver/randr/rrscreen.c.X.original
+981
-0
rrsdispatch.c
nx-X11/programs/Xserver/randr/rrsdispatch.c
+398
-0
rrxinerama.c
nx-X11/programs/Xserver/randr/rrxinerama.c
+490
-0
rrxinerama.c.NX.original
nx-X11/programs/Xserver/randr/rrxinerama.c.NX.original
+490
-0
rrxinerama.c.X.original
nx-X11/programs/Xserver/randr/rrxinerama.c.X.original
+454
-0
No files found.
nx-X11/CHANGELOG
View file @
15cee47a
ChangeLog:
nx-X11-3.5.0-2
- Fixed TR0202420. XKB utility functions wrote out of bounds.
- Upgraded RandR server extension to version 1.2.
nx-X11-3.5.0-1
- Opened the 3.5.0 branch based on nx-X11-3.4.0-4.
...
...
nx-X11/CHANGELOG.NX.original
View file @
15cee47a
ChangeLog:
nx-X11-3.5.0-2
- Fixed TR0202420. XKB utility functions wrote out of bounds.
- Upgraded RandR server extension to version 1.2.
nx-X11-3.5.0-1
- Opened the 3.5.0 branch based on nx-X11-3.4.0-4.
- Updated copyright to year 2011.
nx-X11-3.4.0-4
- Fixed TR06H02359. Removed compiler warnings.
...
...
nx-X11/lib/X11/XKBMAlloc.c
View file @
15cee47a
...
...
@@ -738,8 +738,13 @@ int tmp;
_XkbFree
(
prev_key_sym_map
);
return
BadAlloc
;
}
#ifdef NXAGENT_SERVER
bzero
((
char
*
)
&
xkb
->
map
->
key_sym_map
[
xkb
->
max_key_code
+
1
],
tmp
*
sizeof
(
XkbSymMapRec
));
#else
bzero
((
char
*
)
&
xkb
->
map
->
key_sym_map
[
xkb
->
max_key_code
],
tmp
*
sizeof
(
XkbSymMapRec
));
#endif
if
(
changes
)
{
changes
->
map
.
changed
=
_ExtendRange
(
changes
->
map
.
changed
,
XkbKeySymsMask
,
maxKC
,
...
...
@@ -756,7 +761,11 @@ int tmp;
_XkbFree
(
prev_modmap
);
return
BadAlloc
;
}
#ifdef NXAGENT_SERVER
bzero
((
char
*
)
&
xkb
->
map
->
modmap
[
xkb
->
max_key_code
+
1
],
tmp
);
#else
bzero
((
char
*
)
&
xkb
->
map
->
modmap
[
xkb
->
max_key_code
],
tmp
);
#endif
if
(
changes
)
{
changes
->
map
.
changed
=
_ExtendRange
(
changes
->
map
.
changed
,
XkbModifierMapMask
,
maxKC
,
...
...
@@ -775,8 +784,13 @@ int tmp;
_XkbFree
(
prev_behaviors
);
return
BadAlloc
;
}
#ifdef NXAGENT_SERVER
bzero
((
char
*
)
&
xkb
->
server
->
behaviors
[
xkb
->
max_key_code
+
1
],
tmp
*
sizeof
(
XkbBehavior
));
#else
bzero
((
char
*
)
&
xkb
->
server
->
behaviors
[
xkb
->
max_key_code
],
tmp
*
sizeof
(
XkbBehavior
));
#endif
if
(
changes
)
{
changes
->
map
.
changed
=
_ExtendRange
(
changes
->
map
.
changed
,
XkbKeyBehaviorsMask
,
maxKC
,
...
...
@@ -793,8 +807,13 @@ int tmp;
_XkbFree
(
prev_key_acts
);
return
BadAlloc
;
}
#ifdef NXAGENT_SERVER
bzero
((
char
*
)
&
xkb
->
server
->
key_acts
[
xkb
->
max_key_code
+
1
],
tmp
*
sizeof
(
unsigned
short
));
#else
bzero
((
char
*
)
&
xkb
->
server
->
key_acts
[
xkb
->
max_key_code
],
tmp
*
sizeof
(
unsigned
short
));
#endif
if
(
changes
)
{
changes
->
map
.
changed
=
_ExtendRange
(
changes
->
map
.
changed
,
XkbKeyActionsMask
,
maxKC
,
...
...
@@ -811,8 +830,13 @@ int tmp;
_XkbFree
(
prev_vmodmap
);
return
BadAlloc
;
}
#ifdef NXAGENT_SERVER
bzero
((
char
*
)
&
xkb
->
server
->
vmodmap
[
xkb
->
max_key_code
+
1
],
tmp
*
sizeof
(
unsigned
short
));
#else
bzero
((
char
*
)
&
xkb
->
server
->
vmodmap
[
xkb
->
max_key_code
],
tmp
*
sizeof
(
unsigned
short
));
#endif
if
(
changes
)
{
changes
->
map
.
changed
=
_ExtendRange
(
changes
->
map
.
changed
,
XkbVirtualModMapMask
,
maxKC
,
...
...
@@ -830,8 +854,13 @@ int tmp;
_XkbFree
(
prev_keys
);
return
BadAlloc
;
}
#ifdef NXAGENT_SERVER
bzero
((
char
*
)
&
xkb
->
names
->
keys
[
xkb
->
max_key_code
+
1
],
tmp
*
sizeof
(
XkbKeyNameRec
));
#else
bzero
((
char
*
)
&
xkb
->
names
->
keys
[
xkb
->
max_key_code
],
tmp
*
sizeof
(
XkbKeyNameRec
));
#endif
if
(
changes
)
{
changes
->
names
.
changed
=
_ExtendRange
(
changes
->
names
.
changed
,
XkbKeyNamesMask
,
maxKC
,
...
...
nx-X11/lib/X11/XKBMAlloc.c.NX.original
0 → 100644
View file @
15cee47a
/* $Xorg: XKBMAlloc.c,v 1.4 2000/08/17 19:45:02 cpqbld Exp $ */
/************************************************************
Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
Permission to use, copy, modify, and distribute this
software and its documentation for any purpose and without
fee is hereby granted, provided that the above copyright
notice appear in all copies and that both that copyright
notice and this permission notice appear in supporting
documentation, and that the name of Silicon Graphics not be
used in advertising or publicity pertaining to distribution
of the software without specific prior written permission.
Silicon Graphics makes no representation about the suitability
of this software for any purpose. It is provided "as is"
without any express or implied warranty.
SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
THE USE OR PERFORMANCE OF THIS SOFTWARE.
********************************************************/
/* $XFree86: xc/lib/X11/XKBMAlloc.c,v 3.11 2001/01/17 19:41:48 dawes Exp $ */
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#elif defined(HAVE_CONFIG_H)
#include <config.h>
#endif
#ifndef XKB_IN_SERVER
#include <stdio.h>
#define NEED_REPLIES
#define NEED_EVENTS
#include "Xlibint.h"
#include <X11/extensions/XKBproto.h>
#include <X11/keysym.h>
#include "XKBlibint.h"
#else
#include <stdio.h>
#include <X11/X.h>
#define NEED_EVENTS
#define NEED_REPLIES
#include <X11/Xproto.h>
#include "misc.h"
#include "inputstr.h"
#include <X11/keysym.h>
#define XKBSRV_NEED_FILE_FUNCS
#include <X11/extensions/XKBsrv.h>
#endif /* XKB_IN_SERVER */
/***====================================================================***/
Status
XkbAllocClientMap(XkbDescPtr xkb,unsigned which,unsigned nTotalTypes)
{
register int i;
XkbClientMapPtr map;
if ((xkb==NULL)||((nTotalTypes>0)&&(nTotalTypes<XkbNumRequiredTypes)))
return BadValue;
if ((which&XkbKeySymsMask)&&
((!XkbIsLegalKeycode(xkb->min_key_code))||
(!XkbIsLegalKeycode(xkb->max_key_code))||
(xkb->max_key_code<xkb->min_key_code))) {
#ifdef DEBUG
fprintf(stderr,"bad keycode (%d,%d) in XkbAllocClientMap\n",
xkb->min_key_code,xkb->max_key_code);
#endif
return BadValue;
}
if (xkb->map==NULL) {
map= _XkbTypedCalloc(1,XkbClientMapRec);
if (map==NULL)
return BadAlloc;
xkb->map= map;
}
else map= xkb->map;
if ((which&XkbKeyTypesMask)&&(nTotalTypes>0)) {
if (map->types==NULL) {
map->types= _XkbTypedCalloc(nTotalTypes,XkbKeyTypeRec);
if (map->types==NULL)
return BadAlloc;
map->num_types= 0;
map->size_types= nTotalTypes;
}
else if (map->size_types<nTotalTypes) {
XkbKeyTypeRec *prev_types = map->types;
map->types= _XkbTypedRealloc(map->types,nTotalTypes,XkbKeyTypeRec);
if (map->types==NULL) {
_XkbFree(prev_types);
map->num_types= map->size_types= 0;
return BadAlloc;
}
map->size_types= nTotalTypes;
bzero(&map->types[map->num_types],
((map->size_types-map->num_types)*sizeof(XkbKeyTypeRec)));
}
}
if (which&XkbKeySymsMask) {
int nKeys= XkbNumKeys(xkb);
if (map->syms==NULL) {
map->size_syms= (nKeys*15)/10;
map->syms= _XkbTypedCalloc(map->size_syms,KeySym);
if (!map->syms) {
map->size_syms= 0;
return BadAlloc;
}
map->num_syms= 1;
map->syms[0]= NoSymbol;
}
if (map->key_sym_map==NULL) {
i= xkb->max_key_code+1;
map->key_sym_map= _XkbTypedCalloc(i,XkbSymMapRec);
if (map->key_sym_map==NULL)
return BadAlloc;
}
}
if (which&XkbModifierMapMask) {
if ((!XkbIsLegalKeycode(xkb->min_key_code))||
(!XkbIsLegalKeycode(xkb->max_key_code))||
(xkb->max_key_code<xkb->min_key_code))
return BadMatch;
if (map->modmap==NULL) {
i= xkb->max_key_code+1;
map->modmap= _XkbTypedCalloc(i,unsigned char);
if (map->modmap==NULL)
return BadAlloc;
}
}
return Success;
}
Status
XkbAllocServerMap(XkbDescPtr xkb,unsigned which,unsigned nNewActions)
{
register int i;
XkbServerMapPtr map;
if (xkb==NULL)
return BadMatch;
if (xkb->server==NULL) {
map= _XkbTypedCalloc(1,XkbServerMapRec);
if (map==NULL)
return BadAlloc;
for (i=0;i<XkbNumVirtualMods;i++) {
map->vmods[i]= XkbNoModifierMask;
}
xkb->server= map;
}
else map= xkb->server;
if (which&XkbExplicitComponentsMask) {
if ((!XkbIsLegalKeycode(xkb->min_key_code))||
(!XkbIsLegalKeycode(xkb->max_key_code))||
(xkb->max_key_code<xkb->min_key_code))
return BadMatch;
if (map->explicit==NULL) {
i= xkb->max_key_code+1;
map->explicit= _XkbTypedCalloc(i,unsigned char);
if (map->explicit==NULL)
return BadAlloc;
}
}
if (which&XkbKeyActionsMask) {
if ((!XkbIsLegalKeycode(xkb->min_key_code))||
(!XkbIsLegalKeycode(xkb->max_key_code))||
(xkb->max_key_code<xkb->min_key_code))
return BadMatch;
if (nNewActions<1)
nNewActions= 1;
if (map->acts==NULL) {
map->acts= _XkbTypedCalloc((nNewActions+1),XkbAction);
if (map->acts==NULL)
return BadAlloc;
map->num_acts= 1;
map->size_acts= nNewActions+1;
}
else if ((map->size_acts-map->num_acts)<nNewActions) {
unsigned need;
XkbAction *prev_acts = map->acts;
need= map->num_acts+nNewActions;
map->acts= _XkbTypedRealloc(map->acts,need,XkbAction);
if (map->acts==NULL) {
_XkbFree(prev_acts);
map->num_acts= map->size_acts= 0;
return BadAlloc;
}
map->size_acts= need;
bzero(&map->acts[map->num_acts],
((map->size_acts-map->num_acts)*sizeof(XkbAction)));
}
if (map->key_acts==NULL) {
i= xkb->max_key_code+1;
map->key_acts= _XkbTypedCalloc(i,unsigned short);
if (map->key_acts==NULL)
return BadAlloc;
}
}
if (which&XkbKeyBehaviorsMask) {
if ((!XkbIsLegalKeycode(xkb->min_key_code))||
(!XkbIsLegalKeycode(xkb->max_key_code))||
(xkb->max_key_code<xkb->min_key_code))
return BadMatch;
if (map->behaviors==NULL) {
i= xkb->max_key_code+1;
map->behaviors= _XkbTypedCalloc(i,XkbBehavior);
if (map->behaviors==NULL)
return BadAlloc;
}
}
if (which&XkbVirtualModMapMask) {
if ((!XkbIsLegalKeycode(xkb->min_key_code))||
(!XkbIsLegalKeycode(xkb->max_key_code))||
(xkb->max_key_code<xkb->min_key_code))
return BadMatch;
if (map->vmodmap==NULL) {
i= xkb->max_key_code+1;
map->vmodmap= _XkbTypedCalloc(i,unsigned short);
if (map->vmodmap==NULL)
return BadAlloc;
}
}
return Success;
}
/***====================================================================***/
Status
XkbCopyKeyType(XkbKeyTypePtr from,XkbKeyTypePtr into)
{
if ((!from)||(!into))
return BadMatch;
if (into->map) {
_XkbFree(into->map);
into->map= NULL;
}
if (into->preserve) {
_XkbFree(into->preserve);
into->preserve= NULL;
}
if (into->level_names) {
_XkbFree(into->level_names);
into->level_names= NULL;
}
*into= *from;
if ((from->map)&&(into->map_count>0)) {
into->map= _XkbTypedCalloc(into->map_count,XkbKTMapEntryRec);
if (!into->map)
return BadAlloc;
memcpy(into->map,from->map,into->map_count*sizeof(XkbKTMapEntryRec));
}
if ((from->preserve)&&(into->map_count>0)) {
into->preserve= _XkbTypedCalloc(into->map_count,XkbModsRec);
if (!into->preserve)
return BadAlloc;
memcpy(into->preserve,from->preserve,
into->map_count*sizeof(XkbModsRec));
}
if ((from->level_names)&&(into->num_levels>0)) {
into->level_names= _XkbTypedCalloc(into->num_levels,Atom);
if (!into->level_names)
return BadAlloc;
memcpy(into->level_names,from->level_names,
into->num_levels*sizeof(Atom));
}
return Success;
}
Status
XkbCopyKeyTypes(XkbKeyTypePtr from,XkbKeyTypePtr into,int num_types)
{
register int i,rtrn;
if ((!from)||(!into)||(num_types<0))
return BadMatch;
for (i=0;i<num_types;i++) {
if ((rtrn= XkbCopyKeyType(from++,into++))!=Success)
return rtrn;
}
return Success;
}
XkbKeyTypePtr
XkbAddKeyType( XkbDescPtr xkb,
Atom name,
int map_count,
Bool want_preserve,
int num_lvls)
{
register int i;
unsigned tmp;
XkbKeyTypePtr type;
XkbClientMapPtr map;
if ((!xkb)||(num_lvls<1))
return NULL;
map= xkb->map;
if ((map)&&(map->types)) {
for (i=0;i<map->num_types;i++) {
if (map->types[i].name==name) {
Status status;
status=XkbResizeKeyType(xkb,i,map_count,want_preserve,num_lvls);
return (status==Success?&map->types[i]:NULL);
}
}
}
if ((!map)||(!map->types)||(!map->num_types<XkbNumRequiredTypes)) {
tmp= XkbNumRequiredTypes+1;
if (XkbAllocClientMap(xkb,XkbKeyTypesMask,tmp)!=Success)
return NULL;
tmp= 0;
if (map->num_types<=XkbKeypadIndex)
tmp|= XkbKeypadMask;
if (map->num_types<=XkbAlphabeticIndex)
tmp|= XkbAlphabeticMask;
if (map->num_types<=XkbTwoLevelIndex)
tmp|= XkbTwoLevelMask;
if (map->num_types<=XkbOneLevelIndex)
tmp|= XkbOneLevelMask;
if (XkbInitCanonicalKeyTypes(xkb,tmp,XkbNoModifier)==Success) {
for (i=0;i<map->num_types;i++) {
Status status;
if (map->types[i].name!=name)
continue;
status=XkbResizeKeyType(xkb,i,map_count,want_preserve,num_lvls);
return (status==Success?&map->types[i]:NULL);
}
}
}
if ((map->num_types<=map->size_types)&&
(XkbAllocClientMap(xkb,XkbKeyTypesMask,map->num_types+1)!=Success)) {
return NULL;
}
type= &map->types[map->num_types];
map->num_types++;
bzero((char *)type,sizeof(XkbKeyTypeRec));
type->num_levels= num_lvls;
type->map_count= map_count;
type->name= name;
if (map_count>0) {
type->map= _XkbTypedCalloc(map_count,XkbKTMapEntryRec);
if (!type->map) {
map->num_types--;
return NULL;
}
if (want_preserve) {
type->preserve= _XkbTypedCalloc(map_count,XkbModsRec);
if (!type->preserve) {
_XkbFree(type->map);
map->num_types--;
return NULL;
}
}
}
return type;
}
Status
XkbResizeKeyType( XkbDescPtr xkb,
int type_ndx,
int map_count,
Bool want_preserve,
int new_num_lvls)
{
XkbKeyTypePtr type;
KeyCode matchingKeys[XkbMaxKeyCount],nMatchingKeys;
if ((type_ndx<0)||(type_ndx>=xkb->map->num_types)||(map_count<0)||
(new_num_lvls<1))
return BadValue;
switch (type_ndx) {
case XkbOneLevelIndex:
if (new_num_lvls!=1)
return BadMatch;
break;
case XkbTwoLevelIndex:
case XkbAlphabeticIndex:
case XkbKeypadIndex:
if (new_num_lvls!=2)
return BadMatch;
break;
}
type= &xkb->map->types[type_ndx];
if (map_count==0) {
if (type->map!=NULL)
_XkbFree(type->map);
type->map= NULL;
if (type->preserve!=NULL)
_XkbFree(type->preserve);
type->preserve= NULL;
type->map_count= 0;
}
else {
XkbKTMapEntryRec *prev_map = type->map;
if ((map_count>type->map_count)||(type->map==NULL))
type->map=_XkbTypedRealloc(type->map,map_count,XkbKTMapEntryRec);
if (!type->map) {
if (prev_map)
_XkbFree(prev_map);
return BadAlloc;
}
if (want_preserve) {
XkbModsRec *prev_preserve = type->preserve;
if ((map_count>type->map_count)||(type->preserve==NULL)) {
type->preserve= _XkbTypedRealloc(type->preserve,map_count,
XkbModsRec);
}
if (!type->preserve) {
if (prev_preserve)
_XkbFree(prev_preserve);
return BadAlloc;
}
}
else if (type->preserve!=NULL) {
_XkbFree(type->preserve);
type->preserve= NULL;
}
type->map_count= map_count;
}
if ((new_num_lvls>type->num_levels)||(type->level_names==NULL)) {
Atom * prev_level_names = type->level_names;
type->level_names=_XkbTypedRealloc(type->level_names,new_num_lvls,Atom);
if (!type->level_names) {
if (prev_level_names)
_XkbFree(prev_level_names);
return BadAlloc;
}
}
/*
* Here's the theory:
* If the width of the type changed, we might have to resize the symbol
* maps for any keys that use the type for one or more groups. This is
* expensive, so we'll try to cull out any keys that are obviously okay:
* In any case:
* - keys that have a group width <= the old width are okay (because
* they could not possibly have been associated with the old type)
* If the key type increased in size:
* - keys that already have a group width >= to the new width are okay
* + keys that have a group width >= the old width but < the new width
* might have to be enlarged.
* If the key type decreased in size:
* - keys that have a group width > the old width don't have to be
* resized (because they must have some other wider type associated
* with some group).
* + keys that have a group width == the old width might have to be
* shrunk.
* The possibilities marked with '+' require us to examine the key types
* associated with each group for the key.
*/
bzero(matchingKeys,XkbMaxKeyCount*sizeof(KeyCode));
nMatchingKeys= 0;
if (new_num_lvls>type->num_levels) {
int nTotal;
KeySym * newSyms;
int width,match,nResize;
register int i,g,nSyms;
nResize= 0;
for (nTotal=1,i=xkb->min_key_code;i<=xkb->max_key_code;i++) {
width= XkbKeyGroupsWidth(xkb,i);
if (width<type->num_levels)
continue;
for (match=0,g=XkbKeyNumGroups(xkb,i)-1;(g>=0)&&(!match);g--) {
if (XkbKeyKeyTypeIndex(xkb,i,g)==type_ndx) {
matchingKeys[nMatchingKeys++]= i;
match= 1;
}
}
if ((!match)||(width>=new_num_lvls))
nTotal+= XkbKeyNumSyms(xkb,i);
else {
nTotal+= XkbKeyNumGroups(xkb,i)*new_num_lvls;
nResize++;
}
}
if (nResize>0) {
int nextMatch;
xkb->map->size_syms= (nTotal*12)/10;
newSyms = _XkbTypedCalloc(xkb->map->size_syms,KeySym);
if (newSyms==NULL)
return BadAlloc;
nextMatch= 0;
nSyms= 1;
for (i=xkb->min_key_code;i<=xkb->max_key_code;i++) {
if (matchingKeys[nextMatch]==i) {
KeySym *pOld;
nextMatch++;
width= XkbKeyGroupsWidth(xkb,i);
pOld= XkbKeySymsPtr(xkb,i);
for (g=XkbKeyNumGroups(xkb,i)-1;g>=0;g--) {
memcpy(&newSyms[nSyms+(new_num_lvls*g)],&pOld[width*g],
width*sizeof(KeySym));
}
xkb->map->key_sym_map[i].offset= nSyms;
nSyms+= XkbKeyNumGroups(xkb,i)*new_num_lvls;
}
else {
memcpy(&newSyms[nSyms],XkbKeySymsPtr(xkb,i),
XkbKeyNumSyms(xkb,i)*sizeof(KeySym));
xkb->map->key_sym_map[i].offset= nSyms;
nSyms+= XkbKeyNumSyms(xkb,i);
}
}
type->num_levels= new_num_lvls;
_XkbFree(xkb->map->syms);
xkb->map->syms= newSyms;
xkb->map->num_syms= nSyms;
return Success;
}
}
else if (new_num_lvls<type->num_levels) {
int width,match;
register int g,i;
for (i=xkb->min_key_code;i<=xkb->max_key_code;i++) {
width= XkbKeyGroupsWidth(xkb,i);
if (width<type->num_levels)
continue;
for (match=0,g=XkbKeyNumGroups(xkb,i)-1;(g>=0)&&(!match);g--) {
if (XkbKeyKeyTypeIndex(xkb,i,g)==type_ndx) {
matchingKeys[nMatchingKeys++]= i;
match= 1;
}
}
}
}
if (nMatchingKeys>0) {
int key,firstClear;
register int i,g;
if (new_num_lvls>type->num_levels)
firstClear= type->num_levels;
else firstClear= new_num_lvls;
for (i=0;i<nMatchingKeys;i++) {
KeySym * pSyms;
int width,nClear;
key= matchingKeys[i];
width= XkbKeyGroupsWidth(xkb,key);
nClear= width-firstClear;
pSyms= XkbKeySymsPtr(xkb,key);
for (g=XkbKeyNumGroups(xkb,key)-1;g>=0;g--) {
if (XkbKeyKeyTypeIndex(xkb,key,g)==type_ndx) {
if (nClear>0)
bzero(&pSyms[g*width+firstClear],nClear*sizeof(KeySym));
}
}
}
}
type->num_levels= new_num_lvls;
return Success;
}
KeySym *
XkbResizeKeySyms(XkbDescPtr xkb,int key,int needed)
{
register int i,nSyms,nKeySyms;
unsigned nOldSyms;
KeySym *newSyms;
if (needed==0) {
xkb->map->key_sym_map[key].offset= 0;
return xkb->map->syms;
}
nOldSyms= XkbKeyNumSyms(xkb,key);
if (nOldSyms>=(unsigned)needed) {
return XkbKeySymsPtr(xkb,key);
}
if (xkb->map->size_syms-xkb->map->num_syms>=(unsigned)needed) {
if (nOldSyms>0) {
memcpy(&xkb->map->syms[xkb->map->num_syms],XkbKeySymsPtr(xkb,key),
nOldSyms*sizeof(KeySym));
}
if ((needed-nOldSyms)>0) {
bzero(&xkb->map->syms[xkb->map->num_syms+XkbKeyNumSyms(xkb,key)],
(needed-nOldSyms)*sizeof(KeySym));
}
xkb->map->key_sym_map[key].offset = xkb->map->num_syms;
xkb->map->num_syms+= needed;
return &xkb->map->syms[xkb->map->key_sym_map[key].offset];
}
xkb->map->size_syms+= (needed>32?needed:32);
newSyms = _XkbTypedCalloc(xkb->map->size_syms,KeySym);
if (newSyms==NULL)
return NULL;
newSyms[0]= NoSymbol;
nSyms = 1;
for (i=xkb->min_key_code;i<=(int)xkb->max_key_code;i++) {
int nCopy;
nCopy= nKeySyms= XkbKeyNumSyms(xkb,i);
if ((nKeySyms==0)&&(i!=key))
continue;
if (i==key)
nKeySyms= needed;
if (nCopy!=0)
memcpy(&newSyms[nSyms],XkbKeySymsPtr(xkb,i),nCopy*sizeof(KeySym));
if (nKeySyms>nCopy)
bzero(&newSyms[nSyms+nCopy],(nKeySyms-nCopy)*sizeof(KeySym));
xkb->map->key_sym_map[i].offset = nSyms;
nSyms+= nKeySyms;
}
_XkbFree(xkb->map->syms);
xkb->map->syms = newSyms;
xkb->map->num_syms = nSyms;
return &xkb->map->syms[xkb->map->key_sym_map[key].offset];
}
static unsigned
_ExtendRange( unsigned int old_flags,
unsigned int flag,
KeyCode newKC,
KeyCode * old_min,
unsigned char * old_num)
{
if ((old_flags&flag)==0) {
old_flags|= flag;
*old_min= newKC;
*old_num= 1;
}
else {
int last= (*old_min)+(*old_num)-1;
if (newKC<*old_min) {
*old_min= newKC;
*old_num= (last-newKC)+1;
}
else if (newKC>last) {
*old_num= (newKC-(*old_min))+1;
}
}
return old_flags;
}
Status
XkbChangeKeycodeRange( XkbDescPtr xkb,
int minKC,
int maxKC,
XkbChangesPtr changes)
{
int tmp;
if ((!xkb)||(minKC<XkbMinLegalKeyCode)||(maxKC>XkbMaxLegalKeyCode))
return BadValue;
if (minKC>maxKC)
return BadMatch;
if (minKC<xkb->min_key_code) {
if (changes)
changes->map.min_key_code= minKC;
tmp= xkb->min_key_code-minKC;
if (xkb->map) {
if (xkb->map->key_sym_map) {
bzero((char *)&xkb->map->key_sym_map[minKC],
tmp*sizeof(XkbSymMapRec));
if (changes) {
changes->map.changed= _ExtendRange(changes->map.changed,
XkbKeySymsMask,minKC,
&changes->map.first_key_sym,
&changes->map.num_key_syms);
}
}
if (xkb->map->modmap) {
bzero((char *)&xkb->map->modmap[minKC],tmp);
if (changes) {
changes->map.changed= _ExtendRange(changes->map.changed,
XkbModifierMapMask,minKC,
&changes->map.first_modmap_key,
&changes->map.num_modmap_keys);
}
}
}
if (xkb->server) {
if (xkb->server->behaviors) {
bzero((char *)&xkb->server->behaviors[minKC],
tmp*sizeof(XkbBehavior));
if (changes) {
changes->map.changed= _ExtendRange(changes->map.changed,
XkbKeyBehaviorsMask,minKC,
&changes->map.first_key_behavior,
&changes->map.num_key_behaviors);
}
}
if (xkb->server->key_acts) {
bzero((char *)&xkb->server->key_acts[minKC],
tmp*sizeof(unsigned short));
if (changes) {
changes->map.changed= _ExtendRange(changes->map.changed,
XkbKeyActionsMask,minKC,
&changes->map.first_key_act,
&changes->map.num_key_acts);
}
}
if (xkb->server->vmodmap) {
bzero((char *)&xkb->server->vmodmap[minKC],
tmp*sizeof(unsigned short));
if (changes) {
changes->map.changed= _ExtendRange(changes->map.changed,
XkbVirtualModMapMask,minKC,
&changes->map.first_modmap_key,
&changes->map.num_vmodmap_keys);
}
}
}
if ((xkb->names)&&(xkb->names->keys)) {
bzero((char *)&xkb->names->keys[minKC],tmp*sizeof(XkbKeyNameRec));
if (changes) {
changes->names.changed= _ExtendRange(changes->names.changed,
XkbKeyNamesMask,minKC,
&changes->names.first_key,
&changes->names.num_keys);
}
}
xkb->min_key_code= minKC;
}
if (maxKC>xkb->max_key_code) {
if (changes)
changes->map.max_key_code= maxKC;
tmp= maxKC-xkb->max_key_code;
if (xkb->map) {
if (xkb->map->key_sym_map) {
XkbSymMapRec *prev_key_sym_map = xkb->map->key_sym_map;
xkb->map->key_sym_map= _XkbTypedRealloc(xkb->map->key_sym_map,
(maxKC+1),XkbSymMapRec);
if (!xkb->map->key_sym_map) {
_XkbFree(prev_key_sym_map);
return BadAlloc;
}
#ifdef NXAGENT_SERVER
bzero((char *)&xkb->map->key_sym_map[xkb->max_key_code+1],
tmp*sizeof(XkbSymMapRec));
#else
bzero((char *)&xkb->map->key_sym_map[xkb->max_key_code],
tmp*sizeof(XkbSymMapRec));
#endif
if (changes) {
changes->map.changed= _ExtendRange(changes->map.changed,
XkbKeySymsMask,maxKC,
&changes->map.first_key_sym,
&changes->map.num_key_syms);
}
}
if (xkb->map->modmap) {
unsigned char *prev_modmap = xkb->map->modmap;
xkb->map->modmap= _XkbTypedRealloc(xkb->map->modmap,
(maxKC+1),unsigned char);
if (!xkb->map->modmap) {
_XkbFree(prev_modmap);
return BadAlloc;
}
#ifdef NXAGENT_SERVER
bzero((char *)&xkb->map->modmap[xkb->max_key_code+1],tmp);
#else
bzero((char *)&xkb->map->modmap[xkb->max_key_code],tmp);
#endif
if (changes) {
changes->map.changed= _ExtendRange(changes->map.changed,
XkbModifierMapMask,maxKC,
&changes->map.first_modmap_key,
&changes->map.num_modmap_keys);
}
}
}
if (xkb->server) {
if (xkb->server->behaviors) {
XkbBehavior *prev_behaviors = xkb->server->behaviors;
xkb->server->behaviors=_XkbTypedRealloc(xkb->server->behaviors,
(maxKC+1),XkbBehavior);
if (!xkb->server->behaviors) {
_XkbFree(prev_behaviors);
return BadAlloc;
}
#ifdef NXAGENT_SERVER
bzero((char *)&xkb->server->behaviors[xkb->max_key_code+1],
tmp*sizeof(XkbBehavior));
#else
bzero((char *)&xkb->server->behaviors[xkb->max_key_code],
tmp*sizeof(XkbBehavior));
#endif
if (changes) {
changes->map.changed= _ExtendRange(changes->map.changed,
XkbKeyBehaviorsMask,maxKC,
&changes->map.first_key_behavior,
&changes->map.num_key_behaviors);
}
}
if (xkb->server->key_acts) {
unsigned short *prev_key_acts = xkb->server->key_acts;
xkb->server->key_acts= _XkbTypedRealloc(xkb->server->key_acts,
(maxKC+1),unsigned short);
if (!xkb->server->key_acts) {
_XkbFree(prev_key_acts);
return BadAlloc;
}
#ifdef NXAGENT_SERVER
bzero((char *)&xkb->server->key_acts[xkb->max_key_code+1],
tmp*sizeof(unsigned short));
#else
bzero((char *)&xkb->server->key_acts[xkb->max_key_code],
tmp*sizeof(unsigned short));
#endif
if (changes) {
changes->map.changed= _ExtendRange(changes->map.changed,
XkbKeyActionsMask,maxKC,
&changes->map.first_key_act,
&changes->map.num_key_acts);
}
}
if (xkb->server->vmodmap) {
unsigned short *prev_vmodmap = xkb->server->vmodmap;
xkb->server->vmodmap= _XkbTypedRealloc(xkb->server->vmodmap,
(maxKC+1),unsigned short);
if (!xkb->server->vmodmap) {
_XkbFree(prev_vmodmap);
return BadAlloc;
}
#ifdef NXAGENT_SERVER
bzero((char *)&xkb->server->vmodmap[xkb->max_key_code+1],
tmp*sizeof(unsigned short));
#else
bzero((char *)&xkb->server->vmodmap[xkb->max_key_code],
tmp*sizeof(unsigned short));
#endif
if (changes) {
changes->map.changed= _ExtendRange(changes->map.changed,
XkbVirtualModMapMask,maxKC,
&changes->map.first_modmap_key,
&changes->map.num_vmodmap_keys);
}
}
}
if ((xkb->names)&&(xkb->names->keys)) {
XkbKeyNameRec *prev_keys = xkb->names->keys;
xkb->names->keys= _XkbTypedRealloc(xkb->names->keys,
(maxKC+1),XkbKeyNameRec);
if (!xkb->names->keys) {
_XkbFree(prev_keys);
return BadAlloc;
}
#ifdef NXAGENT_SERVER
bzero((char *)&xkb->names->keys[xkb->max_key_code+1],
tmp*sizeof(XkbKeyNameRec));
#else
bzero((char *)&xkb->names->keys[xkb->max_key_code],
tmp*sizeof(XkbKeyNameRec));
#endif
if (changes) {
changes->names.changed= _ExtendRange(changes->names.changed,
XkbKeyNamesMask,maxKC,
&changes->names.first_key,
&changes->names.num_keys);
}
}
xkb->max_key_code= maxKC;
}
return Success;
}
XkbAction *
XkbResizeKeyActions(XkbDescPtr xkb,int key,int needed)
{
register int i,nActs;
XkbAction *newActs;
if (needed==0) {
xkb->server->key_acts[key]= 0;
return NULL;
}
if (XkbKeyHasActions(xkb,key)&&(XkbKeyNumSyms(xkb,key)>=(unsigned)needed))
return XkbKeyActionsPtr(xkb,key);
if (xkb->server->size_acts-xkb->server->num_acts>=(unsigned)needed) {
xkb->server->key_acts[key]= xkb->server->num_acts;
xkb->server->num_acts+= needed;
return &xkb->server->acts[xkb->server->key_acts[key]];
}
xkb->server->size_acts= xkb->server->num_acts+needed+8;
newActs = _XkbTypedCalloc(xkb->server->size_acts,XkbAction);
if (newActs==NULL)
return NULL;
newActs[0].type = XkbSA_NoAction;
nActs = 1;
for (i=xkb->min_key_code;i<=(int)xkb->max_key_code;i++) {
int nKeyActs,nCopy;
if ((xkb->server->key_acts[i]==0)&&(i!=key))
continue;
nCopy= nKeyActs= XkbKeyNumActions(xkb,i);
if (i==key) {
nKeyActs= needed;
if (needed<nCopy)
nCopy= needed;
}
if (nCopy>0)
memcpy(&newActs[nActs],XkbKeyActionsPtr(xkb,i),
nCopy*sizeof(XkbAction));
if (nCopy<nKeyActs)
bzero(&newActs[nActs+nCopy],(nKeyActs-nCopy)*sizeof(XkbAction));
xkb->server->key_acts[i]= nActs;
nActs+= nKeyActs;
}
_XkbFree(xkb->server->acts);
xkb->server->acts = newActs;
xkb->server->num_acts= nActs;
return &xkb->server->acts[xkb->server->key_acts[key]];
}
void
XkbFreeClientMap(XkbDescPtr xkb,unsigned what,Bool freeMap)
{
XkbClientMapPtr map;
if ((xkb==NULL)||(xkb->map==NULL))
return;
if (freeMap)
what= XkbAllClientInfoMask;
map= xkb->map;
if (what&XkbKeyTypesMask) {
if (map->types!=NULL) {
if (map->num_types>0) {
register int i;
XkbKeyTypePtr type;
for (i=0,type=map->types;i<map->num_types;i++,type++) {
if (type->map!=NULL) {
_XkbFree(type->map);
type->map= NULL;
}
if (type->preserve!=NULL) {
_XkbFree(type->preserve);
type->preserve= NULL;
}
type->map_count= 0;
if (type->level_names!=NULL) {
_XkbFree(type->level_names);
type->level_names= NULL;
}
}
}
_XkbFree(map->types);
map->num_types= map->size_types= 0;
map->types= NULL;
}
}
if (what&XkbKeySymsMask) {
if (map->key_sym_map!=NULL) {
_XkbFree(map->key_sym_map);
map->key_sym_map= NULL;
}
if (map->syms!=NULL) {
_XkbFree(map->syms);
map->size_syms= map->num_syms= 0;
map->syms= NULL;
}
}
if ((what&XkbModifierMapMask)&&(map->modmap!=NULL)) {
_XkbFree(map->modmap);
map->modmap= NULL;
}
if (freeMap) {
_XkbFree(xkb->map);
xkb->map= NULL;
}
return;
}
void
XkbFreeServerMap(XkbDescPtr xkb,unsigned what,Bool freeMap)
{
XkbServerMapPtr map;
if ((xkb==NULL)||(xkb->server==NULL))
return;
if (freeMap)
what= XkbAllServerInfoMask;
map= xkb->server;
if ((what&XkbExplicitComponentsMask)&&(map->explicit!=NULL)) {
_XkbFree(map->explicit);
map->explicit= NULL;
}
if (what&XkbKeyActionsMask) {
if (map->key_acts!=NULL) {
_XkbFree(map->key_acts);
map->key_acts= NULL;
}
if (map->acts!=NULL) {
_XkbFree(map->acts);
map->num_acts= map->size_acts= 0;
map->acts= NULL;
}
}
if ((what&XkbKeyBehaviorsMask)&&(map->behaviors!=NULL)) {
_XkbFree(map->behaviors);
map->behaviors= NULL;
}
if ((what&XkbVirtualModMapMask)&&(map->vmodmap!=NULL)) {
_XkbFree(map->vmodmap);
map->vmodmap= NULL;
}
if (freeMap) {
_XkbFree(xkb->server);
xkb->server= NULL;
}
return;
}
nx-X11/lib/X11/XKBMAlloc.c.X.original
0 → 100644
View file @
15cee47a
/* $Xorg: XKBMAlloc.c,v 1.4 2000/08/17 19:45:02 cpqbld Exp $ */
/************************************************************
Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
Permission to use, copy, modify, and distribute this
software and its documentation for any purpose and without
fee is hereby granted, provided that the above copyright
notice appear in all copies and that both that copyright
notice and this permission notice appear in supporting
documentation, and that the name of Silicon Graphics not be
used in advertising or publicity pertaining to distribution
of the software without specific prior written permission.
Silicon Graphics makes no representation about the suitability
of this software for any purpose. It is provided "as is"
without any express or implied warranty.
SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
THE USE OR PERFORMANCE OF THIS SOFTWARE.
********************************************************/
/* $XFree86: xc/lib/X11/XKBMAlloc.c,v 3.11 2001/01/17 19:41:48 dawes Exp $ */
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#elif defined(HAVE_CONFIG_H)
#include <config.h>
#endif
#ifndef XKB_IN_SERVER
#include <stdio.h>
#define NEED_REPLIES
#define NEED_EVENTS
#include "Xlibint.h"
#include <X11/extensions/XKBproto.h>
#include <X11/keysym.h>
#include "XKBlibint.h"
#else
#include <stdio.h>
#include <X11/X.h>
#define NEED_EVENTS
#define NEED_REPLIES
#include <X11/Xproto.h>
#include "misc.h"
#include "inputstr.h"
#include <X11/keysym.h>
#define XKBSRV_NEED_FILE_FUNCS
#include <X11/extensions/XKBsrv.h>
#endif /* XKB_IN_SERVER */
/***====================================================================***/
Status
XkbAllocClientMap(XkbDescPtr xkb,unsigned which,unsigned nTotalTypes)
{
register int i;
XkbClientMapPtr map;
if ((xkb==NULL)||((nTotalTypes>0)&&(nTotalTypes<XkbNumRequiredTypes)))
return BadValue;
if ((which&XkbKeySymsMask)&&
((!XkbIsLegalKeycode(xkb->min_key_code))||
(!XkbIsLegalKeycode(xkb->max_key_code))||
(xkb->max_key_code<xkb->min_key_code))) {
#ifdef DEBUG
fprintf(stderr,"bad keycode (%d,%d) in XkbAllocClientMap\n",
xkb->min_key_code,xkb->max_key_code);
#endif
return BadValue;
}
if (xkb->map==NULL) {
map= _XkbTypedCalloc(1,XkbClientMapRec);
if (map==NULL)
return BadAlloc;
xkb->map= map;
}
else map= xkb->map;
if ((which&XkbKeyTypesMask)&&(nTotalTypes>0)) {
if (map->types==NULL) {
map->types= _XkbTypedCalloc(nTotalTypes,XkbKeyTypeRec);
if (map->types==NULL)
return BadAlloc;
map->num_types= 0;
map->size_types= nTotalTypes;
}
else if (map->size_types<nTotalTypes) {
XkbKeyTypeRec *prev_types = map->types;
map->types= _XkbTypedRealloc(map->types,nTotalTypes,XkbKeyTypeRec);
if (map->types==NULL) {
_XkbFree(prev_types);
map->num_types= map->size_types= 0;
return BadAlloc;
}
map->size_types= nTotalTypes;
bzero(&map->types[map->num_types],
((map->size_types-map->num_types)*sizeof(XkbKeyTypeRec)));
}
}
if (which&XkbKeySymsMask) {
int nKeys= XkbNumKeys(xkb);
if (map->syms==NULL) {
map->size_syms= (nKeys*15)/10;
map->syms= _XkbTypedCalloc(map->size_syms,KeySym);
if (!map->syms) {
map->size_syms= 0;
return BadAlloc;
}
map->num_syms= 1;
map->syms[0]= NoSymbol;
}
if (map->key_sym_map==NULL) {
i= xkb->max_key_code+1;
map->key_sym_map= _XkbTypedCalloc(i,XkbSymMapRec);
if (map->key_sym_map==NULL)
return BadAlloc;
}
}
if (which&XkbModifierMapMask) {
if ((!XkbIsLegalKeycode(xkb->min_key_code))||
(!XkbIsLegalKeycode(xkb->max_key_code))||
(xkb->max_key_code<xkb->min_key_code))
return BadMatch;
if (map->modmap==NULL) {
i= xkb->max_key_code+1;
map->modmap= _XkbTypedCalloc(i,unsigned char);
if (map->modmap==NULL)
return BadAlloc;
}
}
return Success;
}
Status
XkbAllocServerMap(XkbDescPtr xkb,unsigned which,unsigned nNewActions)
{
register int i;
XkbServerMapPtr map;
if (xkb==NULL)
return BadMatch;
if (xkb->server==NULL) {
map= _XkbTypedCalloc(1,XkbServerMapRec);
if (map==NULL)
return BadAlloc;
for (i=0;i<XkbNumVirtualMods;i++) {
map->vmods[i]= XkbNoModifierMask;
}
xkb->server= map;
}
else map= xkb->server;
if (which&XkbExplicitComponentsMask) {
if ((!XkbIsLegalKeycode(xkb->min_key_code))||
(!XkbIsLegalKeycode(xkb->max_key_code))||
(xkb->max_key_code<xkb->min_key_code))
return BadMatch;
if (map->explicit==NULL) {
i= xkb->max_key_code+1;
map->explicit= _XkbTypedCalloc(i,unsigned char);
if (map->explicit==NULL)
return BadAlloc;
}
}
if (which&XkbKeyActionsMask) {
if ((!XkbIsLegalKeycode(xkb->min_key_code))||
(!XkbIsLegalKeycode(xkb->max_key_code))||
(xkb->max_key_code<xkb->min_key_code))
return BadMatch;
if (nNewActions<1)
nNewActions= 1;
if (map->acts==NULL) {
map->acts= _XkbTypedCalloc((nNewActions+1),XkbAction);
if (map->acts==NULL)
return BadAlloc;
map->num_acts= 1;
map->size_acts= nNewActions+1;
}
else if ((map->size_acts-map->num_acts)<nNewActions) {
unsigned need;
XkbAction *prev_acts = map->acts;
need= map->num_acts+nNewActions;
map->acts= _XkbTypedRealloc(map->acts,need,XkbAction);
if (map->acts==NULL) {
_XkbFree(prev_acts);
map->num_acts= map->size_acts= 0;
return BadAlloc;
}
map->size_acts= need;
bzero(&map->acts[map->num_acts],
((map->size_acts-map->num_acts)*sizeof(XkbAction)));
}
if (map->key_acts==NULL) {
i= xkb->max_key_code+1;
map->key_acts= _XkbTypedCalloc(i,unsigned short);
if (map->key_acts==NULL)
return BadAlloc;
}
}
if (which&XkbKeyBehaviorsMask) {
if ((!XkbIsLegalKeycode(xkb->min_key_code))||
(!XkbIsLegalKeycode(xkb->max_key_code))||
(xkb->max_key_code<xkb->min_key_code))
return BadMatch;
if (map->behaviors==NULL) {
i= xkb->max_key_code+1;
map->behaviors= _XkbTypedCalloc(i,XkbBehavior);
if (map->behaviors==NULL)
return BadAlloc;
}
}
if (which&XkbVirtualModMapMask) {
if ((!XkbIsLegalKeycode(xkb->min_key_code))||
(!XkbIsLegalKeycode(xkb->max_key_code))||
(xkb->max_key_code<xkb->min_key_code))
return BadMatch;
if (map->vmodmap==NULL) {
i= xkb->max_key_code+1;
map->vmodmap= _XkbTypedCalloc(i,unsigned short);
if (map->vmodmap==NULL)
return BadAlloc;
}
}
return Success;
}
/***====================================================================***/
Status
XkbCopyKeyType(XkbKeyTypePtr from,XkbKeyTypePtr into)
{
if ((!from)||(!into))
return BadMatch;
if (into->map) {
_XkbFree(into->map);
into->map= NULL;
}
if (into->preserve) {
_XkbFree(into->preserve);
into->preserve= NULL;
}
if (into->level_names) {
_XkbFree(into->level_names);
into->level_names= NULL;
}
*into= *from;
if ((from->map)&&(into->map_count>0)) {
into->map= _XkbTypedCalloc(into->map_count,XkbKTMapEntryRec);
if (!into->map)
return BadAlloc;
memcpy(into->map,from->map,into->map_count*sizeof(XkbKTMapEntryRec));
}
if ((from->preserve)&&(into->map_count>0)) {
into->preserve= _XkbTypedCalloc(into->map_count,XkbModsRec);
if (!into->preserve)
return BadAlloc;
memcpy(into->preserve,from->preserve,
into->map_count*sizeof(XkbModsRec));
}
if ((from->level_names)&&(into->num_levels>0)) {
into->level_names= _XkbTypedCalloc(into->num_levels,Atom);
if (!into->level_names)
return BadAlloc;
memcpy(into->level_names,from->level_names,
into->num_levels*sizeof(Atom));
}
return Success;
}
Status
XkbCopyKeyTypes(XkbKeyTypePtr from,XkbKeyTypePtr into,int num_types)
{
register int i,rtrn;
if ((!from)||(!into)||(num_types<0))
return BadMatch;
for (i=0;i<num_types;i++) {
if ((rtrn= XkbCopyKeyType(from++,into++))!=Success)
return rtrn;
}
return Success;
}
XkbKeyTypePtr
XkbAddKeyType( XkbDescPtr xkb,
Atom name,
int map_count,
Bool want_preserve,
int num_lvls)
{
register int i;
unsigned tmp;
XkbKeyTypePtr type;
XkbClientMapPtr map;
if ((!xkb)||(num_lvls<1))
return NULL;
map= xkb->map;
if ((map)&&(map->types)) {
for (i=0;i<map->num_types;i++) {
if (map->types[i].name==name) {
Status status;
status=XkbResizeKeyType(xkb,i,map_count,want_preserve,num_lvls);
return (status==Success?&map->types[i]:NULL);
}
}
}
if ((!map)||(!map->types)||(!map->num_types<XkbNumRequiredTypes)) {
tmp= XkbNumRequiredTypes+1;
if (XkbAllocClientMap(xkb,XkbKeyTypesMask,tmp)!=Success)
return NULL;
tmp= 0;
if (map->num_types<=XkbKeypadIndex)
tmp|= XkbKeypadMask;
if (map->num_types<=XkbAlphabeticIndex)
tmp|= XkbAlphabeticMask;
if (map->num_types<=XkbTwoLevelIndex)
tmp|= XkbTwoLevelMask;
if (map->num_types<=XkbOneLevelIndex)
tmp|= XkbOneLevelMask;
if (XkbInitCanonicalKeyTypes(xkb,tmp,XkbNoModifier)==Success) {
for (i=0;i<map->num_types;i++) {
Status status;
if (map->types[i].name!=name)
continue;
status=XkbResizeKeyType(xkb,i,map_count,want_preserve,num_lvls);
return (status==Success?&map->types[i]:NULL);
}
}
}
if ((map->num_types<=map->size_types)&&
(XkbAllocClientMap(xkb,XkbKeyTypesMask,map->num_types+1)!=Success)) {
return NULL;
}
type= &map->types[map->num_types];
map->num_types++;
bzero((char *)type,sizeof(XkbKeyTypeRec));
type->num_levels= num_lvls;
type->map_count= map_count;
type->name= name;
if (map_count>0) {
type->map= _XkbTypedCalloc(map_count,XkbKTMapEntryRec);
if (!type->map) {
map->num_types--;
return NULL;
}
if (want_preserve) {
type->preserve= _XkbTypedCalloc(map_count,XkbModsRec);
if (!type->preserve) {
_XkbFree(type->map);
map->num_types--;
return NULL;
}
}
}
return type;
}
Status
XkbResizeKeyType( XkbDescPtr xkb,
int type_ndx,
int map_count,
Bool want_preserve,
int new_num_lvls)
{
XkbKeyTypePtr type;
KeyCode matchingKeys[XkbMaxKeyCount],nMatchingKeys;
if ((type_ndx<0)||(type_ndx>=xkb->map->num_types)||(map_count<0)||
(new_num_lvls<1))
return BadValue;
switch (type_ndx) {
case XkbOneLevelIndex:
if (new_num_lvls!=1)
return BadMatch;
break;
case XkbTwoLevelIndex:
case XkbAlphabeticIndex:
case XkbKeypadIndex:
if (new_num_lvls!=2)
return BadMatch;
break;
}
type= &xkb->map->types[type_ndx];
if (map_count==0) {
if (type->map!=NULL)
_XkbFree(type->map);
type->map= NULL;
if (type->preserve!=NULL)
_XkbFree(type->preserve);
type->preserve= NULL;
type->map_count= 0;
}
else {
XkbKTMapEntryRec *prev_map = type->map;
if ((map_count>type->map_count)||(type->map==NULL))
type->map=_XkbTypedRealloc(type->map,map_count,XkbKTMapEntryRec);
if (!type->map) {
if (prev_map)
_XkbFree(prev_map);
return BadAlloc;
}
if (want_preserve) {
XkbModsRec *prev_preserve = type->preserve;
if ((map_count>type->map_count)||(type->preserve==NULL)) {
type->preserve= _XkbTypedRealloc(type->preserve,map_count,
XkbModsRec);
}
if (!type->preserve) {
if (prev_preserve)
_XkbFree(prev_preserve);
return BadAlloc;
}
}
else if (type->preserve!=NULL) {
_XkbFree(type->preserve);
type->preserve= NULL;
}
type->map_count= map_count;
}
if ((new_num_lvls>type->num_levels)||(type->level_names==NULL)) {
Atom * prev_level_names = type->level_names;
type->level_names=_XkbTypedRealloc(type->level_names,new_num_lvls,Atom);
if (!type->level_names) {
if (prev_level_names)
_XkbFree(prev_level_names);
return BadAlloc;
}
}
/*
* Here's the theory:
* If the width of the type changed, we might have to resize the symbol
* maps for any keys that use the type for one or more groups. This is
* expensive, so we'll try to cull out any keys that are obviously okay:
* In any case:
* - keys that have a group width <= the old width are okay (because
* they could not possibly have been associated with the old type)
* If the key type increased in size:
* - keys that already have a group width >= to the new width are okay
* + keys that have a group width >= the old width but < the new width
* might have to be enlarged.
* If the key type decreased in size:
* - keys that have a group width > the old width don't have to be
* resized (because they must have some other wider type associated
* with some group).
* + keys that have a group width == the old width might have to be
* shrunk.
* The possibilities marked with '+' require us to examine the key types
* associated with each group for the key.
*/
bzero(matchingKeys,XkbMaxKeyCount*sizeof(KeyCode));
nMatchingKeys= 0;
if (new_num_lvls>type->num_levels) {
int nTotal;
KeySym * newSyms;
int width,match,nResize;
register int i,g,nSyms;
nResize= 0;
for (nTotal=1,i=xkb->min_key_code;i<=xkb->max_key_code;i++) {
width= XkbKeyGroupsWidth(xkb,i);
if (width<type->num_levels)
continue;
for (match=0,g=XkbKeyNumGroups(xkb,i)-1;(g>=0)&&(!match);g--) {
if (XkbKeyKeyTypeIndex(xkb,i,g)==type_ndx) {
matchingKeys[nMatchingKeys++]= i;
match= 1;
}
}
if ((!match)||(width>=new_num_lvls))
nTotal+= XkbKeyNumSyms(xkb,i);
else {
nTotal+= XkbKeyNumGroups(xkb,i)*new_num_lvls;
nResize++;
}
}
if (nResize>0) {
int nextMatch;
xkb->map->size_syms= (nTotal*12)/10;
newSyms = _XkbTypedCalloc(xkb->map->size_syms,KeySym);
if (newSyms==NULL)
return BadAlloc;
nextMatch= 0;
nSyms= 1;
for (i=xkb->min_key_code;i<=xkb->max_key_code;i++) {
if (matchingKeys[nextMatch]==i) {
KeySym *pOld;
nextMatch++;
width= XkbKeyGroupsWidth(xkb,i);
pOld= XkbKeySymsPtr(xkb,i);
for (g=XkbKeyNumGroups(xkb,i)-1;g>=0;g--) {
memcpy(&newSyms[nSyms+(new_num_lvls*g)],&pOld[width*g],
width*sizeof(KeySym));
}
xkb->map->key_sym_map[i].offset= nSyms;
nSyms+= XkbKeyNumGroups(xkb,i)*new_num_lvls;
}
else {
memcpy(&newSyms[nSyms],XkbKeySymsPtr(xkb,i),
XkbKeyNumSyms(xkb,i)*sizeof(KeySym));
xkb->map->key_sym_map[i].offset= nSyms;
nSyms+= XkbKeyNumSyms(xkb,i);
}
}
type->num_levels= new_num_lvls;
_XkbFree(xkb->map->syms);
xkb->map->syms= newSyms;
xkb->map->num_syms= nSyms;
return Success;
}
}
else if (new_num_lvls<type->num_levels) {
int width,match;
register int g,i;
for (i=xkb->min_key_code;i<=xkb->max_key_code;i++) {
width= XkbKeyGroupsWidth(xkb,i);
if (width<type->num_levels)
continue;
for (match=0,g=XkbKeyNumGroups(xkb,i)-1;(g>=0)&&(!match);g--) {
if (XkbKeyKeyTypeIndex(xkb,i,g)==type_ndx) {
matchingKeys[nMatchingKeys++]= i;
match= 1;
}
}
}
}
if (nMatchingKeys>0) {
int key,firstClear;
register int i,g;
if (new_num_lvls>type->num_levels)
firstClear= type->num_levels;
else firstClear= new_num_lvls;
for (i=0;i<nMatchingKeys;i++) {
KeySym * pSyms;
int width,nClear;
key= matchingKeys[i];
width= XkbKeyGroupsWidth(xkb,key);
nClear= width-firstClear;
pSyms= XkbKeySymsPtr(xkb,key);
for (g=XkbKeyNumGroups(xkb,key)-1;g>=0;g--) {
if (XkbKeyKeyTypeIndex(xkb,key,g)==type_ndx) {
if (nClear>0)
bzero(&pSyms[g*width+firstClear],nClear*sizeof(KeySym));
}
}
}
}
type->num_levels= new_num_lvls;
return Success;
}
KeySym *
XkbResizeKeySyms(XkbDescPtr xkb,int key,int needed)
{
register int i,nSyms,nKeySyms;
unsigned nOldSyms;
KeySym *newSyms;
if (needed==0) {
xkb->map->key_sym_map[key].offset= 0;
return xkb->map->syms;
}
nOldSyms= XkbKeyNumSyms(xkb,key);
if (nOldSyms>=(unsigned)needed) {
return XkbKeySymsPtr(xkb,key);
}
if (xkb->map->size_syms-xkb->map->num_syms>=(unsigned)needed) {
if (nOldSyms>0) {
memcpy(&xkb->map->syms[xkb->map->num_syms],XkbKeySymsPtr(xkb,key),
nOldSyms*sizeof(KeySym));
}
if ((needed-nOldSyms)>0) {
bzero(&xkb->map->syms[xkb->map->num_syms+XkbKeyNumSyms(xkb,key)],
(needed-nOldSyms)*sizeof(KeySym));
}
xkb->map->key_sym_map[key].offset = xkb->map->num_syms;
xkb->map->num_syms+= needed;
return &xkb->map->syms[xkb->map->key_sym_map[key].offset];
}
xkb->map->size_syms+= (needed>32?needed:32);
newSyms = _XkbTypedCalloc(xkb->map->size_syms,KeySym);
if (newSyms==NULL)
return NULL;
newSyms[0]= NoSymbol;
nSyms = 1;
for (i=xkb->min_key_code;i<=(int)xkb->max_key_code;i++) {
int nCopy;
nCopy= nKeySyms= XkbKeyNumSyms(xkb,i);
if ((nKeySyms==0)&&(i!=key))
continue;
if (i==key)
nKeySyms= needed;
if (nCopy!=0)
memcpy(&newSyms[nSyms],XkbKeySymsPtr(xkb,i),nCopy*sizeof(KeySym));
if (nKeySyms>nCopy)
bzero(&newSyms[nSyms+nCopy],(nKeySyms-nCopy)*sizeof(KeySym));
xkb->map->key_sym_map[i].offset = nSyms;
nSyms+= nKeySyms;
}
_XkbFree(xkb->map->syms);
xkb->map->syms = newSyms;
xkb->map->num_syms = nSyms;
return &xkb->map->syms[xkb->map->key_sym_map[key].offset];
}
static unsigned
_ExtendRange( unsigned int old_flags,
unsigned int flag,
KeyCode newKC,
KeyCode * old_min,
unsigned char * old_num)
{
if ((old_flags&flag)==0) {
old_flags|= flag;
*old_min= newKC;
*old_num= 1;
}
else {
int last= (*old_min)+(*old_num)-1;
if (newKC<*old_min) {
*old_min= newKC;
*old_num= (last-newKC)+1;
}
else if (newKC>last) {
*old_num= (newKC-(*old_min))+1;
}
}
return old_flags;
}
Status
XkbChangeKeycodeRange( XkbDescPtr xkb,
int minKC,
int maxKC,
XkbChangesPtr changes)
{
int tmp;
if ((!xkb)||(minKC<XkbMinLegalKeyCode)||(maxKC>XkbMaxLegalKeyCode))
return BadValue;
if (minKC>maxKC)
return BadMatch;
if (minKC<xkb->min_key_code) {
if (changes)
changes->map.min_key_code= minKC;
tmp= xkb->min_key_code-minKC;
if (xkb->map) {
if (xkb->map->key_sym_map) {
bzero((char *)&xkb->map->key_sym_map[minKC],
tmp*sizeof(XkbSymMapRec));
if (changes) {
changes->map.changed= _ExtendRange(changes->map.changed,
XkbKeySymsMask,minKC,
&changes->map.first_key_sym,
&changes->map.num_key_syms);
}
}
if (xkb->map->modmap) {
bzero((char *)&xkb->map->modmap[minKC],tmp);
if (changes) {
changes->map.changed= _ExtendRange(changes->map.changed,
XkbModifierMapMask,minKC,
&changes->map.first_modmap_key,
&changes->map.num_modmap_keys);
}
}
}
if (xkb->server) {
if (xkb->server->behaviors) {
bzero((char *)&xkb->server->behaviors[minKC],
tmp*sizeof(XkbBehavior));
if (changes) {
changes->map.changed= _ExtendRange(changes->map.changed,
XkbKeyBehaviorsMask,minKC,
&changes->map.first_key_behavior,
&changes->map.num_key_behaviors);
}
}
if (xkb->server->key_acts) {
bzero((char *)&xkb->server->key_acts[minKC],
tmp*sizeof(unsigned short));
if (changes) {
changes->map.changed= _ExtendRange(changes->map.changed,
XkbKeyActionsMask,minKC,
&changes->map.first_key_act,
&changes->map.num_key_acts);
}
}
if (xkb->server->vmodmap) {
bzero((char *)&xkb->server->vmodmap[minKC],
tmp*sizeof(unsigned short));
if (changes) {
changes->map.changed= _ExtendRange(changes->map.changed,
XkbVirtualModMapMask,minKC,
&changes->map.first_modmap_key,
&changes->map.num_vmodmap_keys);
}
}
}
if ((xkb->names)&&(xkb->names->keys)) {
bzero((char *)&xkb->names->keys[minKC],tmp*sizeof(XkbKeyNameRec));
if (changes) {
changes->names.changed= _ExtendRange(changes->names.changed,
XkbKeyNamesMask,minKC,
&changes->names.first_key,
&changes->names.num_keys);
}
}
xkb->min_key_code= minKC;
}
if (maxKC>xkb->max_key_code) {
if (changes)
changes->map.max_key_code= maxKC;
tmp= maxKC-xkb->max_key_code;
if (xkb->map) {
if (xkb->map->key_sym_map) {
XkbSymMapRec *prev_key_sym_map = xkb->map->key_sym_map;
xkb->map->key_sym_map= _XkbTypedRealloc(xkb->map->key_sym_map,
(maxKC+1),XkbSymMapRec);
if (!xkb->map->key_sym_map) {
_XkbFree(prev_key_sym_map);
return BadAlloc;
}
bzero((char *)&xkb->map->key_sym_map[xkb->max_key_code],
tmp*sizeof(XkbSymMapRec));
if (changes) {
changes->map.changed= _ExtendRange(changes->map.changed,
XkbKeySymsMask,maxKC,
&changes->map.first_key_sym,
&changes->map.num_key_syms);
}
}
if (xkb->map->modmap) {
unsigned char *prev_modmap = xkb->map->modmap;
xkb->map->modmap= _XkbTypedRealloc(xkb->map->modmap,
(maxKC+1),unsigned char);
if (!xkb->map->modmap) {
_XkbFree(prev_modmap);
return BadAlloc;
}
bzero((char *)&xkb->map->modmap[xkb->max_key_code],tmp);
if (changes) {
changes->map.changed= _ExtendRange(changes->map.changed,
XkbModifierMapMask,maxKC,
&changes->map.first_modmap_key,
&changes->map.num_modmap_keys);
}
}
}
if (xkb->server) {
if (xkb->server->behaviors) {
XkbBehavior *prev_behaviors = xkb->server->behaviors;
xkb->server->behaviors=_XkbTypedRealloc(xkb->server->behaviors,
(maxKC+1),XkbBehavior);
if (!xkb->server->behaviors) {
_XkbFree(prev_behaviors);
return BadAlloc;
}
bzero((char *)&xkb->server->behaviors[xkb->max_key_code],
tmp*sizeof(XkbBehavior));
if (changes) {
changes->map.changed= _ExtendRange(changes->map.changed,
XkbKeyBehaviorsMask,maxKC,
&changes->map.first_key_behavior,
&changes->map.num_key_behaviors);
}
}
if (xkb->server->key_acts) {
unsigned short *prev_key_acts = xkb->server->key_acts;
xkb->server->key_acts= _XkbTypedRealloc(xkb->server->key_acts,
(maxKC+1),unsigned short);
if (!xkb->server->key_acts) {
_XkbFree(prev_key_acts);
return BadAlloc;
}
bzero((char *)&xkb->server->key_acts[xkb->max_key_code],
tmp*sizeof(unsigned short));
if (changes) {
changes->map.changed= _ExtendRange(changes->map.changed,
XkbKeyActionsMask,maxKC,
&changes->map.first_key_act,
&changes->map.num_key_acts);
}
}
if (xkb->server->vmodmap) {
unsigned short *prev_vmodmap = xkb->server->vmodmap;
xkb->server->vmodmap= _XkbTypedRealloc(xkb->server->vmodmap,
(maxKC+1),unsigned short);
if (!xkb->server->vmodmap) {
_XkbFree(prev_vmodmap);
return BadAlloc;
}
bzero((char *)&xkb->server->vmodmap[xkb->max_key_code],
tmp*sizeof(unsigned short));
if (changes) {
changes->map.changed= _ExtendRange(changes->map.changed,
XkbVirtualModMapMask,maxKC,
&changes->map.first_modmap_key,
&changes->map.num_vmodmap_keys);
}
}
}
if ((xkb->names)&&(xkb->names->keys)) {
XkbKeyNameRec *prev_keys = xkb->names->keys;
xkb->names->keys= _XkbTypedRealloc(xkb->names->keys,
(maxKC+1),XkbKeyNameRec);
if (!xkb->names->keys) {
_XkbFree(prev_keys);
return BadAlloc;
}
bzero((char *)&xkb->names->keys[xkb->max_key_code],
tmp*sizeof(XkbKeyNameRec));
if (changes) {
changes->names.changed= _ExtendRange(changes->names.changed,
XkbKeyNamesMask,maxKC,
&changes->names.first_key,
&changes->names.num_keys);
}
}
xkb->max_key_code= maxKC;
}
return Success;
}
XkbAction *
XkbResizeKeyActions(XkbDescPtr xkb,int key,int needed)
{
register int i,nActs;
XkbAction *newActs;
if (needed==0) {
xkb->server->key_acts[key]= 0;
return NULL;
}
if (XkbKeyHasActions(xkb,key)&&(XkbKeyNumSyms(xkb,key)>=(unsigned)needed))
return XkbKeyActionsPtr(xkb,key);
if (xkb->server->size_acts-xkb->server->num_acts>=(unsigned)needed) {
xkb->server->key_acts[key]= xkb->server->num_acts;
xkb->server->num_acts+= needed;
return &xkb->server->acts[xkb->server->key_acts[key]];
}
xkb->server->size_acts= xkb->server->num_acts+needed+8;
newActs = _XkbTypedCalloc(xkb->server->size_acts,XkbAction);
if (newActs==NULL)
return NULL;
newActs[0].type = XkbSA_NoAction;
nActs = 1;
for (i=xkb->min_key_code;i<=(int)xkb->max_key_code;i++) {
int nKeyActs,nCopy;
if ((xkb->server->key_acts[i]==0)&&(i!=key))
continue;
nCopy= nKeyActs= XkbKeyNumActions(xkb,i);
if (i==key) {
nKeyActs= needed;
if (needed<nCopy)
nCopy= needed;
}
if (nCopy>0)
memcpy(&newActs[nActs],XkbKeyActionsPtr(xkb,i),
nCopy*sizeof(XkbAction));
if (nCopy<nKeyActs)
bzero(&newActs[nActs+nCopy],(nKeyActs-nCopy)*sizeof(XkbAction));
xkb->server->key_acts[i]= nActs;
nActs+= nKeyActs;
}
_XkbFree(xkb->server->acts);
xkb->server->acts = newActs;
xkb->server->num_acts= nActs;
return &xkb->server->acts[xkb->server->key_acts[key]];
}
void
XkbFreeClientMap(XkbDescPtr xkb,unsigned what,Bool freeMap)
{
XkbClientMapPtr map;
if ((xkb==NULL)||(xkb->map==NULL))
return;
if (freeMap)
what= XkbAllClientInfoMask;
map= xkb->map;
if (what&XkbKeyTypesMask) {
if (map->types!=NULL) {
if (map->num_types>0) {
register int i;
XkbKeyTypePtr type;
for (i=0,type=map->types;i<map->num_types;i++,type++) {
if (type->map!=NULL) {
_XkbFree(type->map);
type->map= NULL;
}
if (type->preserve!=NULL) {
_XkbFree(type->preserve);
type->preserve= NULL;
}
type->map_count= 0;
if (type->level_names!=NULL) {
_XkbFree(type->level_names);
type->level_names= NULL;
}
}
}
_XkbFree(map->types);
map->num_types= map->size_types= 0;
map->types= NULL;
}
}
if (what&XkbKeySymsMask) {
if (map->key_sym_map!=NULL) {
_XkbFree(map->key_sym_map);
map->key_sym_map= NULL;
}
if (map->syms!=NULL) {
_XkbFree(map->syms);
map->size_syms= map->num_syms= 0;
map->syms= NULL;
}
}
if ((what&XkbModifierMapMask)&&(map->modmap!=NULL)) {
_XkbFree(map->modmap);
map->modmap= NULL;
}
if (freeMap) {
_XkbFree(xkb->map);
xkb->map= NULL;
}
return;
}
void
XkbFreeServerMap(XkbDescPtr xkb,unsigned what,Bool freeMap)
{
XkbServerMapPtr map;
if ((xkb==NULL)||(xkb->server==NULL))
return;
if (freeMap)
what= XkbAllServerInfoMask;
map= xkb->server;
if ((what&XkbExplicitComponentsMask)&&(map->explicit!=NULL)) {
_XkbFree(map->explicit);
map->explicit= NULL;
}
if (what&XkbKeyActionsMask) {
if (map->key_acts!=NULL) {
_XkbFree(map->key_acts);
map->key_acts= NULL;
}
if (map->acts!=NULL) {
_XkbFree(map->acts);
map->num_acts= map->size_acts= 0;
map->acts= NULL;
}
}
if ((what&XkbKeyBehaviorsMask)&&(map->behaviors!=NULL)) {
_XkbFree(map->behaviors);
map->behaviors= NULL;
}
if ((what&XkbVirtualModMapMask)&&(map->vmodmap!=NULL)) {
_XkbFree(map->vmodmap);
map->vmodmap= NULL;
}
if (freeMap) {
_XkbFree(xkb->server);
xkb->server= NULL;
}
return;
}
nx-X11/programs/Xserver/randr.X.original/Imakefile
0 → 100644
View file @
15cee47a
XCOMM $XFree86: xc/programs/Xserver/randr/Imakefile,v 1.1 2001/05/23 03:29:44 keithp Exp $
#include <Server.tmpl>
SRCS = randr.c mirandr.c
OBJS = randr.o mirandr.o
INCLUDES = -I../include -I../mi -I../../../include/fonts \
-I../fb -I../hw/kdrive -I$(EXTINCSRC) -I$(XINCLUDESRC) \
-I$(FONTINCSRC) -I../render
LINTLIBS = ../dix/llib-ldix.ln ../os/llib-los.ln
NormalLibraryTarget(randr,$(OBJS))
NormalLibraryObjectRule()
LintLibraryTarget(randr,$(SRCS))
NormalLintTarget($(SRCS))
DependTarget()
nx-X11/programs/Xserver/randr.X.original/mirandr.c
0 → 100644
View file @
15cee47a
/*
* $XFree86: xc/programs/Xserver/randr/mirandr.c,v 1.5 2001/06/04 09:45:40 keithp Exp $
*
* Copyright © 2000, Compaq Computer Corporation,
* Copyright © 2002, Hewlett Packard, Inc.
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Compaq or HP not be used in advertising
* or publicity pertaining to distribution of the software without specific,
* written prior permission. HP makes no representations about the
* suitability of this software for any purpose. It is provided "as is"
* without express or implied warranty.
*
* HP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL HP
* BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
* Author: Jim Gettys, HP Labs, Hewlett-Packard, Inc.
*/
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#include "scrnintstr.h"
#include "mi.h"
#include <X11/extensions/randr.h>
#include "randrstr.h"
#include <stdio.h>
/*
* This function assumes that only a single depth can be
* displayed at a time, but that all visuals of that depth
* can be displayed simultaneously. It further assumes that
* only a single size is available. Hardware providing
* additional capabilties should use different code.
* XXX what to do here....
*/
Bool
miRRGetInfo
(
ScreenPtr
pScreen
,
Rotation
*
rotations
)
{
int
i
;
Bool
setConfig
=
FALSE
;
*
rotations
=
RR_Rotate_0
;
for
(
i
=
0
;
i
<
pScreen
->
numDepths
;
i
++
)
{
if
(
pScreen
->
allowedDepths
[
i
].
numVids
)
{
RRScreenSizePtr
pSize
;
pSize
=
RRRegisterSize
(
pScreen
,
pScreen
->
width
,
pScreen
->
height
,
pScreen
->
mmWidth
,
pScreen
->
mmHeight
);
if
(
!
pSize
)
return
FALSE
;
if
(
!
setConfig
)
{
RRSetCurrentConfig
(
pScreen
,
RR_Rotate_0
,
0
,
pSize
);
setConfig
=
TRUE
;
}
}
}
return
TRUE
;
}
/*
* Any hardware that can actually change anything will need something
* different here
*/
Bool
miRRSetConfig
(
ScreenPtr
pScreen
,
Rotation
rotation
,
int
rate
,
RRScreenSizePtr
pSize
)
{
return
TRUE
;
}
Bool
miRandRInit
(
ScreenPtr
pScreen
)
{
rrScrPrivPtr
rp
;
if
(
!
RRScreenInit
(
pScreen
))
return
FALSE
;
rp
=
rrGetScrPriv
(
pScreen
);
rp
->
rrGetInfo
=
miRRGetInfo
;
rp
->
rrSetConfig
=
miRRSetConfig
;
return
TRUE
;
}
nx-X11/programs/Xserver/randr.X.original/randr.c
0 → 100644
View file @
15cee47a
/*
* $XFree86: xc/programs/Xserver/randr/randr.c,v 1.21tsi Exp $
*
* Copyright © 2000, Compaq Computer Corporation,
* Copyright © 2002, Hewlett Packard, Inc.
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Compaq or HP not be used in advertising
* or publicity pertaining to distribution of the software without specific,
* written prior permission. HP makes no representations about the
* suitability of this software for any purpose. It is provided "as is"
* without express or implied warranty.
*
* HP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL HP
* BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
* Author: Jim Gettys, HP Labs, Hewlett-Packard, Inc.
*/
#define NEED_REPLIES
#define NEED_EVENTS
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#include <X11/X.h>
#include <X11/Xproto.h>
#include "misc.h"
#include "os.h"
#include "dixstruct.h"
#include "resource.h"
#include "scrnintstr.h"
#include "windowstr.h"
#include "pixmapstr.h"
#include "extnsionst.h"
#include "servermd.h"
#include <X11/extensions/randr.h>
#include <X11/extensions/randrproto.h>
#include "randrstr.h"
#ifdef RENDER
#include <X11/extensions/render.h>
/* we share subpixel order information */
#include "picturestr.h"
#endif
#include <X11/Xfuncproto.h>
#ifdef EXTMODULE
#include "xf86_ansic.h"
#endif
/* From render.h */
#ifndef SubPixelUnknown
#define SubPixelUnknown 0
#endif
#define RR_VALIDATE
int
RRGeneration
;
int
RRNScreens
;
static
int
ProcRRQueryVersion
(
ClientPtr
pClient
);
static
int
ProcRRDispatch
(
ClientPtr
pClient
);
static
int
SProcRRDispatch
(
ClientPtr
pClient
);
static
int
SProcRRQueryVersion
(
ClientPtr
pClient
);
#define wrap(priv,real,mem,func) {\
priv->mem = real->mem; \
real->mem = func; \
}
#define unwrap(priv,real,mem) {\
real->mem = priv->mem; \
}
#if 0
static CARD8 RRReqCode;
static int RRErrBase;
#endif
static
int
RREventBase
;
static
RESTYPE
ClientType
,
EventType
;
/* resource types for event masks */
static
int
RRClientPrivateIndex
;
typedef
struct
_RRTimes
{
TimeStamp
setTime
;
TimeStamp
configTime
;
}
RRTimesRec
,
*
RRTimesPtr
;
typedef
struct
_RRClient
{
int
major_version
;
int
minor_version
;
/* RRTimesRec times[0]; */
}
RRClientRec
,
*
RRClientPtr
;
/*
* each window has a list of clients requesting
* RRNotify events. Each client has a resource
* for each window it selects RRNotify input for,
* this resource is used to delete the RRNotifyRec
* entry from the per-window queue.
*/
typedef
struct
_RREvent
*
RREventPtr
;
typedef
struct
_RREvent
{
RREventPtr
next
;
ClientPtr
client
;
WindowPtr
window
;
XID
clientResource
;
int
mask
;
}
RREventRec
;
int
rrPrivIndex
=
-
1
;
#define GetRRClient(pClient) ((RRClientPtr) (pClient)->devPrivates[RRClientPrivateIndex].ptr)
#define rrClientPriv(pClient) RRClientPtr pRRClient = GetRRClient(pClient)
static
Bool
RRClientKnowsRates
(
ClientPtr
pClient
)
{
rrClientPriv
(
pClient
);
return
(
pRRClient
->
major_version
>
1
||
(
pRRClient
->
major_version
==
1
&&
pRRClient
->
minor_version
>=
1
));
}
static
void
RRClientCallback
(
CallbackListPtr
*
list
,
pointer
closure
,
pointer
data
)
{
NewClientInfoRec
*
clientinfo
=
(
NewClientInfoRec
*
)
data
;
ClientPtr
pClient
=
clientinfo
->
client
;
rrClientPriv
(
pClient
);
RRTimesPtr
pTimes
=
(
RRTimesPtr
)
(
pRRClient
+
1
);
int
i
;
pRRClient
->
major_version
=
0
;
pRRClient
->
minor_version
=
0
;
for
(
i
=
0
;
i
<
screenInfo
.
numScreens
;
i
++
)
{
ScreenPtr
pScreen
=
screenInfo
.
screens
[
i
];
rrScrPriv
(
pScreen
);
if
(
pScrPriv
)
{
pTimes
[
i
].
setTime
=
pScrPriv
->
lastSetTime
;
pTimes
[
i
].
configTime
=
pScrPriv
->
lastConfigTime
;
}
}
}
static
void
RRResetProc
(
ExtensionEntry
*
extEntry
)
{
}
static
Bool
RRCloseScreen
(
int
i
,
ScreenPtr
pScreen
)
{
rrScrPriv
(
pScreen
);
unwrap
(
pScrPriv
,
pScreen
,
CloseScreen
);
if
(
pScrPriv
->
pSizes
)
xfree
(
pScrPriv
->
pSizes
);
xfree
(
pScrPriv
);
RRNScreens
-=
1
;
/* ok, one fewer screen with RandR running */
return
(
*
pScreen
->
CloseScreen
)
(
i
,
pScreen
);
}
static
void
SRRScreenChangeNotifyEvent
(
xRRScreenChangeNotifyEvent
*
from
,
xRRScreenChangeNotifyEvent
*
to
)
{
to
->
type
=
from
->
type
;
to
->
rotation
=
from
->
rotation
;
cpswaps
(
from
->
sequenceNumber
,
to
->
sequenceNumber
);
cpswapl
(
from
->
timestamp
,
to
->
timestamp
);
cpswapl
(
from
->
configTimestamp
,
to
->
configTimestamp
);
cpswapl
(
from
->
root
,
to
->
root
);
cpswapl
(
from
->
window
,
to
->
window
);
cpswaps
(
from
->
sizeID
,
to
->
sizeID
);
cpswaps
(
from
->
widthInPixels
,
to
->
widthInPixels
);
cpswaps
(
from
->
heightInPixels
,
to
->
heightInPixels
);
cpswaps
(
from
->
widthInMillimeters
,
to
->
widthInMillimeters
);
cpswaps
(
from
->
heightInMillimeters
,
to
->
heightInMillimeters
);
cpswaps
(
from
->
subpixelOrder
,
to
->
subpixelOrder
);
}
Bool
RRScreenInit
(
ScreenPtr
pScreen
)
{
rrScrPrivPtr
pScrPriv
;
if
(
RRGeneration
!=
serverGeneration
)
{
if
((
rrPrivIndex
=
AllocateScreenPrivateIndex
())
<
0
)
return
FALSE
;
RRGeneration
=
serverGeneration
;
}
pScrPriv
=
(
rrScrPrivPtr
)
xalloc
(
sizeof
(
rrScrPrivRec
));
if
(
!
pScrPriv
)
return
FALSE
;
SetRRScreen
(
pScreen
,
pScrPriv
);
/*
* Calling function best set these function vectors
*/
pScrPriv
->
rrSetConfig
=
0
;
pScrPriv
->
rrGetInfo
=
0
;
/*
* This value doesn't really matter -- any client must call
* GetScreenInfo before reading it which will automatically update
* the time
*/
pScrPriv
->
lastSetTime
=
currentTime
;
pScrPriv
->
lastConfigTime
=
currentTime
;
wrap
(
pScrPriv
,
pScreen
,
CloseScreen
,
RRCloseScreen
);
pScrPriv
->
rotations
=
RR_Rotate_0
;
pScrPriv
->
nSizes
=
0
;
pScrPriv
->
nSizesInUse
=
0
;
pScrPriv
->
pSizes
=
0
;
pScrPriv
->
rotation
=
RR_Rotate_0
;
pScrPriv
->
size
=
-
1
;
RRNScreens
+=
1
;
/* keep count of screens that implement randr */
return
TRUE
;
}
/*ARGSUSED*/
static
int
RRFreeClient
(
pointer
data
,
XID
id
)
{
RREventPtr
pRREvent
;
WindowPtr
pWin
;
RREventPtr
*
pHead
,
pCur
,
pPrev
;
pRREvent
=
(
RREventPtr
)
data
;
pWin
=
pRREvent
->
window
;
pHead
=
(
RREventPtr
*
)
LookupIDByType
(
pWin
->
drawable
.
id
,
EventType
);
if
(
pHead
)
{
pPrev
=
0
;
for
(
pCur
=
*
pHead
;
pCur
&&
pCur
!=
pRREvent
;
pCur
=
pCur
->
next
)
pPrev
=
pCur
;
if
(
pCur
)
{
if
(
pPrev
)
pPrev
->
next
=
pRREvent
->
next
;
else
*
pHead
=
pRREvent
->
next
;
}
}
xfree
((
pointer
)
pRREvent
);
return
1
;
}
/*ARGSUSED*/
static
int
RRFreeEvents
(
pointer
data
,
XID
id
)
{
RREventPtr
*
pHead
,
pCur
,
pNext
;
pHead
=
(
RREventPtr
*
)
data
;
for
(
pCur
=
*
pHead
;
pCur
;
pCur
=
pNext
)
{
pNext
=
pCur
->
next
;
FreeResource
(
pCur
->
clientResource
,
ClientType
);
xfree
((
pointer
)
pCur
);
}
xfree
((
pointer
)
pHead
);
return
1
;
}
void
RRExtensionInit
(
void
)
{
ExtensionEntry
*
extEntry
;
if
(
RRNScreens
==
0
)
return
;
RRClientPrivateIndex
=
AllocateClientPrivateIndex
();
if
(
!
AllocateClientPrivate
(
RRClientPrivateIndex
,
sizeof
(
RRClientRec
)
+
screenInfo
.
numScreens
*
sizeof
(
RRTimesRec
)))
return
;
if
(
!
AddCallback
(
&
ClientStateCallback
,
RRClientCallback
,
0
))
return
;
ClientType
=
CreateNewResourceType
(
RRFreeClient
);
if
(
!
ClientType
)
return
;
EventType
=
CreateNewResourceType
(
RRFreeEvents
);
if
(
!
EventType
)
return
;
extEntry
=
AddExtension
(
RANDR_NAME
,
RRNumberEvents
,
RRNumberErrors
,
ProcRRDispatch
,
SProcRRDispatch
,
RRResetProc
,
StandardMinorOpcode
);
if
(
!
extEntry
)
return
;
#if 0
RRReqCode = (CARD8) extEntry->base;
RRErrBase = extEntry->errorBase;
#endif
RREventBase
=
extEntry
->
eventBase
;
EventSwapVector
[
RREventBase
+
RRScreenChangeNotify
]
=
(
EventSwapPtr
)
SRRScreenChangeNotifyEvent
;
return
;
}
static
int
TellChanged
(
WindowPtr
pWin
,
pointer
value
)
{
RREventPtr
*
pHead
,
pRREvent
;
ClientPtr
client
;
xRRScreenChangeNotifyEvent
se
;
ScreenPtr
pScreen
=
pWin
->
drawable
.
pScreen
;
rrScrPriv
(
pScreen
);
RRScreenSizePtr
pSize
;
WindowPtr
pRoot
=
WindowTable
[
pScreen
->
myNum
];
pHead
=
(
RREventPtr
*
)
LookupIDByType
(
pWin
->
drawable
.
id
,
EventType
);
if
(
!
pHead
)
return
WT_WALKCHILDREN
;
se
.
type
=
RRScreenChangeNotify
+
RREventBase
;
se
.
rotation
=
(
CARD8
)
pScrPriv
->
rotation
;
se
.
timestamp
=
pScrPriv
->
lastSetTime
.
milliseconds
;
se
.
configTimestamp
=
pScrPriv
->
lastConfigTime
.
milliseconds
;
se
.
root
=
pRoot
->
drawable
.
id
;
se
.
window
=
pWin
->
drawable
.
id
;
#ifdef RENDER
se
.
subpixelOrder
=
PictureGetSubpixelOrder
(
pScreen
);
#else
se
.
subpixelOrder
=
SubPixelUnknown
;
#endif
if
(
pScrPriv
->
size
>=
0
)
{
pSize
=
&
pScrPriv
->
pSizes
[
pScrPriv
->
size
];
se
.
sizeID
=
pSize
->
id
;
se
.
widthInPixels
=
pSize
->
width
;
se
.
heightInPixels
=
pSize
->
height
;
se
.
widthInMillimeters
=
pSize
->
mmWidth
;
se
.
heightInMillimeters
=
pSize
->
mmHeight
;
}
else
{
/*
* This "shouldn't happen", but a broken DDX can
* forget to set the current configuration on GetInfo
*/
se
.
sizeID
=
0xffff
;
se
.
widthInPixels
=
0
;
se
.
heightInPixels
=
0
;
se
.
widthInMillimeters
=
0
;
se
.
heightInMillimeters
=
0
;
}
for
(
pRREvent
=
*
pHead
;
pRREvent
;
pRREvent
=
pRREvent
->
next
)
{
client
=
pRREvent
->
client
;
if
(
client
==
serverClient
||
client
->
clientGone
)
continue
;
se
.
sequenceNumber
=
client
->
sequence
;
if
(
pRREvent
->
mask
&
RRScreenChangeNotifyMask
)
WriteEventsToClient
(
client
,
1
,
(
xEvent
*
)
&
se
);
}
return
WT_WALKCHILDREN
;
}
static
Bool
RRGetInfo
(
ScreenPtr
pScreen
)
{
rrScrPriv
(
pScreen
);
int
i
,
j
,
k
,
l
;
Bool
changed
;
Rotation
rotations
;
RRScreenSizePtr
pSize
;
RRScreenRatePtr
pRate
;
for
(
i
=
0
;
i
<
pScrPriv
->
nSizes
;
i
++
)
{
pSize
=
&
pScrPriv
->
pSizes
[
i
];
pSize
->
oldReferenced
=
pSize
->
referenced
;
pSize
->
referenced
=
FALSE
;
for
(
k
=
0
;
k
<
pSize
->
nRates
;
k
++
)
{
pRate
=
&
pSize
->
pRates
[
k
];
pRate
->
oldReferenced
=
pRate
->
referenced
;
pRate
->
referenced
=
FALSE
;
}
}
if
(
!
(
*
pScrPriv
->
rrGetInfo
)
(
pScreen
,
&
rotations
))
return
FALSE
;
changed
=
FALSE
;
/*
* Check whether anything changed and simultaneously generate
* the protocol id values for the objects
*/
if
(
rotations
!=
pScrPriv
->
rotations
)
{
pScrPriv
->
rotations
=
rotations
;
changed
=
TRUE
;
}
j
=
0
;
for
(
i
=
0
;
i
<
pScrPriv
->
nSizes
;
i
++
)
{
pSize
=
&
pScrPriv
->
pSizes
[
i
];
if
(
pSize
->
oldReferenced
!=
pSize
->
referenced
)
changed
=
TRUE
;
if
(
pSize
->
referenced
)
pSize
->
id
=
j
++
;
l
=
0
;
for
(
k
=
0
;
k
<
pSize
->
nRates
;
k
++
)
{
pRate
=
&
pSize
->
pRates
[
k
];
if
(
pRate
->
oldReferenced
!=
pRate
->
referenced
)
changed
=
TRUE
;
if
(
pRate
->
referenced
)
l
++
;
}
pSize
->
nRatesInUse
=
l
;
}
pScrPriv
->
nSizesInUse
=
j
;
if
(
changed
)
{
UpdateCurrentTime
();
pScrPriv
->
lastConfigTime
=
currentTime
;
WalkTree
(
pScreen
,
TellChanged
,
(
pointer
)
pScreen
);
}
return
TRUE
;
}
static
void
RRSendConfigNotify
(
ScreenPtr
pScreen
)
{
WindowPtr
pWin
=
WindowTable
[
pScreen
->
myNum
];
xEvent
event
;
event
.
u
.
u
.
type
=
ConfigureNotify
;
event
.
u
.
configureNotify
.
window
=
pWin
->
drawable
.
id
;
event
.
u
.
configureNotify
.
aboveSibling
=
None
;
event
.
u
.
configureNotify
.
x
=
0
;
event
.
u
.
configureNotify
.
y
=
0
;
/* XXX xinerama stuff ? */
event
.
u
.
configureNotify
.
width
=
pWin
->
drawable
.
width
;
event
.
u
.
configureNotify
.
height
=
pWin
->
drawable
.
height
;
event
.
u
.
configureNotify
.
borderWidth
=
wBorderWidth
(
pWin
);
event
.
u
.
configureNotify
.
override
=
pWin
->
overrideRedirect
;
DeliverEvents
(
pWin
,
&
event
,
1
,
NullWindow
);
}
static
int
ProcRRQueryVersion
(
ClientPtr
client
)
{
xRRQueryVersionReply
rep
;
register
int
n
;
REQUEST
(
xRRQueryVersionReq
);
rrClientPriv
(
client
);
REQUEST_SIZE_MATCH
(
xRRQueryVersionReq
);
pRRClient
->
major_version
=
stuff
->
majorVersion
;
pRRClient
->
minor_version
=
stuff
->
minorVersion
;
rep
.
type
=
X_Reply
;
rep
.
length
=
0
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
majorVersion
=
RANDR_MAJOR
;
rep
.
minorVersion
=
RANDR_MINOR
;
if
(
client
->
swapped
)
{
swaps
(
&
rep
.
sequenceNumber
,
n
);
swapl
(
&
rep
.
length
,
n
);
swapl
(
&
rep
.
majorVersion
,
n
);
swapl
(
&
rep
.
minorVersion
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xRRQueryVersionReply
),
(
char
*
)
&
rep
);
return
(
client
->
noClientException
);
}
extern
char
*
ConnectionInfo
;
static
int
padlength
[
4
]
=
{
0
,
3
,
2
,
1
};
static
void
RREditConnectionInfo
(
ScreenPtr
pScreen
)
{
xConnSetup
*
connSetup
;
char
*
vendor
;
xPixmapFormat
*
formats
;
xWindowRoot
*
root
;
xDepth
*
depth
;
xVisualType
*
visual
;
int
screen
=
0
;
int
d
;
connSetup
=
(
xConnSetup
*
)
ConnectionInfo
;
vendor
=
(
char
*
)
connSetup
+
sizeof
(
xConnSetup
);
formats
=
(
xPixmapFormat
*
)
((
char
*
)
vendor
+
connSetup
->
nbytesVendor
+
padlength
[
connSetup
->
nbytesVendor
&
3
]);
root
=
(
xWindowRoot
*
)
((
char
*
)
formats
+
sizeof
(
xPixmapFormat
)
*
screenInfo
.
numPixmapFormats
);
while
(
screen
!=
pScreen
->
myNum
)
{
depth
=
(
xDepth
*
)
((
char
*
)
root
+
sizeof
(
xWindowRoot
));
for
(
d
=
0
;
d
<
root
->
nDepths
;
d
++
)
{
visual
=
(
xVisualType
*
)
((
char
*
)
depth
+
sizeof
(
xDepth
));
depth
=
(
xDepth
*
)
((
char
*
)
visual
+
depth
->
nVisuals
*
sizeof
(
xVisualType
));
}
root
=
(
xWindowRoot
*
)
((
char
*
)
depth
);
screen
++
;
}
root
->
pixWidth
=
pScreen
->
width
;
root
->
pixHeight
=
pScreen
->
height
;
root
->
mmWidth
=
pScreen
->
mmWidth
;
root
->
mmHeight
=
pScreen
->
mmHeight
;
}
static
int
ProcRRGetScreenInfo
(
ClientPtr
client
)
{
REQUEST
(
xRRGetScreenInfoReq
);
xRRGetScreenInfoReply
rep
;
WindowPtr
pWin
;
int
n
;
ScreenPtr
pScreen
;
rrScrPrivPtr
pScrPriv
;
CARD8
*
extra
;
unsigned
long
extraLen
;
REQUEST_SIZE_MATCH
(
xRRGetScreenInfoReq
);
pWin
=
(
WindowPtr
)
SecurityLookupWindow
(
stuff
->
window
,
client
,
SecurityReadAccess
);
if
(
!
pWin
)
return
BadWindow
;
pScreen
=
pWin
->
drawable
.
pScreen
;
pScrPriv
=
rrGetScrPriv
(
pScreen
);
rep
.
pad
=
0
;
if
(
!
pScrPriv
)
{
rep
.
type
=
X_Reply
;
rep
.
setOfRotations
=
RR_Rotate_0
;;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
length
=
0
;
rep
.
root
=
WindowTable
[
pWin
->
drawable
.
pScreen
->
myNum
]
->
drawable
.
id
;
rep
.
timestamp
=
currentTime
.
milliseconds
;
rep
.
configTimestamp
=
currentTime
.
milliseconds
;
rep
.
nSizes
=
0
;
rep
.
sizeID
=
0
;
rep
.
rotation
=
RR_Rotate_0
;
rep
.
rate
=
0
;
rep
.
nrateEnts
=
0
;
extra
=
0
;
extraLen
=
0
;
}
else
{
int
i
,
j
;
xScreenSizes
*
size
;
CARD16
*
rates
;
CARD8
*
data8
;
Bool
has_rate
=
RRClientKnowsRates
(
client
);
RRGetInfo
(
pScreen
);
rep
.
type
=
X_Reply
;
rep
.
setOfRotations
=
pScrPriv
->
rotations
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
length
=
0
;
rep
.
root
=
WindowTable
[
pWin
->
drawable
.
pScreen
->
myNum
]
->
drawable
.
id
;
rep
.
timestamp
=
pScrPriv
->
lastSetTime
.
milliseconds
;
rep
.
configTimestamp
=
pScrPriv
->
lastConfigTime
.
milliseconds
;
rep
.
rotation
=
pScrPriv
->
rotation
;
rep
.
nSizes
=
pScrPriv
->
nSizesInUse
;
rep
.
rate
=
pScrPriv
->
rate
;
rep
.
nrateEnts
=
0
;
if
(
has_rate
)
{
for
(
i
=
0
;
i
<
pScrPriv
->
nSizes
;
i
++
)
{
RRScreenSizePtr
pSize
=
&
pScrPriv
->
pSizes
[
i
];
if
(
pSize
->
referenced
)
{
rep
.
nrateEnts
+=
(
1
+
pSize
->
nRatesInUse
);
}
}
}
if
(
pScrPriv
->
size
>=
0
)
rep
.
sizeID
=
pScrPriv
->
pSizes
[
pScrPriv
->
size
].
id
;
else
return
BadImplementation
;
extraLen
=
(
rep
.
nSizes
*
sizeof
(
xScreenSizes
)
+
rep
.
nrateEnts
*
sizeof
(
CARD16
));
extra
=
(
CARD8
*
)
xalloc
(
extraLen
);
if
(
!
extra
)
return
BadAlloc
;
/*
* First comes the size information
*/
size
=
(
xScreenSizes
*
)
extra
;
rates
=
(
CARD16
*
)
(
size
+
rep
.
nSizes
);
for
(
i
=
0
;
i
<
pScrPriv
->
nSizes
;
i
++
)
{
RRScreenSizePtr
pSize
=
&
pScrPriv
->
pSizes
[
i
];
if
(
pSize
->
referenced
)
{
size
->
widthInPixels
=
pSize
->
width
;
size
->
heightInPixels
=
pSize
->
height
;
size
->
widthInMillimeters
=
pSize
->
mmWidth
;
size
->
heightInMillimeters
=
pSize
->
mmHeight
;
if
(
client
->
swapped
)
{
swaps
(
&
size
->
widthInPixels
,
n
);
swaps
(
&
size
->
heightInPixels
,
n
);
swaps
(
&
size
->
widthInMillimeters
,
n
);
swaps
(
&
size
->
heightInMillimeters
,
n
);
}
size
++
;
if
(
has_rate
)
{
*
rates
=
pSize
->
nRatesInUse
;
if
(
client
->
swapped
)
{
swaps
(
rates
,
n
);
}
rates
++
;
for
(
j
=
0
;
j
<
pSize
->
nRates
;
j
++
)
{
RRScreenRatePtr
pRate
=
&
pSize
->
pRates
[
j
];
if
(
pRate
->
referenced
)
{
*
rates
=
pRate
->
rate
;
if
(
client
->
swapped
)
{
swaps
(
rates
,
n
);
}
rates
++
;
}
}
}
}
}
data8
=
(
CARD8
*
)
rates
;
if
(
data8
-
(
CARD8
*
)
extra
!=
extraLen
)
FatalError
(
"RRGetScreenInfo bad extra len %ld != %ld
\n
"
,
(
unsigned
long
)(
data8
-
(
CARD8
*
)
extra
),
extraLen
);
rep
.
length
=
(
extraLen
+
3
)
>>
2
;
}
if
(
client
->
swapped
)
{
swaps
(
&
rep
.
sequenceNumber
,
n
);
swapl
(
&
rep
.
length
,
n
);
swapl
(
&
rep
.
timestamp
,
n
);
swaps
(
&
rep
.
rotation
,
n
);
swaps
(
&
rep
.
nSizes
,
n
);
swaps
(
&
rep
.
sizeID
,
n
);
swaps
(
&
rep
.
rate
,
n
);
swaps
(
&
rep
.
nrateEnts
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xRRGetScreenInfoReply
),
(
char
*
)
&
rep
);
if
(
extraLen
)
{
WriteToClient
(
client
,
extraLen
,
(
char
*
)
extra
);
xfree
(
extra
);
}
return
(
client
->
noClientException
);
}
static
int
ProcRRSetScreenConfig
(
ClientPtr
client
)
{
REQUEST
(
xRRSetScreenConfigReq
);
xRRSetScreenConfigReply
rep
;
DrawablePtr
pDraw
;
int
n
;
ScreenPtr
pScreen
;
rrScrPrivPtr
pScrPriv
;
TimeStamp
configTime
;
TimeStamp
time
;
RRScreenSizePtr
pSize
;
int
i
;
Rotation
rotation
;
int
rate
;
short
oldWidth
,
oldHeight
;
Bool
has_rate
;
UpdateCurrentTime
();
if
(
RRClientKnowsRates
(
client
))
{
REQUEST_SIZE_MATCH
(
xRRSetScreenConfigReq
);
has_rate
=
TRUE
;
}
else
{
REQUEST_SIZE_MATCH
(
xRR1_0SetScreenConfigReq
);
has_rate
=
FALSE
;
}
SECURITY_VERIFY_DRAWABLE
(
pDraw
,
stuff
->
drawable
,
client
,
SecurityWriteAccess
);
pScreen
=
pDraw
->
pScreen
;
pScrPriv
=
rrGetScrPriv
(
pScreen
);
time
=
ClientTimeToServerTime
(
stuff
->
timestamp
);
configTime
=
ClientTimeToServerTime
(
stuff
->
configTimestamp
);
oldWidth
=
pScreen
->
width
;
oldHeight
=
pScreen
->
height
;
if
(
!
pScrPriv
)
{
time
=
currentTime
;
rep
.
status
=
RRSetConfigFailed
;
goto
sendReply
;
}
if
(
!
RRGetInfo
(
pScreen
))
return
BadAlloc
;
/*
* if the client's config timestamp is not the same as the last config
* timestamp, then the config information isn't up-to-date and
* can't even be validated
*/
if
(
CompareTimeStamps
(
configTime
,
pScrPriv
->
lastConfigTime
)
!=
0
)
{
rep
.
status
=
RRSetConfigInvalidConfigTime
;
goto
sendReply
;
}
/*
* Search for the requested size
*/
pSize
=
0
;
for
(
i
=
0
;
i
<
pScrPriv
->
nSizes
;
i
++
)
{
pSize
=
&
pScrPriv
->
pSizes
[
i
];
if
(
pSize
->
referenced
&&
pSize
->
id
==
stuff
->
sizeID
)
{
break
;
}
}
if
(
i
==
pScrPriv
->
nSizes
)
{
/*
* Invalid size ID
*/
client
->
errorValue
=
stuff
->
sizeID
;
return
BadValue
;
}
/*
* Validate requested rotation
*/
rotation
=
(
Rotation
)
stuff
->
rotation
;
/* test the rotation bits only! */
switch
(
rotation
&
0xf
)
{
case
RR_Rotate_0
:
case
RR_Rotate_90
:
case
RR_Rotate_180
:
case
RR_Rotate_270
:
break
;
default:
/*
* Invalid rotation
*/
client
->
errorValue
=
stuff
->
rotation
;
return
BadValue
;
}
if
((
~
pScrPriv
->
rotations
)
&
rotation
)
{
/*
* requested rotation or reflection not supported by screen
*/
client
->
errorValue
=
stuff
->
rotation
;
return
BadMatch
;
}
/*
* Validate requested refresh
*/
if
(
has_rate
)
rate
=
(
int
)
stuff
->
rate
;
else
rate
=
0
;
if
(
rate
)
{
for
(
i
=
0
;
i
<
pSize
->
nRates
;
i
++
)
{
RRScreenRatePtr
pRate
=
&
pSize
->
pRates
[
i
];
if
(
pRate
->
referenced
&&
pRate
->
rate
==
rate
)
break
;
}
if
(
i
==
pSize
->
nRates
)
{
/*
* Invalid rate
*/
client
->
errorValue
=
rate
;
return
BadValue
;
}
}
/*
* Make sure the requested set-time is not older than
* the last set-time
*/
if
(
CompareTimeStamps
(
time
,
pScrPriv
->
lastSetTime
)
<
0
)
{
rep
.
status
=
RRSetConfigInvalidTime
;
goto
sendReply
;
}
/*
* call out to ddx routine to effect the change
*/
if
(
!
(
*
pScrPriv
->
rrSetConfig
)
(
pScreen
,
rotation
,
rate
,
pSize
))
{
/*
* unknown DDX failure, report to client
*/
rep
.
status
=
RRSetConfigFailed
;
goto
sendReply
;
}
/*
* set current extension configuration pointers
*/
RRSetCurrentConfig
(
pScreen
,
rotation
,
rate
,
pSize
);
/*
* Deliver ScreenChangeNotify events whenever
* the configuration is updated
*/
WalkTree
(
pScreen
,
TellChanged
,
(
pointer
)
pScreen
);
/*
* Deliver ConfigureNotify events when root changes
* pixel size
*/
if
(
oldWidth
!=
pScreen
->
width
||
oldHeight
!=
pScreen
->
height
)
RRSendConfigNotify
(
pScreen
);
RREditConnectionInfo
(
pScreen
);
/*
* Fix pointer bounds and location
*/
ScreenRestructured
(
pScreen
);
pScrPriv
->
lastSetTime
=
time
;
/*
* Report Success
*/
rep
.
status
=
RRSetConfigSuccess
;
sendReply:
rep
.
type
=
X_Reply
;
/* rep.status has already been filled in */
rep
.
length
=
0
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
newTimestamp
=
pScrPriv
->
lastSetTime
.
milliseconds
;
rep
.
newConfigTimestamp
=
pScrPriv
->
lastConfigTime
.
milliseconds
;
rep
.
root
=
WindowTable
[
pDraw
->
pScreen
->
myNum
]
->
drawable
.
id
;
if
(
client
->
swapped
)
{
swaps
(
&
rep
.
sequenceNumber
,
n
);
swapl
(
&
rep
.
length
,
n
);
swapl
(
&
rep
.
newTimestamp
,
n
);
swapl
(
&
rep
.
newConfigTimestamp
,
n
);
swapl
(
&
rep
.
root
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xRRSetScreenConfigReply
),
(
char
*
)
&
rep
);
return
(
client
->
noClientException
);
}
int
RRSetScreenConfig
(
ScreenPtr
pScreen
,
Rotation
rotation
,
int
rate
,
RRScreenSizePtr
pSize
)
{
rrScrPrivPtr
pScrPriv
;
int
i
;
short
oldWidth
,
oldHeight
;
pScrPriv
=
rrGetScrPriv
(
pScreen
);
oldWidth
=
pScreen
->
width
;
oldHeight
=
pScreen
->
height
;
if
(
!
RRGetInfo
(
pScreen
))
return
BadAlloc
;
/*
* Validate requested rotation
*/
/* test the rotation bits only! */
switch
(
rotation
&
0xf
)
{
case
RR_Rotate_0
:
case
RR_Rotate_90
:
case
RR_Rotate_180
:
case
RR_Rotate_270
:
break
;
default:
/*
* Invalid rotation
*/
return
BadValue
;
}
if
((
~
pScrPriv
->
rotations
)
&
rotation
)
{
/*
* requested rotation or reflection not supported by screen
*/
return
BadMatch
;
}
/*
* Validate requested refresh
*/
if
(
rate
)
{
for
(
i
=
0
;
i
<
pSize
->
nRates
;
i
++
)
{
RRScreenRatePtr
pRate
=
&
pSize
->
pRates
[
i
];
if
(
pRate
->
referenced
&&
pRate
->
rate
==
rate
)
break
;
}
if
(
i
==
pSize
->
nRates
)
{
/*
* Invalid rate
*/
return
BadValue
;
}
}
/*
* call out to ddx routine to effect the change
*/
if
(
!
(
*
pScrPriv
->
rrSetConfig
)
(
pScreen
,
rotation
,
rate
,
pSize
))
{
/*
* unknown DDX failure, report to client
*/
return
BadImplementation
;
}
/*
* set current extension configuration pointers
*/
RRSetCurrentConfig
(
pScreen
,
rotation
,
rate
,
pSize
);
/*
* Deliver ScreenChangeNotify events whenever
* the configuration is updated
*/
WalkTree
(
pScreen
,
TellChanged
,
(
pointer
)
pScreen
);
/*
* Deliver ConfigureNotify events when root changes
* pixel size
*/
if
(
oldWidth
!=
pScreen
->
width
||
oldHeight
!=
pScreen
->
height
)
RRSendConfigNotify
(
pScreen
);
RREditConnectionInfo
(
pScreen
);
/*
* Fix pointer bounds and location
*/
ScreenRestructured
(
pScreen
);
return
Success
;
}
static
int
ProcRRSelectInput
(
ClientPtr
client
)
{
REQUEST
(
xRRSelectInputReq
);
rrClientPriv
(
client
);
RRTimesPtr
pTimes
;
WindowPtr
pWin
;
RREventPtr
pRREvent
,
pNewRREvent
,
*
pHead
;
XID
clientResource
;
REQUEST_SIZE_MATCH
(
xRRSelectInputReq
);
pWin
=
SecurityLookupWindow
(
stuff
->
window
,
client
,
SecurityWriteAccess
);
if
(
!
pWin
)
return
BadWindow
;
pHead
=
(
RREventPtr
*
)
SecurityLookupIDByType
(
client
,
pWin
->
drawable
.
id
,
EventType
,
SecurityWriteAccess
);
if
(
stuff
->
enable
&
(
RRScreenChangeNotifyMask
))
{
ScreenPtr
pScreen
=
pWin
->
drawable
.
pScreen
;
rrScrPriv
(
pScreen
);
if
(
pHead
)
{
/* check for existing entry. */
for
(
pRREvent
=
*
pHead
;
pRREvent
;
pRREvent
=
pRREvent
->
next
)
if
(
pRREvent
->
client
==
client
)
return
Success
;
}
/* build the entry */
pNewRREvent
=
(
RREventPtr
)
xalloc
(
sizeof
(
RREventRec
));
if
(
!
pNewRREvent
)
return
BadAlloc
;
pNewRREvent
->
next
=
0
;
pNewRREvent
->
client
=
client
;
pNewRREvent
->
window
=
pWin
;
pNewRREvent
->
mask
=
stuff
->
enable
;
/*
* add a resource that will be deleted when
* the client goes away
*/
clientResource
=
FakeClientID
(
client
->
index
);
pNewRREvent
->
clientResource
=
clientResource
;
if
(
!
AddResource
(
clientResource
,
ClientType
,
(
pointer
)
pNewRREvent
))
return
BadAlloc
;
/*
* create a resource to contain a pointer to the list
* of clients selecting input. This must be indirect as
* the list may be arbitrarily rearranged which cannot be
* done through the resource database.
*/
if
(
!
pHead
)
{
pHead
=
(
RREventPtr
*
)
xalloc
(
sizeof
(
RREventPtr
));
if
(
!
pHead
||
!
AddResource
(
pWin
->
drawable
.
id
,
EventType
,
(
pointer
)
pHead
))
{
FreeResource
(
clientResource
,
RT_NONE
);
return
BadAlloc
;
}
*
pHead
=
0
;
}
pNewRREvent
->
next
=
*
pHead
;
*
pHead
=
pNewRREvent
;
/*
* Now see if the client needs an event
*/
if
(
pScrPriv
)
{
pTimes
=
&
((
RRTimesPtr
)
(
pRRClient
+
1
))[
pScreen
->
myNum
];
if
(
CompareTimeStamps
(
pTimes
->
setTime
,
pScrPriv
->
lastSetTime
)
!=
0
||
CompareTimeStamps
(
pTimes
->
configTime
,
pScrPriv
->
lastConfigTime
)
!=
0
)
{
TellChanged
(
pWin
,
(
pointer
)
pScreen
);
}
}
}
else
if
(
stuff
->
enable
==
xFalse
)
{
/* delete the interest */
if
(
pHead
)
{
pNewRREvent
=
0
;
for
(
pRREvent
=
*
pHead
;
pRREvent
;
pRREvent
=
pRREvent
->
next
)
{
if
(
pRREvent
->
client
==
client
)
break
;
pNewRREvent
=
pRREvent
;
}
if
(
pRREvent
)
{
FreeResource
(
pRREvent
->
clientResource
,
ClientType
);
if
(
pNewRREvent
)
pNewRREvent
->
next
=
pRREvent
->
next
;
else
*
pHead
=
pRREvent
->
next
;
xfree
(
pRREvent
);
}
}
}
else
{
client
->
errorValue
=
stuff
->
enable
;
return
BadValue
;
}
return
Success
;
}
static
int
ProcRRDispatch
(
ClientPtr
client
)
{
REQUEST
(
xReq
);
switch
(
stuff
->
data
)
{
case
X_RRQueryVersion
:
return
ProcRRQueryVersion
(
client
);
case
X_RRSetScreenConfig
:
return
ProcRRSetScreenConfig
(
client
);
case
X_RRSelectInput
:
return
ProcRRSelectInput
(
client
);
case
X_RRGetScreenInfo
:
return
ProcRRGetScreenInfo
(
client
);
default:
return
BadRequest
;
}
}
static
int
SProcRRQueryVersion
(
ClientPtr
client
)
{
register
int
n
;
REQUEST
(
xRRQueryVersionReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
majorVersion
,
n
);
swapl
(
&
stuff
->
minorVersion
,
n
);
return
ProcRRQueryVersion
(
client
);
}
static
int
SProcRRGetScreenInfo
(
ClientPtr
client
)
{
register
int
n
;
REQUEST
(
xRRGetScreenInfoReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
window
,
n
);
return
ProcRRGetScreenInfo
(
client
);
}
static
int
SProcRRSetScreenConfig
(
ClientPtr
client
)
{
register
int
n
;
REQUEST
(
xRRSetScreenConfigReq
);
if
(
RRClientKnowsRates
(
client
))
{
REQUEST_SIZE_MATCH
(
xRRSetScreenConfigReq
);
swaps
(
&
stuff
->
rate
,
n
);
}
else
{
REQUEST_SIZE_MATCH
(
xRR1_0SetScreenConfigReq
);
}
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
drawable
,
n
);
swapl
(
&
stuff
->
timestamp
,
n
);
swaps
(
&
stuff
->
sizeID
,
n
);
swaps
(
&
stuff
->
rotation
,
n
);
return
ProcRRSetScreenConfig
(
client
);
}
static
int
SProcRRSelectInput
(
ClientPtr
client
)
{
register
int
n
;
REQUEST
(
xRRSelectInputReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
window
,
n
);
return
ProcRRSelectInput
(
client
);
}
static
int
SProcRRDispatch
(
ClientPtr
client
)
{
REQUEST
(
xReq
);
switch
(
stuff
->
data
)
{
case
X_RRQueryVersion
:
return
SProcRRQueryVersion
(
client
);
case
X_RRSetScreenConfig
:
return
SProcRRSetScreenConfig
(
client
);
case
X_RRSelectInput
:
return
SProcRRSelectInput
(
client
);
case
X_RRGetScreenInfo
:
return
SProcRRGetScreenInfo
(
client
);
default:
return
BadRequest
;
}
}
static
Bool
RRScreenSizeMatches
(
RRScreenSizePtr
a
,
RRScreenSizePtr
b
)
{
if
(
a
->
width
!=
b
->
width
)
return
FALSE
;
if
(
a
->
height
!=
b
->
height
)
return
FALSE
;
if
(
a
->
mmWidth
!=
b
->
mmWidth
)
return
FALSE
;
if
(
a
->
mmHeight
!=
b
->
mmHeight
)
return
FALSE
;
return
TRUE
;
}
RRScreenSizePtr
RRRegisterSize
(
ScreenPtr
pScreen
,
short
width
,
short
height
,
short
mmWidth
,
short
mmHeight
)
{
rrScrPriv
(
pScreen
);
int
i
;
RRScreenSize
tmp
;
RRScreenSizePtr
pNew
;
if
(
!
pScrPriv
)
return
0
;
tmp
.
width
=
width
;
tmp
.
height
=
height
;
tmp
.
mmWidth
=
mmWidth
;
tmp
.
mmHeight
=
mmHeight
;
tmp
.
pRates
=
0
;
tmp
.
nRates
=
0
;
tmp
.
nRatesInUse
=
0
;
tmp
.
referenced
=
TRUE
;
tmp
.
oldReferenced
=
FALSE
;
for
(
i
=
0
;
i
<
pScrPriv
->
nSizes
;
i
++
)
if
(
RRScreenSizeMatches
(
&
tmp
,
&
pScrPriv
->
pSizes
[
i
]))
{
pScrPriv
->
pSizes
[
i
].
referenced
=
TRUE
;
return
&
pScrPriv
->
pSizes
[
i
];
}
pNew
=
xrealloc
(
pScrPriv
->
pSizes
,
(
pScrPriv
->
nSizes
+
1
)
*
sizeof
(
RRScreenSize
));
if
(
!
pNew
)
return
0
;
pNew
[
pScrPriv
->
nSizes
++
]
=
tmp
;
pScrPriv
->
pSizes
=
pNew
;
return
&
pNew
[
pScrPriv
->
nSizes
-
1
];
}
Bool
RRRegisterRate
(
ScreenPtr
pScreen
,
RRScreenSizePtr
pSize
,
int
rate
)
{
rrScrPriv
(
pScreen
);
int
i
;
RRScreenRatePtr
pNew
,
pRate
;
if
(
!
pScrPriv
)
return
FALSE
;
for
(
i
=
0
;
i
<
pSize
->
nRates
;
i
++
)
{
pRate
=
&
pSize
->
pRates
[
i
];
if
(
pRate
->
rate
==
rate
)
{
pRate
->
referenced
=
TRUE
;
return
TRUE
;
}
}
pNew
=
xrealloc
(
pSize
->
pRates
,
(
pSize
->
nRates
+
1
)
*
sizeof
(
RRScreenRate
));
if
(
!
pNew
)
return
FALSE
;
pRate
=
&
pNew
[
pSize
->
nRates
++
];
pRate
->
rate
=
rate
;
pRate
->
referenced
=
TRUE
;
pRate
->
oldReferenced
=
FALSE
;
pSize
->
pRates
=
pNew
;
return
TRUE
;
}
void
RRSetCurrentConfig
(
ScreenPtr
pScreen
,
Rotation
rotation
,
int
rate
,
RRScreenSizePtr
pSize
)
{
rrScrPriv
(
pScreen
);
if
(
!
pScrPriv
)
return
;
pScrPriv
->
rotation
=
rotation
;
pScrPriv
->
size
=
pSize
-
pScrPriv
->
pSizes
;
pScrPriv
->
rate
=
rate
;
}
nx-X11/programs/Xserver/randr.X.original/randrstr.h
0 → 100644
View file @
15cee47a
/*
* $XFree86: xc/programs/Xserver/randr/randrstr.h,v 1.5 2002/09/29 23:39:45 keithp Exp $
*
* Copyright © 2000 Compaq Computer Corporation
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Compaq not be used in
* advertising or publicity pertaining to distribution of the software without
* specific, written prior permission. Compaq makes no
* representations about the suitability of this software for any purpose. It
* is provided "as is" without express or implied warranty.
*
* COMPAQ DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL COMPAQ BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#ifndef _RANDRSTR_H_
#define _RANDRSTR_H_
#include <X11/extensions/randr.h>
typedef
struct
_rrScreenRate
{
int
rate
;
Bool
referenced
;
Bool
oldReferenced
;
}
RRScreenRate
,
*
RRScreenRatePtr
;
typedef
struct
_rrScreenSize
{
int
id
;
short
width
,
height
;
short
mmWidth
,
mmHeight
;
RRScreenRatePtr
pRates
;
int
nRates
;
int
nRatesInUse
;
Bool
referenced
;
Bool
oldReferenced
;
}
RRScreenSize
,
*
RRScreenSizePtr
;
typedef
Bool
(
*
RRSetConfigProcPtr
)
(
ScreenPtr
pScreen
,
Rotation
rotation
,
int
rate
,
RRScreenSizePtr
pSize
);
typedef
Bool
(
*
RRGetInfoProcPtr
)
(
ScreenPtr
pScreen
,
Rotation
*
rotations
);
typedef
Bool
(
*
RRCloseScreenProcPtr
)
(
int
i
,
ScreenPtr
pscreen
);
typedef
struct
_rrScrPriv
{
RRSetConfigProcPtr
rrSetConfig
;
RRGetInfoProcPtr
rrGetInfo
;
TimeStamp
lastSetTime
;
/* last changed by client */
TimeStamp
lastConfigTime
;
/* possible configs changed */
RRCloseScreenProcPtr
CloseScreen
;
/*
* Configuration information
*/
Rotation
rotations
;
int
nSizes
;
int
nSizesInUse
;
RRScreenSizePtr
pSizes
;
/*
* Current state
*/
Rotation
rotation
;
int
size
;
int
rate
;
}
rrScrPrivRec
,
*
rrScrPrivPtr
;
extern
int
rrPrivIndex
;
#define rrGetScrPriv(pScr) ((rrScrPrivPtr) (pScr)->devPrivates[rrPrivIndex].ptr)
#define rrScrPriv(pScr) rrScrPrivPtr pScrPriv = rrGetScrPriv(pScr)
#define SetRRScreen(s,p) ((s)->devPrivates[rrPrivIndex].ptr = (pointer) (p))
/* Initialize the extension */
void
RRExtensionInit
(
void
);
/*
* Then, register the specific size with the screen
*/
RRScreenSizePtr
RRRegisterSize
(
ScreenPtr
pScreen
,
short
width
,
short
height
,
short
mmWidth
,
short
mmHeight
);
Bool
RRRegisterRate
(
ScreenPtr
pScreen
,
RRScreenSizePtr
pSize
,
int
rate
);
/*
* Finally, set the current configuration of the screen
*/
void
RRSetCurrentConfig
(
ScreenPtr
pScreen
,
Rotation
rotation
,
int
rate
,
RRScreenSizePtr
pSize
);
Bool
RRScreenInit
(
ScreenPtr
pScreen
);
int
RRSetScreenConfig
(
ScreenPtr
pScreen
,
Rotation
rotation
,
int
rate
,
RRScreenSizePtr
pSize
);
Bool
miRandRInit
(
ScreenPtr
pScreen
);
Bool
miRRGetInfo
(
ScreenPtr
pScreen
,
Rotation
*
rotations
);
Bool
miRRSetConfig
(
ScreenPtr
pScreen
,
Rotation
rotation
,
int
rate
,
RRScreenSizePtr
size
);
Bool
miRRGetScreenInfo
(
ScreenPtr
pScreen
);
#endif
/* _RANDRSTR_H_ */
nx-X11/programs/Xserver/randr/Imakefile
View file @
15cee47a
/**************************************************************************/
/* */
/* Copyright (c) 2001, 2011 NoMachine, http://www.nomachine.com/. */
/* */
/* NX-X11, NX protocol compression and NX extensions to this software */
/* are copyright of NoMachine. Redistribution and use of the present */
/* software is allowed according to terms specified in the file LICENSE */
/* which comes in the source distribution. */
/* */
/* Check http://www.nomachine.com/licensing.html for applicability. */
/* */
/* NX and NoMachine are trademarks of Medialogic S.p.A. */
/* */
/* All rights reserved. */
/* */
/**************************************************************************/
XCOMM $XFree86: xc/programs/Xserver/randr/Imakefile,v 1.1 2001/05/23 03:29:44 keithp Exp $
#include <Server.tmpl>
SRCS =
randr.c mirandr
.c
SRCS =
mirandr.c randr.c rrcrtc.c rrdispatch.c rrinfo.c rrmode.c rroutput.c rrpointer.c rrproperty.c rrscreen.c rrsdispatch.c rrxinerama
.c
OBJS =
randr.o mirandr
.o
OBJS =
mirandr.o randr.o rrcrtc.o rrdispatch.o rrinfo.o rrmode.o rroutput.o rrpointer.o rrproperty.o rrscreen.o rrsdispatch.o rrxinerama
.o
INCLUDES = -I../include -I../mi -I../../../include/fonts \
-I../fb -I../hw/kdrive -I$(EXTINCSRC) -I$(XINCLUDESRC) \
-I$(FONTINCSRC) -I../render
LINTLIBS = ../dix/llib-ldix.ln ../os/llib-los.ln
DEFINES = -DNXAGENT_SERVER
NormalLibraryTarget(randr,$(OBJS))
NormalLibraryObjectRule()
LintLibraryTarget(randr,$(SRCS))
...
...
nx-X11/programs/Xserver/randr/Imakefile.NX.original
0 → 100644
View file @
15cee47a
/**************************************************************************/
/* */
/* Copyright (c) 2001, 2011 NoMachine, http://www.nomachine.com/. */
/* */
/* NX-X11, NX protocol compression and NX extensions to this software */
/* are copyright of NoMachine. Redistribution and use of the present */
/* software is allowed according to terms specified in the file LICENSE */
/* which comes in the source distribution. */
/* */
/* Check http://www.nomachine.com/licensing.html for applicability. */
/* */
/* NX and NoMachine are trademarks of Medialogic S.p.A. */
/* */
/* All rights reserved. */
/* */
/**************************************************************************/
XCOMM $XFree86: xc/programs/Xserver/randr/Imakefile,v 1.1 2001/05/23 03:29:44 keithp Exp $
#include <Server.tmpl>
SRCS = mirandr.c randr.c rrcrtc.c rrdispatch.c rrinfo.c rrmode.c rroutput.c rrpointer.c rrproperty.c rrscreen.c rrsdispatch.c rrxinerama.c
OBJS = mirandr.o randr.o rrcrtc.o rrdispatch.o rrinfo.o rrmode.o rroutput.o rrpointer.o rrproperty.o rrscreen.o rrsdispatch.o rrxinerama.o
INCLUDES = -I../include -I../mi -I../../../include/fonts \
-I../fb -I../hw/kdrive -I$(EXTINCSRC) -I$(XINCLUDESRC) \
-I$(FONTINCSRC) -I../render
LINTLIBS = ../dix/llib-ldix.ln ../os/llib-los.ln
DEFINES = -DNXAGENT_SERVER
NormalLibraryTarget(randr,$(OBJS))
NormalLibraryObjectRule()
LintLibraryTarget(randr,$(SRCS))
NormalLintTarget($(SRCS))
DependTarget()
nx-X11/programs/Xserver/randr/Imakefile.X.original
0 → 100644
View file @
15cee47a
nx-X11/programs/Xserver/randr/Makefile.am
0 → 100644
View file @
15cee47a
noinst_LTLIBRARIES
=
librandr.la
AM_CFLAGS
=
$(DIX_CFLAGS)
XINERAMA_SRCS
=
rrxinerama.c
if
XORG
sdk_HEADERS
=
randrstr.h
endif
librandr_la_SOURCES
=
\
mirandr.c
\
randr.c
\
randrstr.h
\
rrcrtc.c
\
rrdispatch.c
\
rrinfo.c
\
rrmode.c
\
rroutput.c
\
rrpointer.c
\
rrproperty.c
\
rrscreen.c
\
rrsdispatch.c
if
XINERAMA
librandr_la_SOURCES
+=
${
XINERAMA_SRCS
}
endif
nx-X11/programs/Xserver/randr/Makefile.in
0 → 100644
View file @
15cee47a
# Makefile.in generated by automake 1.10.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
VPATH
=
@srcdir@
pkgdatadir
=
$(datadir)
/@PACKAGE@
pkglibdir
=
$(libdir)
/@PACKAGE@
pkgincludedir
=
$(includedir)
/@PACKAGE@
am__cd
=
CDPATH
=
"
$$
{ZSH_VERSION+.}
$(PATH_SEPARATOR)
"
&&
cd
install_sh_DATA
=
$(install_sh)
-c
-m
644
install_sh_PROGRAM
=
$(install_sh)
-c
install_sh_SCRIPT
=
$(install_sh)
-c
INSTALL_HEADER
=
$(INSTALL_DATA)
transform
=
$(program_transform_name)
NORMAL_INSTALL
=
:
PRE_INSTALL
=
:
POST_INSTALL
=
:
NORMAL_UNINSTALL
=
:
PRE_UNINSTALL
=
:
POST_UNINSTALL
=
:
build_triplet
=
@build@
host_triplet
=
@host@
@XINERAMA_TRUE@
am__append_1
=
${
XINERAMA_SRCS
}
subdir
=
randr
DIST_COMMON
=
$(am__sdk_HEADERS_DIST)
$(srcdir)
/Makefile.am
\
$(srcdir)
/Makefile.in
ACLOCAL_M4
=
$(top_srcdir)
/aclocal.m4
am__aclocal_m4_deps
=
$(top_srcdir)
/acinclude.m4
\
$(top_srcdir)
/configure.ac
am__configure_deps
=
$(am__aclocal_m4_deps)
$(CONFIGURE_DEPENDENCIES)
\
$(ACLOCAL_M4)
mkinstalldirs
=
$(install_sh)
-d
CONFIG_HEADER
=
$(top_builddir)
/include/do-not-use-config.h
\
$(top_builddir)
/include/xorg-server.h
\
$(top_builddir)
/include/dix-config.h
\
$(top_builddir)
/include/xgl-config.h
\
$(top_builddir)
/include/xorg-config.h
\
$(top_builddir)
/include/xkb-config.h
\
$(top_builddir)
/include/xwin-config.h
\
$(top_builddir)
/include/kdrive-config.h
CONFIG_CLEAN_FILES
=
LTLIBRARIES
=
$(noinst_LTLIBRARIES)
librandr_la_LIBADD
=
am__librandr_la_SOURCES_DIST
=
mirandr.c randr.c randrstr.h rrcrtc.c
\
rrdispatch.c rrinfo.c rrmode.c rroutput.c rrpointer.c
\
rrproperty.c rrscreen.c rrsdispatch.c rrxinerama.c
am__objects_1
=
rrxinerama.lo
@XINERAMA_TRUE@
am__objects_2
=
$(am__objects_1)
am_librandr_la_OBJECTS
=
mirandr.lo randr.lo rrcrtc.lo rrdispatch.lo
\
rrinfo.lo rrmode.lo rroutput.lo rrpointer.lo rrproperty.lo
\
rrscreen.lo rrsdispatch.lo
$(am__objects_2)
librandr_la_OBJECTS
=
$(am_librandr_la_OBJECTS)
DEFAULT_INCLUDES
=
-I
.@am__isrc@
-I
$(top_builddir)
/include
depcomp
=
$(SHELL)
$(top_srcdir)
/depcomp
am__depfiles_maybe
=
depfiles
COMPILE
=
$(CC)
$(DEFS)
$(DEFAULT_INCLUDES)
$(INCLUDES)
$(AM_CPPFLAGS)
\
$(CPPFLAGS)
$(AM_CFLAGS)
$(CFLAGS)
LTCOMPILE
=
$(LIBTOOL)
--tag
=
CC
$(AM_LIBTOOLFLAGS)
$(LIBTOOLFLAGS)
\
--mode
=
compile
$(CC)
$(DEFS)
$(DEFAULT_INCLUDES)
$(INCLUDES)
\
$(AM_CPPFLAGS)
$(CPPFLAGS)
$(AM_CFLAGS)
$(CFLAGS)
CCLD
=
$(CC)
LINK
=
$(LIBTOOL)
--tag
=
CC
$(AM_LIBTOOLFLAGS)
$(LIBTOOLFLAGS)
\
--mode
=
link
$(CCLD)
$(AM_CFLAGS)
$(CFLAGS)
$(AM_LDFLAGS)
\
$(LDFLAGS)
-o
$@
SOURCES
=
$(librandr_la_SOURCES)
DIST_SOURCES
=
$(am__librandr_la_SOURCES_DIST)
am__sdk_HEADERS_DIST
=
randrstr.h
am__vpath_adj_setup
=
srcdirstrip
=
`
echo
"
$(srcdir)
"
|
sed
's|.|.|g'
`
;
am__vpath_adj
=
case
$$
p
in
\
$(srcdir)
/
*
)
f
=
`
echo
"
$$
p"
|
sed
"s|^
$$
srcdirstrip/||"
`
;;
\
*
)
f
=
$$
p
;;
\
esac
;
am__strip_dir
=
`
echo
$$
p |
sed
-e
's|^.*/||'
`
;
am__installdirs
=
"
$(DESTDIR)$(sdkdir)
"
sdkHEADERS_INSTALL
=
$(INSTALL_HEADER)
HEADERS
=
$(sdk_HEADERS)
ETAGS
=
etags
CTAGS
=
ctags
DISTFILES
=
$(DIST_COMMON)
$(DIST_SOURCES)
$(TEXINFOS)
$(EXTRA_DIST)
ACLOCAL
=
@ACLOCAL@
ADMIN_MAN_DIR
=
@ADMIN_MAN_DIR@
ADMIN_MAN_SUFFIX
=
@ADMIN_MAN_SUFFIX@
ALLOCA
=
@ALLOCA@
AMTAR
=
@AMTAR@
APPDEFAULTDIR
=
@APPDEFAULTDIR@
APPLE_APPLICATIONS_DIR
=
@APPLE_APPLICATIONS_DIR@
APP_MAN_DIR
=
@APP_MAN_DIR@
APP_MAN_SUFFIX
=
@APP_MAN_SUFFIX@
AR
=
@AR@
AS
=
@AS@
AUTOCONF
=
@AUTOCONF@
AUTOHEADER
=
@AUTOHEADER@
AUTOMAKE
=
@AUTOMAKE@
AWK
=
@AWK@
BASE_FONT_PATH
=
@BASE_FONT_PATH@
BUILD_DATE
=
@BUILD_DATE@
BUILD_TIME
=
@BUILD_TIME@
CC
=
@CC@
CCAS
=
@CCAS@
CCASDEPMODE
=
@CCASDEPMODE@
CCASFLAGS
=
@CCASFLAGS@
CCDEPMODE
=
@CCDEPMODE@
CFLAGS
=
@CFLAGS@
COMPILEDDEFAULTFONTPATH
=
@COMPILEDDEFAULTFONTPATH@
CPP
=
@CPP@
CPPFLAGS
=
@CPPFLAGS@
CXX
=
@CXX@
CXXCPP
=
@CXXCPP@
CXXDEPMODE
=
@CXXDEPMODE@
CXXFLAGS
=
@CXXFLAGS@
CYGPATH_W
=
@CYGPATH_W@
DARWIN_LIBS
=
@DARWIN_LIBS@
DBUS_CFLAGS
=
@DBUS_CFLAGS@
DBUS_LIBS
=
@DBUS_LIBS@
DEFAULT_LIBRARY_PATH
=
@DEFAULT_LIBRARY_PATH@
DEFAULT_LOGPREFIX
=
@DEFAULT_LOGPREFIX@
DEFAULT_MODULE_PATH
=
@DEFAULT_MODULE_PATH@
DEFS
=
@DEFS@
DEPDIR
=
@DEPDIR@
DGA_CFLAGS
=
@DGA_CFLAGS@
DGA_LIBS
=
@DGA_LIBS@
DIX_CFLAGS
=
@DIX_CFLAGS@
DLLTOOL
=
@DLLTOOL@
DMXEXAMPLES_DEP_CFLAGS
=
@DMXEXAMPLES_DEP_CFLAGS@
DMXEXAMPLES_DEP_LIBS
=
@DMXEXAMPLES_DEP_LIBS@
DMXMODULES_CFLAGS
=
@DMXMODULES_CFLAGS@
DMXMODULES_LIBS
=
@DMXMODULES_LIBS@
DMXXIEXAMPLES_DEP_CFLAGS
=
@DMXXIEXAMPLES_DEP_CFLAGS@
DMXXIEXAMPLES_DEP_LIBS
=
@DMXXIEXAMPLES_DEP_LIBS@
DMXXMUEXAMPLES_DEP_CFLAGS
=
@DMXXMUEXAMPLES_DEP_CFLAGS@
DMXXMUEXAMPLES_DEP_LIBS
=
@DMXXMUEXAMPLES_DEP_LIBS@
DRI2PROTO_CFLAGS
=
@DRI2PROTO_CFLAGS@
DRI2PROTO_LIBS
=
@DRI2PROTO_LIBS@
DRIPROTO_CFLAGS
=
@DRIPROTO_CFLAGS@
DRIPROTO_LIBS
=
@DRIPROTO_LIBS@
DRIVER_MAN_DIR
=
@DRIVER_MAN_DIR@
DRIVER_MAN_SUFFIX
=
@DRIVER_MAN_SUFFIX@
DRI_DRIVER_PATH
=
@DRI_DRIVER_PATH@
DSYMUTIL
=
@DSYMUTIL@
DTRACE
=
@DTRACE@
ECHO
=
@ECHO@
ECHO_C
=
@ECHO_C@
ECHO_N
=
@ECHO_N@
ECHO_T
=
@ECHO_T@
EGREP
=
@EGREP@
EXEEXT
=
@EXEEXT@
F77
=
@F77@
FFLAGS
=
@FFLAGS@
FILE_MAN_DIR
=
@FILE_MAN_DIR@
FILE_MAN_SUFFIX
=
@FILE_MAN_SUFFIX@
FREETYPE_CFLAGS
=
@FREETYPE_CFLAGS@
FREETYPE_LIBS
=
@FREETYPE_LIBS@
GLX_ARCH_DEFINES
=
@GLX_ARCH_DEFINES@
GLX_DEFINES
=
@GLX_DEFINES@
GL_CFLAGS
=
@GL_CFLAGS@
GL_LIBS
=
@GL_LIBS@
GREP
=
@GREP@
HAL_CFLAGS
=
@HAL_CFLAGS@
HAL_LIBS
=
@HAL_LIBS@
INSTALL
=
@INSTALL@
INSTALL_DATA
=
@INSTALL_DATA@
INSTALL_PROGRAM
=
@INSTALL_PROGRAM@
INSTALL_SCRIPT
=
@INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM
=
@INSTALL_STRIP_PROGRAM@
KDRIVE_CFLAGS
=
@KDRIVE_CFLAGS@
KDRIVE_INCS
=
@KDRIVE_INCS@
KDRIVE_LIBS
=
@KDRIVE_LIBS@
KDRIVE_LOCAL_LIBS
=
@KDRIVE_LOCAL_LIBS@
KDRIVE_PURE_INCS
=
@KDRIVE_PURE_INCS@
KDRIVE_PURE_LIBS
=
@KDRIVE_PURE_LIBS@
LAUNCHD
=
@LAUNCHD@
LDFLAGS
=
@LDFLAGS@
LD_EXPORT_SYMBOLS_FLAG
=
@LD_EXPORT_SYMBOLS_FLAG@
LEX
=
@LEX@
LEXLIB
=
@LEXLIB@
LEX_OUTPUT_ROOT
=
@LEX_OUTPUT_ROOT@
LIBDRM_CFLAGS
=
@LIBDRM_CFLAGS@
LIBDRM_LIBS
=
@LIBDRM_LIBS@
LIBOBJS
=
@LIBOBJS@
LIBS
=
@LIBS@
LIBTOOL
=
@LIBTOOL@
LIB_MAN_DIR
=
@LIB_MAN_DIR@
LIB_MAN_SUFFIX
=
@LIB_MAN_SUFFIX@
LINUXDOC
=
@LINUXDOC@
LN_S
=
@LN_S@
LTLIBOBJS
=
@LTLIBOBJS@
MAINT
=
@MAINT@
MAKEINFO
=
@MAKEINFO@
MAKE_HTML
=
@MAKE_HTML@
MAKE_PDF
=
@MAKE_PDF@
MAKE_PS
=
@MAKE_PS@
MAKE_TEXT
=
@MAKE_TEXT@
MESA_SOURCE
=
@MESA_SOURCE@
MISC_MAN_DIR
=
@MISC_MAN_DIR@
MISC_MAN_SUFFIX
=
@MISC_MAN_SUFFIX@
MKDIR_P
=
@MKDIR_P@
MKFONTDIR
=
@MKFONTDIR@
MKFONTSCALE
=
@MKFONTSCALE@
NMEDIT
=
@NMEDIT@
OBJC
=
@OBJC@
OBJCCLD
=
@OBJCCLD@
OBJCDEPMODE
=
@OBJCDEPMODE@
OBJCFLAGS
=
@OBJCFLAGS@
OBJCLINK
=
@OBJCLINK@
OBJDUMP
=
@OBJDUMP@
OBJEXT
=
@OBJEXT@
OPENSSL_CFLAGS
=
@OPENSSL_CFLAGS@
OPENSSL_LIBS
=
@OPENSSL_LIBS@
PACKAGE
=
@PACKAGE@
PACKAGE_BUGREPORT
=
@PACKAGE_BUGREPORT@
PACKAGE_NAME
=
@PACKAGE_NAME@
PACKAGE_STRING
=
@PACKAGE_STRING@
PACKAGE_TARNAME
=
@PACKAGE_TARNAME@
PACKAGE_VERSION
=
@PACKAGE_VERSION@
PATH_SEPARATOR
=
@PATH_SEPARATOR@
PCIACCESS_CFLAGS
=
@PCIACCESS_CFLAGS@
PCIACCESS_LIBS
=
@PCIACCESS_LIBS@
PCI_TXT_IDS_PATH
=
@PCI_TXT_IDS_PATH@
PERL
=
@PERL@
PKG_CONFIG
=
@PKG_CONFIG@
PROJECTROOT
=
@PROJECTROOT@
PS2PDF
=
@PS2PDF@
RANLIB
=
@RANLIB@
RAWCPP
=
@RAWCPP@
RAWCPPFLAGS
=
@RAWCPPFLAGS@
SED
=
@SED@
SERVER_MISC_CONFIG_PATH
=
@SERVER_MISC_CONFIG_PATH@
SET_MAKE
=
@SET_MAKE@
SHELL
=
@SHELL@
SOLARIS_ASM_CFLAGS
=
@SOLARIS_ASM_CFLAGS@
SOLARIS_INOUT_ARCH
=
@SOLARIS_INOUT_ARCH@
STRIP
=
@STRIP@
TSLIB_CFLAGS
=
@TSLIB_CFLAGS@
TSLIB_LIBS
=
@TSLIB_LIBS@
UTILS_SYS_LIBS
=
@UTILS_SYS_LIBS@
VENDOR_MAN_VERSION
=
@VENDOR_MAN_VERSION@
VENDOR_NAME
=
@VENDOR_NAME@
VENDOR_NAME_SHORT
=
@VENDOR_NAME_SHORT@
VENDOR_RELEASE
=
@VENDOR_RELEASE@
VERSION
=
@VERSION@
X11APP_ARCHS
=
@X11APP_ARCHS@
X11EXAMPLES_DEP_CFLAGS
=
@X11EXAMPLES_DEP_CFLAGS@
X11EXAMPLES_DEP_LIBS
=
@X11EXAMPLES_DEP_LIBS@
XDMCP_CFLAGS
=
@XDMCP_CFLAGS@
XDMCP_LIBS
=
@XDMCP_LIBS@
XDMXCONFIG_DEP_CFLAGS
=
@XDMXCONFIG_DEP_CFLAGS@
XDMXCONFIG_DEP_LIBS
=
@XDMXCONFIG_DEP_LIBS@
XDMX_CFLAGS
=
@XDMX_CFLAGS@
XDMX_LIBS
=
@XDMX_LIBS@
XDMX_SYS_LIBS
=
@XDMX_SYS_LIBS@
XEGLMODULES_CFLAGS
=
@XEGLMODULES_CFLAGS@
XEGL_LIBS
=
@XEGL_LIBS@
XEGL_SYS_LIBS
=
@XEGL_SYS_LIBS@
XEPHYR_CFLAGS
=
@XEPHYR_CFLAGS@
XEPHYR_DRI_LIBS
=
@XEPHYR_DRI_LIBS@
XEPHYR_INCS
=
@XEPHYR_INCS@
XEPHYR_LIBS
=
@XEPHYR_LIBS@
XF86CONFIGFILE
=
@XF86CONFIGFILE@
XF86MISC_CFLAGS
=
@XF86MISC_CFLAGS@
XF86MISC_LIBS
=
@XF86MISC_LIBS@
XF86VIDMODE_CFLAGS
=
@XF86VIDMODE_CFLAGS@
XF86VIDMODE_LIBS
=
@XF86VIDMODE_LIBS@
XGLMODULES_CFLAGS
=
@XGLMODULES_CFLAGS@
XGLMODULES_LIBS
=
@XGLMODULES_LIBS@
XGLXMODULES_CFLAGS
=
@XGLXMODULES_CFLAGS@
XGLXMODULES_LIBS
=
@XGLXMODULES_LIBS@
XGLX_LIBS
=
@XGLX_LIBS@
XGLX_SYS_LIBS
=
@XGLX_SYS_LIBS@
XGL_LIBS
=
@XGL_LIBS@
XGL_MODULE_PATH
=
@XGL_MODULE_PATH@
XGL_SYS_LIBS
=
@XGL_SYS_LIBS@
XKB_BASE_DIRECTORY
=
@XKB_BASE_DIRECTORY@
XKB_BIN_DIRECTORY
=
@XKB_BIN_DIRECTORY@
XKB_COMPILED_DIR
=
@XKB_COMPILED_DIR@
XKM_OUTPUT_DIR
=
@XKM_OUTPUT_DIR@
XLIB_CFLAGS
=
@XLIB_CFLAGS@
XLIB_LIBS
=
@XLIB_LIBS@
XNESTMODULES_CFLAGS
=
@XNESTMODULES_CFLAGS@
XNESTMODULES_LIBS
=
@XNESTMODULES_LIBS@
XNEST_LIBS
=
@XNEST_LIBS@
XNEST_SYS_LIBS
=
@XNEST_SYS_LIBS@
XORGCFG_DEP_CFLAGS
=
@XORGCFG_DEP_CFLAGS@
XORGCFG_DEP_LIBS
=
@XORGCFG_DEP_LIBS@
XORGCONFIG_DEP_CFLAGS
=
@XORGCONFIG_DEP_CFLAGS@
XORGCONFIG_DEP_LIBS
=
@XORGCONFIG_DEP_LIBS@
XORG_CFLAGS
=
@XORG_CFLAGS@
XORG_INCS
=
@XORG_INCS@
XORG_LIBS
=
@XORG_LIBS@
XORG_MODULES_CFLAGS
=
@XORG_MODULES_CFLAGS@
XORG_MODULES_LIBS
=
@XORG_MODULES_LIBS@
XORG_OS
=
@XORG_OS@
XORG_OS_SUBDIR
=
@XORG_OS_SUBDIR@
XORG_SYS_LIBS
=
@XORG_SYS_LIBS@
XPRINTMODULES_CFLAGS
=
@XPRINTMODULES_CFLAGS@
XPRINTMODULES_LIBS
=
@XPRINTMODULES_LIBS@
XPRINTPROTO_CFLAGS
=
@XPRINTPROTO_CFLAGS@
XPRINTPROTO_LIBS
=
@XPRINTPROTO_LIBS@
XPRINT_CFLAGS
=
@XPRINT_CFLAGS@
XPRINT_LIBS
=
@XPRINT_LIBS@
XPRINT_SYS_LIBS
=
@XPRINT_SYS_LIBS@
XRESEXAMPLES_DEP_CFLAGS
=
@XRESEXAMPLES_DEP_CFLAGS@
XRESEXAMPLES_DEP_LIBS
=
@XRESEXAMPLES_DEP_LIBS@
XSDL_INCS
=
@XSDL_INCS@
XSDL_LIBS
=
@XSDL_LIBS@
XSERVERCFLAGS_CFLAGS
=
@XSERVERCFLAGS_CFLAGS@
XSERVERCFLAGS_LIBS
=
@XSERVERCFLAGS_LIBS@
XSERVERLIBS_CFLAGS
=
@XSERVERLIBS_CFLAGS@
XSERVERLIBS_LIBS
=
@XSERVERLIBS_LIBS@
XSERVER_LIBS
=
@XSERVER_LIBS@
XSERVER_SYS_LIBS
=
@XSERVER_SYS_LIBS@
XTSTEXAMPLES_DEP_CFLAGS
=
@XTSTEXAMPLES_DEP_CFLAGS@
XTSTEXAMPLES_DEP_LIBS
=
@XTSTEXAMPLES_DEP_LIBS@
XVFB_LIBS
=
@XVFB_LIBS@
XVFB_SYS_LIBS
=
@XVFB_SYS_LIBS@
XWINMODULES_CFLAGS
=
@XWINMODULES_CFLAGS@
XWINMODULES_LIBS
=
@XWINMODULES_LIBS@
XWIN_LIBS
=
@XWIN_LIBS@
XWIN_SERVER_NAME
=
@XWIN_SERVER_NAME@
XWIN_SYS_LIBS
=
@XWIN_SYS_LIBS@
YACC
=
@YACC@
YFLAGS
=
@YFLAGS@
__XCONFIGFILE__
=
@__XCONFIGFILE__@
abi_ansic
=
@abi_ansic@
abi_extension
=
@abi_extension@
abi_font
=
@abi_font@
abi_videodrv
=
@abi_videodrv@
abi_xinput
=
@abi_xinput@
abs_builddir
=
@abs_builddir@
abs_srcdir
=
@abs_srcdir@
abs_top_builddir
=
@abs_top_builddir@
abs_top_srcdir
=
@abs_top_srcdir@
ac_ct_CC
=
@ac_ct_CC@
ac_ct_CXX
=
@ac_ct_CXX@
ac_ct_F77
=
@ac_ct_F77@
am__include
=
@am__include@
am__leading_dot
=
@am__leading_dot@
am__quote
=
@am__quote@
am__tar
=
@am__tar@
am__untar
=
@am__untar@
bindir
=
@bindir@
build
=
@build@
build_alias
=
@build_alias@
build_cpu
=
@build_cpu@
build_os
=
@build_os@
build_vendor
=
@build_vendor@
builddir
=
@builddir@
datadir
=
@datadir@
datarootdir
=
@datarootdir@
docdir
=
@docdir@
driverdir
=
@driverdir@
dvidir
=
@dvidir@
exec_prefix
=
@exec_prefix@
extdir
=
@extdir@
ft_config
=
@ft_config@
host
=
@host@
host_alias
=
@host_alias@
host_cpu
=
@host_cpu@
host_os
=
@host_os@
host_vendor
=
@host_vendor@
htmldir
=
@htmldir@
includedir
=
@includedir@
infodir
=
@infodir@
install_sh
=
@install_sh@
launchagentsdir
=
@launchagentsdir@
libdir
=
@libdir@
libexecdir
=
@libexecdir@
localedir
=
@localedir@
localstatedir
=
@localstatedir@
logdir
=
@logdir@
mandir
=
@mandir@
mkdir_p
=
@mkdir_p@
moduledir
=
@moduledir@
oldincludedir
=
@oldincludedir@
pdfdir
=
@pdfdir@
prefix
=
@prefix@
program_transform_name
=
@program_transform_name@
psdir
=
@psdir@
sbindir
=
@sbindir@
sdkdir
=
@sdkdir@
sharedstatedir
=
@sharedstatedir@
srcdir
=
@srcdir@
sysconfdir
=
@sysconfdir@
target_alias
=
@target_alias@
top_build_prefix
=
@top_build_prefix@
top_builddir
=
@top_builddir@
top_srcdir
=
@top_srcdir@
xglmoduledir
=
@xglmoduledir@
xpconfigdir
=
@xpconfigdir@
noinst_LTLIBRARIES
=
librandr.la
AM_CFLAGS
=
$(DIX_CFLAGS)
XINERAMA_SRCS
=
rrxinerama.c
@XORG_TRUE@
sdk_HEADERS
=
randrstr.h
librandr_la_SOURCES
=
mirandr.c randr.c randrstr.h rrcrtc.c
\
rrdispatch.c rrinfo.c rrmode.c rroutput.c rrpointer.c
\
rrproperty.c rrscreen.c rrsdispatch.c
$(am__append_1)
all
:
all-am
.SUFFIXES
:
.SUFFIXES
:
.c .lo .o .obj
$(srcdir)/Makefile.in
:
@MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@
for
dep
in
$?
;
do
\
case
'
$(am__configure_deps)
'
in
\
*
$$
dep
*
)
\
cd
$(top_builddir)
&&
$(MAKE)
$(AM_MAKEFLAGS)
am--refresh
\
&&
exit
0
;
\
exit
1
;;
\
esac
;
\
done
;
\
echo
' cd
$(top_srcdir)
&&
$(AUTOMAKE)
--foreign randr/Makefile'
;
\
cd
$(top_srcdir)
&&
\
$(AUTOMAKE)
--foreign
randr/Makefile
.PRECIOUS
:
Makefile
Makefile
:
$(srcdir)/Makefile.in $(top_builddir)/config.status
@
case
'$?'
in
\
*
config.status
*
)
\
cd
$(top_builddir)
&&
$(MAKE)
$(AM_MAKEFLAGS)
am--refresh
;;
\
*
)
\
echo
' cd
$(top_builddir)
&&
$(SHELL)
./config.status
$(subdir)
/$@
$(am__depfiles_maybe)
'
;
\
cd
$(top_builddir)
&&
$(SHELL)
./config.status
$(subdir)
/
$@
$(am__depfiles_maybe)
;;
\
esac
;
$(top_builddir)/config.status
:
$(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd
$(top_builddir)
&&
$(MAKE)
$(AM_MAKEFLAGS)
am--refresh
$(top_srcdir)/configure
:
@MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd
$(top_builddir)
&&
$(MAKE)
$(AM_MAKEFLAGS)
am--refresh
$(ACLOCAL_M4)
:
@MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd
$(top_builddir)
&&
$(MAKE)
$(AM_MAKEFLAGS)
am--refresh
clean-noinstLTLIBRARIES
:
-
test
-z
"
$(noinst_LTLIBRARIES)
"
||
rm
-f
$(noinst_LTLIBRARIES)
@
list
=
'
$(noinst_LTLIBRARIES)
'
;
for
p
in
$$
list
;
do
\
dir
=
"
`
echo
$$
p |
sed
-e
's|/[^/]*$$||'
`
"
;
\
test
"
$$
dir"
!=
"
$$
p"
||
dir
=
.
;
\
echo
"rm -f
\"
$$
{dir}/so_locations
\"
"
;
\
rm
-f
"
$$
{dir}/so_locations"
;
\
done
librandr.la
:
$(librandr_la_OBJECTS) $(librandr_la_DEPENDENCIES)
$(LINK)
$(librandr_la_OBJECTS)
$(librandr_la_LIBADD)
$(LIBS)
mostlyclean-compile
:
-
rm
-f
*
.
$(OBJEXT)
distclean-compile
:
-
rm
-f
*
.tab.c
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/mirandr.Plo@am__quote@
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/randr.Plo@am__quote@
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/rrcrtc.Plo@am__quote@
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/rrdispatch.Plo@am__quote@
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/rrinfo.Plo@am__quote@
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/rrmode.Plo@am__quote@
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/rroutput.Plo@am__quote@
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/rrpointer.Plo@am__quote@
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/rrproperty.Plo@am__quote@
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/rrscreen.Plo@am__quote@
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/rrsdispatch.Plo@am__quote@
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/rrxinerama.Plo@am__quote@
.c.o
:
@am__fastdepCC_TRUE@
$(COMPILE)
-MT
$@
-MD
-MP
-MF
$(DEPDIR)/$*.Tpo
-c
-o
$@
$<
@am__fastdepCC_TRUE@
mv
-f
$(DEPDIR)/$*.Tpo
$(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@
source
=
'$<'
object
=
'$@'
libtool
=
no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@
DEPDIR
=
$(DEPDIR)
$(CCDEPMODE)
$(depcomp)
@AMDEPBACKSLASH@
@am__fastdepCC_FALSE@
$(COMPILE)
-c
$<
.c.obj
:
@am__fastdepCC_TRUE@
$(COMPILE)
-MT
$@
-MD
-MP
-MF
$(DEPDIR)/$*.Tpo
-c
-o
$@
`$(CYGPATH_W)
'$<'
`
@am__fastdepCC_TRUE@
mv
-f
$(DEPDIR)/$*.Tpo
$(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@
source
=
'$<'
object
=
'$@'
libtool
=
no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@
DEPDIR
=
$(DEPDIR)
$(CCDEPMODE)
$(depcomp)
@AMDEPBACKSLASH@
@am__fastdepCC_FALSE@
$(COMPILE)
-c
`$(CYGPATH_W)
'$<'
`
.c.lo
:
@am__fastdepCC_TRUE@
$(LTCOMPILE)
-MT
$@
-MD
-MP
-MF
$(DEPDIR)/$*.Tpo
-c
-o
$@
$<
@am__fastdepCC_TRUE@
mv
-f
$(DEPDIR)/$*.Tpo
$(DEPDIR)/$*.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@
source
=
'$<'
object
=
'$@'
libtool
=
yes
@AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@
DEPDIR
=
$(DEPDIR)
$(CCDEPMODE)
$(depcomp)
@AMDEPBACKSLASH@
@am__fastdepCC_FALSE@
$(LTCOMPILE)
-c
-o
$@
$<
mostlyclean-libtool
:
-
rm
-f
*
.lo
clean-libtool
:
-
rm
-rf
.libs _libs
install-sdkHEADERS
:
$(sdk_HEADERS)
@
$(NORMAL_INSTALL)
test
-z
"
$(sdkdir)
"
||
$(MKDIR_P)
"
$(DESTDIR)$(sdkdir)
"
@
list
=
'
$(sdk_HEADERS)
'
;
for
p
in
$$
list
;
do
\
if
test
-f
"
$$
p"
;
then
d
=
;
else
d
=
"
$(srcdir)
/"
;
fi
;
\
f
=
$(am__strip_dir)
\
echo
"
$(sdkHEADERS_INSTALL)
'
$$
d
$$
p' '
$(DESTDIR)$(sdkdir)
/
$$
f'"
;
\
$(sdkHEADERS_INSTALL)
"
$$
d
$$
p"
"
$(DESTDIR)$(sdkdir)
/
$$
f"
;
\
done
uninstall-sdkHEADERS
:
@
$(NORMAL_UNINSTALL)
@
list
=
'
$(sdk_HEADERS)
'
;
for
p
in
$$
list
;
do
\
f
=
$(am__strip_dir)
\
echo
" rm -f '
$(DESTDIR)$(sdkdir)
/
$$
f'"
;
\
rm
-f
"
$(DESTDIR)$(sdkdir)
/
$$
f"
;
\
done
ID
:
$(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list
=
'
$(SOURCES)
$(HEADERS)
$(LISP)
$(TAGS_FILES)
'
;
\
unique
=
`
for
i
in
$$
list
;
do
\
if
test
-f
"
$$
i"
;
then
echo
$$
i
;
else
echo
$(srcdir)
/
$$
i
;
fi
;
\
done
|
\
$(AWK)
'{ files[$$0] = 1; nonemtpy = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'
`
;
\
mkid
-fID
$$
unique
tags
:
TAGS
TAGS
:
$(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES)
\
$(TAGS_FILES) $(LISP)
tags
=
;
\
here
=
`
pwd
`
;
\
list
=
'
$(SOURCES)
$(HEADERS)
$(LISP)
$(TAGS_FILES)
'
;
\
unique
=
`
for
i
in
$$
list
;
do
\
if
test
-f
"
$$
i"
;
then
echo
$$
i
;
else
echo
$(srcdir)
/
$$
i
;
fi
;
\
done
|
\
$(AWK)
'{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'
`
;
\
if
test
-z
"
$(ETAGS_ARGS)$$
tags
$$
unique"
;
then
:
;
else
\
test
-n
"
$$
unique"
||
unique
=
$$
empty_fix
;
\
$(ETAGS)
$(ETAGSFLAGS)
$(AM_ETAGSFLAGS)
$(ETAGS_ARGS)
\
$$
tags
$$
unique
;
\
fi
ctags
:
CTAGS
CTAGS
:
$(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES)
\
$(TAGS_FILES) $(LISP)
tags
=
;
\
list
=
'
$(SOURCES)
$(HEADERS)
$(LISP)
$(TAGS_FILES)
'
;
\
unique
=
`
for
i
in
$$
list
;
do
\
if
test
-f
"
$$
i"
;
then
echo
$$
i
;
else
echo
$(srcdir)
/
$$
i
;
fi
;
\
done
|
\
$(AWK)
'{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'
`
;
\
test
-z
"
$(CTAGS_ARGS)$$
tags
$$
unique"
\
||
$(CTAGS)
$(CTAGSFLAGS)
$(AM_CTAGSFLAGS)
$(CTAGS_ARGS)
\
$$
tags
$$
unique
GTAGS
:
here
=
`
$(am__cd)
$(top_builddir)
&&
pwd
`
\
&&
cd
$(top_srcdir)
\
&&
gtags
-i
$(GTAGS_ARGS)
$$
here
distclean-tags
:
-
rm
-f
TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir
:
$(DISTFILES)
@
srcdirstrip
=
`
echo
"
$(srcdir)
"
|
sed
's/[].[^$$\\*]/\\\\&/g'
`
;
\
topsrcdirstrip
=
`
echo
"
$(top_srcdir)
"
|
sed
's/[].[^$$\\*]/\\\\&/g'
`
;
\
list
=
'
$(DISTFILES)
'
;
\
dist_files
=
`
for
file
in
$$
list
;
do
echo
$$
file
;
done
|
\
sed
-e
"s|^
$$
srcdirstrip/||;t"
\
-e
"s|^
$$
topsrcdirstrip/|
$(top_builddir)
/|;t"
`
;
\
case
$$
dist_files
in
\
*
/
*
)
$(MKDIR_P)
`
echo
"
$$
dist_files"
|
\
sed
'/\//!d;s|^|
$(distdir)
/|;s,/[^/]*$$,,'
|
\
sort
-u
`
;;
\
esac
;
\
for
file
in
$$
dist_files
;
do
\
if
test
-f
$$
file
||
test
-d
$$
file
;
then
d
=
.
;
else
d
=
$(srcdir)
;
fi
;
\
if
test
-d
$$
d/
$$
file
;
then
\
dir
=
`
echo
"/
$$
file"
|
sed
-e
's,/[^/]*$$,,'
`
;
\
if
test
-d
$(srcdir)
/
$$
file
&&
test
$$
d
!=
$(srcdir)
;
then
\
cp
-pR
$(srcdir)
/
$$
file
$(distdir)$$
dir
||
exit
1
;
\
fi
;
\
cp
-pR
$$
d/
$$
file
$(distdir)$$
dir
||
exit
1
;
\
else
\
test
-f
$(distdir)
/
$$
file
\
||
cp
-p
$$
d/
$$
file
$(distdir)
/
$$
file
\
||
exit
1
;
\
fi
;
\
done
check-am
:
all-am
check
:
check-am
all-am
:
Makefile $(LTLIBRARIES) $(HEADERS)
installdirs
:
for
dir
in
"
$(DESTDIR)$(sdkdir)
"
;
do
\
test
-z
"
$$
dir"
||
$(MKDIR_P)
"
$$
dir"
;
\
done
install
:
install-am
install-exec
:
install-exec-am
install-data
:
install-data-am
uninstall
:
uninstall-am
install-am
:
all-am
@
$(MAKE)
$(AM_MAKEFLAGS)
install-exec-am install-data-am
installcheck
:
installcheck-am
install-strip
:
$(MAKE)
$(AM_MAKEFLAGS)
INSTALL_PROGRAM
=
"
$(INSTALL_STRIP_PROGRAM)
"
\
install_sh_PROGRAM
=
"
$(INSTALL_STRIP_PROGRAM)
"
INSTALL_STRIP_FLAG
=
-s
\
`
test
-z
'
$(STRIP)
'
||
\
echo
"INSTALL_PROGRAM_ENV=STRIPPROG='
$(STRIP)
'"
`
install
mostlyclean-generic
:
clean-generic
:
distclean-generic
:
-
test
-z
"
$(CONFIG_CLEAN_FILES)
"
||
rm
-f
$(CONFIG_CLEAN_FILES)
maintainer-clean-generic
:
@
echo
"This command is intended for maintainers to use"
@
echo
"it deletes files that may require special tools to rebuild."
clean
:
clean-am
clean-am
:
clean-generic clean-libtool clean-noinstLTLIBRARIES
\
mostlyclean-am
distclean
:
distclean-am
-
rm
-rf
./
$(DEPDIR)
-
rm
-f
Makefile
distclean-am
:
clean-am distclean-compile distclean-generic
\
distclean-tags
dvi
:
dvi-am
dvi-am
:
html
:
html-am
info
:
info-am
info-am
:
install-data-am
:
install-sdkHEADERS
install-dvi
:
install-dvi-am
install-exec-am
:
install-html
:
install-html-am
install-info
:
install-info-am
install-man
:
install-pdf
:
install-pdf-am
install-ps
:
install-ps-am
installcheck-am
:
maintainer-clean
:
maintainer-clean-am
-
rm
-rf
./
$(DEPDIR)
-
rm
-f
Makefile
maintainer-clean-am
:
distclean-am maintainer-clean-generic
mostlyclean
:
mostlyclean-am
mostlyclean-am
:
mostlyclean-compile mostlyclean-generic
\
mostlyclean-libtool
pdf
:
pdf-am
pdf-am
:
ps
:
ps-am
ps-am
:
uninstall-am
:
uninstall-sdkHEADERS
.MAKE
:
install-am install-strip
.PHONY
:
CTAGS GTAGS all all-am check check-am clean clean-generic
\
clean-libtool clean-noinstLTLIBRARIES ctags distclean
\
distclean-compile distclean-generic distclean-libtool
\
distclean-tags distdir dvi dvi-am html html-am info info-am
\
install install-am install-data install-data-am install-dvi
\
install-dvi-am install-exec install-exec-am install-html
\
install-html-am install-info install-info-am install-man
\
install-pdf install-pdf-am install-ps install-ps-am
\
install-sdkHEADERS install-strip installcheck installcheck-am
\
installdirs maintainer-clean maintainer-clean-generic
\
mostlyclean mostlyclean-compile mostlyclean-generic
\
mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall
\
uninstall-am uninstall-sdkHEADERS
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT
:
nx-X11/programs/Xserver/randr/mirandr.c
View file @
15cee47a
/*
* $XFree86: xc/programs/Xserver/randr/mirandr.c,v 1.5 2001/06/04 09:45:40 keithp Exp $
*
* Copyright © 2000, Compaq Computer Corporation,
* Copyright © 2002, Hewlett Packard, Inc.
* Copyright © 2000 Compaq Computer Corporation
* Copyright © 2002 Hewlett-Packard Company
* Copyright © 2006 Intel Corporation
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
*
copyright notice and this permission notice appear in supporting
*
documentation, and that the name of Compaq or HP not be used in advertising
*
or
publicity pertaining to distribution of the software without specific,
* written prior permission.
HP makes no representations about the
*
suitability of this software for any purpose. It is provided "as is"
* without express or implied warranty.
* the above copyright notice appear in all copies and that both that
copyright
*
notice and this permission notice appear in supporting documentation, and
*
that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission.
The copyright holders make no representations
*
about the suitability of this software for any purpose. It is provided "as
*
is"
without express or implied warranty.
*
* HP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL HP
* BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*
* Author: Jim Gettys, HP Labs, Hewlett-Packard, Inc.
* Author: Jim Gettys, Hewlett-Packard Company, Inc.
* Keith Packard, Intel Corporation
*/
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#include "scrnintstr.h"
#include "mi.h"
#include <X11/extensions/randr.h>
#include "randrstr.h"
#include <stdio.h>
/*
* This function assumes that only a single depth can be
* displayed at a time, but that all visuals of that depth
* can be displayed simultaneously. It further assumes that
* only a single size is available. Hardware providing
* additional capabilties should use different code.
* XXX what to do here....
*/
Bool
miRRGetInfo
(
ScreenPtr
pScreen
,
Rotation
*
rotations
)
{
int
i
;
Bool
setConfig
=
FALSE
;
*
rotations
=
RR_Rotate_0
;
for
(
i
=
0
;
i
<
pScreen
->
numDepths
;
i
++
)
{
if
(
pScreen
->
allowedDepths
[
i
].
numVids
)
{
RRScreenSizePtr
pSize
;
pSize
=
RRRegisterSize
(
pScreen
,
pScreen
->
width
,
pScreen
->
height
,
pScreen
->
mmWidth
,
pScreen
->
mmHeight
);
if
(
!
pSize
)
return
FALSE
;
if
(
!
setConfig
)
{
RRSetCurrentConfig
(
pScreen
,
RR_Rotate_0
,
0
,
pSize
);
setConfig
=
TRUE
;
}
}
}
return
TRUE
;
}
...
...
@@ -79,24 +45,110 @@ miRRGetInfo (ScreenPtr pScreen, Rotation *rotations)
* different here
*/
Bool
miRRSetConfig
(
ScreenPtr
pScreen
,
miRRCrtcSet
(
ScreenPtr
pScreen
,
RRCrtcPtr
crtc
,
RRModePtr
mode
,
int
x
,
int
y
,
Rotation
rotation
,
int
rate
,
RRScreenSizePtr
pSize
)
int
numOutput
,
RROutputPtr
*
outputs
)
{
return
TRUE
;
}
static
Bool
miRRCrtcSetGamma
(
ScreenPtr
pScreen
,
RRCrtcPtr
crtc
)
{
return
TRUE
;
}
Bool
miRROutputSetProperty
(
ScreenPtr
pScreen
,
RROutputPtr
output
,
Atom
property
,
RRPropertyValuePtr
value
)
{
return
TRUE
;
}
Bool
miRROutputValidateMode
(
ScreenPtr
pScreen
,
RROutputPtr
output
,
RRModePtr
mode
)
{
return
FALSE
;
}
void
miRRModeDestroy
(
ScreenPtr
pScreen
,
RRModePtr
mode
)
{
}
/*
* This function assumes that only a single depth can be
* displayed at a time, but that all visuals of that depth
* can be displayed simultaneously. It further assumes that
* only a single size is available. Hardware providing
* additional capabilties should use different code.
* XXX what to do here....
*/
Bool
miRandRInit
(
ScreenPtr
pScreen
)
{
rrScrPrivPtr
rp
;
rrScrPrivPtr
pScrPriv
;
#if RANDR_12_INTERFACE
RRModePtr
mode
;
RRCrtcPtr
crtc
;
RROutputPtr
output
;
xRRModeInfo
modeInfo
;
char
name
[
64
];
#endif
if
(
!
RRScreenInit
(
pScreen
))
return
FALSE
;
rp
=
rrGetScrPriv
(
pScreen
);
rp
->
rrGetInfo
=
miRRGetInfo
;
rp
->
rrSetConfig
=
miRRSetConfig
;
pScrPriv
=
rrGetScrPriv
(
pScreen
);
pScrPriv
->
rrGetInfo
=
miRRGetInfo
;
#if RANDR_12_INTERFACE
pScrPriv
->
rrCrtcSet
=
miRRCrtcSet
;
pScrPriv
->
rrCrtcSetGamma
=
miRRCrtcSetGamma
;
pScrPriv
->
rrOutputSetProperty
=
miRROutputSetProperty
;
pScrPriv
->
rrOutputValidateMode
=
miRROutputValidateMode
;
pScrPriv
->
rrModeDestroy
=
miRRModeDestroy
;
RRScreenSetSizeRange
(
pScreen
,
pScreen
->
width
,
pScreen
->
height
,
pScreen
->
width
,
pScreen
->
height
);
sprintf
(
name
,
"%dx%d"
,
pScreen
->
width
,
pScreen
->
height
);
memset
(
&
modeInfo
,
'\0'
,
sizeof
(
modeInfo
));
modeInfo
.
width
=
pScreen
->
width
;
modeInfo
.
height
=
pScreen
->
height
;
modeInfo
.
nameLength
=
strlen
(
name
);
mode
=
RRModeGet
(
&
modeInfo
,
name
);
if
(
!
mode
)
return
FALSE
;
crtc
=
RRCrtcCreate
(
pScreen
,
NULL
);
if
(
!
crtc
)
return
FALSE
;
output
=
RROutputCreate
(
pScreen
,
"screen"
,
6
,
NULL
);
if
(
!
output
)
return
FALSE
;
if
(
!
RROutputSetClones
(
output
,
NULL
,
0
))
return
FALSE
;
if
(
!
RROutputSetModes
(
output
,
&
mode
,
1
,
0
))
return
FALSE
;
if
(
!
RROutputSetCrtcs
(
output
,
&
crtc
,
1
))
return
FALSE
;
if
(
!
RROutputSetConnection
(
output
,
RR_Connected
))
return
FALSE
;
RRCrtcNotify
(
crtc
,
mode
,
0
,
0
,
RR_Rotate_0
,
1
,
&
output
);
#endif
return
TRUE
;
}
nx-X11/programs/Xserver/randr/panoramiXproto.h
0 → 100644
View file @
15cee47a
/* $Xorg: panoramiXproto.h,v 1.4 2000/08/18 04:05:45 coskrey Exp $ */
/*****************************************************************
Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of Digital Equipment Corporation
shall not be used in advertising or otherwise to promote the sale, use or other
dealings in this Software without prior written authorization from Digital
Equipment Corporation.
******************************************************************/
/* $XFree86: xc/include/extensions/panoramiXproto.h,v 3.5 2000/03/01 01:04:21 dawes Exp $ */
/* THIS IS NOT AN X PROJECT TEAM SPECIFICATION */
#ifndef _PANORAMIXPROTO_H_
#define _PANORAMIXPROTO_H_
#define PANORAMIX_PROTOCOL_NAME "XINERAMA"
#define X_PanoramiXQueryVersion 0
#define X_PanoramiXGetState 1
#define X_PanoramiXGetScreenCount 2
#define X_PanoramiXGetScreenSize 3
#define X_XineramaIsActive 4
#define X_XineramaQueryScreens 5
typedef
struct
_PanoramiXQueryVersion
{
CARD8
reqType
;
/* always PanoramiXReqCode */
CARD8
panoramiXReqType
;
/* always X_PanoramiXQueryVersion */
CARD16
length
B16
;
CARD8
clientMajor
;
CARD8
clientMinor
;
CARD16
unused
B16
;
}
xPanoramiXQueryVersionReq
;
#define sz_xPanoramiXQueryVersionReq 8
typedef
struct
{
CARD8
type
;
/* must be X_Reply */
CARD8
pad1
;
/* unused */
CARD16
sequenceNumber
B16
;
/* last sequence number */
CARD32
length
B32
;
/* 0 */
CARD16
majorVersion
B16
;
CARD16
minorVersion
B16
;
CARD32
pad2
B32
;
/* unused */
CARD32
pad3
B32
;
/* unused */
CARD32
pad4
B32
;
/* unused */
CARD32
pad5
B32
;
/* unused */
CARD32
pad6
B32
;
/* unused */
}
xPanoramiXQueryVersionReply
;
#define sz_xPanoramiXQueryVersionReply 32
typedef
struct
_PanoramiXGetState
{
CARD8
reqType
;
/* always PanoramiXReqCode */
CARD8
panoramiXReqType
;
/* always X_PanoramiXGetState */
CARD16
length
B16
;
CARD32
window
B32
;
}
xPanoramiXGetStateReq
;
#define sz_xPanoramiXGetStateReq 8
typedef
struct
{
BYTE
type
;
BYTE
state
;
CARD16
sequenceNumber
B16
;
CARD32
length
B32
;
CARD32
window
B32
;
CARD32
pad1
B32
;
/* unused */
CARD32
pad2
B32
;
/* unused */
CARD32
pad3
B32
;
/* unused */
CARD32
pad4
B32
;
/* unused */
CARD32
pad5
B32
;
/* unused */
}
xPanoramiXGetStateReply
;
#define sz_panoramiXGetStateReply 32
typedef
struct
_PanoramiXGetScreenCount
{
CARD8
reqType
;
/* always PanoramiXReqCode */
CARD8
panoramiXReqType
;
/* always X_PanoramiXGetScreenCount */
CARD16
length
B16
;
CARD32
window
B32
;
}
xPanoramiXGetScreenCountReq
;
#define sz_xPanoramiXGetScreenCountReq 8
typedef
struct
{
BYTE
type
;
BYTE
ScreenCount
;
CARD16
sequenceNumber
B16
;
CARD32
length
B32
;
CARD32
window
B32
;
CARD32
pad1
B32
;
/* unused */
CARD32
pad2
B32
;
/* unused */
CARD32
pad3
B32
;
/* unused */
CARD32
pad4
B32
;
/* unused */
CARD32
pad5
B32
;
/* unused */
}
xPanoramiXGetScreenCountReply
;
#define sz_panoramiXGetScreenCountReply 32
typedef
struct
_PanoramiXGetScreenSize
{
CARD8
reqType
;
/* always PanoramiXReqCode */
CARD8
panoramiXReqType
;
/* always X_PanoramiXGetState */
CARD16
length
B16
;
CARD32
window
B32
;
CARD32
screen
B32
;
}
xPanoramiXGetScreenSizeReq
;
#define sz_xPanoramiXGetScreenSizeReq 12
typedef
struct
{
BYTE
type
;
CARD8
pad1
;
CARD16
sequenceNumber
B16
;
CARD32
length
B32
;
CARD32
width
B32
;
CARD32
height
B32
;
CARD32
window
B32
;
CARD32
screen
B32
;
CARD32
pad2
B32
;
/* unused */
CARD32
pad3
B32
;
/* unused */
}
xPanoramiXGetScreenSizeReply
;
#define sz_panoramiXGetScreenSizeReply 32
/************ Alternate protocol ******************/
typedef
struct
{
CARD8
reqType
;
CARD8
panoramiXReqType
;
CARD16
length
B16
;
}
xXineramaIsActiveReq
;
#define sz_xXineramaIsActiveReq 4
typedef
struct
{
BYTE
type
;
CARD8
pad1
;
CARD16
sequenceNumber
B16
;
CARD32
length
B32
;
CARD32
state
B32
;
CARD32
pad2
B32
;
CARD32
pad3
B32
;
CARD32
pad4
B32
;
CARD32
pad5
B32
;
CARD32
pad6
B32
;
}
xXineramaIsActiveReply
;
#define sz_XineramaIsActiveReply 32
typedef
struct
{
CARD8
reqType
;
CARD8
panoramiXReqType
;
CARD16
length
B16
;
}
xXineramaQueryScreensReq
;
#define sz_xXineramaQueryScreensReq 4
typedef
struct
{
BYTE
type
;
CARD8
pad1
;
CARD16
sequenceNumber
B16
;
CARD32
length
B32
;
CARD32
number
B32
;
CARD32
pad2
B32
;
CARD32
pad3
B32
;
CARD32
pad4
B32
;
CARD32
pad5
B32
;
CARD32
pad6
B32
;
}
xXineramaQueryScreensReply
;
#define sz_XineramaQueryScreensReply 32
typedef
struct
{
INT16
x_org
B16
;
INT16
y_org
B16
;
CARD16
width
B16
;
CARD16
height
B16
;
}
xXineramaScreenInfo
;
#define sz_XineramaScreenInfo 8
#endif
nx-X11/programs/Xserver/randr/panoramiXproto.h.NX.original
0 → 100644
View file @
15cee47a
/* $Xorg: panoramiXproto.h,v 1.4 2000/08/18 04:05:45 coskrey Exp $ */
/*****************************************************************
Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of Digital Equipment Corporation
shall not be used in advertising or otherwise to promote the sale, use or other
dealings in this Software without prior written authorization from Digital
Equipment Corporation.
******************************************************************/
/* $XFree86: xc/include/extensions/panoramiXproto.h,v 3.5 2000/03/01 01:04:21 dawes Exp $ */
/* THIS IS NOT AN X PROJECT TEAM SPECIFICATION */
#ifndef _PANORAMIXPROTO_H_
#define _PANORAMIXPROTO_H_
#define PANORAMIX_PROTOCOL_NAME "XINERAMA"
#define X_PanoramiXQueryVersion 0
#define X_PanoramiXGetState 1
#define X_PanoramiXGetScreenCount 2
#define X_PanoramiXGetScreenSize 3
#define X_XineramaIsActive 4
#define X_XineramaQueryScreens 5
typedef struct _PanoramiXQueryVersion {
CARD8 reqType; /* always PanoramiXReqCode */
CARD8 panoramiXReqType; /* always X_PanoramiXQueryVersion */
CARD16 length B16;
CARD8 clientMajor;
CARD8 clientMinor;
CARD16 unused B16;
} xPanoramiXQueryVersionReq;
#define sz_xPanoramiXQueryVersionReq 8
typedef struct {
CARD8 type; /* must be X_Reply */
CARD8 pad1; /* unused */
CARD16 sequenceNumber B16; /* last sequence number */
CARD32 length B32; /* 0 */
CARD16 majorVersion B16;
CARD16 minorVersion B16;
CARD32 pad2 B32; /* unused */
CARD32 pad3 B32; /* unused */
CARD32 pad4 B32; /* unused */
CARD32 pad5 B32; /* unused */
CARD32 pad6 B32; /* unused */
} xPanoramiXQueryVersionReply;
#define sz_xPanoramiXQueryVersionReply 32
typedef struct _PanoramiXGetState {
CARD8 reqType; /* always PanoramiXReqCode */
CARD8 panoramiXReqType; /* always X_PanoramiXGetState */
CARD16 length B16;
CARD32 window B32;
} xPanoramiXGetStateReq;
#define sz_xPanoramiXGetStateReq 8
typedef struct {
BYTE type;
BYTE state;
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD32 window B32;
CARD32 pad1 B32; /* unused */
CARD32 pad2 B32; /* unused */
CARD32 pad3 B32; /* unused */
CARD32 pad4 B32; /* unused */
CARD32 pad5 B32; /* unused */
} xPanoramiXGetStateReply;
#define sz_panoramiXGetStateReply 32
typedef struct _PanoramiXGetScreenCount {
CARD8 reqType; /* always PanoramiXReqCode */
CARD8 panoramiXReqType; /* always X_PanoramiXGetScreenCount */
CARD16 length B16;
CARD32 window B32;
} xPanoramiXGetScreenCountReq;
#define sz_xPanoramiXGetScreenCountReq 8
typedef struct {
BYTE type;
BYTE ScreenCount;
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD32 window B32;
CARD32 pad1 B32; /* unused */
CARD32 pad2 B32; /* unused */
CARD32 pad3 B32; /* unused */
CARD32 pad4 B32; /* unused */
CARD32 pad5 B32; /* unused */
} xPanoramiXGetScreenCountReply;
#define sz_panoramiXGetScreenCountReply 32
typedef struct _PanoramiXGetScreenSize {
CARD8 reqType; /* always PanoramiXReqCode */
CARD8 panoramiXReqType; /* always X_PanoramiXGetState */
CARD16 length B16;
CARD32 window B32;
CARD32 screen B32;
} xPanoramiXGetScreenSizeReq;
#define sz_xPanoramiXGetScreenSizeReq 12
typedef struct {
BYTE type;
CARD8 pad1;
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD32 width B32;
CARD32 height B32;
CARD32 window B32;
CARD32 screen B32;
CARD32 pad2 B32; /* unused */
CARD32 pad3 B32; /* unused */
} xPanoramiXGetScreenSizeReply;
#define sz_panoramiXGetScreenSizeReply 32
/************ Alternate protocol ******************/
typedef struct {
CARD8 reqType;
CARD8 panoramiXReqType;
CARD16 length B16;
} xXineramaIsActiveReq;
#define sz_xXineramaIsActiveReq 4
typedef struct {
BYTE type;
CARD8 pad1;
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD32 state B32;
CARD32 pad2 B32;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
} xXineramaIsActiveReply;
#define sz_XineramaIsActiveReply 32
typedef struct {
CARD8 reqType;
CARD8 panoramiXReqType;
CARD16 length B16;
} xXineramaQueryScreensReq;
#define sz_xXineramaQueryScreensReq 4
typedef struct {
BYTE type;
CARD8 pad1;
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD32 number B32;
CARD32 pad2 B32;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
} xXineramaQueryScreensReply;
#define sz_XineramaQueryScreensReply 32
typedef struct {
INT16 x_org B16;
INT16 y_org B16;
CARD16 width B16;
CARD16 height B16;
} xXineramaScreenInfo;
#define sz_XineramaScreenInfo 8
#endif
nx-X11/programs/Xserver/randr/panoramiXproto.h.X.original
0 → 100644
View file @
15cee47a
nx-X11/programs/Xserver/randr/randr.c
View file @
15cee47a
/*
* $XFree86: xc/programs/Xserver/randr/randr.c,v 1.21tsi Exp $
*
* Copyright © 2000, Compaq Computer Corporation,
* Copyright © 2002, Hewlett Packard, Inc.
* Copyright © 2000 Compaq Computer Corporation
* Copyright © 2002 Hewlett-Packard Company
* Copyright © 2006 Intel Corporation
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
*
copyright notice and this permission notice appear in supporting
*
documentation, and that the name of Compaq or HP not be used in advertising
*
or
publicity pertaining to distribution of the software without specific,
* written prior permission.
HP makes no representations about the
*
suitability of this software for any purpose. It is provided "as is"
* without express or implied warranty.
* the above copyright notice appear in all copies and that both that
copyright
*
notice and this permission notice appear in supporting documentation, and
*
that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission.
The copyright holders make no representations
*
about the suitability of this software for any purpose. It is provided "as
*
is"
without express or implied warranty.
*
* HP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL HP
* BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*
* Author: Jim Gettys, HP Labs, Hewlett-Packard, Inc.
*/
* Author: Jim Gettys, Hewlett-Packard Company, Inc.
* Keith Packard, Intel Corporation
*/
/**************************************************************************/
/* */
/* Copyright (c) 2001, 2011 NoMachine, http://www.nomachine.com/. */
/* */
/* NX-X11, NX protocol compression and NX extensions to this software */
/* are copyright of NoMachine. Redistribution and use of the present */
/* software is allowed according to terms specified in the file LICENSE */
/* which comes in the source distribution. */
/* */
/* Check http://www.nomachine.com/licensing.html for applicability. */
/* */
/* NX and NoMachine are trademarks of Medialogic S.p.A. */
/* */
/* All rights reserved. */
/* */
/**************************************************************************/
#define NEED_REPLIES
#define NEED_EVENTS
...
...
@@ -31,28 +48,7 @@
#include <dix-config.h>
#endif
#include <X11/X.h>
#include <X11/Xproto.h>
#include "misc.h"
#include "os.h"
#include "dixstruct.h"
#include "resource.h"
#include "scrnintstr.h"
#include "windowstr.h"
#include "pixmapstr.h"
#include "extnsionst.h"
#include "servermd.h"
#include <X11/extensions/randr.h>
#include <X11/extensions/randrproto.h>
#include "randrstr.h"
#ifdef RENDER
#include <X11/extensions/render.h>
/* we share subpixel order information */
#include "picturestr.h"
#endif
#include <X11/Xfuncproto.h>
#ifdef EXTMODULE
#include "xf86_ansic.h"
#endif
/* From render.h */
#ifndef SubPixelUnknown
...
...
@@ -60,13 +56,7 @@
#endif
#define RR_VALIDATE
int
RRGeneration
;
int
RRNScreens
;
static
int
ProcRRQueryVersion
(
ClientPtr
pClient
);
static
int
ProcRRDispatch
(
ClientPtr
pClient
);
static
int
SProcRRDispatch
(
ClientPtr
pClient
);
static
int
SProcRRQueryVersion
(
ClientPtr
pClient
);
static
int
RRNScreens
;
#define wrap(priv,real,mem,func) {\
priv->mem = real->mem; \
...
...
@@ -77,56 +67,20 @@ static int SProcRRQueryVersion (ClientPtr pClient);
real->mem = priv->mem; \
}
#if 0
static CARD8 RRReqCode;
static int RRErrBase;
#endif
static
int
RREventBase
;
static
RESTYPE
ClientType
,
EventType
;
/* resource types for event masks */
static
int
RRClientPrivateIndex
;
typedef
struct
_RRTimes
{
TimeStamp
setTime
;
TimeStamp
configTime
;
}
RRTimesRec
,
*
RRTimesPtr
;
typedef
struct
_RRClient
{
int
major_version
;
int
minor_version
;
/* RRTimesRec times[0]; */
}
RRClientRec
,
*
RRClientPtr
;
/*
* each window has a list of clients requesting
* RRNotify events. Each client has a resource
* for each window it selects RRNotify input for,
* this resource is used to delete the RRNotifyRec
* entry from the per-window queue.
*/
typedef
struct
_RREvent
*
RREventPtr
;
static
int
ProcRRDispatch
(
ClientPtr
pClient
);
static
int
SProcRRDispatch
(
ClientPtr
pClient
);
typedef
struct
_RREvent
{
RREventPtr
next
;
ClientPtr
client
;
WindowPtr
window
;
XID
clientResource
;
int
mask
;
}
RREventRec
;
int
RREventBase
;
int
RRErrorBase
;
RESTYPE
RRClientType
,
RREventType
;
/* resource types for event masks */
#ifndef NXAGENT_SERVER
DevPrivateKey
RRClientPrivateKey
=
&
RRClientPrivateKey
;
DevPrivateKey
rrPrivKey
=
&
rrPrivKey
;
#else
int
RRClientPrivateIndex
;
int
rrPrivIndex
=
-
1
;
#define GetRRClient(pClient) ((RRClientPtr) (pClient)->devPrivates[RRClientPrivateIndex].ptr)
#define rrClientPriv(pClient) RRClientPtr pRRClient = GetRRClient(pClient)
static
Bool
RRClientKnowsRates
(
ClientPtr
pClient
)
{
rrClientPriv
(
pClient
);
return
(
pRRClient
->
major_version
>
1
||
(
pRRClient
->
major_version
==
1
&&
pRRClient
->
minor_version
>=
1
));
}
#endif
static
void
RRClientCallback
(
CallbackListPtr
*
list
,
...
...
@@ -163,10 +117,14 @@ static Bool
RRCloseScreen
(
int
i
,
ScreenPtr
pScreen
)
{
rrScrPriv
(
pScreen
);
int
j
;
unwrap
(
pScrPriv
,
pScreen
,
CloseScreen
);
if
(
pScrPriv
->
pSizes
)
xfree
(
pScrPriv
->
pSizes
);
for
(
j
=
pScrPriv
->
numCrtcs
-
1
;
j
>=
0
;
j
--
)
RRCrtcDestroy
(
pScrPriv
->
crtcs
[
j
]);
for
(
j
=
pScrPriv
->
numOutputs
-
1
;
j
>=
0
;
j
--
)
RROutputDestroy
(
pScrPriv
->
outputs
[
j
]);
xfree
(
pScrPriv
);
RRNScreens
-=
1
;
/* ok, one fewer screen with RandR running */
return
(
*
pScreen
->
CloseScreen
)
(
i
,
pScreen
);
...
...
@@ -191,18 +149,105 @@ SRRScreenChangeNotifyEvent(xRRScreenChangeNotifyEvent *from,
cpswaps
(
from
->
subpixelOrder
,
to
->
subpixelOrder
);
}
Bool
RRScreenInit
(
ScreenPtr
pScreen
)
static
void
SRRCrtcChangeNotifyEvent
(
xRRCrtcChangeNotifyEvent
*
from
,
xRRCrtcChangeNotifyEvent
*
to
)
{
rrScrPrivPtr
pScrPriv
;
to
->
type
=
from
->
type
;
to
->
subCode
=
from
->
subCode
;
cpswaps
(
from
->
sequenceNumber
,
to
->
sequenceNumber
);
cpswapl
(
from
->
timestamp
,
to
->
timestamp
);
cpswapl
(
from
->
window
,
to
->
window
);
cpswapl
(
from
->
crtc
,
to
->
crtc
);
cpswapl
(
from
->
mode
,
to
->
mode
);
cpswapl
(
from
->
window
,
to
->
window
);
cpswaps
(
from
->
rotation
,
to
->
rotation
);
cpswaps
(
from
->
x
,
to
->
x
);
cpswaps
(
from
->
y
,
to
->
y
);
cpswaps
(
from
->
width
,
to
->
width
);
cpswaps
(
from
->
height
,
to
->
height
);
}
static
void
SRROutputChangeNotifyEvent
(
xRROutputChangeNotifyEvent
*
from
,
xRROutputChangeNotifyEvent
*
to
)
{
to
->
type
=
from
->
type
;
to
->
subCode
=
from
->
subCode
;
cpswaps
(
from
->
sequenceNumber
,
to
->
sequenceNumber
);
cpswapl
(
from
->
timestamp
,
to
->
timestamp
);
cpswapl
(
from
->
configTimestamp
,
to
->
configTimestamp
);
cpswapl
(
from
->
window
,
to
->
window
);
cpswapl
(
from
->
output
,
to
->
output
);
cpswapl
(
from
->
crtc
,
to
->
crtc
);
cpswapl
(
from
->
mode
,
to
->
mode
);
cpswaps
(
from
->
rotation
,
to
->
rotation
);
}
static
void
SRROutputPropertyNotifyEvent
(
xRROutputPropertyNotifyEvent
*
from
,
xRROutputPropertyNotifyEvent
*
to
)
{
to
->
type
=
from
->
type
;
to
->
subCode
=
from
->
subCode
;
cpswaps
(
from
->
sequenceNumber
,
to
->
sequenceNumber
);
cpswapl
(
from
->
window
,
to
->
window
);
cpswapl
(
from
->
output
,
to
->
output
);
cpswapl
(
from
->
atom
,
to
->
atom
);
cpswapl
(
from
->
timestamp
,
to
->
timestamp
);
}
static
void
SRRNotifyEvent
(
xEvent
*
from
,
xEvent
*
to
)
{
switch
(
from
->
u
.
u
.
detail
)
{
case
RRNotify_CrtcChange
:
SRRCrtcChangeNotifyEvent
((
xRRCrtcChangeNotifyEvent
*
)
from
,
(
xRRCrtcChangeNotifyEvent
*
)
to
);
break
;
case
RRNotify_OutputChange
:
SRROutputChangeNotifyEvent
((
xRROutputChangeNotifyEvent
*
)
from
,
(
xRROutputChangeNotifyEvent
*
)
to
);
break
;
case
RRNotify_OutputProperty
:
SRROutputPropertyNotifyEvent
((
xRROutputPropertyNotifyEvent
*
)
from
,
(
xRROutputPropertyNotifyEvent
*
)
to
);
break
;
default:
break
;
}
}
static
int
RRGeneration
;
Bool
RRInit
(
void
)
{
if
(
RRGeneration
!=
serverGeneration
)
{
#ifdef NXAGENT_SERVER
if
((
rrPrivIndex
=
AllocateScreenPrivateIndex
())
<
0
)
return
FALSE
;
#endif
if
(
!
RRModeInit
())
return
FALSE
;
if
(
!
RRCrtcInit
())
return
FALSE
;
if
(
!
RROutputInit
())
return
FALSE
;
RRGeneration
=
serverGeneration
;
}
return
TRUE
;
}
Bool
RRScreenInit
(
ScreenPtr
pScreen
)
{
rrScrPrivPtr
pScrPriv
;
pScrPriv
=
(
rrScrPrivPtr
)
xalloc
(
sizeof
(
rrScrPrivRec
));
if
(
!
RRInit
())
return
FALSE
;
pScrPriv
=
(
rrScrPrivPtr
)
xcalloc
(
1
,
sizeof
(
rrScrPrivRec
));
if
(
!
pScrPriv
)
return
FALSE
;
...
...
@@ -211,8 +256,31 @@ Bool RRScreenInit(ScreenPtr pScreen)
/*
* Calling function best set these function vectors
*/
pScrPriv
->
rrSetConfig
=
0
;
pScrPriv
->
rrGetInfo
=
0
;
pScrPriv
->
maxWidth
=
pScrPriv
->
minWidth
=
pScreen
->
width
;
pScrPriv
->
maxHeight
=
pScrPriv
->
minHeight
=
pScreen
->
height
;
pScrPriv
->
width
=
pScreen
->
width
;
pScrPriv
->
height
=
pScreen
->
height
;
pScrPriv
->
mmWidth
=
pScreen
->
mmWidth
;
pScrPriv
->
mmHeight
=
pScreen
->
mmHeight
;
#if RANDR_12_INTERFACE
pScrPriv
->
rrScreenSetSize
=
NULL
;
pScrPriv
->
rrCrtcSet
=
NULL
;
pScrPriv
->
rrCrtcSetGamma
=
NULL
;
#endif
#if RANDR_10_INTERFACE
pScrPriv
->
rrSetConfig
=
0
;
pScrPriv
->
rotations
=
RR_Rotate_0
;
pScrPriv
->
reqWidth
=
pScreen
->
width
;
pScrPriv
->
reqHeight
=
pScreen
->
height
;
pScrPriv
->
nSizes
=
0
;
pScrPriv
->
pSizes
=
NULL
;
pScrPriv
->
rotation
=
RR_Rotate_0
;
pScrPriv
->
rate
=
0
;
pScrPriv
->
size
=
0
;
#endif
/*
* This value doesn't really matter -- any client must call
* GetScreenInfo before reading it which will automatically update
...
...
@@ -223,14 +291,10 @@ Bool RRScreenInit(ScreenPtr pScreen)
wrap
(
pScrPriv
,
pScreen
,
CloseScreen
,
RRCloseScreen
);
pScrPriv
->
rotations
=
RR_Rotate_0
;
pScrPriv
->
nSizes
=
0
;
pScrPriv
->
nSizesInUse
=
0
;
pScrPriv
->
pSizes
=
0
;
pScrPriv
->
rotation
=
RR_Rotate_0
;
pScrPriv
->
size
=
-
1
;
pScrPriv
->
numOutputs
=
0
;
pScrPriv
->
outputs
=
NULL
;
pScrPriv
->
numCrtcs
=
0
;
pScrPriv
->
crtcs
=
NULL
;
RRNScreens
+=
1
;
/* keep count of screens that implement randr */
return
TRUE
;
...
...
@@ -246,7 +310,7 @@ RRFreeClient (pointer data, XID id)
pRREvent
=
(
RREventPtr
)
data
;
pWin
=
pRREvent
->
window
;
pHead
=
(
RREventPtr
*
)
LookupIDByType
(
pWin
->
drawable
.
id
,
EventType
);
pHead
=
(
RREventPtr
*
)
LookupIDByType
(
pWin
->
drawable
.
id
,
RR
EventType
);
if
(
pHead
)
{
pPrev
=
0
;
for
(
pCur
=
*
pHead
;
pCur
&&
pCur
!=
pRREvent
;
pCur
=
pCur
->
next
)
...
...
@@ -272,7 +336,7 @@ RRFreeEvents (pointer data, XID id)
pHead
=
(
RREventPtr
*
)
data
;
for
(
pCur
=
*
pHead
;
pCur
;
pCur
=
pNext
)
{
pNext
=
pCur
->
next
;
FreeResource
(
pCur
->
clientResource
,
ClientType
);
FreeResource
(
pCur
->
clientResource
,
RR
ClientType
);
xfree
((
pointer
)
pCur
);
}
xfree
((
pointer
)
pHead
);
...
...
@@ -286,34 +350,41 @@ RRExtensionInit (void)
if
(
RRNScreens
==
0
)
return
;
#ifndef NXAGENT_SERVER
if
(
!
dixRequestPrivate
(
RRClientPrivateKey
,
sizeof
(
RRClientRec
)
+
screenInfo
.
numScreens
*
sizeof
(
RRTimesRec
)))
return
;
#else
RRClientPrivateIndex
=
AllocateClientPrivateIndex
();
if
(
!
AllocateClientPrivate
(
RRClientPrivateIndex
,
sizeof
(
RRClientRec
)
+
screenInfo
.
numScreens
*
sizeof
(
RRTimesRec
)))
return
;
#endif
if
(
!
AddCallback
(
&
ClientStateCallback
,
RRClientCallback
,
0
))
return
;
ClientType
=
CreateNewResourceType
(
RRFreeClient
);
if
(
!
ClientType
)
RR
ClientType
=
CreateNewResourceType
(
RRFreeClient
);
if
(
!
RR
ClientType
)
return
;
EventType
=
CreateNewResourceType
(
RRFreeEvents
);
if
(
!
EventType
)
RR
EventType
=
CreateNewResourceType
(
RRFreeEvents
);
if
(
!
RR
EventType
)
return
;
extEntry
=
AddExtension
(
RANDR_NAME
,
RRNumberEvents
,
RRNumberErrors
,
ProcRRDispatch
,
SProcRRDispatch
,
RRResetProc
,
StandardMinorOpcode
);
if
(
!
extEntry
)
return
;
#if 0
RRReqCode = (CARD8) extEntry->base;
RRErrBase = extEntry->errorBase;
#endif
RRErrorBase
=
extEntry
->
errorBase
;
RREventBase
=
extEntry
->
eventBase
;
EventSwapVector
[
RREventBase
+
RRScreenChangeNotify
]
=
(
EventSwapPtr
)
SRRScreenChangeNotifyEvent
;
return
;
EventSwapVector
[
RREventBase
+
RRNotify
]
=
(
EventSwapPtr
)
SRRNotifyEvent
;
#ifdef PANORAMIX
RRXineramaExtensionInit
();
#endif
}
static
int
...
...
@@ -321,999 +392,130 @@ TellChanged (WindowPtr pWin, pointer value)
{
RREventPtr
*
pHead
,
pRREvent
;
ClientPtr
client
;
xRRScreenChangeNotifyEvent
se
;
ScreenPtr
pScreen
=
pWin
->
drawable
.
pScreen
;
rrScrPriv
(
pScreen
);
RRScreenSizePtr
pSize
;
WindowPtr
pRoot
=
WindowTable
[
pScreen
->
myNum
];
int
i
;
pHead
=
(
RREventPtr
*
)
LookupIDByType
(
pWin
->
drawable
.
id
,
EventType
);
pHead
=
(
RREventPtr
*
)
LookupIDByType
(
pWin
->
drawable
.
id
,
RR
EventType
);
if
(
!
pHead
)
return
WT_WALKCHILDREN
;
se
.
type
=
RRScreenChangeNotify
+
RREventBase
;
se
.
rotation
=
(
CARD8
)
pScrPriv
->
rotation
;
se
.
timestamp
=
pScrPriv
->
lastSetTime
.
milliseconds
;
se
.
configTimestamp
=
pScrPriv
->
lastConfigTime
.
milliseconds
;
se
.
root
=
pRoot
->
drawable
.
id
;
se
.
window
=
pWin
->
drawable
.
id
;
#ifdef RENDER
se
.
subpixelOrder
=
PictureGetSubpixelOrder
(
pScreen
);
#else
se
.
subpixelOrder
=
SubPixelUnknown
;
#endif
if
(
pScrPriv
->
size
>=
0
)
{
pSize
=
&
pScrPriv
->
pSizes
[
pScrPriv
->
size
];
se
.
sizeID
=
pSize
->
id
;
se
.
widthInPixels
=
pSize
->
width
;
se
.
heightInPixels
=
pSize
->
height
;
se
.
widthInMillimeters
=
pSize
->
mmWidth
;
se
.
heightInMillimeters
=
pSize
->
mmHeight
;
}
else
{
/*
* This "shouldn't happen", but a broken DDX can
* forget to set the current configuration on GetInfo
*/
se
.
sizeID
=
0xffff
;
se
.
widthInPixels
=
0
;
se
.
heightInPixels
=
0
;
se
.
widthInMillimeters
=
0
;
se
.
heightInMillimeters
=
0
;
}
for
(
pRREvent
=
*
pHead
;
pRREvent
;
pRREvent
=
pRREvent
->
next
)
{
client
=
pRREvent
->
client
;
if
(
client
==
serverClient
||
client
->
clientGone
)
continue
;
se
.
sequenceNumber
=
client
->
sequence
;
if
(
pRREvent
->
mask
&
RRScreenChangeNotifyMask
)
WriteEventsToClient
(
client
,
1
,
(
xEvent
*
)
&
se
);
}
return
WT_WALKCHILDREN
;
}
static
Bool
RRGetInfo
(
ScreenPtr
pScreen
)
{
rrScrPriv
(
pScreen
);
int
i
,
j
,
k
,
l
;
Bool
changed
;
Rotation
rotations
;
RRScreenSizePtr
pSize
;
RRScreenRatePtr
pRate
;
if
(
pRREvent
->
mask
&
RRScreenChangeNotifyMask
)
RRDeliverScreenEvent
(
client
,
pWin
,
pScreen
);
for
(
i
=
0
;
i
<
pScrPriv
->
nSizes
;
i
++
)
if
(
pRREvent
->
mask
&
RRCrtcChangeNotifyMask
)
{
pSize
=
&
pScrPriv
->
pSizes
[
i
];
pSize
->
oldReferenced
=
pSize
->
referenced
;
pSize
->
referenced
=
FALSE
;
for
(
k
=
0
;
k
<
pSize
->
nRates
;
k
++
)
for
(
i
=
0
;
i
<
pScrPriv
->
numCrtcs
;
i
++
)
{
pRate
=
&
pSize
->
pRates
[
k
];
pRate
->
oldReferenced
=
pRate
->
referenced
;
pRate
->
referenced
=
FALSE
;
RRCrtcPtr
crtc
=
pScrPriv
->
crtcs
[
i
];
if
(
crtc
->
changed
)
RRDeliverCrtcEvent
(
client
,
pWin
,
crtc
)
;
}
}
if
(
!
(
*
pScrPriv
->
rrGetInfo
)
(
pScreen
,
&
rotations
))
return
FALSE
;
changed
=
FALSE
;
/*
* Check whether anything changed and simultaneously generate
* the protocol id values for the objects
*/
if
(
rotations
!=
pScrPriv
->
rotations
)
if
(
pRREvent
->
mask
&
RROutputChangeNotifyMask
)
{
pScrPriv
->
rotations
=
rotations
;
changed
=
TRUE
;
}
j
=
0
;
for
(
i
=
0
;
i
<
pScrPriv
->
nSizes
;
i
++
)
for
(
i
=
0
;
i
<
pScrPriv
->
numOutputs
;
i
++
)
{
pSize
=
&
pScrPriv
->
pSizes
[
i
];
if
(
pSize
->
oldReferenced
!=
pSize
->
referenced
)
changed
=
TRUE
;
if
(
pSize
->
referenced
)
pSize
->
id
=
j
++
;
l
=
0
;
for
(
k
=
0
;
k
<
pSize
->
nRates
;
k
++
)
{
pRate
=
&
pSize
->
pRates
[
k
];
if
(
pRate
->
oldReferenced
!=
pRate
->
referenced
)
changed
=
TRUE
;
if
(
pRate
->
referenced
)
l
++
;
}
pSize
->
nRatesInUse
=
l
;
}
pScrPriv
->
nSizesInUse
=
j
;
if
(
changed
)
{
UpdateCurrentTime
();
pScrPriv
->
lastConfigTime
=
currentTime
;
WalkTree
(
pScreen
,
TellChanged
,
(
pointer
)
pScreen
);
RROutputPtr
output
=
pScrPriv
->
outputs
[
i
];
if
(
output
->
changed
)
RRDeliverOutputEvent
(
client
,
pWin
,
output
);
}
return
TRUE
;
}
static
void
RRSendConfigNotify
(
ScreenPtr
pScreen
)
{
WindowPtr
pWin
=
WindowTable
[
pScreen
->
myNum
];
xEvent
event
;
event
.
u
.
u
.
type
=
ConfigureNotify
;
event
.
u
.
configureNotify
.
window
=
pWin
->
drawable
.
id
;
event
.
u
.
configureNotify
.
aboveSibling
=
None
;
event
.
u
.
configureNotify
.
x
=
0
;
event
.
u
.
configureNotify
.
y
=
0
;
/* XXX xinerama stuff ? */
event
.
u
.
configureNotify
.
width
=
pWin
->
drawable
.
width
;
event
.
u
.
configureNotify
.
height
=
pWin
->
drawable
.
height
;
event
.
u
.
configureNotify
.
borderWidth
=
wBorderWidth
(
pWin
);
event
.
u
.
configureNotify
.
override
=
pWin
->
overrideRedirect
;
DeliverEvents
(
pWin
,
&
event
,
1
,
NullWindow
);
}
static
int
ProcRRQueryVersion
(
ClientPtr
client
)
{
xRRQueryVersionReply
rep
;
register
int
n
;
REQUEST
(
xRRQueryVersionReq
);
rrClientPriv
(
client
);
REQUEST_SIZE_MATCH
(
xRRQueryVersionReq
);
pRRClient
->
major_version
=
stuff
->
majorVersion
;
pRRClient
->
minor_version
=
stuff
->
minorVersion
;
rep
.
type
=
X_Reply
;
rep
.
length
=
0
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
majorVersion
=
RANDR_MAJOR
;
rep
.
minorVersion
=
RANDR_MINOR
;
if
(
client
->
swapped
)
{
swaps
(
&
rep
.
sequenceNumber
,
n
);
swapl
(
&
rep
.
length
,
n
);
swapl
(
&
rep
.
majorVersion
,
n
);
swapl
(
&
rep
.
minorVersion
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xRRQueryVersionReply
),
(
char
*
)
&
rep
);
return
(
client
->
noClientException
);
}
extern
char
*
ConnectionInfo
;
static
int
padlength
[
4
]
=
{
0
,
3
,
2
,
1
};
static
void
RREditConnectionInfo
(
ScreenPtr
pScreen
)
{
xConnSetup
*
connSetup
;
char
*
vendor
;
xPixmapFormat
*
formats
;
xWindowRoot
*
root
;
xDepth
*
depth
;
xVisualType
*
visual
;
int
screen
=
0
;
int
d
;
connSetup
=
(
xConnSetup
*
)
ConnectionInfo
;
vendor
=
(
char
*
)
connSetup
+
sizeof
(
xConnSetup
);
formats
=
(
xPixmapFormat
*
)
((
char
*
)
vendor
+
connSetup
->
nbytesVendor
+
padlength
[
connSetup
->
nbytesVendor
&
3
]);
root
=
(
xWindowRoot
*
)
((
char
*
)
formats
+
sizeof
(
xPixmapFormat
)
*
screenInfo
.
numPixmapFormats
);
while
(
screen
!=
pScreen
->
myNum
)
{
depth
=
(
xDepth
*
)
((
char
*
)
root
+
sizeof
(
xWindowRoot
));
for
(
d
=
0
;
d
<
root
->
nDepths
;
d
++
)
{
visual
=
(
xVisualType
*
)
((
char
*
)
depth
+
sizeof
(
xDepth
));
depth
=
(
xDepth
*
)
((
char
*
)
visual
+
depth
->
nVisuals
*
sizeof
(
xVisualType
));
}
root
=
(
xWindowRoot
*
)
((
char
*
)
depth
);
screen
++
;
}
root
->
pixWidth
=
pScreen
->
width
;
root
->
pixHeight
=
pScreen
->
height
;
root
->
mmWidth
=
pScreen
->
mmWidth
;
root
->
mmHeight
=
pScreen
->
mmHeight
;
return
WT_WALKCHILDREN
;
}
static
int
ProcRRGetScreenInfo
(
ClientPtr
client
)
{
REQUEST
(
xRRGetScreenInfoReq
);
xRRGetScreenInfoReply
rep
;
WindowPtr
pWin
;
int
n
;
ScreenPtr
pScreen
;
rrScrPrivPtr
pScrPriv
;
CARD8
*
extra
;
unsigned
long
extraLen
;
REQUEST_SIZE_MATCH
(
xRRGetScreenInfoReq
);
pWin
=
(
WindowPtr
)
SecurityLookupWindow
(
stuff
->
window
,
client
,
SecurityReadAccess
);
if
(
!
pWin
)
return
BadWindow
;
pScreen
=
pWin
->
drawable
.
pScreen
;
pScrPriv
=
rrGetScrPriv
(
pScreen
);
rep
.
pad
=
0
;
if
(
!
pScrPriv
)
{
rep
.
type
=
X_Reply
;
rep
.
setOfRotations
=
RR_Rotate_0
;;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
length
=
0
;
rep
.
root
=
WindowTable
[
pWin
->
drawable
.
pScreen
->
myNum
]
->
drawable
.
id
;
rep
.
timestamp
=
currentTime
.
milliseconds
;
rep
.
configTimestamp
=
currentTime
.
milliseconds
;
rep
.
nSizes
=
0
;
rep
.
sizeID
=
0
;
rep
.
rotation
=
RR_Rotate_0
;
rep
.
rate
=
0
;
rep
.
nrateEnts
=
0
;
extra
=
0
;
extraLen
=
0
;
}
else
{
int
i
,
j
;
xScreenSizes
*
size
;
CARD16
*
rates
;
CARD8
*
data8
;
Bool
has_rate
=
RRClientKnowsRates
(
client
);
RRGetInfo
(
pScreen
);
rep
.
type
=
X_Reply
;
rep
.
setOfRotations
=
pScrPriv
->
rotations
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
length
=
0
;
rep
.
root
=
WindowTable
[
pWin
->
drawable
.
pScreen
->
myNum
]
->
drawable
.
id
;
rep
.
timestamp
=
pScrPriv
->
lastSetTime
.
milliseconds
;
rep
.
configTimestamp
=
pScrPriv
->
lastConfigTime
.
milliseconds
;
rep
.
rotation
=
pScrPriv
->
rotation
;
rep
.
nSizes
=
pScrPriv
->
nSizesInUse
;
rep
.
rate
=
pScrPriv
->
rate
;
rep
.
nrateEnts
=
0
;
if
(
has_rate
)
{
for
(
i
=
0
;
i
<
pScrPriv
->
nSizes
;
i
++
)
{
RRScreenSizePtr
pSize
=
&
pScrPriv
->
pSizes
[
i
];
if
(
pSize
->
referenced
)
{
rep
.
nrateEnts
+=
(
1
+
pSize
->
nRatesInUse
);
}
}
}
if
(
pScrPriv
->
size
>=
0
)
rep
.
sizeID
=
pScrPriv
->
pSizes
[
pScrPriv
->
size
].
id
;
else
return
BadImplementation
;
extraLen
=
(
rep
.
nSizes
*
sizeof
(
xScreenSizes
)
+
rep
.
nrateEnts
*
sizeof
(
CARD16
));
extra
=
(
CARD8
*
)
xalloc
(
extraLen
);
if
(
!
extra
)
return
BadAlloc
;
/*
* First comes the size information
/*
* Something changed; send events and adjust pointer position
*/
size
=
(
xScreenSizes
*
)
extra
;
rates
=
(
CARD16
*
)
(
size
+
rep
.
nSizes
);
for
(
i
=
0
;
i
<
pScrPriv
->
nSizes
;
i
++
)
{
RRScreenSizePtr
pSize
=
&
pScrPriv
->
pSizes
[
i
];
if
(
pSize
->
referenced
)
{
size
->
widthInPixels
=
pSize
->
width
;
size
->
heightInPixels
=
pSize
->
height
;
size
->
widthInMillimeters
=
pSize
->
mmWidth
;
size
->
heightInMillimeters
=
pSize
->
mmHeight
;
if
(
client
->
swapped
)
{
swaps
(
&
size
->
widthInPixels
,
n
);
swaps
(
&
size
->
heightInPixels
,
n
);
swaps
(
&
size
->
widthInMillimeters
,
n
);
swaps
(
&
size
->
heightInMillimeters
,
n
);
}
size
++
;
if
(
has_rate
)
{
*
rates
=
pSize
->
nRatesInUse
;
if
(
client
->
swapped
)
{
swaps
(
rates
,
n
);
}
rates
++
;
for
(
j
=
0
;
j
<
pSize
->
nRates
;
j
++
)
{
RRScreenRatePtr
pRate
=
&
pSize
->
pRates
[
j
];
if
(
pRate
->
referenced
)
{
*
rates
=
pRate
->
rate
;
if
(
client
->
swapped
)
{
swaps
(
rates
,
n
);
}
rates
++
;
}
}
}
}
}
data8
=
(
CARD8
*
)
rates
;
if
(
data8
-
(
CARD8
*
)
extra
!=
extraLen
)
FatalError
(
"RRGetScreenInfo bad extra len %ld != %ld
\n
"
,
(
unsigned
long
)(
data8
-
(
CARD8
*
)
extra
),
extraLen
);
rep
.
length
=
(
extraLen
+
3
)
>>
2
;
}
if
(
client
->
swapped
)
{
swaps
(
&
rep
.
sequenceNumber
,
n
);
swapl
(
&
rep
.
length
,
n
);
swapl
(
&
rep
.
timestamp
,
n
);
swaps
(
&
rep
.
rotation
,
n
);
swaps
(
&
rep
.
nSizes
,
n
);
swaps
(
&
rep
.
sizeID
,
n
);
swaps
(
&
rep
.
rate
,
n
);
swaps
(
&
rep
.
nrateEnts
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xRRGetScreenInfoReply
),
(
char
*
)
&
rep
);
if
(
extraLen
)
{
WriteToClient
(
client
,
extraLen
,
(
char
*
)
extra
);
xfree
(
extra
);
}
return
(
client
->
noClientException
);
}
static
int
ProcRRSetScreenConfig
(
ClientPtr
client
)
void
RRTellChanged
(
ScreenPtr
pScreen
)
{
REQUEST
(
xRRSetScreenConfigReq
);
xRRSetScreenConfigReply
rep
;
DrawablePtr
pDraw
;
int
n
;
ScreenPtr
pScreen
;
rrScrPrivPtr
pScrPriv
;
TimeStamp
configTime
;
TimeStamp
time
;
RRScreenSizePtr
pSize
;
rrScrPriv
(
pScreen
);
int
i
;
Rotation
rotation
;
int
rate
;
short
oldWidth
,
oldHeight
;
Bool
has_rate
;
UpdateCurrentTime
();
if
(
RRClientKnowsRates
(
client
))
{
REQUEST_SIZE_MATCH
(
xRRSetScreenConfigReq
);
has_rate
=
TRUE
;
}
else
{
REQUEST_SIZE_MATCH
(
xRR1_0SetScreenConfigReq
);
has_rate
=
FALSE
;
}
SECURITY_VERIFY_DRAWABLE
(
pDraw
,
stuff
->
drawable
,
client
,
SecurityWriteAccess
);
pScreen
=
pDraw
->
pScreen
;
pScrPriv
=
rrGetScrPriv
(
pScreen
);
time
=
ClientTimeToServerTime
(
stuff
->
timestamp
);
configTime
=
ClientTimeToServerTime
(
stuff
->
configTimestamp
);
oldWidth
=
pScreen
->
width
;
oldHeight
=
pScreen
->
height
;
if
(
!
pScrPriv
)
{
time
=
currentTime
;
rep
.
status
=
RRSetConfigFailed
;
goto
sendReply
;
}
if
(
!
RRGetInfo
(
pScreen
))
return
BadAlloc
;
/*
* if the client's config timestamp is not the same as the last config
* timestamp, then the config information isn't up-to-date and
* can't even be validated
*/
if
(
CompareTimeStamps
(
configTime
,
pScrPriv
->
lastConfigTime
)
!=
0
)
{
rep
.
status
=
RRSetConfigInvalidConfigTime
;
goto
sendReply
;
}
/*
* Search for the requested size
*/
pSize
=
0
;
for
(
i
=
0
;
i
<
pScrPriv
->
nSizes
;
i
++
)
{
pSize
=
&
pScrPriv
->
pSizes
[
i
];
if
(
pSize
->
referenced
&&
pSize
->
id
==
stuff
->
sizeID
)
{
break
;
}
}
if
(
i
==
pScrPriv
->
nSizes
)
{
/*
* Invalid size ID
*/
client
->
errorValue
=
stuff
->
sizeID
;
return
BadValue
;
}
/*
* Validate requested rotation
*/
rotation
=
(
Rotation
)
stuff
->
rotation
;
/* test the rotation bits only! */
switch
(
rotation
&
0xf
)
{
case
RR_Rotate_0
:
case
RR_Rotate_90
:
case
RR_Rotate_180
:
case
RR_Rotate_270
:
break
;
default:
/*
* Invalid rotation
*/
client
->
errorValue
=
stuff
->
rotation
;
return
BadValue
;
}
if
((
~
pScrPriv
->
rotations
)
&
rotation
)
{
/*
* requested rotation or reflection not supported by screen
*/
client
->
errorValue
=
stuff
->
rotation
;
return
BadMatch
;
}
/*
* Validate requested refresh
*/
if
(
has_rate
)
rate
=
(
int
)
stuff
->
rate
;
else
rate
=
0
;
if
(
rate
)
{
for
(
i
=
0
;
i
<
pSize
->
nRates
;
i
++
)
{
RRScreenRatePtr
pRate
=
&
pSize
->
pRates
[
i
];
if
(
pRate
->
referenced
&&
pRate
->
rate
==
rate
)
break
;
}
if
(
i
==
pSize
->
nRates
)
{
/*
* Invalid rate
*/
client
->
errorValue
=
rate
;
return
BadValue
;
}
}
/*
* Make sure the requested set-time is not older than
* the last set-time
*/
if
(
CompareTimeStamps
(
time
,
pScrPriv
->
lastSetTime
)
<
0
)
if
(
pScrPriv
->
changed
)
{
rep
.
status
=
RRSetConfigInvalidTime
;
goto
sendReply
;
}
/*
* call out to ddx routine to effect the change
*/
if
(
!
(
*
pScrPriv
->
rrSetConfig
)
(
pScreen
,
rotation
,
rate
,
pSize
))
UpdateCurrentTime
();
if
(
pScrPriv
->
configChanged
)
{
/*
* unknown DDX failure, report to client
*/
rep
.
status
=
RRSetConfigFailed
;
goto
sendReply
;
pScrPriv
->
lastConfigTime
=
currentTime
;
pScrPriv
->
configChanged
=
FALSE
;
}
/*
* set current extension configuration pointers
*/
RRSetCurrentConfig
(
pScreen
,
rotation
,
rate
,
pSize
);
/*
* Deliver ScreenChangeNotify events whenever
* the configuration is updated
*/
pScrPriv
->
changed
=
FALSE
;
WalkTree
(
pScreen
,
TellChanged
,
(
pointer
)
pScreen
);
/*
* Deliver ConfigureNotify events when root changes
* pixel size
*/
if
(
oldWidth
!=
pScreen
->
width
||
oldHeight
!=
pScreen
->
height
)
for
(
i
=
0
;
i
<
pScrPriv
->
numOutputs
;
i
++
)
pScrPriv
->
outputs
[
i
]
->
changed
=
FALSE
;
for
(
i
=
0
;
i
<
pScrPriv
->
numCrtcs
;
i
++
)
pScrPriv
->
crtcs
[
i
]
->
changed
=
FALSE
;
if
(
pScrPriv
->
layoutChanged
)
{
pScrPriv
->
layoutChanged
=
FALSE
;
RRPointerScreenConfigured
(
pScreen
);
RRSendConfigNotify
(
pScreen
);
RREditConnectionInfo
(
pScreen
);
/*
* Fix pointer bounds and location
*/
ScreenRestructured
(
pScreen
);
pScrPriv
->
lastSetTime
=
time
;
/*
* Report Success
*/
rep
.
status
=
RRSetConfigSuccess
;
sendReply:
rep
.
type
=
X_Reply
;
/* rep.status has already been filled in */
rep
.
length
=
0
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
newTimestamp
=
pScrPriv
->
lastSetTime
.
milliseconds
;
rep
.
newConfigTimestamp
=
pScrPriv
->
lastConfigTime
.
milliseconds
;
rep
.
root
=
WindowTable
[
pDraw
->
pScreen
->
myNum
]
->
drawable
.
id
;
if
(
client
->
swapped
)
{
swaps
(
&
rep
.
sequenceNumber
,
n
);
swapl
(
&
rep
.
length
,
n
);
swapl
(
&
rep
.
newTimestamp
,
n
);
swapl
(
&
rep
.
newConfigTimestamp
,
n
);
swapl
(
&
rep
.
root
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xRRSetScreenConfigReply
),
(
char
*
)
&
rep
);
return
(
client
->
noClientException
);
}
int
RRSetScreenConfig
(
ScreenPtr
pScreen
,
Rotation
rotation
,
int
rate
,
RRScreenSizePtr
pSize
)
{
rrScrPrivPtr
pScrPriv
;
int
i
;
short
oldWidth
,
oldHeight
;
pScrPriv
=
rrGetScrPriv
(
pScreen
);
oldWidth
=
pScreen
->
width
;
oldHeight
=
pScreen
->
height
;
if
(
!
RRGetInfo
(
pScreen
))
return
BadAlloc
;
/*
* Validate requested rotation
*/
/* test the rotation bits only! */
switch
(
rotation
&
0xf
)
{
case
RR_Rotate_0
:
case
RR_Rotate_90
:
case
RR_Rotate_180
:
case
RR_Rotate_270
:
break
;
default:
/*
* Invalid rotation
*/
return
BadValue
;
}
}
if
((
~
pScrPriv
->
rotations
)
&
rotation
)
{
/*
* requested rotation or reflection not supported by screen
/*
* Return the first output which is connected to an active CRTC
* Used in emulating 1.0 behaviour
*/
return
BadMatch
;
}
RROutputPtr
RRFirstOutput
(
ScreenPtr
pScreen
)
{
rrScrPriv
(
pScreen
);
RROutputPtr
output
;
int
i
,
j
;
/*
* Validate requested refresh
*/
if
(
rate
)
for
(
i
=
0
;
i
<
pScrPriv
->
numCrtcs
;
i
++
)
{
for
(
i
=
0
;
i
<
pSize
->
nRates
;
i
++
)
RRCrtcPtr
crtc
=
pScrPriv
->
crtcs
[
i
];
for
(
j
=
0
;
j
<
pScrPriv
->
numOutputs
;
j
++
)
{
RRScreenRatePtr
pRate
=
&
pSize
->
pRates
[
i
];
if
(
pRate
->
referenced
&&
pRate
->
rate
==
rate
)
break
;
}
if
(
i
==
pSize
->
nRates
)
{
/*
* Invalid rate
*/
return
BadValue
;
output
=
pScrPriv
->
outputs
[
j
];
if
(
output
->
crtc
==
crtc
)
return
output
;
}
}
/*
* call out to ddx routine to effect the change
*/
if
(
!
(
*
pScrPriv
->
rrSetConfig
)
(
pScreen
,
rotation
,
rate
,
pSize
))
{
/*
* unknown DDX failure, report to client
*/
return
BadImplementation
;
}
/*
* set current extension configuration pointers
*/
RRSetCurrentConfig
(
pScreen
,
rotation
,
rate
,
pSize
);
/*
* Deliver ScreenChangeNotify events whenever
* the configuration is updated
*/
WalkTree
(
pScreen
,
TellChanged
,
(
pointer
)
pScreen
);
/*
* Deliver ConfigureNotify events when root changes
* pixel size
*/
if
(
oldWidth
!=
pScreen
->
width
||
oldHeight
!=
pScreen
->
height
)
RRSendConfigNotify
(
pScreen
);
RREditConnectionInfo
(
pScreen
);
/*
* Fix pointer bounds and location
*/
ScreenRestructured
(
pScreen
);
return
Success
;
return
NULL
;
}
static
int
ProcRRSelectInput
(
ClientPtr
client
)
CARD16
RRVerticalRefresh
(
xRRModeInfo
*
mode
)
{
REQUEST
(
xRRSelectInputReq
);
rrClientPriv
(
client
);
RRTimesPtr
pTimes
;
WindowPtr
pWin
;
RREventPtr
pRREvent
,
pNewRREvent
,
*
pHead
;
XID
clientResource
;
REQUEST_SIZE_MATCH
(
xRRSelectInputReq
);
pWin
=
SecurityLookupWindow
(
stuff
->
window
,
client
,
SecurityWriteAccess
);
if
(
!
pWin
)
return
BadWindow
;
pHead
=
(
RREventPtr
*
)
SecurityLookupIDByType
(
client
,
pWin
->
drawable
.
id
,
EventType
,
SecurityWriteAccess
);
if
(
stuff
->
enable
&
(
RRScreenChangeNotifyMask
))
{
ScreenPtr
pScreen
=
pWin
->
drawable
.
pScreen
;
rrScrPriv
(
pScreen
);
if
(
pHead
)
{
/* check for existing entry. */
for
(
pRREvent
=
*
pHead
;
pRREvent
;
pRREvent
=
pRREvent
->
next
)
if
(
pRREvent
->
client
==
client
)
return
Success
;
}
/* build the entry */
pNewRREvent
=
(
RREventPtr
)
xalloc
(
sizeof
(
RREventRec
));
if
(
!
pNewRREvent
)
return
BadAlloc
;
pNewRREvent
->
next
=
0
;
pNewRREvent
->
client
=
client
;
pNewRREvent
->
window
=
pWin
;
pNewRREvent
->
mask
=
stuff
->
enable
;
/*
* add a resource that will be deleted when
* the client goes away
*/
clientResource
=
FakeClientID
(
client
->
index
);
pNewRREvent
->
clientResource
=
clientResource
;
if
(
!
AddResource
(
clientResource
,
ClientType
,
(
pointer
)
pNewRREvent
))
return
BadAlloc
;
/*
* create a resource to contain a pointer to the list
* of clients selecting input. This must be indirect as
* the list may be arbitrarily rearranged which cannot be
* done through the resource database.
*/
if
(
!
pHead
)
{
pHead
=
(
RREventPtr
*
)
xalloc
(
sizeof
(
RREventPtr
));
if
(
!
pHead
||
!
AddResource
(
pWin
->
drawable
.
id
,
EventType
,
(
pointer
)
pHead
))
{
FreeResource
(
clientResource
,
RT_NONE
);
return
BadAlloc
;
}
*
pHead
=
0
;
}
pNewRREvent
->
next
=
*
pHead
;
*
pHead
=
pNewRREvent
;
/*
* Now see if the client needs an event
*/
if
(
pScrPriv
)
{
pTimes
=
&
((
RRTimesPtr
)
(
pRRClient
+
1
))[
pScreen
->
myNum
];
if
(
CompareTimeStamps
(
pTimes
->
setTime
,
pScrPriv
->
lastSetTime
)
!=
0
||
CompareTimeStamps
(
pTimes
->
configTime
,
pScrPriv
->
lastConfigTime
)
!=
0
)
{
TellChanged
(
pWin
,
(
pointer
)
pScreen
);
}
}
}
else
if
(
stuff
->
enable
==
xFalse
)
{
/* delete the interest */
if
(
pHead
)
{
pNewRREvent
=
0
;
for
(
pRREvent
=
*
pHead
;
pRREvent
;
pRREvent
=
pRREvent
->
next
)
{
if
(
pRREvent
->
client
==
client
)
break
;
pNewRREvent
=
pRREvent
;
}
if
(
pRREvent
)
{
FreeResource
(
pRREvent
->
clientResource
,
ClientType
);
if
(
pNewRREvent
)
pNewRREvent
->
next
=
pRREvent
->
next
;
else
*
pHead
=
pRREvent
->
next
;
xfree
(
pRREvent
);
}
}
}
else
{
client
->
errorValue
=
stuff
->
enable
;
return
BadValue
;
}
return
Success
;
CARD32
refresh
;
CARD32
dots
=
mode
->
hTotal
*
mode
->
vTotal
;
if
(
!
dots
)
return
0
;
refresh
=
(
mode
->
dotClock
+
dots
/
2
)
/
dots
;
if
(
refresh
>
0xffff
)
refresh
=
0xffff
;
return
(
CARD16
)
refresh
;
}
static
int
ProcRRDispatch
(
ClientPtr
client
)
{
REQUEST
(
xReq
);
switch
(
stuff
->
data
)
{
case
X_RRQueryVersion
:
return
ProcRRQueryVersion
(
client
);
case
X_RRSetScreenConfig
:
return
ProcRRSetScreenConfig
(
client
);
case
X_RRSelectInput
:
return
ProcRRSelectInput
(
client
);
case
X_RRGetScreenInfo
:
return
ProcRRGetScreenInfo
(
client
);
default:
if
(
stuff
->
data
>=
RRNumberRequests
||
!
ProcRandrVector
[
stuff
->
data
])
return
BadRequest
;
}
}
static
int
SProcRRQueryVersion
(
ClientPtr
client
)
{
register
int
n
;
REQUEST
(
xRRQueryVersionReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
majorVersion
,
n
);
swapl
(
&
stuff
->
minorVersion
,
n
);
return
ProcRRQueryVersion
(
client
);
}
static
int
SProcRRGetScreenInfo
(
ClientPtr
client
)
{
register
int
n
;
REQUEST
(
xRRGetScreenInfoReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
window
,
n
);
return
ProcRRGetScreenInfo
(
client
);
}
static
int
SProcRRSetScreenConfig
(
ClientPtr
client
)
{
register
int
n
;
REQUEST
(
xRRSetScreenConfigReq
);
if
(
RRClientKnowsRates
(
client
))
{
REQUEST_SIZE_MATCH
(
xRRSetScreenConfigReq
);
swaps
(
&
stuff
->
rate
,
n
);
}
else
{
REQUEST_SIZE_MATCH
(
xRR1_0SetScreenConfigReq
);
}
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
drawable
,
n
);
swapl
(
&
stuff
->
timestamp
,
n
);
swaps
(
&
stuff
->
sizeID
,
n
);
swaps
(
&
stuff
->
rotation
,
n
);
return
ProcRRSetScreenConfig
(
client
);
return
(
*
ProcRandrVector
[
stuff
->
data
])
(
client
);
}
static
int
SProcRRSelectInput
(
ClientPtr
client
)
{
register
int
n
;
REQUEST
(
xRRSelectInputReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
window
,
n
);
return
ProcRRSelectInput
(
client
);
}
static
int
SProcRRDispatch
(
ClientPtr
client
)
{
REQUEST
(
xReq
);
switch
(
stuff
->
data
)
{
case
X_RRQueryVersion
:
return
SProcRRQueryVersion
(
client
);
case
X_RRSetScreenConfig
:
return
SProcRRSetScreenConfig
(
client
);
case
X_RRSelectInput
:
return
SProcRRSelectInput
(
client
);
case
X_RRGetScreenInfo
:
return
SProcRRGetScreenInfo
(
client
);
default:
if
(
stuff
->
data
>=
RRNumberRequests
||
!
ProcRandrVector
[
stuff
->
data
])
return
BadRequest
;
}
}
static
Bool
RRScreenSizeMatches
(
RRScreenSizePtr
a
,
RRScreenSizePtr
b
)
{
if
(
a
->
width
!=
b
->
width
)
return
FALSE
;
if
(
a
->
height
!=
b
->
height
)
return
FALSE
;
if
(
a
->
mmWidth
!=
b
->
mmWidth
)
return
FALSE
;
if
(
a
->
mmHeight
!=
b
->
mmHeight
)
return
FALSE
;
return
TRUE
;
return
(
*
SProcRandrVector
[
stuff
->
data
])
(
client
);
}
RRScreenSizePtr
RRRegisterSize
(
ScreenPtr
pScreen
,
short
width
,
short
height
,
short
mmWidth
,
short
mmHeight
)
{
rrScrPriv
(
pScreen
);
int
i
;
RRScreenSize
tmp
;
RRScreenSizePtr
pNew
;
if
(
!
pScrPriv
)
return
0
;
tmp
.
width
=
width
;
tmp
.
height
=
height
;
tmp
.
mmWidth
=
mmWidth
;
tmp
.
mmHeight
=
mmHeight
;
tmp
.
pRates
=
0
;
tmp
.
nRates
=
0
;
tmp
.
nRatesInUse
=
0
;
tmp
.
referenced
=
TRUE
;
tmp
.
oldReferenced
=
FALSE
;
for
(
i
=
0
;
i
<
pScrPriv
->
nSizes
;
i
++
)
if
(
RRScreenSizeMatches
(
&
tmp
,
&
pScrPriv
->
pSizes
[
i
]))
{
pScrPriv
->
pSizes
[
i
].
referenced
=
TRUE
;
return
&
pScrPriv
->
pSizes
[
i
];
}
pNew
=
xrealloc
(
pScrPriv
->
pSizes
,
(
pScrPriv
->
nSizes
+
1
)
*
sizeof
(
RRScreenSize
));
if
(
!
pNew
)
return
0
;
pNew
[
pScrPriv
->
nSizes
++
]
=
tmp
;
pScrPriv
->
pSizes
=
pNew
;
return
&
pNew
[
pScrPriv
->
nSizes
-
1
];
}
Bool
RRRegisterRate
(
ScreenPtr
pScreen
,
RRScreenSizePtr
pSize
,
int
rate
)
{
rrScrPriv
(
pScreen
);
int
i
;
RRScreenRatePtr
pNew
,
pRate
;
if
(
!
pScrPriv
)
return
FALSE
;
for
(
i
=
0
;
i
<
pSize
->
nRates
;
i
++
)
{
pRate
=
&
pSize
->
pRates
[
i
];
if
(
pRate
->
rate
==
rate
)
{
pRate
->
referenced
=
TRUE
;
return
TRUE
;
}
}
pNew
=
xrealloc
(
pSize
->
pRates
,
(
pSize
->
nRates
+
1
)
*
sizeof
(
RRScreenRate
));
if
(
!
pNew
)
return
FALSE
;
pRate
=
&
pNew
[
pSize
->
nRates
++
];
pRate
->
rate
=
rate
;
pRate
->
referenced
=
TRUE
;
pRate
->
oldReferenced
=
FALSE
;
pSize
->
pRates
=
pNew
;
return
TRUE
;
}
void
RRSetCurrentConfig
(
ScreenPtr
pScreen
,
Rotation
rotation
,
int
rate
,
RRScreenSizePtr
pSize
)
{
rrScrPriv
(
pScreen
);
if
(
!
pScrPriv
)
return
;
pScrPriv
->
rotation
=
rotation
;
pScrPriv
->
size
=
pSize
-
pScrPriv
->
pSizes
;
pScrPriv
->
rate
=
rate
;
}
nx-X11/programs/Xserver/randr/randr.c.NX.original
0 → 100644
View file @
15cee47a
/*
* Copyright © 2000 Compaq Computer Corporation
* Copyright © 2002 Hewlett-Packard Company
* Copyright © 2006 Intel Corporation
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*
* Author: Jim Gettys, Hewlett-Packard Company, Inc.
* Keith Packard, Intel Corporation
*/
/**************************************************************************/
/* */
/* Copyright (c) 2001, 2011 NoMachine, http://www.nomachine.com/. */
/* */
/* NX-X11, NX protocol compression and NX extensions to this software */
/* are copyright of NoMachine. Redistribution and use of the present */
/* software is allowed according to terms specified in the file LICENSE */
/* which comes in the source distribution. */
/* */
/* Check http://www.nomachine.com/licensing.html for applicability. */
/* */
/* NX and NoMachine are trademarks of Medialogic S.p.A. */
/* */
/* All rights reserved. */
/* */
/**************************************************************************/
#define NEED_REPLIES
#define NEED_EVENTS
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#include "randrstr.h"
/* From render.h */
#ifndef SubPixelUnknown
#define SubPixelUnknown 0
#endif
#define RR_VALIDATE
static int RRNScreens;
#define wrap(priv,real,mem,func) {\
priv->mem = real->mem; \
real->mem = func; \
}
#define unwrap(priv,real,mem) {\
real->mem = priv->mem; \
}
static int ProcRRDispatch (ClientPtr pClient);
static int SProcRRDispatch (ClientPtr pClient);
int RREventBase;
int RRErrorBase;
RESTYPE RRClientType, RREventType; /* resource types for event masks */
#ifndef NXAGENT_SERVER
DevPrivateKey RRClientPrivateKey = &RRClientPrivateKey;
DevPrivateKey rrPrivKey = &rrPrivKey;
#else
int RRClientPrivateIndex;
int rrPrivIndex = -1;
#endif
static void
RRClientCallback (CallbackListPtr *list,
pointer closure,
pointer data)
{
NewClientInfoRec *clientinfo = (NewClientInfoRec *) data;
ClientPtr pClient = clientinfo->client;
rrClientPriv(pClient);
RRTimesPtr pTimes = (RRTimesPtr) (pRRClient + 1);
int i;
pRRClient->major_version = 0;
pRRClient->minor_version = 0;
for (i = 0; i < screenInfo.numScreens; i++)
{
ScreenPtr pScreen = screenInfo.screens[i];
rrScrPriv(pScreen);
if (pScrPriv)
{
pTimes[i].setTime = pScrPriv->lastSetTime;
pTimes[i].configTime = pScrPriv->lastConfigTime;
}
}
}
static void
RRResetProc (ExtensionEntry *extEntry)
{
}
static Bool
RRCloseScreen (int i, ScreenPtr pScreen)
{
rrScrPriv(pScreen);
int j;
unwrap (pScrPriv, pScreen, CloseScreen);
for (j = pScrPriv->numCrtcs - 1; j >= 0; j--)
RRCrtcDestroy (pScrPriv->crtcs[j]);
for (j = pScrPriv->numOutputs - 1; j >= 0; j--)
RROutputDestroy (pScrPriv->outputs[j]);
xfree (pScrPriv);
RRNScreens -= 1; /* ok, one fewer screen with RandR running */
return (*pScreen->CloseScreen) (i, pScreen);
}
static void
SRRScreenChangeNotifyEvent(xRRScreenChangeNotifyEvent *from,
xRRScreenChangeNotifyEvent *to)
{
to->type = from->type;
to->rotation = from->rotation;
cpswaps(from->sequenceNumber, to->sequenceNumber);
cpswapl(from->timestamp, to->timestamp);
cpswapl(from->configTimestamp, to->configTimestamp);
cpswapl(from->root, to->root);
cpswapl(from->window, to->window);
cpswaps(from->sizeID, to->sizeID);
cpswaps(from->widthInPixels, to->widthInPixels);
cpswaps(from->heightInPixels, to->heightInPixels);
cpswaps(from->widthInMillimeters, to->widthInMillimeters);
cpswaps(from->heightInMillimeters, to->heightInMillimeters);
cpswaps(from->subpixelOrder, to->subpixelOrder);
}
static void
SRRCrtcChangeNotifyEvent(xRRCrtcChangeNotifyEvent *from,
xRRCrtcChangeNotifyEvent *to)
{
to->type = from->type;
to->subCode = from->subCode;
cpswaps(from->sequenceNumber, to->sequenceNumber);
cpswapl(from->timestamp, to->timestamp);
cpswapl(from->window, to->window);
cpswapl(from->crtc, to->crtc);
cpswapl(from->mode, to->mode);
cpswapl(from->window, to->window);
cpswaps(from->rotation, to->rotation);
cpswaps(from->x, to->x);
cpswaps(from->y, to->y);
cpswaps(from->width, to->width);
cpswaps(from->height, to->height);
}
static void
SRROutputChangeNotifyEvent(xRROutputChangeNotifyEvent *from,
xRROutputChangeNotifyEvent *to)
{
to->type = from->type;
to->subCode = from->subCode;
cpswaps(from->sequenceNumber, to->sequenceNumber);
cpswapl(from->timestamp, to->timestamp);
cpswapl(from->configTimestamp, to->configTimestamp);
cpswapl(from->window, to->window);
cpswapl(from->output, to->output);
cpswapl(from->crtc, to->crtc);
cpswapl(from->mode, to->mode);
cpswaps(from->rotation, to->rotation);
}
static void
SRROutputPropertyNotifyEvent(xRROutputPropertyNotifyEvent *from,
xRROutputPropertyNotifyEvent *to)
{
to->type = from->type;
to->subCode = from->subCode;
cpswaps(from->sequenceNumber, to->sequenceNumber);
cpswapl(from->window, to->window);
cpswapl(from->output, to->output);
cpswapl(from->atom, to->atom);
cpswapl(from->timestamp, to->timestamp);
}
static void
SRRNotifyEvent (xEvent *from,
xEvent *to)
{
switch (from->u.u.detail) {
case RRNotify_CrtcChange:
SRRCrtcChangeNotifyEvent ((xRRCrtcChangeNotifyEvent *) from,
(xRRCrtcChangeNotifyEvent *) to);
break;
case RRNotify_OutputChange:
SRROutputChangeNotifyEvent ((xRROutputChangeNotifyEvent *) from,
(xRROutputChangeNotifyEvent *) to);
break;
case RRNotify_OutputProperty:
SRROutputPropertyNotifyEvent ((xRROutputPropertyNotifyEvent *) from,
(xRROutputPropertyNotifyEvent *) to);
break;
default:
break;
}
}
static int RRGeneration;
Bool RRInit (void)
{
if (RRGeneration != serverGeneration)
{
#ifdef NXAGENT_SERVER
if ((rrPrivIndex = AllocateScreenPrivateIndex()) < 0)
return FALSE;
#endif
if (!RRModeInit ())
return FALSE;
if (!RRCrtcInit ())
return FALSE;
if (!RROutputInit ())
return FALSE;
RRGeneration = serverGeneration;
}
return TRUE;
}
Bool RRScreenInit(ScreenPtr pScreen)
{
rrScrPrivPtr pScrPriv;
if (!RRInit ())
return FALSE;
pScrPriv = (rrScrPrivPtr) xcalloc (1, sizeof (rrScrPrivRec));
if (!pScrPriv)
return FALSE;
SetRRScreen(pScreen, pScrPriv);
/*
* Calling function best set these function vectors
*/
pScrPriv->rrGetInfo = 0;
pScrPriv->maxWidth = pScrPriv->minWidth = pScreen->width;
pScrPriv->maxHeight = pScrPriv->minHeight = pScreen->height;
pScrPriv->width = pScreen->width;
pScrPriv->height = pScreen->height;
pScrPriv->mmWidth = pScreen->mmWidth;
pScrPriv->mmHeight = pScreen->mmHeight;
#if RANDR_12_INTERFACE
pScrPriv->rrScreenSetSize = NULL;
pScrPriv->rrCrtcSet = NULL;
pScrPriv->rrCrtcSetGamma = NULL;
#endif
#if RANDR_10_INTERFACE
pScrPriv->rrSetConfig = 0;
pScrPriv->rotations = RR_Rotate_0;
pScrPriv->reqWidth = pScreen->width;
pScrPriv->reqHeight = pScreen->height;
pScrPriv->nSizes = 0;
pScrPriv->pSizes = NULL;
pScrPriv->rotation = RR_Rotate_0;
pScrPriv->rate = 0;
pScrPriv->size = 0;
#endif
/*
* This value doesn't really matter -- any client must call
* GetScreenInfo before reading it which will automatically update
* the time
*/
pScrPriv->lastSetTime = currentTime;
pScrPriv->lastConfigTime = currentTime;
wrap (pScrPriv, pScreen, CloseScreen, RRCloseScreen);
pScrPriv->numOutputs = 0;
pScrPriv->outputs = NULL;
pScrPriv->numCrtcs = 0;
pScrPriv->crtcs = NULL;
RRNScreens += 1; /* keep count of screens that implement randr */
return TRUE;
}
/*ARGSUSED*/
static int
RRFreeClient (pointer data, XID id)
{
RREventPtr pRREvent;
WindowPtr pWin;
RREventPtr *pHead, pCur, pPrev;
pRREvent = (RREventPtr) data;
pWin = pRREvent->window;
pHead = (RREventPtr *) LookupIDByType(pWin->drawable.id, RREventType);
if (pHead) {
pPrev = 0;
for (pCur = *pHead; pCur && pCur != pRREvent; pCur=pCur->next)
pPrev = pCur;
if (pCur)
{
if (pPrev)
pPrev->next = pRREvent->next;
else
*pHead = pRREvent->next;
}
}
xfree ((pointer) pRREvent);
return 1;
}
/*ARGSUSED*/
static int
RRFreeEvents (pointer data, XID id)
{
RREventPtr *pHead, pCur, pNext;
pHead = (RREventPtr *) data;
for (pCur = *pHead; pCur; pCur = pNext) {
pNext = pCur->next;
FreeResource (pCur->clientResource, RRClientType);
xfree ((pointer) pCur);
}
xfree ((pointer) pHead);
return 1;
}
void
RRExtensionInit (void)
{
ExtensionEntry *extEntry;
if (RRNScreens == 0) return;
#ifndef NXAGENT_SERVER
if (!dixRequestPrivate(RRClientPrivateKey,
sizeof (RRClientRec) +
screenInfo.numScreens * sizeof (RRTimesRec)))
return;
#else
RRClientPrivateIndex = AllocateClientPrivateIndex ();
if (!AllocateClientPrivate (RRClientPrivateIndex,
sizeof (RRClientRec) +
screenInfo.numScreens * sizeof (RRTimesRec)))
return;
#endif
if (!AddCallback (&ClientStateCallback, RRClientCallback, 0))
return;
RRClientType = CreateNewResourceType(RRFreeClient);
if (!RRClientType)
return;
RREventType = CreateNewResourceType(RRFreeEvents);
if (!RREventType)
return;
extEntry = AddExtension (RANDR_NAME, RRNumberEvents, RRNumberErrors,
ProcRRDispatch, SProcRRDispatch,
RRResetProc, StandardMinorOpcode);
if (!extEntry)
return;
RRErrorBase = extEntry->errorBase;
RREventBase = extEntry->eventBase;
EventSwapVector[RREventBase + RRScreenChangeNotify] = (EventSwapPtr)
SRRScreenChangeNotifyEvent;
EventSwapVector[RREventBase + RRNotify] = (EventSwapPtr)
SRRNotifyEvent;
#ifdef PANORAMIX
RRXineramaExtensionInit();
#endif
}
static int
TellChanged (WindowPtr pWin, pointer value)
{
RREventPtr *pHead, pRREvent;
ClientPtr client;
ScreenPtr pScreen = pWin->drawable.pScreen;
rrScrPriv(pScreen);
int i;
pHead = (RREventPtr *) LookupIDByType (pWin->drawable.id, RREventType);
if (!pHead)
return WT_WALKCHILDREN;
for (pRREvent = *pHead; pRREvent; pRREvent = pRREvent->next)
{
client = pRREvent->client;
if (client == serverClient || client->clientGone)
continue;
if (pRREvent->mask & RRScreenChangeNotifyMask)
RRDeliverScreenEvent (client, pWin, pScreen);
if (pRREvent->mask & RRCrtcChangeNotifyMask)
{
for (i = 0; i < pScrPriv->numCrtcs; i++)
{
RRCrtcPtr crtc = pScrPriv->crtcs[i];
if (crtc->changed)
RRDeliverCrtcEvent (client, pWin, crtc);
}
}
if (pRREvent->mask & RROutputChangeNotifyMask)
{
for (i = 0; i < pScrPriv->numOutputs; i++)
{
RROutputPtr output = pScrPriv->outputs[i];
if (output->changed)
RRDeliverOutputEvent (client, pWin, output);
}
}
}
return WT_WALKCHILDREN;
}
/*
* Something changed; send events and adjust pointer position
*/
void
RRTellChanged (ScreenPtr pScreen)
{
rrScrPriv (pScreen);
int i;
if (pScrPriv->changed)
{
UpdateCurrentTime ();
if (pScrPriv->configChanged)
{
pScrPriv->lastConfigTime = currentTime;
pScrPriv->configChanged = FALSE;
}
pScrPriv->changed = FALSE;
WalkTree (pScreen, TellChanged, (pointer) pScreen);
for (i = 0; i < pScrPriv->numOutputs; i++)
pScrPriv->outputs[i]->changed = FALSE;
for (i = 0; i < pScrPriv->numCrtcs; i++)
pScrPriv->crtcs[i]->changed = FALSE;
if (pScrPriv->layoutChanged)
{
pScrPriv->layoutChanged = FALSE;
RRPointerScreenConfigured (pScreen);
RRSendConfigNotify (pScreen);
}
}
}
/*
* Return the first output which is connected to an active CRTC
* Used in emulating 1.0 behaviour
*/
RROutputPtr
RRFirstOutput (ScreenPtr pScreen)
{
rrScrPriv(pScreen);
RROutputPtr output;
int i, j;
for (i = 0; i < pScrPriv->numCrtcs; i++)
{
RRCrtcPtr crtc = pScrPriv->crtcs[i];
for (j = 0; j < pScrPriv->numOutputs; j++)
{
output = pScrPriv->outputs[j];
if (output->crtc == crtc)
return output;
}
}
return NULL;
}
CARD16
RRVerticalRefresh (xRRModeInfo *mode)
{
CARD32 refresh;
CARD32 dots = mode->hTotal * mode->vTotal;
if (!dots)
return 0;
refresh = (mode->dotClock + dots/2) / dots;
if (refresh > 0xffff)
refresh = 0xffff;
return (CARD16) refresh;
}
static int
ProcRRDispatch (ClientPtr client)
{
REQUEST(xReq);
if (stuff->data >= RRNumberRequests || !ProcRandrVector[stuff->data])
return BadRequest;
return (*ProcRandrVector[stuff->data]) (client);
}
static int
SProcRRDispatch (ClientPtr client)
{
REQUEST(xReq);
if (stuff->data >= RRNumberRequests || !ProcRandrVector[stuff->data])
return BadRequest;
return (*SProcRandrVector[stuff->data]) (client);
}
nx-X11/programs/Xserver/randr/randr.c.X.original
0 → 100644
View file @
15cee47a
/*
* Copyright © 2000 Compaq Computer Corporation
* Copyright © 2002 Hewlett-Packard Company
* Copyright © 2006 Intel Corporation
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*
* Author: Jim Gettys, Hewlett-Packard Company, Inc.
* Keith Packard, Intel Corporation
*/
#define NEED_REPLIES
#define NEED_EVENTS
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#include "randrstr.h"
/* From render.h */
#ifndef SubPixelUnknown
#define SubPixelUnknown 0
#endif
#define RR_VALIDATE
static int RRNScreens;
#define wrap(priv,real,mem,func) {\
priv->mem = real->mem; \
real->mem = func; \
}
#define unwrap(priv,real,mem) {\
real->mem = priv->mem; \
}
static int ProcRRDispatch (ClientPtr pClient);
static int SProcRRDispatch (ClientPtr pClient);
int RREventBase;
int RRErrorBase;
RESTYPE RRClientType, RREventType; /* resource types for event masks */
DevPrivateKey RRClientPrivateKey = &RRClientPrivateKey;
DevPrivateKey rrPrivKey = &rrPrivKey;
static void
RRClientCallback (CallbackListPtr *list,
pointer closure,
pointer data)
{
NewClientInfoRec *clientinfo = (NewClientInfoRec *) data;
ClientPtr pClient = clientinfo->client;
rrClientPriv(pClient);
RRTimesPtr pTimes = (RRTimesPtr) (pRRClient + 1);
int i;
pRRClient->major_version = 0;
pRRClient->minor_version = 0;
for (i = 0; i < screenInfo.numScreens; i++)
{
ScreenPtr pScreen = screenInfo.screens[i];
rrScrPriv(pScreen);
if (pScrPriv)
{
pTimes[i].setTime = pScrPriv->lastSetTime;
pTimes[i].configTime = pScrPriv->lastConfigTime;
}
}
}
static void
RRResetProc (ExtensionEntry *extEntry)
{
}
static Bool
RRCloseScreen (int i, ScreenPtr pScreen)
{
rrScrPriv(pScreen);
int j;
unwrap (pScrPriv, pScreen, CloseScreen);
for (j = pScrPriv->numCrtcs - 1; j >= 0; j--)
RRCrtcDestroy (pScrPriv->crtcs[j]);
for (j = pScrPriv->numOutputs - 1; j >= 0; j--)
RROutputDestroy (pScrPriv->outputs[j]);
xfree (pScrPriv);
RRNScreens -= 1; /* ok, one fewer screen with RandR running */
return (*pScreen->CloseScreen) (i, pScreen);
}
static void
SRRScreenChangeNotifyEvent(xRRScreenChangeNotifyEvent *from,
xRRScreenChangeNotifyEvent *to)
{
to->type = from->type;
to->rotation = from->rotation;
cpswaps(from->sequenceNumber, to->sequenceNumber);
cpswapl(from->timestamp, to->timestamp);
cpswapl(from->configTimestamp, to->configTimestamp);
cpswapl(from->root, to->root);
cpswapl(from->window, to->window);
cpswaps(from->sizeID, to->sizeID);
cpswaps(from->widthInPixels, to->widthInPixels);
cpswaps(from->heightInPixels, to->heightInPixels);
cpswaps(from->widthInMillimeters, to->widthInMillimeters);
cpswaps(from->heightInMillimeters, to->heightInMillimeters);
cpswaps(from->subpixelOrder, to->subpixelOrder);
}
static void
SRRCrtcChangeNotifyEvent(xRRCrtcChangeNotifyEvent *from,
xRRCrtcChangeNotifyEvent *to)
{
to->type = from->type;
to->subCode = from->subCode;
cpswaps(from->sequenceNumber, to->sequenceNumber);
cpswapl(from->timestamp, to->timestamp);
cpswapl(from->window, to->window);
cpswapl(from->crtc, to->crtc);
cpswapl(from->mode, to->mode);
cpswapl(from->window, to->window);
cpswaps(from->rotation, to->rotation);
cpswaps(from->x, to->x);
cpswaps(from->y, to->y);
cpswaps(from->width, to->width);
cpswaps(from->height, to->height);
}
static void
SRROutputChangeNotifyEvent(xRROutputChangeNotifyEvent *from,
xRROutputChangeNotifyEvent *to)
{
to->type = from->type;
to->subCode = from->subCode;
cpswaps(from->sequenceNumber, to->sequenceNumber);
cpswapl(from->timestamp, to->timestamp);
cpswapl(from->configTimestamp, to->configTimestamp);
cpswapl(from->window, to->window);
cpswapl(from->output, to->output);
cpswapl(from->crtc, to->crtc);
cpswapl(from->mode, to->mode);
cpswaps(from->rotation, to->rotation);
}
static void
SRROutputPropertyNotifyEvent(xRROutputPropertyNotifyEvent *from,
xRROutputPropertyNotifyEvent *to)
{
to->type = from->type;
to->subCode = from->subCode;
cpswaps(from->sequenceNumber, to->sequenceNumber);
cpswapl(from->window, to->window);
cpswapl(from->output, to->output);
cpswapl(from->atom, to->atom);
cpswapl(from->timestamp, to->timestamp);
}
static void
SRRNotifyEvent (xEvent *from,
xEvent *to)
{
switch (from->u.u.detail) {
case RRNotify_CrtcChange:
SRRCrtcChangeNotifyEvent ((xRRCrtcChangeNotifyEvent *) from,
(xRRCrtcChangeNotifyEvent *) to);
break;
case RRNotify_OutputChange:
SRROutputChangeNotifyEvent ((xRROutputChangeNotifyEvent *) from,
(xRROutputChangeNotifyEvent *) to);
break;
case RRNotify_OutputProperty:
SRROutputPropertyNotifyEvent ((xRROutputPropertyNotifyEvent *) from,
(xRROutputPropertyNotifyEvent *) to);
break;
default:
break;
}
}
static int RRGeneration;
Bool RRInit (void)
{
if (RRGeneration != serverGeneration)
{
if (!RRModeInit ())
return FALSE;
if (!RRCrtcInit ())
return FALSE;
if (!RROutputInit ())
return FALSE;
RRGeneration = serverGeneration;
}
return TRUE;
}
Bool RRScreenInit(ScreenPtr pScreen)
{
rrScrPrivPtr pScrPriv;
if (!RRInit ())
return FALSE;
pScrPriv = (rrScrPrivPtr) xcalloc (1, sizeof (rrScrPrivRec));
if (!pScrPriv)
return FALSE;
SetRRScreen(pScreen, pScrPriv);
/*
* Calling function best set these function vectors
*/
pScrPriv->rrGetInfo = 0;
pScrPriv->maxWidth = pScrPriv->minWidth = pScreen->width;
pScrPriv->maxHeight = pScrPriv->minHeight = pScreen->height;
pScrPriv->width = pScreen->width;
pScrPriv->height = pScreen->height;
pScrPriv->mmWidth = pScreen->mmWidth;
pScrPriv->mmHeight = pScreen->mmHeight;
#if RANDR_12_INTERFACE
pScrPriv->rrScreenSetSize = NULL;
pScrPriv->rrCrtcSet = NULL;
pScrPriv->rrCrtcSetGamma = NULL;
#endif
#if RANDR_10_INTERFACE
pScrPriv->rrSetConfig = 0;
pScrPriv->rotations = RR_Rotate_0;
pScrPriv->reqWidth = pScreen->width;
pScrPriv->reqHeight = pScreen->height;
pScrPriv->nSizes = 0;
pScrPriv->pSizes = NULL;
pScrPriv->rotation = RR_Rotate_0;
pScrPriv->rate = 0;
pScrPriv->size = 0;
#endif
/*
* This value doesn't really matter -- any client must call
* GetScreenInfo before reading it which will automatically update
* the time
*/
pScrPriv->lastSetTime = currentTime;
pScrPriv->lastConfigTime = currentTime;
wrap (pScrPriv, pScreen, CloseScreen, RRCloseScreen);
pScrPriv->numOutputs = 0;
pScrPriv->outputs = NULL;
pScrPriv->numCrtcs = 0;
pScrPriv->crtcs = NULL;
RRNScreens += 1; /* keep count of screens that implement randr */
return TRUE;
}
/*ARGSUSED*/
static int
RRFreeClient (pointer data, XID id)
{
RREventPtr pRREvent;
WindowPtr pWin;
RREventPtr *pHead, pCur, pPrev;
pRREvent = (RREventPtr) data;
pWin = pRREvent->window;
pHead = (RREventPtr *) LookupIDByType(pWin->drawable.id, RREventType);
if (pHead) {
pPrev = 0;
for (pCur = *pHead; pCur && pCur != pRREvent; pCur=pCur->next)
pPrev = pCur;
if (pCur)
{
if (pPrev)
pPrev->next = pRREvent->next;
else
*pHead = pRREvent->next;
}
}
xfree ((pointer) pRREvent);
return 1;
}
/*ARGSUSED*/
static int
RRFreeEvents (pointer data, XID id)
{
RREventPtr *pHead, pCur, pNext;
pHead = (RREventPtr *) data;
for (pCur = *pHead; pCur; pCur = pNext) {
pNext = pCur->next;
FreeResource (pCur->clientResource, RRClientType);
xfree ((pointer) pCur);
}
xfree ((pointer) pHead);
return 1;
}
void
RRExtensionInit (void)
{
ExtensionEntry *extEntry;
if (RRNScreens == 0) return;
if (!dixRequestPrivate(RRClientPrivateKey,
sizeof (RRClientRec) +
screenInfo.numScreens * sizeof (RRTimesRec)))
return;
if (!AddCallback (&ClientStateCallback, RRClientCallback, 0))
return;
RRClientType = CreateNewResourceType(RRFreeClient);
if (!RRClientType)
return;
RREventType = CreateNewResourceType(RRFreeEvents);
if (!RREventType)
return;
extEntry = AddExtension (RANDR_NAME, RRNumberEvents, RRNumberErrors,
ProcRRDispatch, SProcRRDispatch,
RRResetProc, StandardMinorOpcode);
if (!extEntry)
return;
RRErrorBase = extEntry->errorBase;
RREventBase = extEntry->eventBase;
EventSwapVector[RREventBase + RRScreenChangeNotify] = (EventSwapPtr)
SRRScreenChangeNotifyEvent;
EventSwapVector[RREventBase + RRNotify] = (EventSwapPtr)
SRRNotifyEvent;
#ifdef PANORAMIX
RRXineramaExtensionInit();
#endif
}
static int
TellChanged (WindowPtr pWin, pointer value)
{
RREventPtr *pHead, pRREvent;
ClientPtr client;
ScreenPtr pScreen = pWin->drawable.pScreen;
rrScrPriv(pScreen);
int i;
pHead = (RREventPtr *) LookupIDByType (pWin->drawable.id, RREventType);
if (!pHead)
return WT_WALKCHILDREN;
for (pRREvent = *pHead; pRREvent; pRREvent = pRREvent->next)
{
client = pRREvent->client;
if (client == serverClient || client->clientGone)
continue;
if (pRREvent->mask & RRScreenChangeNotifyMask)
RRDeliverScreenEvent (client, pWin, pScreen);
if (pRREvent->mask & RRCrtcChangeNotifyMask)
{
for (i = 0; i < pScrPriv->numCrtcs; i++)
{
RRCrtcPtr crtc = pScrPriv->crtcs[i];
if (crtc->changed)
RRDeliverCrtcEvent (client, pWin, crtc);
}
}
if (pRREvent->mask & RROutputChangeNotifyMask)
{
for (i = 0; i < pScrPriv->numOutputs; i++)
{
RROutputPtr output = pScrPriv->outputs[i];
if (output->changed)
RRDeliverOutputEvent (client, pWin, output);
}
}
}
return WT_WALKCHILDREN;
}
/*
* Something changed; send events and adjust pointer position
*/
void
RRTellChanged (ScreenPtr pScreen)
{
rrScrPriv (pScreen);
int i;
if (pScrPriv->changed)
{
UpdateCurrentTime ();
if (pScrPriv->configChanged)
{
pScrPriv->lastConfigTime = currentTime;
pScrPriv->configChanged = FALSE;
}
pScrPriv->changed = FALSE;
WalkTree (pScreen, TellChanged, (pointer) pScreen);
for (i = 0; i < pScrPriv->numOutputs; i++)
pScrPriv->outputs[i]->changed = FALSE;
for (i = 0; i < pScrPriv->numCrtcs; i++)
pScrPriv->crtcs[i]->changed = FALSE;
if (pScrPriv->layoutChanged)
{
pScrPriv->layoutChanged = FALSE;
RRPointerScreenConfigured (pScreen);
RRSendConfigNotify (pScreen);
}
}
}
/*
* Return the first output which is connected to an active CRTC
* Used in emulating 1.0 behaviour
*/
RROutputPtr
RRFirstOutput (ScreenPtr pScreen)
{
rrScrPriv(pScreen);
RROutputPtr output;
int i, j;
for (i = 0; i < pScrPriv->numCrtcs; i++)
{
RRCrtcPtr crtc = pScrPriv->crtcs[i];
for (j = 0; j < pScrPriv->numOutputs; j++)
{
output = pScrPriv->outputs[j];
if (output->crtc == crtc)
return output;
}
}
return NULL;
}
CARD16
RRVerticalRefresh (xRRModeInfo *mode)
{
CARD32 refresh;
CARD32 dots = mode->hTotal * mode->vTotal;
if (!dots)
return 0;
refresh = (mode->dotClock + dots/2) / dots;
if (refresh > 0xffff)
refresh = 0xffff;
return (CARD16) refresh;
}
static int
ProcRRDispatch (ClientPtr client)
{
REQUEST(xReq);
if (stuff->data >= RRNumberRequests || !ProcRandrVector[stuff->data])
return BadRequest;
return (*ProcRandrVector[stuff->data]) (client);
}
static int
SProcRRDispatch (ClientPtr client)
{
REQUEST(xReq);
if (stuff->data >= RRNumberRequests || !ProcRandrVector[stuff->data])
return BadRequest;
return (*SProcRandrVector[stuff->data]) (client);
}
nx-X11/programs/Xserver/randr/randr.h
0 → 100644
View file @
15cee47a
/*
* Copyright © 2000 Compaq Computer Corporation
* Copyright © 2002 Hewlett Packard Company
* Copyright © 2006 Intel Corporation
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*
* Author: Jim Gettys, HP Labs, Hewlett-Packard, Inc.
* Keith Packard, Intel Corporation
*/
#ifndef _RANDR_H_
#define _RANDR_H_
typedef
unsigned
short
Rotation
;
typedef
unsigned
short
SizeID
;
typedef
unsigned
short
SubpixelOrder
;
typedef
unsigned
short
Connection
;
typedef
unsigned
short
XRandrRotation
;
typedef
unsigned
short
XRandrSizeID
;
typedef
unsigned
short
XRandrSubpixelOrder
;
typedef
unsigned
long
XRandrModeFlags
;
#define RANDR_NAME "RANDR"
#define RANDR_MAJOR 1
#define RANDR_MINOR 2
#define RRNumberErrors 3
#define RRNumberEvents 2
#define RRNumberRequests 25
#define X_RRQueryVersion 0
/* we skip 1 to make old clients fail pretty immediately */
#define X_RROldGetScreenInfo 1
#define X_RR1_0SetScreenConfig 2
/* V1.0 apps share the same set screen config request id */
#define X_RRSetScreenConfig 2
#define X_RROldScreenChangeSelectInput 3
/* 3 used to be ScreenChangeSelectInput; deprecated */
#define X_RRSelectInput 4
#define X_RRGetScreenInfo 5
/* V1.2 additions */
#define X_RRGetScreenSizeRange 6
#define X_RRSetScreenSize 7
#define X_RRGetScreenResources 8
#define X_RRGetOutputInfo 9
#define X_RRListOutputProperties 10
#define X_RRQueryOutputProperty 11
#define X_RRConfigureOutputProperty 12
#define X_RRChangeOutputProperty 13
#define X_RRDeleteOutputProperty 14
#define X_RRGetOutputProperty 15
#define X_RRCreateMode 16
#define X_RRDestroyMode 17
#define X_RRAddOutputMode 18
#define X_RRDeleteOutputMode 19
#define X_RRGetCrtcInfo 20
#define X_RRSetCrtcConfig 21
#define X_RRGetCrtcGammaSize 22
#define X_RRGetCrtcGamma 23
#define X_RRSetCrtcGamma 24
/* Event selection bits */
#define RRScreenChangeNotifyMask (1L << 0)
/* V1.2 additions */
#define RRCrtcChangeNotifyMask (1L << 1)
#define RROutputChangeNotifyMask (1L << 2)
#define RROutputPropertyNotifyMask (1L << 3)
/* Event codes */
#define RRScreenChangeNotify 0
/* V1.2 additions */
#define RRNotify 1
/* RRNotify Subcodes */
#define RRNotify_CrtcChange 0
#define RRNotify_OutputChange 1
#define RRNotify_OutputProperty 2
/* used in the rotation field; rotation and reflection in 0.1 proto. */
#define RR_Rotate_0 1
#define RR_Rotate_90 2
#define RR_Rotate_180 4
#define RR_Rotate_270 8
/* new in 1.0 protocol, to allow reflection of screen */
#define RR_Reflect_X 16
#define RR_Reflect_Y 32
#define RRSetConfigSuccess 0
#define RRSetConfigInvalidConfigTime 1
#define RRSetConfigInvalidTime 2
#define RRSetConfigFailed 3
/* new in 1.2 protocol */
#define RR_HSyncPositive 0x00000001
#define RR_HSyncNegative 0x00000002
#define RR_VSyncPositive 0x00000004
#define RR_VSyncNegative 0x00000008
#define RR_Interlace 0x00000010
#define RR_DoubleScan 0x00000020
#define RR_CSync 0x00000040
#define RR_CSyncPositive 0x00000080
#define RR_CSyncNegative 0x00000100
#define RR_HSkewPresent 0x00000200
#define RR_BCast 0x00000400
#define RR_PixelMultiplex 0x00000800
#define RR_DoubleClock 0x00001000
#define RR_ClockDivideBy2 0x00002000
#define RR_Connected 0
#define RR_Disconnected 1
#define RR_UnknownConnection 2
#define BadRROutput 0
#define BadRRCrtc 1
#define BadRRMode 2
/* Conventional RandR output properties */
#define RR_PROPERTY_RANDR_EDID "RANDR_EDID"
#endif
/* _RANDR_H_ */
nx-X11/programs/Xserver/randr/randr.h.NX.original
0 → 100644
View file @
15cee47a
/*
* Copyright © 2000 Compaq Computer Corporation
* Copyright © 2002 Hewlett Packard Company
* Copyright © 2006 Intel Corporation
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*
* Author: Jim Gettys, HP Labs, Hewlett-Packard, Inc.
* Keith Packard, Intel Corporation
*/
#ifndef _RANDR_H_
#define _RANDR_H_
typedef unsigned short Rotation;
typedef unsigned short SizeID;
typedef unsigned short SubpixelOrder;
typedef unsigned short Connection;
typedef unsigned short XRandrRotation;
typedef unsigned short XRandrSizeID;
typedef unsigned short XRandrSubpixelOrder;
typedef unsigned long XRandrModeFlags;
#define RANDR_NAME "RANDR"
#define RANDR_MAJOR 1
#define RANDR_MINOR 2
#define RRNumberErrors 3
#define RRNumberEvents 2
#define RRNumberRequests 25
#define X_RRQueryVersion 0
/* we skip 1 to make old clients fail pretty immediately */
#define X_RROldGetScreenInfo 1
#define X_RR1_0SetScreenConfig 2
/* V1.0 apps share the same set screen config request id */
#define X_RRSetScreenConfig 2
#define X_RROldScreenChangeSelectInput 3
/* 3 used to be ScreenChangeSelectInput; deprecated */
#define X_RRSelectInput 4
#define X_RRGetScreenInfo 5
/* V1.2 additions */
#define X_RRGetScreenSizeRange 6
#define X_RRSetScreenSize 7
#define X_RRGetScreenResources 8
#define X_RRGetOutputInfo 9
#define X_RRListOutputProperties 10
#define X_RRQueryOutputProperty 11
#define X_RRConfigureOutputProperty 12
#define X_RRChangeOutputProperty 13
#define X_RRDeleteOutputProperty 14
#define X_RRGetOutputProperty 15
#define X_RRCreateMode 16
#define X_RRDestroyMode 17
#define X_RRAddOutputMode 18
#define X_RRDeleteOutputMode 19
#define X_RRGetCrtcInfo 20
#define X_RRSetCrtcConfig 21
#define X_RRGetCrtcGammaSize 22
#define X_RRGetCrtcGamma 23
#define X_RRSetCrtcGamma 24
/* Event selection bits */
#define RRScreenChangeNotifyMask (1L << 0)
/* V1.2 additions */
#define RRCrtcChangeNotifyMask (1L << 1)
#define RROutputChangeNotifyMask (1L << 2)
#define RROutputPropertyNotifyMask (1L << 3)
/* Event codes */
#define RRScreenChangeNotify 0
/* V1.2 additions */
#define RRNotify 1
/* RRNotify Subcodes */
#define RRNotify_CrtcChange 0
#define RRNotify_OutputChange 1
#define RRNotify_OutputProperty 2
/* used in the rotation field; rotation and reflection in 0.1 proto. */
#define RR_Rotate_0 1
#define RR_Rotate_90 2
#define RR_Rotate_180 4
#define RR_Rotate_270 8
/* new in 1.0 protocol, to allow reflection of screen */
#define RR_Reflect_X 16
#define RR_Reflect_Y 32
#define RRSetConfigSuccess 0
#define RRSetConfigInvalidConfigTime 1
#define RRSetConfigInvalidTime 2
#define RRSetConfigFailed 3
/* new in 1.2 protocol */
#define RR_HSyncPositive 0x00000001
#define RR_HSyncNegative 0x00000002
#define RR_VSyncPositive 0x00000004
#define RR_VSyncNegative 0x00000008
#define RR_Interlace 0x00000010
#define RR_DoubleScan 0x00000020
#define RR_CSync 0x00000040
#define RR_CSyncPositive 0x00000080
#define RR_CSyncNegative 0x00000100
#define RR_HSkewPresent 0x00000200
#define RR_BCast 0x00000400
#define RR_PixelMultiplex 0x00000800
#define RR_DoubleClock 0x00001000
#define RR_ClockDivideBy2 0x00002000
#define RR_Connected 0
#define RR_Disconnected 1
#define RR_UnknownConnection 2
#define BadRROutput 0
#define BadRRCrtc 1
#define BadRRMode 2
/* Conventional RandR output properties */
#define RR_PROPERTY_RANDR_EDID "RANDR_EDID"
#endif /* _RANDR_H_ */
nx-X11/programs/Xserver/randr/randr.h.X.original
0 → 100644
View file @
15cee47a
nx-X11/programs/Xserver/randr/randrproto.h
0 → 100644
View file @
15cee47a
/*
* Copyright © 2000 Compaq Computer Corporation
* Copyright © 2002 Hewlett-Packard Company
* Copyright © 2006 Intel Corporation
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*
* Author: Jim Gettys, Hewlett-Packard Company, Inc.
* Keith Packard, Intel Corporation
*/
/* note that RANDR 1.0 is incompatible with version 0.0, or 0.1 */
/* V1.0 removes depth switching from the protocol */
#ifndef _XRANDRP_H_
#define _XRANDRP_H_
/*#include <X11/extensions/randr.h>*/
#include "randr.h"
#define Window CARD32
#define Drawable CARD32
#define Font CARD32
#define Pixmap CARD32
#define Cursor CARD32
#define Colormap CARD32
#define GContext CARD32
#define Atom CARD32
#define Time CARD32
#define KeyCode CARD8
#define KeySym CARD32
#define RROutput CARD32
#define RRMode CARD32
#define RRCrtc CARD32
#define RRModeFlags CARD32
#define Rotation CARD16
#define SizeID CARD16
#define SubpixelOrder CARD16
/*
* data structures
*/
typedef
struct
{
CARD16
widthInPixels
B16
;
CARD16
heightInPixels
B16
;
CARD16
widthInMillimeters
B16
;
CARD16
heightInMillimeters
B16
;
}
xScreenSizes
;
#define sz_xScreenSizes 8
/*
* requests and replies
*/
typedef
struct
{
CARD8
reqType
;
CARD8
randrReqType
;
CARD16
length
B16
;
CARD32
majorVersion
B32
;
CARD32
minorVersion
B32
;
}
xRRQueryVersionReq
;
#define sz_xRRQueryVersionReq 12
typedef
struct
{
BYTE
type
;
/* X_Reply */
BYTE
pad1
;
CARD16
sequenceNumber
B16
;
CARD32
length
B32
;
CARD32
majorVersion
B32
;
CARD32
minorVersion
B32
;
CARD32
pad2
B32
;
CARD32
pad3
B32
;
CARD32
pad4
B32
;
CARD32
pad5
B32
;
}
xRRQueryVersionReply
;
#define sz_xRRQueryVersionReply 32
typedef
struct
{
CARD8
reqType
;
CARD8
randrReqType
;
CARD16
length
B16
;
Window
window
B32
;
}
xRRGetScreenInfoReq
;
#define sz_xRRGetScreenInfoReq 8
/*
* the xRRScreenInfoReply structure is followed by:
*
* the size information
*/
typedef
struct
{
BYTE
type
;
/* X_Reply */
BYTE
setOfRotations
;
CARD16
sequenceNumber
B16
;
CARD32
length
B32
;
Window
root
B32
;
Time
timestamp
B32
;
Time
configTimestamp
B32
;
CARD16
nSizes
B16
;
SizeID
sizeID
B16
;
Rotation
rotation
B16
;
CARD16
rate
B16
;
CARD16
nrateEnts
B16
;
CARD16
pad
B16
;
}
xRRGetScreenInfoReply
;
#define sz_xRRGetScreenInfoReply 32
typedef
struct
{
CARD8
reqType
;
CARD8
randrReqType
;
CARD16
length
B16
;
Drawable
drawable
B32
;
Time
timestamp
B32
;
Time
configTimestamp
B32
;
SizeID
sizeID
B16
;
Rotation
rotation
B16
;
}
xRR1_0SetScreenConfigReq
;
#define sz_xRR1_0SetScreenConfigReq 20
typedef
struct
{
CARD8
reqType
;
CARD8
randrReqType
;
CARD16
length
B16
;
Drawable
drawable
B32
;
Time
timestamp
B32
;
Time
configTimestamp
B32
;
SizeID
sizeID
B16
;
Rotation
rotation
B16
;
CARD16
rate
B16
;
CARD16
pad
B16
;
}
xRRSetScreenConfigReq
;
#define sz_xRRSetScreenConfigReq 24
typedef
struct
{
BYTE
type
;
/* X_Reply */
CARD8
status
;
CARD16
sequenceNumber
B16
;
CARD32
length
B32
;
Time
newTimestamp
B32
;
Time
newConfigTimestamp
B32
;
Window
root
;
CARD16
subpixelOrder
B16
;
CARD16
pad4
B16
;
CARD32
pad5
B32
;
CARD32
pad6
B32
;
}
xRRSetScreenConfigReply
;
#define sz_xRRSetScreenConfigReply 32
typedef
struct
{
CARD8
reqType
;
CARD8
randrReqType
;
CARD16
length
B16
;
Window
window
B32
;
CARD16
enable
B16
;
CARD16
pad2
B16
;
}
xRRSelectInputReq
;
#define sz_xRRSelectInputReq 12
/*
* Additions for version 1.2
*/
typedef
struct
_xRRModeInfo
{
RRMode
id
B32
;
CARD16
width
B16
;
CARD16
height
B16
;
CARD32
dotClock
B32
;
CARD16
hSyncStart
B16
;
CARD16
hSyncEnd
B16
;
CARD16
hTotal
B16
;
CARD16
hSkew
B16
;
CARD16
vSyncStart
B16
;
CARD16
vSyncEnd
B16
;
CARD16
vTotal
B16
;
CARD16
nameLength
B16
;
RRModeFlags
modeFlags
B32
;
}
xRRModeInfo
;
#define sz_xRRModeInfo 32
typedef
struct
{
CARD8
reqType
;
CARD8
randrReqType
;
CARD16
length
B16
;
Window
window
B32
;
}
xRRGetScreenSizeRangeReq
;
#define sz_xRRGetScreenSizeRangeReq 8
typedef
struct
{
BYTE
type
;
/* X_Reply */
CARD8
pad
;
CARD16
sequenceNumber
B16
;
CARD32
length
B32
;
CARD16
minWidth
B16
;
CARD16
minHeight
B16
;
CARD16
maxWidth
B16
;
CARD16
maxHeight
B16
;
CARD32
pad0
B32
;
CARD32
pad1
B32
;
CARD32
pad2
B32
;
CARD32
pad3
B32
;
}
xRRGetScreenSizeRangeReply
;
#define sz_xRRGetScreenSizeRangeReply 32
typedef
struct
{
CARD8
reqType
;
CARD8
randrReqType
;
CARD16
length
B16
;
Window
window
B32
;
CARD16
width
B16
;
CARD16
height
B16
;
CARD32
widthInMillimeters
B32
;
CARD32
heightInMillimeters
B32
;
}
xRRSetScreenSizeReq
;
#define sz_xRRSetScreenSizeReq 20
typedef
struct
{
CARD8
reqType
;
CARD8
randrReqType
;
CARD16
length
B16
;
Window
window
B32
;
}
xRRGetScreenResourcesReq
;
#define sz_xRRGetScreenResourcesReq 8
typedef
struct
{
BYTE
type
;
CARD8
pad
;
CARD16
sequenceNumber
B16
;
CARD32
length
B32
;
Time
timestamp
B32
;
Time
configTimestamp
B32
;
CARD16
nCrtcs
B16
;
CARD16
nOutputs
B16
;
CARD16
nModes
B16
;
CARD16
nbytesNames
B16
;
CARD32
pad1
B32
;
CARD32
pad2
B32
;
}
xRRGetScreenResourcesReply
;
#define sz_xRRGetScreenResourcesReply 32
typedef
struct
{
CARD8
reqType
;
CARD8
randrReqType
;
CARD16
length
B16
;
RROutput
output
B32
;
Time
configTimestamp
B32
;
}
xRRGetOutputInfoReq
;
#define sz_xRRGetOutputInfoReq 12
typedef
struct
{
BYTE
type
;
CARD8
status
;
CARD16
sequenceNumber
B16
;
CARD32
length
B32
;
Time
timestamp
B32
;
RRCrtc
crtc
B32
;
CARD32
mmWidth
B32
;
CARD32
mmHeight
B32
;
CARD8
connection
;
CARD8
subpixelOrder
;
CARD16
nCrtcs
B16
;
CARD16
nModes
B16
;
CARD16
nPreferred
B16
;
CARD16
nClones
B16
;
CARD16
nameLength
B16
;
}
xRRGetOutputInfoReply
;
#define sz_xRRGetOutputInfoReply 36
typedef
struct
{
CARD8
reqType
;
CARD8
randrReqType
;
CARD16
length
B16
;
RROutput
output
B32
;
}
xRRListOutputPropertiesReq
;
#define sz_xRRListOutputPropertiesReq 8
typedef
struct
{
BYTE
type
;
CARD8
pad0
;
CARD16
sequenceNumber
B16
;
CARD32
length
B32
;
CARD16
nAtoms
B16
;
CARD16
pad1
B16
;
CARD32
pad2
B32
;
CARD32
pad3
B32
;
CARD32
pad4
B32
;
CARD32
pad5
B32
;
CARD32
pad6
B32
;
}
xRRListOutputPropertiesReply
;
#define sz_xRRListOutputPropertiesReply 32
typedef
struct
{
CARD8
reqType
;
CARD8
randrReqType
;
CARD16
length
B16
;
RROutput
output
B32
;
Atom
property
B32
;
}
xRRQueryOutputPropertyReq
;
#define sz_xRRQueryOutputPropertyReq 12
typedef
struct
{
BYTE
type
;
BYTE
pad0
;
CARD16
sequenceNumber
B16
;
CARD32
length
B32
;
BOOL
pending
;
BOOL
range
;
BOOL
immutable
;
BYTE
pad1
;
CARD32
pad2
B32
;
CARD32
pad3
B32
;
CARD32
pad4
B32
;
CARD32
pad5
B32
;
CARD32
pad6
B32
;
}
xRRQueryOutputPropertyReply
;
#define sz_xRRQueryOutputPropertyReply 32
typedef
struct
{
CARD8
reqType
;
CARD8
randrReqType
;
CARD16
length
B16
;
RROutput
output
B32
;
Atom
property
B32
;
BOOL
pending
;
BOOL
range
;
CARD16
pad
B16
;
}
xRRConfigureOutputPropertyReq
;
#define sz_xRRConfigureOutputPropertyReq 16
typedef
struct
{
CARD8
reqType
;
CARD8
randrReqType
;
CARD16
length
B16
;
RROutput
output
B32
;
Atom
property
B32
;
Atom
type
B32
;
CARD8
format
;
CARD8
mode
;
CARD16
pad
;
CARD32
nUnits
B32
;
}
xRRChangeOutputPropertyReq
;
#define sz_xRRChangeOutputPropertyReq 24
typedef
struct
{
CARD8
reqType
;
CARD8
randrReqType
;
CARD16
length
B16
;
RROutput
output
B32
;
Atom
property
B32
;
}
xRRDeleteOutputPropertyReq
;
#define sz_xRRDeleteOutputPropertyReq 12
typedef
struct
{
CARD8
reqType
;
CARD8
randrReqType
;
CARD16
length
B16
;
RROutput
output
B32
;
Atom
property
B32
;
Atom
type
B32
;
CARD32
longOffset
B32
;
CARD32
longLength
B32
;
#ifdef __cplusplus
BOOL
_delete
;
#else
BOOL
delete
;
#endif
BOOL
pending
;
CARD16
pad1
B16
;
}
xRRGetOutputPropertyReq
;
#define sz_xRRGetOutputPropertyReq 28
typedef
struct
{
BYTE
type
;
CARD8
format
;
CARD16
sequenceNumber
B16
;
CARD32
length
B32
;
Atom
propertyType
B32
;
CARD32
bytesAfter
B32
;
CARD32
nItems
B32
;
CARD32
pad1
B32
;
CARD32
pad2
B32
;
CARD32
pad3
B32
;
}
xRRGetOutputPropertyReply
;
#define sz_xRRGetOutputPropertyReply 32
typedef
struct
{
CARD8
reqType
;
CARD8
randrReqType
;
CARD16
length
B16
;
Window
window
B32
;
xRRModeInfo
modeInfo
;
}
xRRCreateModeReq
;
#define sz_xRRCreateModeReq 40
typedef
struct
{
BYTE
type
;
CARD8
pad0
;
CARD16
sequenceNumber
B16
;
CARD32
length
B32
;
RRMode
mode
B32
;
CARD32
pad1
B32
;
CARD32
pad2
B32
;
CARD32
pad3
B32
;
CARD32
pad4
B32
;
CARD32
pad5
B32
;
}
xRRCreateModeReply
;
#define sz_xRRCreateModeReply 32
typedef
struct
{
CARD8
reqType
;
CARD8
randrReqType
;
CARD16
length
B16
;
RRMode
mode
B32
;
}
xRRDestroyModeReq
;
#define sz_xRRDestroyModeReq 8
typedef
struct
{
CARD8
reqType
;
CARD8
randrReqType
;
CARD16
length
B16
;
RROutput
output
B32
;
RRMode
mode
B32
;
}
xRRAddOutputModeReq
;
#define sz_xRRAddOutputModeReq 12
typedef
struct
{
CARD8
reqType
;
CARD8
randrReqType
;
CARD16
length
B16
;
RROutput
output
B32
;
RRMode
mode
B32
;
}
xRRDeleteOutputModeReq
;
#define sz_xRRDeleteOutputModeReq 12
typedef
struct
{
CARD8
reqType
;
CARD8
randrReqType
;
CARD16
length
B16
;
RRCrtc
crtc
B32
;
Time
configTimestamp
B32
;
}
xRRGetCrtcInfoReq
;
#define sz_xRRGetCrtcInfoReq 12
typedef
struct
{
BYTE
type
;
CARD8
status
;
CARD16
sequenceNumber
B16
;
CARD32
length
B32
;
Time
timestamp
B32
;
INT16
x
B16
;
INT16
y
B16
;
CARD16
width
B16
;
CARD16
height
B16
;
RRMode
mode
B32
;
Rotation
rotation
B16
;
Rotation
rotations
B16
;
CARD16
nOutput
B16
;
CARD16
nPossibleOutput
B16
;
}
xRRGetCrtcInfoReply
;
#define sz_xRRGetCrtcInfoReply 32
typedef
struct
{
CARD8
reqType
;
CARD8
randrReqType
;
CARD16
length
B16
;
RRCrtc
crtc
B32
;
Time
timestamp
B32
;
Time
configTimestamp
B32
;
INT16
x
B16
;
INT16
y
B16
;
RRMode
mode
B32
;
Rotation
rotation
B16
;
CARD16
pad
B16
;
}
xRRSetCrtcConfigReq
;
#define sz_xRRSetCrtcConfigReq 28
typedef
struct
{
BYTE
type
;
CARD8
status
;
CARD16
sequenceNumber
B16
;
CARD32
length
B32
;
Time
newTimestamp
B32
;
CARD32
pad1
B32
;
CARD32
pad2
B16
;
CARD32
pad3
B32
;
CARD32
pad4
B32
;
CARD32
pad5
B32
;
}
xRRSetCrtcConfigReply
;
#define sz_xRRSetCrtcConfigReply 32
typedef
struct
{
CARD8
reqType
;
CARD8
randrReqType
;
CARD16
length
B16
;
RRCrtc
crtc
B32
;
}
xRRGetCrtcGammaSizeReq
;
#define sz_xRRGetCrtcGammaSizeReq 8
typedef
struct
{
BYTE
type
;
CARD8
status
;
CARD16
sequenceNumber
B16
;
CARD32
length
B32
;
CARD16
size
B16
;
CARD16
pad1
B16
;
CARD32
pad2
B32
;
CARD32
pad3
B32
;
CARD32
pad4
B32
;
CARD32
pad5
B32
;
CARD32
pad6
B32
;
}
xRRGetCrtcGammaSizeReply
;
#define sz_xRRGetCrtcGammaSizeReply 32
typedef
struct
{
CARD8
reqType
;
CARD8
randrReqType
;
CARD16
length
B16
;
RRCrtc
crtc
B32
;
}
xRRGetCrtcGammaReq
;
#define sz_xRRGetCrtcGammaReq 8
typedef
struct
{
BYTE
type
;
CARD8
status
;
CARD16
sequenceNumber
B16
;
CARD32
length
B32
;
CARD16
size
B16
;
CARD16
pad1
B16
;
CARD32
pad2
B32
;
CARD32
pad3
B32
;
CARD32
pad4
B32
;
CARD32
pad5
B32
;
CARD32
pad6
B32
;
}
xRRGetCrtcGammaReply
;
#define sz_xRRGetCrtcGammaReply 32
typedef
struct
{
CARD8
reqType
;
CARD8
randrReqType
;
CARD16
length
B16
;
RRCrtc
crtc
B32
;
CARD16
size
B16
;
CARD16
pad1
B16
;
}
xRRSetCrtcGammaReq
;
#define sz_xRRSetCrtcGammaReq 12
/*
* event
*/
typedef
struct
{
CARD8
type
;
/* always evBase + ScreenChangeNotify */
CARD8
rotation
;
/* new rotation */
CARD16
sequenceNumber
B16
;
Time
timestamp
B32
;
/* time screen was changed */
Time
configTimestamp
B32
;
/* time config data was changed */
Window
root
B32
;
/* root window */
Window
window
B32
;
/* window requesting notification */
SizeID
sizeID
B16
;
/* new size ID */
CARD16
subpixelOrder
B16
;
/* subpixel order */
CARD16
widthInPixels
B16
;
/* new size */
CARD16
heightInPixels
B16
;
CARD16
widthInMillimeters
B16
;
CARD16
heightInMillimeters
B16
;
}
xRRScreenChangeNotifyEvent
;
#define sz_xRRScreenChangeNotifyEvent 32
typedef
struct
{
CARD8
type
;
/* always evBase + RRNotify */
CARD8
subCode
;
/* RRNotify_CrtcChange */
CARD16
sequenceNumber
B16
;
Time
timestamp
B32
;
/* time crtc was changed */
Window
window
B32
;
/* window requesting notification */
RRCrtc
crtc
B32
;
/* affected CRTC */
RRMode
mode
B32
;
/* current mode */
CARD16
rotation
B16
;
/* rotation and reflection */
CARD16
pad1
B16
;
/* unused */
INT16
x
B16
;
/* new location */
INT16
y
B16
;
CARD16
width
B16
;
/* new size */
CARD16
height
B16
;
}
xRRCrtcChangeNotifyEvent
;
#define sz_xRRCrtcChangeNotifyEvent 32
typedef
struct
{
CARD8
type
;
/* always evBase + RRNotify */
CARD8
subCode
;
/* RRNotify_OutputChange */
CARD16
sequenceNumber
B16
;
Time
timestamp
B32
;
/* time crtc was changed */
Time
configTimestamp
B32
;
/* time crtc was changed */
Window
window
B32
;
/* window requesting notification */
RROutput
output
B32
;
/* affected output */
RRCrtc
crtc
B32
;
/* current crtc */
RRMode
mode
B32
;
/* current mode */
CARD16
rotation
B16
;
/* rotation and reflection */
CARD8
connection
;
/* connection status */
CARD8
subpixelOrder
;
/* subpixel order */
}
xRROutputChangeNotifyEvent
;
#define sz_xRROutputChangeNotifyEvent 32
typedef
struct
{
CARD8
type
;
/* always evBase + RRNotify */
CARD8
subCode
;
/* RRNotify_OutputProperty */
CARD16
sequenceNumber
B16
;
Window
window
B32
;
/* window requesting notification */
RROutput
output
B32
;
/* affected output */
Atom
atom
B32
;
/* property name */
Time
timestamp
B32
;
/* time crtc was changed */
CARD8
state
;
/* NewValue or Deleted */
CARD8
pad1
;
CARD16
pad2
B16
;
CARD32
pad3
B32
;
CARD32
pad4
B32
;
}
xRROutputPropertyNotifyEvent
;
#define sz_xRROutputPropertyNotifyEvent 32
#undef RRModeFlags
#undef RRCrtc
#undef RRMode
#undef RROutput
#undef RRMode
#undef RRCrtc
#undef Drawable
#undef Window
#undef Font
#undef Pixmap
#undef Cursor
#undef Colormap
#undef GContext
#undef Atom
#undef Time
#undef KeyCode
#undef KeySym
#undef Rotation
#undef SizeID
#undef SubpixelOrder
#endif
/* _XRANDRP_H_ */
nx-X11/programs/Xserver/randr/randrproto.h.NX.original
0 → 100644
View file @
15cee47a
/*
* Copyright © 2000 Compaq Computer Corporation
* Copyright © 2002 Hewlett-Packard Company
* Copyright © 2006 Intel Corporation
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*
* Author: Jim Gettys, Hewlett-Packard Company, Inc.
* Keith Packard, Intel Corporation
*/
/* note that RANDR 1.0 is incompatible with version 0.0, or 0.1 */
/* V1.0 removes depth switching from the protocol */
#ifndef _XRANDRP_H_
#define _XRANDRP_H_
/*#include <X11/extensions/randr.h>*/
#include "randr.h"
#define Window CARD32
#define Drawable CARD32
#define Font CARD32
#define Pixmap CARD32
#define Cursor CARD32
#define Colormap CARD32
#define GContext CARD32
#define Atom CARD32
#define Time CARD32
#define KeyCode CARD8
#define KeySym CARD32
#define RROutput CARD32
#define RRMode CARD32
#define RRCrtc CARD32
#define RRModeFlags CARD32
#define Rotation CARD16
#define SizeID CARD16
#define SubpixelOrder CARD16
/*
* data structures
*/
typedef struct {
CARD16 widthInPixels B16;
CARD16 heightInPixels B16;
CARD16 widthInMillimeters B16;
CARD16 heightInMillimeters B16;
} xScreenSizes;
#define sz_xScreenSizes 8
/*
* requests and replies
*/
typedef struct {
CARD8 reqType;
CARD8 randrReqType;
CARD16 length B16;
CARD32 majorVersion B32;
CARD32 minorVersion B32;
} xRRQueryVersionReq;
#define sz_xRRQueryVersionReq 12
typedef struct {
BYTE type; /* X_Reply */
BYTE pad1;
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD32 majorVersion B32;
CARD32 minorVersion B32;
CARD32 pad2 B32;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
} xRRQueryVersionReply;
#define sz_xRRQueryVersionReply 32
typedef struct {
CARD8 reqType;
CARD8 randrReqType;
CARD16 length B16;
Window window B32;
} xRRGetScreenInfoReq;
#define sz_xRRGetScreenInfoReq 8
/*
* the xRRScreenInfoReply structure is followed by:
*
* the size information
*/
typedef struct {
BYTE type; /* X_Reply */
BYTE setOfRotations;
CARD16 sequenceNumber B16;
CARD32 length B32;
Window root B32;
Time timestamp B32;
Time configTimestamp B32;
CARD16 nSizes B16;
SizeID sizeID B16;
Rotation rotation B16;
CARD16 rate B16;
CARD16 nrateEnts B16;
CARD16 pad B16;
} xRRGetScreenInfoReply;
#define sz_xRRGetScreenInfoReply 32
typedef struct {
CARD8 reqType;
CARD8 randrReqType;
CARD16 length B16;
Drawable drawable B32;
Time timestamp B32;
Time configTimestamp B32;
SizeID sizeID B16;
Rotation rotation B16;
} xRR1_0SetScreenConfigReq;
#define sz_xRR1_0SetScreenConfigReq 20
typedef struct {
CARD8 reqType;
CARD8 randrReqType;
CARD16 length B16;
Drawable drawable B32;
Time timestamp B32;
Time configTimestamp B32;
SizeID sizeID B16;
Rotation rotation B16;
CARD16 rate B16;
CARD16 pad B16;
} xRRSetScreenConfigReq;
#define sz_xRRSetScreenConfigReq 24
typedef struct {
BYTE type; /* X_Reply */
CARD8 status;
CARD16 sequenceNumber B16;
CARD32 length B32;
Time newTimestamp B32;
Time newConfigTimestamp B32;
Window root;
CARD16 subpixelOrder B16;
CARD16 pad4 B16;
CARD32 pad5 B32;
CARD32 pad6 B32;
} xRRSetScreenConfigReply;
#define sz_xRRSetScreenConfigReply 32
typedef struct {
CARD8 reqType;
CARD8 randrReqType;
CARD16 length B16;
Window window B32;
CARD16 enable B16;
CARD16 pad2 B16;
} xRRSelectInputReq;
#define sz_xRRSelectInputReq 12
/*
* Additions for version 1.2
*/
typedef struct _xRRModeInfo {
RRMode id B32;
CARD16 width B16;
CARD16 height B16;
CARD32 dotClock B32;
CARD16 hSyncStart B16;
CARD16 hSyncEnd B16;
CARD16 hTotal B16;
CARD16 hSkew B16;
CARD16 vSyncStart B16;
CARD16 vSyncEnd B16;
CARD16 vTotal B16;
CARD16 nameLength B16;
RRModeFlags modeFlags B32;
} xRRModeInfo;
#define sz_xRRModeInfo 32
typedef struct {
CARD8 reqType;
CARD8 randrReqType;
CARD16 length B16;
Window window B32;
} xRRGetScreenSizeRangeReq;
#define sz_xRRGetScreenSizeRangeReq 8
typedef struct {
BYTE type; /* X_Reply */
CARD8 pad;
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD16 minWidth B16;
CARD16 minHeight B16;
CARD16 maxWidth B16;
CARD16 maxHeight B16;
CARD32 pad0 B32;
CARD32 pad1 B32;
CARD32 pad2 B32;
CARD32 pad3 B32;
} xRRGetScreenSizeRangeReply;
#define sz_xRRGetScreenSizeRangeReply 32
typedef struct {
CARD8 reqType;
CARD8 randrReqType;
CARD16 length B16;
Window window B32;
CARD16 width B16;
CARD16 height B16;
CARD32 widthInMillimeters B32;
CARD32 heightInMillimeters B32;
} xRRSetScreenSizeReq;
#define sz_xRRSetScreenSizeReq 20
typedef struct {
CARD8 reqType;
CARD8 randrReqType;
CARD16 length B16;
Window window B32;
} xRRGetScreenResourcesReq;
#define sz_xRRGetScreenResourcesReq 8
typedef struct {
BYTE type;
CARD8 pad;
CARD16 sequenceNumber B16;
CARD32 length B32;
Time timestamp B32;
Time configTimestamp B32;
CARD16 nCrtcs B16;
CARD16 nOutputs B16;
CARD16 nModes B16;
CARD16 nbytesNames B16;
CARD32 pad1 B32;
CARD32 pad2 B32;
} xRRGetScreenResourcesReply;
#define sz_xRRGetScreenResourcesReply 32
typedef struct {
CARD8 reqType;
CARD8 randrReqType;
CARD16 length B16;
RROutput output B32;
Time configTimestamp B32;
} xRRGetOutputInfoReq;
#define sz_xRRGetOutputInfoReq 12
typedef struct {
BYTE type;
CARD8 status;
CARD16 sequenceNumber B16;
CARD32 length B32;
Time timestamp B32;
RRCrtc crtc B32;
CARD32 mmWidth B32;
CARD32 mmHeight B32;
CARD8 connection;
CARD8 subpixelOrder;
CARD16 nCrtcs B16;
CARD16 nModes B16;
CARD16 nPreferred B16;
CARD16 nClones B16;
CARD16 nameLength B16;
} xRRGetOutputInfoReply;
#define sz_xRRGetOutputInfoReply 36
typedef struct {
CARD8 reqType;
CARD8 randrReqType;
CARD16 length B16;
RROutput output B32;
} xRRListOutputPropertiesReq;
#define sz_xRRListOutputPropertiesReq 8
typedef struct {
BYTE type;
CARD8 pad0;
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD16 nAtoms B16;
CARD16 pad1 B16;
CARD32 pad2 B32;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
} xRRListOutputPropertiesReply;
#define sz_xRRListOutputPropertiesReply 32
typedef struct {
CARD8 reqType;
CARD8 randrReqType;
CARD16 length B16;
RROutput output B32;
Atom property B32;
} xRRQueryOutputPropertyReq;
#define sz_xRRQueryOutputPropertyReq 12
typedef struct {
BYTE type;
BYTE pad0;
CARD16 sequenceNumber B16;
CARD32 length B32;
BOOL pending;
BOOL range;
BOOL immutable;
BYTE pad1;
CARD32 pad2 B32;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
} xRRQueryOutputPropertyReply;
#define sz_xRRQueryOutputPropertyReply 32
typedef struct {
CARD8 reqType;
CARD8 randrReqType;
CARD16 length B16;
RROutput output B32;
Atom property B32;
BOOL pending;
BOOL range;
CARD16 pad B16;
} xRRConfigureOutputPropertyReq;
#define sz_xRRConfigureOutputPropertyReq 16
typedef struct {
CARD8 reqType;
CARD8 randrReqType;
CARD16 length B16;
RROutput output B32;
Atom property B32;
Atom type B32;
CARD8 format;
CARD8 mode;
CARD16 pad;
CARD32 nUnits B32;
} xRRChangeOutputPropertyReq;
#define sz_xRRChangeOutputPropertyReq 24
typedef struct {
CARD8 reqType;
CARD8 randrReqType;
CARD16 length B16;
RROutput output B32;
Atom property B32;
} xRRDeleteOutputPropertyReq;
#define sz_xRRDeleteOutputPropertyReq 12
typedef struct {
CARD8 reqType;
CARD8 randrReqType;
CARD16 length B16;
RROutput output B32;
Atom property B32;
Atom type B32;
CARD32 longOffset B32;
CARD32 longLength B32;
#ifdef __cplusplus
BOOL _delete;
#else
BOOL delete;
#endif
BOOL pending;
CARD16 pad1 B16;
} xRRGetOutputPropertyReq;
#define sz_xRRGetOutputPropertyReq 28
typedef struct {
BYTE type;
CARD8 format;
CARD16 sequenceNumber B16;
CARD32 length B32;
Atom propertyType B32;
CARD32 bytesAfter B32;
CARD32 nItems B32;
CARD32 pad1 B32;
CARD32 pad2 B32;
CARD32 pad3 B32;
} xRRGetOutputPropertyReply;
#define sz_xRRGetOutputPropertyReply 32
typedef struct {
CARD8 reqType;
CARD8 randrReqType;
CARD16 length B16;
Window window B32;
xRRModeInfo modeInfo;
} xRRCreateModeReq;
#define sz_xRRCreateModeReq 40
typedef struct {
BYTE type;
CARD8 pad0;
CARD16 sequenceNumber B16;
CARD32 length B32;
RRMode mode B32;
CARD32 pad1 B32;
CARD32 pad2 B32;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
} xRRCreateModeReply;
#define sz_xRRCreateModeReply 32
typedef struct {
CARD8 reqType;
CARD8 randrReqType;
CARD16 length B16;
RRMode mode B32;
} xRRDestroyModeReq;
#define sz_xRRDestroyModeReq 8
typedef struct {
CARD8 reqType;
CARD8 randrReqType;
CARD16 length B16;
RROutput output B32;
RRMode mode B32;
} xRRAddOutputModeReq;
#define sz_xRRAddOutputModeReq 12
typedef struct {
CARD8 reqType;
CARD8 randrReqType;
CARD16 length B16;
RROutput output B32;
RRMode mode B32;
} xRRDeleteOutputModeReq;
#define sz_xRRDeleteOutputModeReq 12
typedef struct {
CARD8 reqType;
CARD8 randrReqType;
CARD16 length B16;
RRCrtc crtc B32;
Time configTimestamp B32;
} xRRGetCrtcInfoReq;
#define sz_xRRGetCrtcInfoReq 12
typedef struct {
BYTE type;
CARD8 status;
CARD16 sequenceNumber B16;
CARD32 length B32;
Time timestamp B32;
INT16 x B16;
INT16 y B16;
CARD16 width B16;
CARD16 height B16;
RRMode mode B32;
Rotation rotation B16;
Rotation rotations B16;
CARD16 nOutput B16;
CARD16 nPossibleOutput B16;
} xRRGetCrtcInfoReply;
#define sz_xRRGetCrtcInfoReply 32
typedef struct {
CARD8 reqType;
CARD8 randrReqType;
CARD16 length B16;
RRCrtc crtc B32;
Time timestamp B32;
Time configTimestamp B32;
INT16 x B16;
INT16 y B16;
RRMode mode B32;
Rotation rotation B16;
CARD16 pad B16;
} xRRSetCrtcConfigReq;
#define sz_xRRSetCrtcConfigReq 28
typedef struct {
BYTE type;
CARD8 status;
CARD16 sequenceNumber B16;
CARD32 length B32;
Time newTimestamp B32;
CARD32 pad1 B32;
CARD32 pad2 B16;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
} xRRSetCrtcConfigReply;
#define sz_xRRSetCrtcConfigReply 32
typedef struct {
CARD8 reqType;
CARD8 randrReqType;
CARD16 length B16;
RRCrtc crtc B32;
} xRRGetCrtcGammaSizeReq;
#define sz_xRRGetCrtcGammaSizeReq 8
typedef struct {
BYTE type;
CARD8 status;
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD16 size B16;
CARD16 pad1 B16;
CARD32 pad2 B32;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
} xRRGetCrtcGammaSizeReply;
#define sz_xRRGetCrtcGammaSizeReply 32
typedef struct {
CARD8 reqType;
CARD8 randrReqType;
CARD16 length B16;
RRCrtc crtc B32;
} xRRGetCrtcGammaReq;
#define sz_xRRGetCrtcGammaReq 8
typedef struct {
BYTE type;
CARD8 status;
CARD16 sequenceNumber B16;
CARD32 length B32;
CARD16 size B16;
CARD16 pad1 B16;
CARD32 pad2 B32;
CARD32 pad3 B32;
CARD32 pad4 B32;
CARD32 pad5 B32;
CARD32 pad6 B32;
} xRRGetCrtcGammaReply;
#define sz_xRRGetCrtcGammaReply 32
typedef struct {
CARD8 reqType;
CARD8 randrReqType;
CARD16 length B16;
RRCrtc crtc B32;
CARD16 size B16;
CARD16 pad1 B16;
} xRRSetCrtcGammaReq;
#define sz_xRRSetCrtcGammaReq 12
/*
* event
*/
typedef struct {
CARD8 type; /* always evBase + ScreenChangeNotify */
CARD8 rotation; /* new rotation */
CARD16 sequenceNumber B16;
Time timestamp B32; /* time screen was changed */
Time configTimestamp B32; /* time config data was changed */
Window root B32; /* root window */
Window window B32; /* window requesting notification */
SizeID sizeID B16; /* new size ID */
CARD16 subpixelOrder B16; /* subpixel order */
CARD16 widthInPixels B16; /* new size */
CARD16 heightInPixels B16;
CARD16 widthInMillimeters B16;
CARD16 heightInMillimeters B16;
} xRRScreenChangeNotifyEvent;
#define sz_xRRScreenChangeNotifyEvent 32
typedef struct {
CARD8 type; /* always evBase + RRNotify */
CARD8 subCode; /* RRNotify_CrtcChange */
CARD16 sequenceNumber B16;
Time timestamp B32; /* time crtc was changed */
Window window B32; /* window requesting notification */
RRCrtc crtc B32; /* affected CRTC */
RRMode mode B32; /* current mode */
CARD16 rotation B16; /* rotation and reflection */
CARD16 pad1 B16; /* unused */
INT16 x B16; /* new location */
INT16 y B16;
CARD16 width B16; /* new size */
CARD16 height B16;
} xRRCrtcChangeNotifyEvent;
#define sz_xRRCrtcChangeNotifyEvent 32
typedef struct {
CARD8 type; /* always evBase + RRNotify */
CARD8 subCode; /* RRNotify_OutputChange */
CARD16 sequenceNumber B16;
Time timestamp B32; /* time crtc was changed */
Time configTimestamp B32; /* time crtc was changed */
Window window B32; /* window requesting notification */
RROutput output B32; /* affected output */
RRCrtc crtc B32; /* current crtc */
RRMode mode B32; /* current mode */
CARD16 rotation B16; /* rotation and reflection */
CARD8 connection; /* connection status */
CARD8 subpixelOrder; /* subpixel order */
} xRROutputChangeNotifyEvent;
#define sz_xRROutputChangeNotifyEvent 32
typedef struct {
CARD8 type; /* always evBase + RRNotify */
CARD8 subCode; /* RRNotify_OutputProperty */
CARD16 sequenceNumber B16;
Window window B32; /* window requesting notification */
RROutput output B32; /* affected output */
Atom atom B32; /* property name */
Time timestamp B32; /* time crtc was changed */
CARD8 state; /* NewValue or Deleted */
CARD8 pad1;
CARD16 pad2 B16;
CARD32 pad3 B32;
CARD32 pad4 B32;
} xRROutputPropertyNotifyEvent;
#define sz_xRROutputPropertyNotifyEvent 32
#undef RRModeFlags
#undef RRCrtc
#undef RRMode
#undef RROutput
#undef RRMode
#undef RRCrtc
#undef Drawable
#undef Window
#undef Font
#undef Pixmap
#undef Cursor
#undef Colormap
#undef GContext
#undef Atom
#undef Time
#undef KeyCode
#undef KeySym
#undef Rotation
#undef SizeID
#undef SubpixelOrder
#endif /* _XRANDRP_H_ */
nx-X11/programs/Xserver/randr/randrproto.h.X.original
0 → 100644
View file @
15cee47a
nx-X11/programs/Xserver/randr/randrstr.h
View file @
15cee47a
/*
* $XFree86: xc/programs/Xserver/randr/randrstr.h,v 1.5 2002/09/29 23:39:45 keithp Exp $
*
* Copyright © 2000 Compaq Computer Corporation
* Copyright © 2002 Hewlett-Packard Company
* Copyright © 2006 Intel Corporation
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
*
copyright notice and this permission notice appear in supporting
*
documentation, and that the name of Compaq not be used in
*
advertising or publicity pertaining to distribution of the software without
*
specific, written prior permission. Compaq makes no
*
representations about the suitability of this software for any purpose. It
* is
provided "as is
" without express or implied warranty.
* the above copyright notice appear in all copies and that both that
copyright
*
notice and this permission notice appear in supporting documentation, and
*
that the name of the copyright holders not be used in advertising or
*
publicity pertaining to distribution of the software without specific,
*
written prior permission. The copyright holders make no representations
*
about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
*
COMPAQ DISCLAIMS
ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
*
THE COPYRIGHT HOLDERS DISCLAIM
ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL
COMPAQ
BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* EVENT SHALL
THE COPYRIGHT HOLDERS
BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*
* Author: Jim Gettys, Hewlett-Packard Company, Inc.
* Keith Packard, Intel Corporation
*/
#ifdef HAVE_DIX_CONFIG_H
...
...
@@ -29,68 +32,456 @@
#ifndef _RANDRSTR_H_
#define _RANDRSTR_H_
#include <X11/X.h>
#include <X11/Xproto.h>
#include "misc.h"
#include "os.h"
#include "dixstruct.h"
#include "resource.h"
#include "scrnintstr.h"
#include "windowstr.h"
#include "pixmapstr.h"
#include "extnsionst.h"
#include "servermd.h"
#ifndef NXAGENT_SERVER
#include <X11/extensions/randr.h>
#include <X11/extensions/randrproto.h>
#else
#include "randr.h"
#include "randrproto.h"
#endif
#ifdef RENDER
#include <X11/extensions/render.h>
/* we share subpixel order information */
#include "picturestr.h"
#endif
#include <X11/Xfuncproto.h>
typedef
struct
_rrScreenRate
{
int
rate
;
Bool
referenced
;
Bool
oldReferenced
;
/* required for ABI compatibility for now */
#define RANDR_10_INTERFACE 1
#define RANDR_12_INTERFACE 1
typedef
XID
RRMode
;
typedef
XID
RROutput
;
typedef
XID
RRCrtc
;
extern
int
RREventBase
,
RRErrorBase
;
extern
int
(
*
ProcRandrVector
[
RRNumberRequests
])(
ClientPtr
);
extern
int
(
*
SProcRandrVector
[
RRNumberRequests
])(
ClientPtr
);
/*
* Modeline for a monitor. Name follows directly after this struct
*/
#define RRModeName(pMode) ((char *) (pMode + 1))
typedef
struct
_rrMode
RRModeRec
,
*
RRModePtr
;
typedef
struct
_rrPropertyValue
RRPropertyValueRec
,
*
RRPropertyValuePtr
;
typedef
struct
_rrProperty
RRPropertyRec
,
*
RRPropertyPtr
;
typedef
struct
_rrCrtc
RRCrtcRec
,
*
RRCrtcPtr
;
typedef
struct
_rrOutput
RROutputRec
,
*
RROutputPtr
;
struct
_rrMode
{
int
refcnt
;
xRRModeInfo
mode
;
char
*
name
;
ScreenPtr
userScreen
;
};
struct
_rrPropertyValue
{
Atom
type
;
/* ignored by server */
short
format
;
/* format of data for swapping - 8,16,32 */
long
size
;
/* size of data in (format/8) bytes */
pointer
data
;
/* private to client */
};
struct
_rrProperty
{
RRPropertyPtr
next
;
ATOM
propertyName
;
Bool
is_pending
;
Bool
range
;
Bool
immutable
;
int
num_valid
;
INT32
*
valid_values
;
RRPropertyValueRec
current
,
pending
;
};
struct
_rrCrtc
{
RRCrtc
id
;
ScreenPtr
pScreen
;
RRModePtr
mode
;
int
x
,
y
;
Rotation
rotation
;
Rotation
rotations
;
Bool
changed
;
int
numOutputs
;
RROutputPtr
*
outputs
;
int
gammaSize
;
CARD16
*
gammaRed
;
CARD16
*
gammaBlue
;
CARD16
*
gammaGreen
;
void
*
devPrivate
;
};
struct
_rrOutput
{
RROutput
id
;
ScreenPtr
pScreen
;
char
*
name
;
int
nameLength
;
CARD8
connection
;
CARD8
subpixelOrder
;
int
mmWidth
;
int
mmHeight
;
RRCrtcPtr
crtc
;
int
numCrtcs
;
RRCrtcPtr
*
crtcs
;
int
numClones
;
RROutputPtr
*
clones
;
int
numModes
;
int
numPreferred
;
RRModePtr
*
modes
;
int
numUserModes
;
RRModePtr
*
userModes
;
Bool
changed
;
RRPropertyPtr
properties
;
Bool
pendingProperties
;
void
*
devPrivate
;
};
#if RANDR_12_INTERFACE
typedef
Bool
(
*
RRScreenSetSizeProcPtr
)
(
ScreenPtr
pScreen
,
CARD16
width
,
CARD16
height
,
CARD32
mmWidth
,
CARD32
mmHeight
);
typedef
Bool
(
*
RRCrtcSetProcPtr
)
(
ScreenPtr
pScreen
,
RRCrtcPtr
crtc
,
RRModePtr
mode
,
int
x
,
int
y
,
Rotation
rotation
,
int
numOutputs
,
RROutputPtr
*
outputs
);
typedef
Bool
(
*
RRCrtcSetGammaProcPtr
)
(
ScreenPtr
pScreen
,
RRCrtcPtr
crtc
);
typedef
Bool
(
*
RROutputSetPropertyProcPtr
)
(
ScreenPtr
pScreen
,
RROutputPtr
output
,
Atom
property
,
RRPropertyValuePtr
value
);
typedef
Bool
(
*
RROutputValidateModeProcPtr
)
(
ScreenPtr
pScreen
,
RROutputPtr
output
,
RRModePtr
mode
);
typedef
void
(
*
RRModeDestroyProcPtr
)
(
ScreenPtr
pScreen
,
RRModePtr
mode
);
#endif
typedef
Bool
(
*
RRGetInfoProcPtr
)
(
ScreenPtr
pScreen
,
Rotation
*
rotations
);
typedef
Bool
(
*
RRCloseScreenProcPtr
)
(
int
i
,
ScreenPtr
pscreen
);
/* These are for 1.0 compatibility */
typedef
struct
_rrRefresh
{
CARD16
rate
;
RRModePtr
mode
;
}
RRScreenRate
,
*
RRScreenRatePtr
;
typedef
struct
_rrScreenSize
{
int
id
;
short
width
,
height
;
short
mmWidth
,
mmHeight
;
RRScreenRatePtr
pRates
;
int
nRates
;
int
nRatesInUse
;
Bool
referenced
;
Bool
oldReferenced
;
RRScreenRatePtr
pRates
;
}
RRScreenSize
,
*
RRScreenSizePtr
;
#ifdef RANDR_10_INTERFACE
typedef
Bool
(
*
RRSetConfigProcPtr
)
(
ScreenPtr
pScreen
,
Rotation
rotation
,
int
rate
,
RRScreenSizePtr
pSize
);
typedef
Bool
(
*
RRGetInfoProcPtr
)
(
ScreenPtr
pScreen
,
Rotation
*
rotations
);
typedef
Bool
(
*
RRCloseScreenProcPtr
)
(
int
i
,
ScreenPtr
pscreen
);
#endif
typedef
struct
_rrScrPriv
{
/*
* 'public' part of the structure; DDXen fill this in
* as they initialize
*/
#if RANDR_10_INTERFACE
RRSetConfigProcPtr
rrSetConfig
;
#endif
RRGetInfoProcPtr
rrGetInfo
;
#if RANDR_12_INTERFACE
RRScreenSetSizeProcPtr
rrScreenSetSize
;
RRCrtcSetProcPtr
rrCrtcSet
;
RRCrtcSetGammaProcPtr
rrCrtcSetGamma
;
RROutputSetPropertyProcPtr
rrOutputSetProperty
;
RROutputValidateModeProcPtr
rrOutputValidateMode
;
RRModeDestroyProcPtr
rrModeDestroy
;
#endif
/*
* Private part of the structure; not considered part of the ABI
*/
TimeStamp
lastSetTime
;
/* last changed by client */
TimeStamp
lastConfigTime
;
/* possible configs changed */
RRCloseScreenProcPtr
CloseScreen
;
Bool
changed
;
/* some config changed */
Bool
configChanged
;
/* configuration changed */
Bool
layoutChanged
;
/* screen layout changed */
CARD16
minWidth
,
minHeight
;
CARD16
maxWidth
,
maxHeight
;
CARD16
width
,
height
;
/* last known screen size */
CARD16
mmWidth
,
mmHeight
;
/* last known screen size */
int
numOutputs
;
RROutputPtr
*
outputs
;
int
numCrtcs
;
RRCrtcPtr
*
crtcs
;
/* Last known pointer position */
RRCrtcPtr
pointerCrtc
;
#ifdef RANDR_10_INTERFACE
/*
* Configuration information
*/
Rotation
rotations
;
CARD16
reqWidth
,
reqHeight
;
int
nSizes
;
int
nSizesInUse
;
RRScreenSizePtr
pSizes
;
/*
* Current state
*/
Rotation
rotation
;
int
size
;
int
rate
;
int
size
;
#endif
}
rrScrPrivRec
,
*
rrScrPrivPtr
;
#ifndef NXAGENT_SERVER
extern
DevPrivateKey
rrPrivKey
;
#else
extern
int
rrPrivIndex
;
#endif
#ifndef NXAGENT_SERVER
#define rrGetScrPriv(pScr) ((rrScrPrivPtr)dixLookupPrivate(&(pScr)->devPrivates, rrPrivKey))
#define rrScrPriv(pScr) rrScrPrivPtr pScrPriv = rrGetScrPriv(pScr)
#define SetRRScreen(s,p) dixSetPrivate(&(s)->devPrivates, rrPrivKey, p)
#else
#define rrGetScrPriv(pScr) ((rrScrPrivPtr) (pScr)->devPrivates[rrPrivIndex].ptr)
#define rrScrPriv(pScr) rrScrPrivPtr pScrPriv = rrGetScrPriv(pScr)
#define SetRRScreen(s,p) ((s)->devPrivates[rrPrivIndex].ptr = (pointer) (p))
#endif
/*
* each window has a list of clients requesting
* RRNotify events. Each client has a resource
* for each window it selects RRNotify input for,
* this resource is used to delete the RRNotifyRec
* entry from the per-window queue.
*/
typedef
struct
_RREvent
*
RREventPtr
;
typedef
struct
_RREvent
{
RREventPtr
next
;
ClientPtr
client
;
WindowPtr
window
;
XID
clientResource
;
int
mask
;
}
RREventRec
;
typedef
struct
_RRTimes
{
TimeStamp
setTime
;
TimeStamp
configTime
;
}
RRTimesRec
,
*
RRTimesPtr
;
typedef
struct
_RRClient
{
int
major_version
;
int
minor_version
;
/* RRTimesRec times[0]; */
}
RRClientRec
,
*
RRClientPtr
;
extern
RESTYPE
RRClientType
,
RREventType
;
/* resource types for event masks */
#ifndef NXAGENT_SERVER
extern
DevPrivateKey
RRClientPrivateKey
;
#else
extern
int
RRClientPrivateIndex
;
#endif
extern
RESTYPE
RRCrtcType
,
RRModeType
,
RROutputType
;
#define LookupOutput(client,id,a) ((RROutputPtr) \
(SecurityLookupIDByType (client, id, \
RROutputType, a)))
#define LookupCrtc(client,id,a) ((RRCrtcPtr) \
(SecurityLookupIDByType (client, id, \
RRCrtcType, a)))
#define LookupMode(client,id,a) ((RRModePtr) \
(SecurityLookupIDByType (client, id, \
RRModeType, a)))
#ifndef NXAGENT_SERVER
#define GetRRClient(pClient) ((RRClientPtr)dixLookupPrivate(&(pClient)->devPrivates, RRClientPrivateKey))
#define rrClientPriv(pClient) RRClientPtr pRRClient = GetRRClient(pClient)
#else
#define GetRRClient(pClient) ((RRClientPtr) (pClient)->devPrivates[RRClientPrivateIndex].ptr)
#define rrClientPriv(pClient) RRClientPtr pRRClient = GetRRClient(pClient)
#define DixUnknownAccess SecurityUnknownAccess
#define DixReadAccess SecurityReadAccess
#define DixWriteAccess SecurityWriteAccess
#define DixDestroyAccess SecurityDestroyAccess
#endif
/* Initialize the extension */
void
RRExtensionInit
(
void
);
#ifdef RANDR_12_INTERFACE
/*
* Set the range of sizes for the screen
*/
void
RRScreenSetSizeRange
(
ScreenPtr
pScreen
,
CARD16
minWidth
,
CARD16
minHeight
,
CARD16
maxWidth
,
CARD16
maxHeight
);
#endif
/* rrscreen.c */
/*
* Notify the extension that the screen size has been changed.
* The driver is responsible for calling this whenever it has changed
* the size of the screen
*/
void
RRScreenSizeNotify
(
ScreenPtr
pScreen
);
/*
* Request that the screen be resized
*/
Bool
RRScreenSizeSet
(
ScreenPtr
pScreen
,
CARD16
width
,
CARD16
height
,
CARD32
mmWidth
,
CARD32
mmHeight
);
/*
* Send ConfigureNotify event to root window when 'something' happens
*/
void
RRSendConfigNotify
(
ScreenPtr
pScreen
);
/*
* screen dispatch
*/
int
ProcRRGetScreenSizeRange
(
ClientPtr
client
);
int
ProcRRSetScreenSize
(
ClientPtr
client
);
int
ProcRRGetScreenResources
(
ClientPtr
client
);
int
ProcRRSetScreenConfig
(
ClientPtr
client
);
int
ProcRRGetScreenInfo
(
ClientPtr
client
);
/*
* Deliver a ScreenNotify event
*/
void
RRDeliverScreenEvent
(
ClientPtr
client
,
WindowPtr
pWin
,
ScreenPtr
pScreen
);
/* mirandr.c */
Bool
miRandRInit
(
ScreenPtr
pScreen
);
Bool
miRRGetInfo
(
ScreenPtr
pScreen
,
Rotation
*
rotations
);
Bool
miRRGetScreenInfo
(
ScreenPtr
pScreen
);
Bool
miRRCrtcSet
(
ScreenPtr
pScreen
,
RRCrtcPtr
crtc
,
RRModePtr
mode
,
int
x
,
int
y
,
Rotation
rotation
,
int
numOutput
,
RROutputPtr
*
outputs
);
Bool
miRROutputSetProperty
(
ScreenPtr
pScreen
,
RROutputPtr
output
,
Atom
property
,
RRPropertyValuePtr
value
);
Bool
miRROutputValidateMode
(
ScreenPtr
pScreen
,
RROutputPtr
output
,
RRModePtr
mode
);
void
miRRModeDestroy
(
ScreenPtr
pScreen
,
RRModePtr
mode
);
/* randr.c */
/*
* Send all pending events
*/
void
RRTellChanged
(
ScreenPtr
pScreen
);
/*
* Poll the driver for changed information
*/
Bool
RRGetInfo
(
ScreenPtr
pScreen
);
Bool
RRInit
(
void
);
Bool
RRScreenInit
(
ScreenPtr
pScreen
);
RROutputPtr
RRFirstOutput
(
ScreenPtr
pScreen
);
Rotation
RRGetRotation
(
ScreenPtr
pScreen
);
CARD16
RRVerticalRefresh
(
xRRModeInfo
*
mode
);
#ifdef RANDR_10_INTERFACE
/*
* This is the old interface, deprecated but left
* around for compatibility
*/
/*
* Then, register the specific size with the screen
*/
...
...
@@ -116,7 +507,10 @@ RRSetCurrentConfig (ScreenPtr pScreen,
int
rate
,
RRScreenSizePtr
pSize
);
Bool
RRScreenInit
(
ScreenPtr
pScreen
);
Bool
RRScreenInit
(
ScreenPtr
pScreen
);
Rotation
RRGetRotation
(
ScreenPtr
pScreen
);
int
RRSetScreenConfig
(
ScreenPtr
pScreen
,
...
...
@@ -124,19 +518,371 @@ RRSetScreenConfig (ScreenPtr pScreen,
int
rate
,
RRScreenSizePtr
pSize
);
Bool
miRandRInit
(
ScreenPtr
pScreen
);
#endif
/* rrcrtc.c */
/*
* Notify the CRTC of some change; layoutChanged indicates that
* some position or size element changed
*/
void
RRCrtcChanged
(
RRCrtcPtr
crtc
,
Bool
layoutChanged
);
/*
* Create a CRTC
*/
RRCrtcPtr
RRCrtcCreate
(
ScreenPtr
pScreen
,
void
*
devPrivate
);
/*
* Set the allowed rotations on a CRTC
*/
void
RRCrtcSetRotations
(
RRCrtcPtr
crtc
,
Rotation
rotations
);
/*
* Notify the extension that the Crtc has been reconfigured,
* the driver calls this whenever it has updated the mode
*/
Bool
miRRGetInfo
(
ScreenPtr
pScreen
,
Rotation
*
rotations
);
RRCrtcNotify
(
RRCrtcPtr
crtc
,
RRModePtr
mode
,
int
x
,
int
y
,
Rotation
rotation
,
int
numOutputs
,
RROutputPtr
*
outputs
);
void
RRDeliverCrtcEvent
(
ClientPtr
client
,
WindowPtr
pWin
,
RRCrtcPtr
crtc
);
/*
* Request that the Crtc be reconfigured
*/
Bool
miRRSetConfig
(
ScreenPtr
pScreen
,
RRCrtcSet
(
RRCrtcPtr
crtc
,
RRModePtr
mode
,
int
x
,
int
y
,
Rotation
rotation
,
int
rate
,
RRScreenSizePtr
size
);
int
numOutput
,
RROutputPtr
*
outputs
);
/*
* Request that the Crtc gamma be changed
*/
Bool
miRRGetScreenInfo
(
ScreenPtr
pScreen
);
RRCrtcGammaSet
(
RRCrtcPtr
crtc
,
CARD16
*
red
,
CARD16
*
green
,
CARD16
*
blue
);
/*
* Notify the extension that the Crtc gamma has been changed
* The driver calls this whenever it has changed the gamma values
* in the RRCrtcRec
*/
Bool
RRCrtcGammaNotify
(
RRCrtcPtr
crtc
);
/*
* Set the size of the gamma table at server startup time
*/
Bool
RRCrtcGammaSetSize
(
RRCrtcPtr
crtc
,
int
size
);
/*
* Return the area of the frame buffer scanned out by the crtc,
* taking into account the current mode and rotation
*/
void
RRCrtcGetScanoutSize
(
RRCrtcPtr
crtc
,
int
*
width
,
int
*
height
);
/*
* Destroy a Crtc at shutdown
*/
void
RRCrtcDestroy
(
RRCrtcPtr
crtc
);
/*
* Initialize crtc type
*/
Bool
RRCrtcInit
(
void
);
/*
* Crtc dispatch
*/
int
ProcRRGetCrtcInfo
(
ClientPtr
client
);
int
ProcRRSetCrtcConfig
(
ClientPtr
client
);
int
ProcRRGetCrtcGammaSize
(
ClientPtr
client
);
int
ProcRRGetCrtcGamma
(
ClientPtr
client
);
int
ProcRRSetCrtcGamma
(
ClientPtr
client
);
/* rrdispatch.c */
Bool
RRClientKnowsRates
(
ClientPtr
pClient
);
/* rrmode.c */
/*
* Find, and if necessary, create a mode
*/
RRModePtr
RRModeGet
(
xRRModeInfo
*
modeInfo
,
const
char
*
name
);
void
RRModePruneUnused
(
ScreenPtr
pScreen
);
/*
* Destroy a mode.
*/
void
RRModeDestroy
(
RRModePtr
mode
);
/*
* Return a list of modes that are valid for some output in pScreen
*/
RRModePtr
*
RRModesForScreen
(
ScreenPtr
pScreen
,
int
*
num_ret
);
/*
* Initialize mode type
*/
Bool
RRModeInit
(
void
);
int
ProcRRCreateMode
(
ClientPtr
client
);
int
ProcRRDestroyMode
(
ClientPtr
client
);
int
ProcRRAddOutputMode
(
ClientPtr
client
);
int
ProcRRDeleteOutputMode
(
ClientPtr
client
);
/* rroutput.c */
/*
* Notify the output of some change. configChanged indicates whether
* any external configuration (mode list, clones, connected status)
* has changed, or whether the change was strictly internal
* (which crtc is in use)
*/
void
RROutputChanged
(
RROutputPtr
output
,
Bool
configChanged
);
/*
* Create an output
*/
RROutputPtr
RROutputCreate
(
ScreenPtr
pScreen
,
const
char
*
name
,
int
nameLength
,
void
*
devPrivate
);
/*
* Notify extension that output parameters have been changed
*/
Bool
RROutputSetClones
(
RROutputPtr
output
,
RROutputPtr
*
clones
,
int
numClones
);
Bool
RROutputSetModes
(
RROutputPtr
output
,
RRModePtr
*
modes
,
int
numModes
,
int
numPreferred
);
int
RROutputAddUserMode
(
RROutputPtr
output
,
RRModePtr
mode
);
int
RROutputDeleteUserMode
(
RROutputPtr
output
,
RRModePtr
mode
);
Bool
RROutputSetCrtcs
(
RROutputPtr
output
,
RRCrtcPtr
*
crtcs
,
int
numCrtcs
);
Bool
RROutputSetConnection
(
RROutputPtr
output
,
CARD8
connection
);
Bool
RROutputSetSubpixelOrder
(
RROutputPtr
output
,
int
subpixelOrder
);
Bool
RROutputSetPhysicalSize
(
RROutputPtr
output
,
int
mmWidth
,
int
mmHeight
);
void
RRDeliverOutputEvent
(
ClientPtr
client
,
WindowPtr
pWin
,
RROutputPtr
output
);
void
RROutputDestroy
(
RROutputPtr
output
);
int
ProcRRGetOutputInfo
(
ClientPtr
client
);
/*
* Initialize output type
*/
Bool
RROutputInit
(
void
);
/* rrpointer.c */
void
RRPointerMoved
(
ScreenPtr
pScreen
,
int
x
,
int
y
);
void
RRPointerScreenConfigured
(
ScreenPtr
pScreen
);
/* rrproperty.c */
void
RRDeleteAllOutputProperties
(
RROutputPtr
output
);
RRPropertyValuePtr
RRGetOutputProperty
(
RROutputPtr
output
,
Atom
property
,
Bool
pending
);
RRPropertyPtr
RRQueryOutputProperty
(
RROutputPtr
output
,
Atom
property
);
void
RRDeleteOutputProperty
(
RROutputPtr
output
,
Atom
property
);
Bool
RRPostPendingProperties
(
RROutputPtr
output
);
int
RRChangeOutputProperty
(
RROutputPtr
output
,
Atom
property
,
Atom
type
,
int
format
,
int
mode
,
unsigned
long
len
,
pointer
value
,
Bool
sendevent
,
Bool
pending
);
int
RRConfigureOutputProperty
(
RROutputPtr
output
,
Atom
property
,
Bool
pending
,
Bool
range
,
Bool
immutable
,
int
num_values
,
INT32
*
values
);
int
ProcRRChangeOutputProperty
(
ClientPtr
client
);
int
ProcRRGetOutputProperty
(
ClientPtr
client
);
int
ProcRRListOutputProperties
(
ClientPtr
client
);
int
ProcRRQueryOutputProperty
(
ClientPtr
client
);
int
ProcRRConfigureOutputProperty
(
ClientPtr
client
);
int
ProcRRDeleteOutputProperty
(
ClientPtr
client
);
/* rrxinerama.c */
void
RRXineramaExtensionInit
(
void
);
#endif
/* _RANDRSTR_H_ */
/*
randr extension implementation structure
Query state:
ProcRRGetScreenInfo/ProcRRGetScreenResources
RRGetInfo
• Request configuration from driver, either 1.0 or 1.2 style
• These functions only record state changes, all
other actions are pended until RRTellChanged is called
->rrGetInfo
1.0:
RRRegisterSize
RRRegisterRate
RRSetCurrentConfig
1.2:
RRScreenSetSizeRange
RROutputSetCrtcs
RRModeGet
RROutputSetModes
RROutputSetConnection
RROutputSetSubpixelOrder
RROutputSetClones
RRCrtcNotify
• Must delay scanning configuration until after ->rrGetInfo returns
because some drivers will call SetCurrentConfig in the middle
of the ->rrGetInfo operation.
1.0:
• Scan old configuration, mirror to new structures
RRScanOldConfig
RRCrtcCreate
RROutputCreate
RROutputSetCrtcs
RROutputSetConnection
RROutputSetSubpixelOrder
RROldModeAdd • This adds modes one-at-a-time
RRModeGet
RRCrtcNotify
• send events, reset pointer if necessary
RRTellChanged
WalkTree (sending events)
• when layout has changed:
RRPointerScreenConfigured
RRSendConfigNotify
Asynchronous state setting (1.2 only)
When setting state asynchronously, the driver invokes the
->rrGetInfo function and then calls RRTellChanged to flush
the changes to the clients and reset pointer if necessary
Set state
ProcRRSetScreenConfig
RRCrtcSet
1.2:
->rrCrtcSet
RRCrtcNotify
1.0:
->rrSetConfig
RRCrtcNotify
RRTellChanged
*/
nx-X11/programs/Xserver/randr/registry.h
0 → 100644
View file @
15cee47a
/***********************************************************
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
******************************************************************/
#ifndef DIX_REGISTRY_H
#define DIX_REGISTRY_H
/*
* Result returned from any unsuccessful lookup
*/
#define XREGISTRY_UNKNOWN "<unknown>"
#ifdef XREGISTRY
#include "resource.h"
#include "extnsionst.h"
/* Internal string registry - for auditing, debugging, security, etc. */
/*
* Registration functions. The name string is not copied, so it must
* not be a stack variable.
*/
void
RegisterResourceName
(
RESTYPE
type
,
char
*
name
);
void
RegisterExtensionNames
(
ExtensionEntry
*
ext
);
/*
* Lookup functions. The returned string must not be modified or freed.
*/
const
char
*
LookupMajorName
(
int
major
);
const
char
*
LookupRequestName
(
int
major
,
int
minor
);
const
char
*
LookupEventName
(
int
event
);
const
char
*
LookupErrorName
(
int
error
);
const
char
*
LookupResourceName
(
RESTYPE
rtype
);
/*
* Setup and teardown
*/
void
dixResetRegistry
(
void
);
#else
/* XREGISTRY */
/* Define calls away when the registry is not being built. */
#define RegisterResourceName(a, b) { ; }
#define RegisterExtensionNames(a) { ; }
#define LookupMajorName(a) XREGISTRY_UNKNOWN
#define LookupRequestName(a, b) XREGISTRY_UNKNOWN
#define LookupEventName(a) XREGISTRY_UNKNOWN
#define LookupErrorName(a) XREGISTRY_UNKNOWN
#define LookupResourceName(a) XREGISTRY_UNKNOWN
#define dixResetRegistry() { ; }
#endif
/* XREGISTRY */
#endif
/* DIX_REGISTRY_H */
nx-X11/programs/Xserver/randr/registry.h.NX.original
0 → 100644
View file @
15cee47a
/***********************************************************
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
******************************************************************/
#ifndef DIX_REGISTRY_H
#define DIX_REGISTRY_H
/*
* Result returned from any unsuccessful lookup
*/
#define XREGISTRY_UNKNOWN "<unknown>"
#ifdef XREGISTRY
#include "resource.h"
#include "extnsionst.h"
/* Internal string registry - for auditing, debugging, security, etc. */
/*
* Registration functions. The name string is not copied, so it must
* not be a stack variable.
*/
void RegisterResourceName(RESTYPE type, char *name);
void RegisterExtensionNames(ExtensionEntry *ext);
/*
* Lookup functions. The returned string must not be modified or freed.
*/
const char *LookupMajorName(int major);
const char *LookupRequestName(int major, int minor);
const char *LookupEventName(int event);
const char *LookupErrorName(int error);
const char *LookupResourceName(RESTYPE rtype);
/*
* Setup and teardown
*/
void dixResetRegistry(void);
#else /* XREGISTRY */
/* Define calls away when the registry is not being built. */
#define RegisterResourceName(a, b) { ; }
#define RegisterExtensionNames(a) { ; }
#define LookupMajorName(a) XREGISTRY_UNKNOWN
#define LookupRequestName(a, b) XREGISTRY_UNKNOWN
#define LookupEventName(a) XREGISTRY_UNKNOWN
#define LookupErrorName(a) XREGISTRY_UNKNOWN
#define LookupResourceName(a) XREGISTRY_UNKNOWN
#define dixResetRegistry() { ; }
#endif /* XREGISTRY */
#endif /* DIX_REGISTRY_H */
nx-X11/programs/Xserver/randr/registry.h.X.original
0 → 100644
View file @
15cee47a
nx-X11/programs/Xserver/randr/rrcrtc.c
0 → 100644
View file @
15cee47a
/*
* Copyright © 2006 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
/**************************************************************************/
/* */
/* Copyright (c) 2001, 2011 NoMachine, http://www.nomachine.com/. */
/* */
/* NX-X11, NX protocol compression and NX extensions to this software */
/* are copyright of NoMachine. Redistribution and use of the present */
/* software is allowed according to terms specified in the file LICENSE */
/* which comes in the source distribution. */
/* */
/* Check http://www.nomachine.com/licensing.html for applicability. */
/* */
/* NX and NoMachine are trademarks of Medialogic S.p.A. */
/* */
/* All rights reserved. */
/* */
/**************************************************************************/
#include "randrstr.h"
#include "swaprep.h"
#include "registry.h"
RESTYPE
RRCrtcType
;
/*
* Notify the CRTC of some change
*/
void
RRCrtcChanged
(
RRCrtcPtr
crtc
,
Bool
layoutChanged
)
{
ScreenPtr
pScreen
=
crtc
->
pScreen
;
crtc
->
changed
=
TRUE
;
if
(
pScreen
)
{
rrScrPriv
(
pScreen
);
pScrPriv
->
changed
=
TRUE
;
/*
* Send ConfigureNotify on any layout change
*/
if
(
layoutChanged
)
pScrPriv
->
layoutChanged
=
TRUE
;
}
}
/*
* Create a CRTC
*/
RRCrtcPtr
RRCrtcCreate
(
ScreenPtr
pScreen
,
void
*
devPrivate
)
{
RRCrtcPtr
crtc
;
RRCrtcPtr
*
crtcs
;
rrScrPrivPtr
pScrPriv
;
if
(
!
RRInit
())
return
NULL
;
pScrPriv
=
rrGetScrPriv
(
pScreen
);
/* make space for the crtc pointer */
if
(
pScrPriv
->
numCrtcs
)
crtcs
=
xrealloc
(
pScrPriv
->
crtcs
,
(
pScrPriv
->
numCrtcs
+
1
)
*
sizeof
(
RRCrtcPtr
));
else
crtcs
=
xalloc
(
sizeof
(
RRCrtcPtr
));
if
(
!
crtcs
)
return
FALSE
;
pScrPriv
->
crtcs
=
crtcs
;
crtc
=
xcalloc
(
1
,
sizeof
(
RRCrtcRec
));
if
(
!
crtc
)
return
NULL
;
crtc
->
id
=
FakeClientID
(
0
);
crtc
->
pScreen
=
pScreen
;
crtc
->
mode
=
NULL
;
crtc
->
x
=
0
;
crtc
->
y
=
0
;
crtc
->
rotation
=
RR_Rotate_0
;
crtc
->
rotations
=
RR_Rotate_0
;
crtc
->
outputs
=
NULL
;
crtc
->
numOutputs
=
0
;
crtc
->
gammaSize
=
0
;
crtc
->
gammaRed
=
crtc
->
gammaBlue
=
crtc
->
gammaGreen
=
NULL
;
crtc
->
changed
=
FALSE
;
crtc
->
devPrivate
=
devPrivate
;
if
(
!
AddResource
(
crtc
->
id
,
RRCrtcType
,
(
pointer
)
crtc
))
return
NULL
;
/* attach the screen and crtc together */
crtc
->
pScreen
=
pScreen
;
pScrPriv
->
crtcs
[
pScrPriv
->
numCrtcs
++
]
=
crtc
;
return
crtc
;
}
/*
* Set the allowed rotations on a CRTC
*/
void
RRCrtcSetRotations
(
RRCrtcPtr
crtc
,
Rotation
rotations
)
{
crtc
->
rotations
=
rotations
;
}
/*
* Notify the extension that the Crtc has been reconfigured,
* the driver calls this whenever it has updated the mode
*/
Bool
RRCrtcNotify
(
RRCrtcPtr
crtc
,
RRModePtr
mode
,
int
x
,
int
y
,
Rotation
rotation
,
int
numOutputs
,
RROutputPtr
*
outputs
)
{
int
i
,
j
;
/*
* Check to see if any of the new outputs were
* not in the old list and mark them as changed
*/
for
(
i
=
0
;
i
<
numOutputs
;
i
++
)
{
for
(
j
=
0
;
j
<
crtc
->
numOutputs
;
j
++
)
if
(
outputs
[
i
]
==
crtc
->
outputs
[
j
])
break
;
if
(
j
==
crtc
->
numOutputs
)
{
outputs
[
i
]
->
crtc
=
crtc
;
RROutputChanged
(
outputs
[
i
],
FALSE
);
RRCrtcChanged
(
crtc
,
FALSE
);
}
}
/*
* Check to see if any of the old outputs are
* not in the new list and mark them as changed
*/
for
(
j
=
0
;
j
<
crtc
->
numOutputs
;
j
++
)
{
for
(
i
=
0
;
i
<
numOutputs
;
i
++
)
if
(
outputs
[
i
]
==
crtc
->
outputs
[
j
])
break
;
if
(
i
==
numOutputs
)
{
if
(
crtc
->
outputs
[
j
]
->
crtc
==
crtc
)
crtc
->
outputs
[
j
]
->
crtc
=
NULL
;
RROutputChanged
(
crtc
->
outputs
[
j
],
FALSE
);
RRCrtcChanged
(
crtc
,
FALSE
);
}
}
/*
* Reallocate the crtc output array if necessary
*/
if
(
numOutputs
!=
crtc
->
numOutputs
)
{
RROutputPtr
*
newoutputs
;
if
(
numOutputs
)
{
if
(
crtc
->
numOutputs
)
newoutputs
=
xrealloc
(
crtc
->
outputs
,
numOutputs
*
sizeof
(
RROutputPtr
));
else
newoutputs
=
xalloc
(
numOutputs
*
sizeof
(
RROutputPtr
));
if
(
!
newoutputs
)
return
FALSE
;
}
else
{
if
(
crtc
->
outputs
)
xfree
(
crtc
->
outputs
);
newoutputs
=
NULL
;
}
crtc
->
outputs
=
newoutputs
;
crtc
->
numOutputs
=
numOutputs
;
}
/*
* Copy the new list of outputs into the crtc
*/
memcpy
(
crtc
->
outputs
,
outputs
,
numOutputs
*
sizeof
(
RROutputPtr
));
/*
* Update remaining crtc fields
*/
if
(
mode
!=
crtc
->
mode
)
{
if
(
crtc
->
mode
)
RRModeDestroy
(
crtc
->
mode
);
crtc
->
mode
=
mode
;
if
(
mode
!=
NULL
)
mode
->
refcnt
++
;
RRCrtcChanged
(
crtc
,
TRUE
);
}
if
(
x
!=
crtc
->
x
)
{
crtc
->
x
=
x
;
RRCrtcChanged
(
crtc
,
TRUE
);
}
if
(
y
!=
crtc
->
y
)
{
crtc
->
y
=
y
;
RRCrtcChanged
(
crtc
,
TRUE
);
}
if
(
rotation
!=
crtc
->
rotation
)
{
crtc
->
rotation
=
rotation
;
RRCrtcChanged
(
crtc
,
TRUE
);
}
return
TRUE
;
}
void
RRDeliverCrtcEvent
(
ClientPtr
client
,
WindowPtr
pWin
,
RRCrtcPtr
crtc
)
{
ScreenPtr
pScreen
=
pWin
->
drawable
.
pScreen
;
rrScrPriv
(
pScreen
);
xRRCrtcChangeNotifyEvent
ce
;
RRModePtr
mode
=
crtc
->
mode
;
ce
.
type
=
RRNotify
+
RREventBase
;
ce
.
subCode
=
RRNotify_CrtcChange
;
ce
.
sequenceNumber
=
client
->
sequence
;
ce
.
timestamp
=
pScrPriv
->
lastSetTime
.
milliseconds
;
ce
.
window
=
pWin
->
drawable
.
id
;
ce
.
crtc
=
crtc
->
id
;
ce
.
rotation
=
crtc
->
rotation
;
if
(
mode
)
{
ce
.
mode
=
mode
->
mode
.
id
;
ce
.
x
=
crtc
->
x
;
ce
.
y
=
crtc
->
y
;
ce
.
width
=
mode
->
mode
.
width
;
ce
.
height
=
mode
->
mode
.
height
;
}
else
{
ce
.
mode
=
None
;
ce
.
x
=
0
;
ce
.
y
=
0
;
ce
.
width
=
0
;
ce
.
height
=
0
;
}
WriteEventsToClient
(
client
,
1
,
(
xEvent
*
)
&
ce
);
}
static
Bool
RRCrtcPendingProperties
(
RRCrtcPtr
crtc
)
{
ScreenPtr
pScreen
=
crtc
->
pScreen
;
rrScrPriv
(
pScreen
);
int
o
;
for
(
o
=
0
;
o
<
pScrPriv
->
numOutputs
;
o
++
)
{
RROutputPtr
output
=
pScrPriv
->
outputs
[
o
];
if
(
output
->
crtc
==
crtc
&&
output
->
pendingProperties
)
return
TRUE
;
}
return
FALSE
;
}
/*
* Request that the Crtc be reconfigured
*/
Bool
RRCrtcSet
(
RRCrtcPtr
crtc
,
RRModePtr
mode
,
int
x
,
int
y
,
Rotation
rotation
,
int
numOutputs
,
RROutputPtr
*
outputs
)
{
ScreenPtr
pScreen
=
crtc
->
pScreen
;
Bool
ret
=
FALSE
;
rrScrPriv
(
pScreen
);
/* See if nothing changed */
if
(
crtc
->
mode
==
mode
&&
crtc
->
x
==
x
&&
crtc
->
y
==
y
&&
crtc
->
rotation
==
rotation
&&
crtc
->
numOutputs
==
numOutputs
&&
!
memcmp
(
crtc
->
outputs
,
outputs
,
numOutputs
*
sizeof
(
RROutputPtr
))
&&
!
RRCrtcPendingProperties
(
crtc
))
{
ret
=
TRUE
;
}
else
{
#if RANDR_12_INTERFACE
if
(
pScrPriv
->
rrCrtcSet
)
{
ret
=
(
*
pScrPriv
->
rrCrtcSet
)
(
pScreen
,
crtc
,
mode
,
x
,
y
,
rotation
,
numOutputs
,
outputs
);
}
else
#endif
{
#if RANDR_10_INTERFACE
if
(
pScrPriv
->
rrSetConfig
)
{
RRScreenSize
size
;
RRScreenRate
rate
;
if
(
!
mode
)
{
RRCrtcNotify
(
crtc
,
NULL
,
x
,
y
,
rotation
,
0
,
NULL
);
ret
=
TRUE
;
}
else
{
size
.
width
=
mode
->
mode
.
width
;
size
.
height
=
mode
->
mode
.
height
;
if
(
outputs
[
0
]
->
mmWidth
&&
outputs
[
0
]
->
mmHeight
)
{
size
.
mmWidth
=
outputs
[
0
]
->
mmWidth
;
size
.
mmHeight
=
outputs
[
0
]
->
mmHeight
;
}
else
{
size
.
mmWidth
=
pScreen
->
mmWidth
;
size
.
mmHeight
=
pScreen
->
mmHeight
;
}
size
.
nRates
=
1
;
rate
.
rate
=
RRVerticalRefresh
(
&
mode
->
mode
);
size
.
pRates
=
&
rate
;
ret
=
(
*
pScrPriv
->
rrSetConfig
)
(
pScreen
,
rotation
,
rate
.
rate
,
&
size
);
/*
* Old 1.0 interface tied screen size to mode size
*/
if
(
ret
)
{
RRCrtcNotify
(
crtc
,
mode
,
x
,
y
,
rotation
,
1
,
outputs
);
RRScreenSizeNotify
(
pScreen
);
}
}
}
#endif
}
if
(
ret
)
{
int
o
;
RRTellChanged
(
pScreen
);
for
(
o
=
0
;
o
<
numOutputs
;
o
++
)
RRPostPendingProperties
(
outputs
[
o
]);
}
}
return
ret
;
}
/*
* Destroy a Crtc at shutdown
*/
void
RRCrtcDestroy
(
RRCrtcPtr
crtc
)
{
FreeResource
(
crtc
->
id
,
0
);
}
static
int
RRCrtcDestroyResource
(
pointer
value
,
XID
pid
)
{
RRCrtcPtr
crtc
=
(
RRCrtcPtr
)
value
;
ScreenPtr
pScreen
=
crtc
->
pScreen
;
if
(
pScreen
)
{
rrScrPriv
(
pScreen
);
int
i
;
for
(
i
=
0
;
i
<
pScrPriv
->
numCrtcs
;
i
++
)
{
if
(
pScrPriv
->
crtcs
[
i
]
==
crtc
)
{
memmove
(
pScrPriv
->
crtcs
+
i
,
pScrPriv
->
crtcs
+
i
+
1
,
(
pScrPriv
->
numCrtcs
-
(
i
+
1
))
*
sizeof
(
RRCrtcPtr
));
--
pScrPriv
->
numCrtcs
;
break
;
}
}
}
if
(
crtc
->
gammaRed
)
xfree
(
crtc
->
gammaRed
);
if
(
crtc
->
mode
)
RRModeDestroy
(
crtc
->
mode
);
xfree
(
crtc
);
return
1
;
}
/*
* Request that the Crtc gamma be changed
*/
Bool
RRCrtcGammaSet
(
RRCrtcPtr
crtc
,
CARD16
*
red
,
CARD16
*
green
,
CARD16
*
blue
)
{
Bool
ret
=
TRUE
;
#if RANDR_12_INTERFACE
ScreenPtr
pScreen
=
crtc
->
pScreen
;
#endif
memcpy
(
crtc
->
gammaRed
,
red
,
crtc
->
gammaSize
*
sizeof
(
CARD16
));
memcpy
(
crtc
->
gammaGreen
,
green
,
crtc
->
gammaSize
*
sizeof
(
CARD16
));
memcpy
(
crtc
->
gammaBlue
,
blue
,
crtc
->
gammaSize
*
sizeof
(
CARD16
));
#if RANDR_12_INTERFACE
if
(
pScreen
)
{
rrScrPriv
(
pScreen
);
if
(
pScrPriv
->
rrCrtcSetGamma
)
ret
=
(
*
pScrPriv
->
rrCrtcSetGamma
)
(
pScreen
,
crtc
);
}
#endif
return
ret
;
}
/*
* Notify the extension that the Crtc gamma has been changed
* The driver calls this whenever it has changed the gamma values
* in the RRCrtcRec
*/
Bool
RRCrtcGammaNotify
(
RRCrtcPtr
crtc
)
{
return
TRUE
;
/* not much going on here */
}
/**
* Returns the width/height that the crtc scans out from the framebuffer
*/
void
RRCrtcGetScanoutSize
(
RRCrtcPtr
crtc
,
int
*
width
,
int
*
height
)
{
if
(
crtc
->
mode
==
NULL
)
{
*
width
=
0
;
*
height
=
0
;
return
;
}
switch
(
crtc
->
rotation
&
0xf
)
{
case
RR_Rotate_0
:
case
RR_Rotate_180
:
*
width
=
crtc
->
mode
->
mode
.
width
;
*
height
=
crtc
->
mode
->
mode
.
height
;
break
;
case
RR_Rotate_90
:
case
RR_Rotate_270
:
*
width
=
crtc
->
mode
->
mode
.
height
;
*
height
=
crtc
->
mode
->
mode
.
width
;
break
;
}
}
/*
* Set the size of the gamma table at server startup time
*/
Bool
RRCrtcGammaSetSize
(
RRCrtcPtr
crtc
,
int
size
)
{
CARD16
*
gamma
;
if
(
size
==
crtc
->
gammaSize
)
return
TRUE
;
if
(
size
)
{
gamma
=
xalloc
(
size
*
3
*
sizeof
(
CARD16
));
if
(
!
gamma
)
return
FALSE
;
}
else
gamma
=
NULL
;
if
(
crtc
->
gammaRed
)
xfree
(
crtc
->
gammaRed
);
crtc
->
gammaRed
=
gamma
;
crtc
->
gammaGreen
=
gamma
+
size
;
crtc
->
gammaBlue
=
gamma
+
size
*
2
;
crtc
->
gammaSize
=
size
;
return
TRUE
;
}
/*
* Initialize crtc type
*/
Bool
RRCrtcInit
(
void
)
{
RRCrtcType
=
CreateNewResourceType
(
RRCrtcDestroyResource
);
if
(
!
RRCrtcType
)
return
FALSE
;
RegisterResourceName
(
RRCrtcType
,
"CRTC"
);
return
TRUE
;
}
int
ProcRRGetCrtcInfo
(
ClientPtr
client
)
{
REQUEST
(
xRRGetCrtcInfoReq
);
xRRGetCrtcInfoReply
rep
;
RRCrtcPtr
crtc
;
CARD8
*
extra
;
unsigned
long
extraLen
;
ScreenPtr
pScreen
;
rrScrPrivPtr
pScrPriv
;
RRModePtr
mode
;
RROutput
*
outputs
;
RROutput
*
possible
;
int
i
,
j
,
k
,
n
;
int
width
,
height
;
REQUEST_SIZE_MATCH
(
xRRGetCrtcInfoReq
);
crtc
=
LookupCrtc
(
client
,
stuff
->
crtc
,
DixReadAccess
);
if
(
!
crtc
)
return
RRErrorBase
+
BadRRCrtc
;
/* All crtcs must be associated with screens before client
* requests are processed
*/
pScreen
=
crtc
->
pScreen
;
pScrPriv
=
rrGetScrPriv
(
pScreen
);
mode
=
crtc
->
mode
;
rep
.
type
=
X_Reply
;
rep
.
status
=
RRSetConfigSuccess
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
length
=
0
;
rep
.
timestamp
=
pScrPriv
->
lastSetTime
.
milliseconds
;
rep
.
x
=
crtc
->
x
;
rep
.
y
=
crtc
->
y
;
RRCrtcGetScanoutSize
(
crtc
,
&
width
,
&
height
);
rep
.
width
=
width
;
rep
.
height
=
height
;
rep
.
mode
=
mode
?
mode
->
mode
.
id
:
0
;
rep
.
rotation
=
crtc
->
rotation
;
rep
.
rotations
=
crtc
->
rotations
;
rep
.
nOutput
=
crtc
->
numOutputs
;
k
=
0
;
for
(
i
=
0
;
i
<
pScrPriv
->
numOutputs
;
i
++
)
for
(
j
=
0
;
j
<
pScrPriv
->
outputs
[
i
]
->
numCrtcs
;
j
++
)
if
(
pScrPriv
->
outputs
[
i
]
->
crtcs
[
j
]
==
crtc
)
k
++
;
rep
.
nPossibleOutput
=
k
;
rep
.
length
=
rep
.
nOutput
+
rep
.
nPossibleOutput
;
extraLen
=
rep
.
length
<<
2
;
if
(
extraLen
)
{
extra
=
xalloc
(
extraLen
);
if
(
!
extra
)
return
BadAlloc
;
}
else
extra
=
NULL
;
outputs
=
(
RROutput
*
)
extra
;
possible
=
(
RROutput
*
)
(
outputs
+
rep
.
nOutput
);
for
(
i
=
0
;
i
<
crtc
->
numOutputs
;
i
++
)
{
outputs
[
i
]
=
crtc
->
outputs
[
i
]
->
id
;
if
(
client
->
swapped
)
swapl
(
&
outputs
[
i
],
n
);
}
k
=
0
;
for
(
i
=
0
;
i
<
pScrPriv
->
numOutputs
;
i
++
)
for
(
j
=
0
;
j
<
pScrPriv
->
outputs
[
i
]
->
numCrtcs
;
j
++
)
if
(
pScrPriv
->
outputs
[
i
]
->
crtcs
[
j
]
==
crtc
)
{
possible
[
k
]
=
pScrPriv
->
outputs
[
i
]
->
id
;
if
(
client
->
swapped
)
swapl
(
&
possible
[
k
],
n
);
k
++
;
}
if
(
client
->
swapped
)
{
swaps
(
&
rep
.
sequenceNumber
,
n
);
swapl
(
&
rep
.
length
,
n
);
swapl
(
&
rep
.
timestamp
,
n
);
swaps
(
&
rep
.
x
,
n
);
swaps
(
&
rep
.
y
,
n
);
swaps
(
&
rep
.
width
,
n
);
swaps
(
&
rep
.
height
,
n
);
swapl
(
&
rep
.
mode
,
n
);
swaps
(
&
rep
.
rotation
,
n
);
swaps
(
&
rep
.
rotations
,
n
);
swaps
(
&
rep
.
nOutput
,
n
);
swaps
(
&
rep
.
nPossibleOutput
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xRRGetCrtcInfoReply
),
(
char
*
)
&
rep
);
if
(
extraLen
)
{
WriteToClient
(
client
,
extraLen
,
(
char
*
)
extra
);
xfree
(
extra
);
}
return
client
->
noClientException
;
}
int
ProcRRSetCrtcConfig
(
ClientPtr
client
)
{
REQUEST
(
xRRSetCrtcConfigReq
);
xRRSetCrtcConfigReply
rep
;
ScreenPtr
pScreen
;
rrScrPrivPtr
pScrPriv
;
RRCrtcPtr
crtc
;
RRModePtr
mode
;
int
numOutputs
;
RROutputPtr
*
outputs
=
NULL
;
RROutput
*
outputIds
;
TimeStamp
configTime
;
TimeStamp
time
;
Rotation
rotation
;
int
i
,
j
;
REQUEST_AT_LEAST_SIZE
(
xRRSetCrtcConfigReq
);
numOutputs
=
(
stuff
->
length
-
(
SIZEOF
(
xRRSetCrtcConfigReq
)
>>
2
));
crtc
=
LookupIDByType
(
stuff
->
crtc
,
RRCrtcType
);
if
(
!
crtc
)
{
client
->
errorValue
=
stuff
->
crtc
;
return
RRErrorBase
+
BadRRCrtc
;
}
if
(
stuff
->
mode
==
None
)
{
mode
=
NULL
;
if
(
numOutputs
>
0
)
return
BadMatch
;
}
else
{
mode
=
LookupIDByType
(
stuff
->
mode
,
RRModeType
);
if
(
!
mode
)
{
client
->
errorValue
=
stuff
->
mode
;
return
RRErrorBase
+
BadRRMode
;
}
if
(
numOutputs
==
0
)
return
BadMatch
;
}
if
(
numOutputs
)
{
outputs
=
xalloc
(
numOutputs
*
sizeof
(
RROutputPtr
));
if
(
!
outputs
)
return
BadAlloc
;
}
else
outputs
=
NULL
;
outputIds
=
(
RROutput
*
)
(
stuff
+
1
);
for
(
i
=
0
;
i
<
numOutputs
;
i
++
)
{
outputs
[
i
]
=
(
RROutputPtr
)
LookupIDByType
(
outputIds
[
i
],
RROutputType
);
if
(
!
outputs
[
i
])
{
client
->
errorValue
=
outputIds
[
i
];
if
(
outputs
)
xfree
(
outputs
);
return
RRErrorBase
+
BadRROutput
;
}
/* validate crtc for this output */
for
(
j
=
0
;
j
<
outputs
[
i
]
->
numCrtcs
;
j
++
)
if
(
outputs
[
i
]
->
crtcs
[
j
]
==
crtc
)
break
;
if
(
j
==
outputs
[
i
]
->
numCrtcs
)
{
if
(
outputs
)
xfree
(
outputs
);
return
BadMatch
;
}
/* validate mode for this output */
for
(
j
=
0
;
j
<
outputs
[
i
]
->
numModes
+
outputs
[
i
]
->
numUserModes
;
j
++
)
{
RRModePtr
m
=
(
j
<
outputs
[
i
]
->
numModes
?
outputs
[
i
]
->
modes
[
j
]
:
outputs
[
i
]
->
userModes
[
j
-
outputs
[
i
]
->
numModes
]);
if
(
m
==
mode
)
break
;
}
if
(
j
==
outputs
[
i
]
->
numModes
+
outputs
[
i
]
->
numUserModes
)
{
if
(
outputs
)
xfree
(
outputs
);
return
BadMatch
;
}
}
/* validate clones */
for
(
i
=
0
;
i
<
numOutputs
;
i
++
)
{
for
(
j
=
0
;
j
<
numOutputs
;
j
++
)
{
int
k
;
if
(
i
==
j
)
continue
;
for
(
k
=
0
;
k
<
outputs
[
i
]
->
numClones
;
k
++
)
{
if
(
outputs
[
i
]
->
clones
[
k
]
==
outputs
[
j
])
break
;
}
if
(
k
==
outputs
[
i
]
->
numClones
)
{
if
(
outputs
)
xfree
(
outputs
);
return
BadMatch
;
}
}
}
pScreen
=
crtc
->
pScreen
;
pScrPriv
=
rrGetScrPriv
(
pScreen
);
time
=
ClientTimeToServerTime
(
stuff
->
timestamp
);
configTime
=
ClientTimeToServerTime
(
stuff
->
configTimestamp
);
if
(
!
pScrPriv
)
{
time
=
currentTime
;
rep
.
status
=
RRSetConfigFailed
;
goto
sendReply
;
}
#if 0
/*
* if the client's config timestamp is not the same as the last config
* timestamp, then the config information isn't up-to-date and
* can't even be validated
*/
if (CompareTimeStamps (configTime, pScrPriv->lastConfigTime) != 0)
{
rep.status = RRSetConfigInvalidConfigTime;
goto sendReply;
}
#endif
/*
* Validate requested rotation
*/
rotation
=
(
Rotation
)
stuff
->
rotation
;
/* test the rotation bits only! */
switch
(
rotation
&
0xf
)
{
case
RR_Rotate_0
:
case
RR_Rotate_90
:
case
RR_Rotate_180
:
case
RR_Rotate_270
:
break
;
default:
/*
* Invalid rotation
*/
client
->
errorValue
=
stuff
->
rotation
;
if
(
outputs
)
xfree
(
outputs
);
return
BadValue
;
}
if
(
mode
)
{
if
((
~
crtc
->
rotations
)
&
rotation
)
{
/*
* requested rotation or reflection not supported by screen
*/
client
->
errorValue
=
stuff
->
rotation
;
if
(
outputs
)
xfree
(
outputs
);
return
BadMatch
;
}
#ifdef RANDR_12_INTERFACE
/*
* Check screen size bounds if the DDX provides a 1.2 interface
* for setting screen size. Else, assume the CrtcSet sets
* the size along with the mode
*/
if
(
pScrPriv
->
rrScreenSetSize
)
{
int
source_width
=
mode
->
mode
.
width
;
int
source_height
=
mode
->
mode
.
height
;
if
((
rotation
&
0xf
)
==
RR_Rotate_90
||
(
rotation
&
0xf
)
==
RR_Rotate_270
)
{
source_width
=
mode
->
mode
.
height
;
source_height
=
mode
->
mode
.
width
;
}
if
(
stuff
->
x
+
source_width
>
pScreen
->
width
)
{
client
->
errorValue
=
stuff
->
x
;
if
(
outputs
)
xfree
(
outputs
);
return
BadValue
;
}
if
(
stuff
->
y
+
source_height
>
pScreen
->
height
)
{
client
->
errorValue
=
stuff
->
y
;
if
(
outputs
)
xfree
(
outputs
);
return
BadValue
;
}
}
#endif
}
/*
* Make sure the requested set-time is not older than
* the last set-time
*/
if
(
CompareTimeStamps
(
time
,
pScrPriv
->
lastSetTime
)
<
0
)
{
rep
.
status
=
RRSetConfigInvalidTime
;
goto
sendReply
;
}
if
(
!
RRCrtcSet
(
crtc
,
mode
,
stuff
->
x
,
stuff
->
y
,
rotation
,
numOutputs
,
outputs
))
{
rep
.
status
=
RRSetConfigFailed
;
goto
sendReply
;
}
#ifdef NXAGENT_SERVER
/* Bug 21987 */
pScrPriv
->
lastSetTime
=
time
;
#endif
rep
.
status
=
RRSetConfigSuccess
;
sendReply:
if
(
outputs
)
xfree
(
outputs
);
rep
.
type
=
X_Reply
;
/* rep.status has already been filled in */
rep
.
length
=
0
;
rep
.
sequenceNumber
=
client
->
sequence
;
#ifndef NXAGENT_SERVER
/* Bug 21987 */
rep
.
newTimestamp
=
pScrPriv
->
lastConfigTime
.
milliseconds
;
#else
rep
.
newTimestamp
=
pScrPriv
->
lastSetTime
.
milliseconds
;
#endif
if
(
client
->
swapped
)
{
int
n
;
swaps
(
&
rep
.
sequenceNumber
,
n
);
swapl
(
&
rep
.
length
,
n
);
swapl
(
&
rep
.
newTimestamp
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xRRSetCrtcConfigReply
),
(
char
*
)
&
rep
);
return
client
->
noClientException
;
}
int
ProcRRGetCrtcGammaSize
(
ClientPtr
client
)
{
REQUEST
(
xRRGetCrtcGammaSizeReq
);
xRRGetCrtcGammaSizeReply
reply
;
RRCrtcPtr
crtc
;
int
n
;
REQUEST_SIZE_MATCH
(
xRRGetCrtcGammaSizeReq
);
crtc
=
LookupCrtc
(
client
,
stuff
->
crtc
,
DixReadAccess
);
if
(
!
crtc
)
return
RRErrorBase
+
BadRRCrtc
;
reply
.
type
=
X_Reply
;
reply
.
sequenceNumber
=
client
->
sequence
;
reply
.
length
=
0
;
reply
.
size
=
crtc
->
gammaSize
;
if
(
client
->
swapped
)
{
swaps
(
&
reply
.
sequenceNumber
,
n
);
swapl
(
&
reply
.
length
,
n
);
swaps
(
&
reply
.
size
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xRRGetCrtcGammaSizeReply
),
(
char
*
)
&
reply
);
return
client
->
noClientException
;
}
int
ProcRRGetCrtcGamma
(
ClientPtr
client
)
{
REQUEST
(
xRRGetCrtcGammaReq
);
xRRGetCrtcGammaReply
reply
;
RRCrtcPtr
crtc
;
int
n
;
unsigned
long
len
;
char
*
extra
;
REQUEST_SIZE_MATCH
(
xRRGetCrtcGammaReq
);
crtc
=
LookupCrtc
(
client
,
stuff
->
crtc
,
DixReadAccess
);
if
(
!
crtc
)
return
RRErrorBase
+
BadRRCrtc
;
len
=
crtc
->
gammaSize
*
3
*
2
;
if
(
crtc
->
gammaSize
)
{
extra
=
xalloc
(
len
);
if
(
!
extra
)
return
BadAlloc
;
}
reply
.
type
=
X_Reply
;
reply
.
sequenceNumber
=
client
->
sequence
;
reply
.
length
=
(
len
+
3
)
>>
2
;
reply
.
size
=
crtc
->
gammaSize
;
if
(
client
->
swapped
)
{
swaps
(
&
reply
.
sequenceNumber
,
n
);
swapl
(
&
reply
.
length
,
n
);
swaps
(
&
reply
.
size
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xRRGetCrtcGammaReply
),
(
char
*
)
&
reply
);
if
(
crtc
->
gammaSize
)
{
memcpy
(
extra
,
crtc
->
gammaRed
,
len
);
client
->
pSwapReplyFunc
=
(
ReplySwapPtr
)
CopySwap16Write
;
WriteSwappedDataToClient
(
client
,
len
,
extra
);
xfree
(
extra
);
}
return
client
->
noClientException
;
}
int
ProcRRSetCrtcGamma
(
ClientPtr
client
)
{
REQUEST
(
xRRSetCrtcGammaReq
);
RRCrtcPtr
crtc
;
unsigned
long
len
;
CARD16
*
red
,
*
green
,
*
blue
;
REQUEST_AT_LEAST_SIZE
(
xRRSetCrtcGammaReq
);
crtc
=
LookupCrtc
(
client
,
stuff
->
crtc
,
DixWriteAccess
);
if
(
!
crtc
)
return
RRErrorBase
+
BadRRCrtc
;
len
=
client
->
req_len
-
(
sizeof
(
xRRSetCrtcGammaReq
)
>>
2
);
if
(
len
<
(
stuff
->
size
*
3
+
1
)
>>
1
)
return
BadLength
;
if
(
stuff
->
size
!=
crtc
->
gammaSize
)
return
BadMatch
;
red
=
(
CARD16
*
)
(
stuff
+
1
);
green
=
red
+
crtc
->
gammaSize
;
blue
=
green
+
crtc
->
gammaSize
;
RRCrtcGammaSet
(
crtc
,
red
,
green
,
blue
);
return
Success
;
}
nx-X11/programs/Xserver/randr/rrcrtc.c.NX.original
0 → 100644
View file @
15cee47a
/*
* Copyright © 2006 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
/**************************************************************************/
/* */
/* Copyright (c) 2001, 2011 NoMachine, http://www.nomachine.com/. */
/* */
/* NX-X11, NX protocol compression and NX extensions to this software */
/* are copyright of NoMachine. Redistribution and use of the present */
/* software is allowed according to terms specified in the file LICENSE */
/* which comes in the source distribution. */
/* */
/* Check http://www.nomachine.com/licensing.html for applicability. */
/* */
/* NX and NoMachine are trademarks of Medialogic S.p.A. */
/* */
/* All rights reserved. */
/* */
/**************************************************************************/
#include "randrstr.h"
#include "swaprep.h"
#include "registry.h"
RESTYPE RRCrtcType;
/*
* Notify the CRTC of some change
*/
void
RRCrtcChanged (RRCrtcPtr crtc, Bool layoutChanged)
{
ScreenPtr pScreen = crtc->pScreen;
crtc->changed = TRUE;
if (pScreen)
{
rrScrPriv(pScreen);
pScrPriv->changed = TRUE;
/*
* Send ConfigureNotify on any layout change
*/
if (layoutChanged)
pScrPriv->layoutChanged = TRUE;
}
}
/*
* Create a CRTC
*/
RRCrtcPtr
RRCrtcCreate (ScreenPtr pScreen, void *devPrivate)
{
RRCrtcPtr crtc;
RRCrtcPtr *crtcs;
rrScrPrivPtr pScrPriv;
if (!RRInit())
return NULL;
pScrPriv = rrGetScrPriv(pScreen);
/* make space for the crtc pointer */
if (pScrPriv->numCrtcs)
crtcs = xrealloc (pScrPriv->crtcs,
(pScrPriv->numCrtcs + 1) * sizeof (RRCrtcPtr));
else
crtcs = xalloc (sizeof (RRCrtcPtr));
if (!crtcs)
return FALSE;
pScrPriv->crtcs = crtcs;
crtc = xcalloc (1, sizeof (RRCrtcRec));
if (!crtc)
return NULL;
crtc->id = FakeClientID (0);
crtc->pScreen = pScreen;
crtc->mode = NULL;
crtc->x = 0;
crtc->y = 0;
crtc->rotation = RR_Rotate_0;
crtc->rotations = RR_Rotate_0;
crtc->outputs = NULL;
crtc->numOutputs = 0;
crtc->gammaSize = 0;
crtc->gammaRed = crtc->gammaBlue = crtc->gammaGreen = NULL;
crtc->changed = FALSE;
crtc->devPrivate = devPrivate;
if (!AddResource (crtc->id, RRCrtcType, (pointer) crtc))
return NULL;
/* attach the screen and crtc together */
crtc->pScreen = pScreen;
pScrPriv->crtcs[pScrPriv->numCrtcs++] = crtc;
return crtc;
}
/*
* Set the allowed rotations on a CRTC
*/
void
RRCrtcSetRotations (RRCrtcPtr crtc, Rotation rotations)
{
crtc->rotations = rotations;
}
/*
* Notify the extension that the Crtc has been reconfigured,
* the driver calls this whenever it has updated the mode
*/
Bool
RRCrtcNotify (RRCrtcPtr crtc,
RRModePtr mode,
int x,
int y,
Rotation rotation,
int numOutputs,
RROutputPtr *outputs)
{
int i, j;
/*
* Check to see if any of the new outputs were
* not in the old list and mark them as changed
*/
for (i = 0; i < numOutputs; i++)
{
for (j = 0; j < crtc->numOutputs; j++)
if (outputs[i] == crtc->outputs[j])
break;
if (j == crtc->numOutputs)
{
outputs[i]->crtc = crtc;
RROutputChanged (outputs[i], FALSE);
RRCrtcChanged (crtc, FALSE);
}
}
/*
* Check to see if any of the old outputs are
* not in the new list and mark them as changed
*/
for (j = 0; j < crtc->numOutputs; j++)
{
for (i = 0; i < numOutputs; i++)
if (outputs[i] == crtc->outputs[j])
break;
if (i == numOutputs)
{
if (crtc->outputs[j]->crtc == crtc)
crtc->outputs[j]->crtc = NULL;
RROutputChanged (crtc->outputs[j], FALSE);
RRCrtcChanged (crtc, FALSE);
}
}
/*
* Reallocate the crtc output array if necessary
*/
if (numOutputs != crtc->numOutputs)
{
RROutputPtr *newoutputs;
if (numOutputs)
{
if (crtc->numOutputs)
newoutputs = xrealloc (crtc->outputs,
numOutputs * sizeof (RROutputPtr));
else
newoutputs = xalloc (numOutputs * sizeof (RROutputPtr));
if (!newoutputs)
return FALSE;
}
else
{
if (crtc->outputs)
xfree (crtc->outputs);
newoutputs = NULL;
}
crtc->outputs = newoutputs;
crtc->numOutputs = numOutputs;
}
/*
* Copy the new list of outputs into the crtc
*/
memcpy (crtc->outputs, outputs, numOutputs * sizeof (RROutputPtr));
/*
* Update remaining crtc fields
*/
if (mode != crtc->mode)
{
if (crtc->mode)
RRModeDestroy (crtc->mode);
crtc->mode = mode;
if (mode != NULL)
mode->refcnt++;
RRCrtcChanged (crtc, TRUE);
}
if (x != crtc->x)
{
crtc->x = x;
RRCrtcChanged (crtc, TRUE);
}
if (y != crtc->y)
{
crtc->y = y;
RRCrtcChanged (crtc, TRUE);
}
if (rotation != crtc->rotation)
{
crtc->rotation = rotation;
RRCrtcChanged (crtc, TRUE);
}
return TRUE;
}
void
RRDeliverCrtcEvent (ClientPtr client, WindowPtr pWin, RRCrtcPtr crtc)
{
ScreenPtr pScreen = pWin->drawable.pScreen;
rrScrPriv (pScreen);
xRRCrtcChangeNotifyEvent ce;
RRModePtr mode = crtc->mode;
ce.type = RRNotify + RREventBase;
ce.subCode = RRNotify_CrtcChange;
ce.sequenceNumber = client->sequence;
ce.timestamp = pScrPriv->lastSetTime.milliseconds;
ce.window = pWin->drawable.id;
ce.crtc = crtc->id;
ce.rotation = crtc->rotation;
if (mode)
{
ce.mode = mode->mode.id;
ce.x = crtc->x;
ce.y = crtc->y;
ce.width = mode->mode.width;
ce.height = mode->mode.height;
}
else
{
ce.mode = None;
ce.x = 0;
ce.y = 0;
ce.width = 0;
ce.height = 0;
}
WriteEventsToClient (client, 1, (xEvent *) &ce);
}
static Bool
RRCrtcPendingProperties (RRCrtcPtr crtc)
{
ScreenPtr pScreen = crtc->pScreen;
rrScrPriv(pScreen);
int o;
for (o = 0; o < pScrPriv->numOutputs; o++)
{
RROutputPtr output = pScrPriv->outputs[o];
if (output->crtc == crtc && output->pendingProperties)
return TRUE;
}
return FALSE;
}
/*
* Request that the Crtc be reconfigured
*/
Bool
RRCrtcSet (RRCrtcPtr crtc,
RRModePtr mode,
int x,
int y,
Rotation rotation,
int numOutputs,
RROutputPtr *outputs)
{
ScreenPtr pScreen = crtc->pScreen;
Bool ret = FALSE;
rrScrPriv(pScreen);
/* See if nothing changed */
if (crtc->mode == mode &&
crtc->x == x &&
crtc->y == y &&
crtc->rotation == rotation &&
crtc->numOutputs == numOutputs &&
!memcmp (crtc->outputs, outputs, numOutputs * sizeof (RROutputPtr)) &&
!RRCrtcPendingProperties (crtc))
{
ret = TRUE;
}
else
{
#if RANDR_12_INTERFACE
if (pScrPriv->rrCrtcSet)
{
ret = (*pScrPriv->rrCrtcSet) (pScreen, crtc, mode, x, y,
rotation, numOutputs, outputs);
}
else
#endif
{
#if RANDR_10_INTERFACE
if (pScrPriv->rrSetConfig)
{
RRScreenSize size;
RRScreenRate rate;
if (!mode)
{
RRCrtcNotify (crtc, NULL, x, y, rotation, 0, NULL);
ret = TRUE;
}
else
{
size.width = mode->mode.width;
size.height = mode->mode.height;
if (outputs[0]->mmWidth && outputs[0]->mmHeight)
{
size.mmWidth = outputs[0]->mmWidth;
size.mmHeight = outputs[0]->mmHeight;
}
else
{
size.mmWidth = pScreen->mmWidth;
size.mmHeight = pScreen->mmHeight;
}
size.nRates = 1;
rate.rate = RRVerticalRefresh (&mode->mode);
size.pRates = &rate;
ret = (*pScrPriv->rrSetConfig) (pScreen, rotation, rate.rate, &size);
/*
* Old 1.0 interface tied screen size to mode size
*/
if (ret)
{
RRCrtcNotify (crtc, mode, x, y, rotation, 1, outputs);
RRScreenSizeNotify (pScreen);
}
}
}
#endif
}
if (ret)
{
int o;
RRTellChanged (pScreen);
for (o = 0; o < numOutputs; o++)
RRPostPendingProperties (outputs[o]);
}
}
return ret;
}
/*
* Destroy a Crtc at shutdown
*/
void
RRCrtcDestroy (RRCrtcPtr crtc)
{
FreeResource (crtc->id, 0);
}
static int
RRCrtcDestroyResource (pointer value, XID pid)
{
RRCrtcPtr crtc = (RRCrtcPtr) value;
ScreenPtr pScreen = crtc->pScreen;
if (pScreen)
{
rrScrPriv(pScreen);
int i;
for (i = 0; i < pScrPriv->numCrtcs; i++)
{
if (pScrPriv->crtcs[i] == crtc)
{
memmove (pScrPriv->crtcs + i, pScrPriv->crtcs + i + 1,
(pScrPriv->numCrtcs - (i + 1)) * sizeof (RRCrtcPtr));
--pScrPriv->numCrtcs;
break;
}
}
}
if (crtc->gammaRed)
xfree (crtc->gammaRed);
if (crtc->mode)
RRModeDestroy (crtc->mode);
xfree (crtc);
return 1;
}
/*
* Request that the Crtc gamma be changed
*/
Bool
RRCrtcGammaSet (RRCrtcPtr crtc,
CARD16 *red,
CARD16 *green,
CARD16 *blue)
{
Bool ret = TRUE;
#if RANDR_12_INTERFACE
ScreenPtr pScreen = crtc->pScreen;
#endif
memcpy (crtc->gammaRed, red, crtc->gammaSize * sizeof (CARD16));
memcpy (crtc->gammaGreen, green, crtc->gammaSize * sizeof (CARD16));
memcpy (crtc->gammaBlue, blue, crtc->gammaSize * sizeof (CARD16));
#if RANDR_12_INTERFACE
if (pScreen)
{
rrScrPriv(pScreen);
if (pScrPriv->rrCrtcSetGamma)
ret = (*pScrPriv->rrCrtcSetGamma) (pScreen, crtc);
}
#endif
return ret;
}
/*
* Notify the extension that the Crtc gamma has been changed
* The driver calls this whenever it has changed the gamma values
* in the RRCrtcRec
*/
Bool
RRCrtcGammaNotify (RRCrtcPtr crtc)
{
return TRUE; /* not much going on here */
}
/**
* Returns the width/height that the crtc scans out from the framebuffer
*/
void
RRCrtcGetScanoutSize(RRCrtcPtr crtc, int *width, int *height)
{
if (crtc->mode == NULL) {
*width = 0;
*height = 0;
return;
}
switch (crtc->rotation & 0xf) {
case RR_Rotate_0:
case RR_Rotate_180:
*width = crtc->mode->mode.width;
*height = crtc->mode->mode.height;
break;
case RR_Rotate_90:
case RR_Rotate_270:
*width = crtc->mode->mode.height;
*height = crtc->mode->mode.width;
break;
}
}
/*
* Set the size of the gamma table at server startup time
*/
Bool
RRCrtcGammaSetSize (RRCrtcPtr crtc,
int size)
{
CARD16 *gamma;
if (size == crtc->gammaSize)
return TRUE;
if (size)
{
gamma = xalloc (size * 3 * sizeof (CARD16));
if (!gamma)
return FALSE;
}
else
gamma = NULL;
if (crtc->gammaRed)
xfree (crtc->gammaRed);
crtc->gammaRed = gamma;
crtc->gammaGreen = gamma + size;
crtc->gammaBlue = gamma + size*2;
crtc->gammaSize = size;
return TRUE;
}
/*
* Initialize crtc type
*/
Bool
RRCrtcInit (void)
{
RRCrtcType = CreateNewResourceType (RRCrtcDestroyResource);
if (!RRCrtcType)
return FALSE;
RegisterResourceName (RRCrtcType, "CRTC");
return TRUE;
}
int
ProcRRGetCrtcInfo (ClientPtr client)
{
REQUEST(xRRGetCrtcInfoReq);
xRRGetCrtcInfoReply rep;
RRCrtcPtr crtc;
CARD8 *extra;
unsigned long extraLen;
ScreenPtr pScreen;
rrScrPrivPtr pScrPriv;
RRModePtr mode;
RROutput *outputs;
RROutput *possible;
int i, j, k, n;
int width, height;
REQUEST_SIZE_MATCH(xRRGetCrtcInfoReq);
crtc = LookupCrtc(client, stuff->crtc, DixReadAccess);
if (!crtc)
return RRErrorBase + BadRRCrtc;
/* All crtcs must be associated with screens before client
* requests are processed
*/
pScreen = crtc->pScreen;
pScrPriv = rrGetScrPriv(pScreen);
mode = crtc->mode;
rep.type = X_Reply;
rep.status = RRSetConfigSuccess;
rep.sequenceNumber = client->sequence;
rep.length = 0;
rep.timestamp = pScrPriv->lastSetTime.milliseconds;
rep.x = crtc->x;
rep.y = crtc->y;
RRCrtcGetScanoutSize (crtc, &width, &height);
rep.width = width;
rep.height = height;
rep.mode = mode ? mode->mode.id : 0;
rep.rotation = crtc->rotation;
rep.rotations = crtc->rotations;
rep.nOutput = crtc->numOutputs;
k = 0;
for (i = 0; i < pScrPriv->numOutputs; i++)
for (j = 0; j < pScrPriv->outputs[i]->numCrtcs; j++)
if (pScrPriv->outputs[i]->crtcs[j] == crtc)
k++;
rep.nPossibleOutput = k;
rep.length = rep.nOutput + rep.nPossibleOutput;
extraLen = rep.length << 2;
if (extraLen)
{
extra = xalloc (extraLen);
if (!extra)
return BadAlloc;
}
else
extra = NULL;
outputs = (RROutput *) extra;
possible = (RROutput *) (outputs + rep.nOutput);
for (i = 0; i < crtc->numOutputs; i++)
{
outputs[i] = crtc->outputs[i]->id;
if (client->swapped)
swapl (&outputs[i], n);
}
k = 0;
for (i = 0; i < pScrPriv->numOutputs; i++)
for (j = 0; j < pScrPriv->outputs[i]->numCrtcs; j++)
if (pScrPriv->outputs[i]->crtcs[j] == crtc)
{
possible[k] = pScrPriv->outputs[i]->id;
if (client->swapped)
swapl (&possible[k], n);
k++;
}
if (client->swapped) {
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swapl(&rep.timestamp, n);
swaps(&rep.x, n);
swaps(&rep.y, n);
swaps(&rep.width, n);
swaps(&rep.height, n);
swapl(&rep.mode, n);
swaps(&rep.rotation, n);
swaps(&rep.rotations, n);
swaps(&rep.nOutput, n);
swaps(&rep.nPossibleOutput, n);
}
WriteToClient(client, sizeof(xRRGetCrtcInfoReply), (char *)&rep);
if (extraLen)
{
WriteToClient (client, extraLen, (char *) extra);
xfree (extra);
}
return client->noClientException;
}
int
ProcRRSetCrtcConfig (ClientPtr client)
{
REQUEST(xRRSetCrtcConfigReq);
xRRSetCrtcConfigReply rep;
ScreenPtr pScreen;
rrScrPrivPtr pScrPriv;
RRCrtcPtr crtc;
RRModePtr mode;
int numOutputs;
RROutputPtr *outputs = NULL;
RROutput *outputIds;
TimeStamp configTime;
TimeStamp time;
Rotation rotation;
int i, j;
REQUEST_AT_LEAST_SIZE(xRRSetCrtcConfigReq);
numOutputs = (stuff->length - (SIZEOF (xRRSetCrtcConfigReq) >> 2));
crtc = LookupIDByType (stuff->crtc, RRCrtcType);
if (!crtc)
{
client->errorValue = stuff->crtc;
return RRErrorBase + BadRRCrtc;
}
if (stuff->mode == None)
{
mode = NULL;
if (numOutputs > 0)
return BadMatch;
}
else
{
mode = LookupIDByType (stuff->mode, RRModeType);
if (!mode)
{
client->errorValue = stuff->mode;
return RRErrorBase + BadRRMode;
}
if (numOutputs == 0)
return BadMatch;
}
if (numOutputs)
{
outputs = xalloc (numOutputs * sizeof (RROutputPtr));
if (!outputs)
return BadAlloc;
}
else
outputs = NULL;
outputIds = (RROutput *) (stuff + 1);
for (i = 0; i < numOutputs; i++)
{
outputs[i] = (RROutputPtr) LookupIDByType (outputIds[i], RROutputType);
if (!outputs[i])
{
client->errorValue = outputIds[i];
if (outputs)
xfree (outputs);
return RRErrorBase + BadRROutput;
}
/* validate crtc for this output */
for (j = 0; j < outputs[i]->numCrtcs; j++)
if (outputs[i]->crtcs[j] == crtc)
break;
if (j == outputs[i]->numCrtcs)
{
if (outputs)
xfree (outputs);
return BadMatch;
}
/* validate mode for this output */
for (j = 0; j < outputs[i]->numModes + outputs[i]->numUserModes; j++)
{
RRModePtr m = (j < outputs[i]->numModes ?
outputs[i]->modes[j] :
outputs[i]->userModes[j - outputs[i]->numModes]);
if (m == mode)
break;
}
if (j == outputs[i]->numModes + outputs[i]->numUserModes)
{
if (outputs)
xfree (outputs);
return BadMatch;
}
}
/* validate clones */
for (i = 0; i < numOutputs; i++)
{
for (j = 0; j < numOutputs; j++)
{
int k;
if (i == j)
continue;
for (k = 0; k < outputs[i]->numClones; k++)
{
if (outputs[i]->clones[k] == outputs[j])
break;
}
if (k == outputs[i]->numClones)
{
if (outputs)
xfree (outputs);
return BadMatch;
}
}
}
pScreen = crtc->pScreen;
pScrPriv = rrGetScrPriv(pScreen);
time = ClientTimeToServerTime(stuff->timestamp);
configTime = ClientTimeToServerTime(stuff->configTimestamp);
if (!pScrPriv)
{
time = currentTime;
rep.status = RRSetConfigFailed;
goto sendReply;
}
#if 0
/*
* if the client's config timestamp is not the same as the last config
* timestamp, then the config information isn't up-to-date and
* can't even be validated
*/
if (CompareTimeStamps (configTime, pScrPriv->lastConfigTime) != 0)
{
rep.status = RRSetConfigInvalidConfigTime;
goto sendReply;
}
#endif
/*
* Validate requested rotation
*/
rotation = (Rotation) stuff->rotation;
/* test the rotation bits only! */
switch (rotation & 0xf) {
case RR_Rotate_0:
case RR_Rotate_90:
case RR_Rotate_180:
case RR_Rotate_270:
break;
default:
/*
* Invalid rotation
*/
client->errorValue = stuff->rotation;
if (outputs)
xfree (outputs);
return BadValue;
}
if (mode)
{
if ((~crtc->rotations) & rotation)
{
/*
* requested rotation or reflection not supported by screen
*/
client->errorValue = stuff->rotation;
if (outputs)
xfree (outputs);
return BadMatch;
}
#ifdef RANDR_12_INTERFACE
/*
* Check screen size bounds if the DDX provides a 1.2 interface
* for setting screen size. Else, assume the CrtcSet sets
* the size along with the mode
*/
if (pScrPriv->rrScreenSetSize)
{
int source_width = mode->mode.width;
int source_height = mode->mode.height;
if ((rotation & 0xf) == RR_Rotate_90 || (rotation & 0xf) == RR_Rotate_270)
{
source_width = mode->mode.height;
source_height = mode->mode.width;
}
if (stuff->x + source_width > pScreen->width)
{
client->errorValue = stuff->x;
if (outputs)
xfree (outputs);
return BadValue;
}
if (stuff->y + source_height > pScreen->height)
{
client->errorValue = stuff->y;
if (outputs)
xfree (outputs);
return BadValue;
}
}
#endif
}
/*
* Make sure the requested set-time is not older than
* the last set-time
*/
if (CompareTimeStamps (time, pScrPriv->lastSetTime) < 0)
{
rep.status = RRSetConfigInvalidTime;
goto sendReply;
}
if (!RRCrtcSet (crtc, mode, stuff->x, stuff->y,
rotation, numOutputs, outputs))
{
rep.status = RRSetConfigFailed;
goto sendReply;
}
#ifdef NXAGENT_SERVER /* Bug 21987 */
pScrPriv->lastSetTime = time;
#endif
rep.status = RRSetConfigSuccess;
sendReply:
if (outputs)
xfree (outputs);
rep.type = X_Reply;
/* rep.status has already been filled in */
rep.length = 0;
rep.sequenceNumber = client->sequence;
#ifndef NXAGENT_SERVER /* Bug 21987 */
rep.newTimestamp = pScrPriv->lastConfigTime.milliseconds;
#else
rep.newTimestamp = pScrPriv->lastSetTime.milliseconds;
#endif
if (client->swapped)
{
int n;
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swapl(&rep.newTimestamp, n);
}
WriteToClient(client, sizeof(xRRSetCrtcConfigReply), (char *)&rep);
return client->noClientException;
}
int
ProcRRGetCrtcGammaSize (ClientPtr client)
{
REQUEST(xRRGetCrtcGammaSizeReq);
xRRGetCrtcGammaSizeReply reply;
RRCrtcPtr crtc;
int n;
REQUEST_SIZE_MATCH(xRRGetCrtcGammaSizeReq);
crtc = LookupCrtc (client, stuff->crtc, DixReadAccess);
if (!crtc)
return RRErrorBase + BadRRCrtc;
reply.type = X_Reply;
reply.sequenceNumber = client->sequence;
reply.length = 0;
reply.size = crtc->gammaSize;
if (client->swapped) {
swaps (&reply.sequenceNumber, n);
swapl (&reply.length, n);
swaps (&reply.size, n);
}
WriteToClient (client, sizeof (xRRGetCrtcGammaSizeReply), (char *) &reply);
return client->noClientException;
}
int
ProcRRGetCrtcGamma (ClientPtr client)
{
REQUEST(xRRGetCrtcGammaReq);
xRRGetCrtcGammaReply reply;
RRCrtcPtr crtc;
int n;
unsigned long len;
char *extra;
REQUEST_SIZE_MATCH(xRRGetCrtcGammaReq);
crtc = LookupCrtc (client, stuff->crtc, DixReadAccess);
if (!crtc)
return RRErrorBase + BadRRCrtc;
len = crtc->gammaSize * 3 * 2;
if (crtc->gammaSize) {
extra = xalloc(len);
if (!extra)
return BadAlloc;
}
reply.type = X_Reply;
reply.sequenceNumber = client->sequence;
reply.length = (len + 3) >> 2;
reply.size = crtc->gammaSize;
if (client->swapped) {
swaps (&reply.sequenceNumber, n);
swapl (&reply.length, n);
swaps (&reply.size, n);
}
WriteToClient (client, sizeof (xRRGetCrtcGammaReply), (char *) &reply);
if (crtc->gammaSize)
{
memcpy(extra, crtc->gammaRed, len);
client->pSwapReplyFunc = (ReplySwapPtr)CopySwap16Write;
WriteSwappedDataToClient (client, len, extra);
xfree(extra);
}
return client->noClientException;
}
int
ProcRRSetCrtcGamma (ClientPtr client)
{
REQUEST(xRRSetCrtcGammaReq);
RRCrtcPtr crtc;
unsigned long len;
CARD16 *red, *green, *blue;
REQUEST_AT_LEAST_SIZE(xRRSetCrtcGammaReq);
crtc = LookupCrtc (client, stuff->crtc, DixWriteAccess);
if (!crtc)
return RRErrorBase + BadRRCrtc;
len = client->req_len - (sizeof (xRRSetCrtcGammaReq) >> 2);
if (len < (stuff->size * 3 + 1) >> 1)
return BadLength;
if (stuff->size != crtc->gammaSize)
return BadMatch;
red = (CARD16 *) (stuff + 1);
green = red + crtc->gammaSize;
blue = green + crtc->gammaSize;
RRCrtcGammaSet (crtc, red, green, blue);
return Success;
}
nx-X11/programs/Xserver/randr/rrcrtc.c.X.original
0 → 100644
View file @
15cee47a
/*
* Copyright © 2006 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
#include "randrstr.h"
#include "swaprep.h"
#include "registry.h"
RESTYPE RRCrtcType;
/*
* Notify the CRTC of some change
*/
void
RRCrtcChanged (RRCrtcPtr crtc, Bool layoutChanged)
{
ScreenPtr pScreen = crtc->pScreen;
crtc->changed = TRUE;
if (pScreen)
{
rrScrPriv(pScreen);
pScrPriv->changed = TRUE;
/*
* Send ConfigureNotify on any layout change
*/
if (layoutChanged)
pScrPriv->layoutChanged = TRUE;
}
}
/*
* Create a CRTC
*/
RRCrtcPtr
RRCrtcCreate (ScreenPtr pScreen, void *devPrivate)
{
RRCrtcPtr crtc;
RRCrtcPtr *crtcs;
rrScrPrivPtr pScrPriv;
if (!RRInit())
return NULL;
pScrPriv = rrGetScrPriv(pScreen);
/* make space for the crtc pointer */
if (pScrPriv->numCrtcs)
crtcs = xrealloc (pScrPriv->crtcs,
(pScrPriv->numCrtcs + 1) * sizeof (RRCrtcPtr));
else
crtcs = xalloc (sizeof (RRCrtcPtr));
if (!crtcs)
return FALSE;
pScrPriv->crtcs = crtcs;
crtc = xcalloc (1, sizeof (RRCrtcRec));
if (!crtc)
return NULL;
crtc->id = FakeClientID (0);
crtc->pScreen = pScreen;
crtc->mode = NULL;
crtc->x = 0;
crtc->y = 0;
crtc->rotation = RR_Rotate_0;
crtc->rotations = RR_Rotate_0;
crtc->outputs = NULL;
crtc->numOutputs = 0;
crtc->gammaSize = 0;
crtc->gammaRed = crtc->gammaBlue = crtc->gammaGreen = NULL;
crtc->changed = FALSE;
crtc->devPrivate = devPrivate;
if (!AddResource (crtc->id, RRCrtcType, (pointer) crtc))
return NULL;
/* attach the screen and crtc together */
crtc->pScreen = pScreen;
pScrPriv->crtcs[pScrPriv->numCrtcs++] = crtc;
return crtc;
}
/*
* Set the allowed rotations on a CRTC
*/
void
RRCrtcSetRotations (RRCrtcPtr crtc, Rotation rotations)
{
crtc->rotations = rotations;
}
/*
* Notify the extension that the Crtc has been reconfigured,
* the driver calls this whenever it has updated the mode
*/
Bool
RRCrtcNotify (RRCrtcPtr crtc,
RRModePtr mode,
int x,
int y,
Rotation rotation,
int numOutputs,
RROutputPtr *outputs)
{
int i, j;
/*
* Check to see if any of the new outputs were
* not in the old list and mark them as changed
*/
for (i = 0; i < numOutputs; i++)
{
for (j = 0; j < crtc->numOutputs; j++)
if (outputs[i] == crtc->outputs[j])
break;
if (j == crtc->numOutputs)
{
outputs[i]->crtc = crtc;
RROutputChanged (outputs[i], FALSE);
RRCrtcChanged (crtc, FALSE);
}
}
/*
* Check to see if any of the old outputs are
* not in the new list and mark them as changed
*/
for (j = 0; j < crtc->numOutputs; j++)
{
for (i = 0; i < numOutputs; i++)
if (outputs[i] == crtc->outputs[j])
break;
if (i == numOutputs)
{
if (crtc->outputs[j]->crtc == crtc)
crtc->outputs[j]->crtc = NULL;
RROutputChanged (crtc->outputs[j], FALSE);
RRCrtcChanged (crtc, FALSE);
}
}
/*
* Reallocate the crtc output array if necessary
*/
if (numOutputs != crtc->numOutputs)
{
RROutputPtr *newoutputs;
if (numOutputs)
{
if (crtc->numOutputs)
newoutputs = xrealloc (crtc->outputs,
numOutputs * sizeof (RROutputPtr));
else
newoutputs = xalloc (numOutputs * sizeof (RROutputPtr));
if (!newoutputs)
return FALSE;
}
else
{
if (crtc->outputs)
xfree (crtc->outputs);
newoutputs = NULL;
}
crtc->outputs = newoutputs;
crtc->numOutputs = numOutputs;
}
/*
* Copy the new list of outputs into the crtc
*/
memcpy (crtc->outputs, outputs, numOutputs * sizeof (RROutputPtr));
/*
* Update remaining crtc fields
*/
if (mode != crtc->mode)
{
if (crtc->mode)
RRModeDestroy (crtc->mode);
crtc->mode = mode;
if (mode != NULL)
mode->refcnt++;
RRCrtcChanged (crtc, TRUE);
}
if (x != crtc->x)
{
crtc->x = x;
RRCrtcChanged (crtc, TRUE);
}
if (y != crtc->y)
{
crtc->y = y;
RRCrtcChanged (crtc, TRUE);
}
if (rotation != crtc->rotation)
{
crtc->rotation = rotation;
RRCrtcChanged (crtc, TRUE);
}
return TRUE;
}
void
RRDeliverCrtcEvent (ClientPtr client, WindowPtr pWin, RRCrtcPtr crtc)
{
ScreenPtr pScreen = pWin->drawable.pScreen;
rrScrPriv (pScreen);
xRRCrtcChangeNotifyEvent ce;
RRModePtr mode = crtc->mode;
ce.type = RRNotify + RREventBase;
ce.subCode = RRNotify_CrtcChange;
ce.sequenceNumber = client->sequence;
ce.timestamp = pScrPriv->lastSetTime.milliseconds;
ce.window = pWin->drawable.id;
ce.crtc = crtc->id;
ce.rotation = crtc->rotation;
if (mode)
{
ce.mode = mode->mode.id;
ce.x = crtc->x;
ce.y = crtc->y;
ce.width = mode->mode.width;
ce.height = mode->mode.height;
}
else
{
ce.mode = None;
ce.x = 0;
ce.y = 0;
ce.width = 0;
ce.height = 0;
}
WriteEventsToClient (client, 1, (xEvent *) &ce);
}
static Bool
RRCrtcPendingProperties (RRCrtcPtr crtc)
{
ScreenPtr pScreen = crtc->pScreen;
rrScrPriv(pScreen);
int o;
for (o = 0; o < pScrPriv->numOutputs; o++)
{
RROutputPtr output = pScrPriv->outputs[o];
if (output->crtc == crtc && output->pendingProperties)
return TRUE;
}
return FALSE;
}
/*
* Request that the Crtc be reconfigured
*/
Bool
RRCrtcSet (RRCrtcPtr crtc,
RRModePtr mode,
int x,
int y,
Rotation rotation,
int numOutputs,
RROutputPtr *outputs)
{
ScreenPtr pScreen = crtc->pScreen;
Bool ret = FALSE;
rrScrPriv(pScreen);
/* See if nothing changed */
if (crtc->mode == mode &&
crtc->x == x &&
crtc->y == y &&
crtc->rotation == rotation &&
crtc->numOutputs == numOutputs &&
!memcmp (crtc->outputs, outputs, numOutputs * sizeof (RROutputPtr)) &&
!RRCrtcPendingProperties (crtc))
{
ret = TRUE;
}
else
{
#if RANDR_12_INTERFACE
if (pScrPriv->rrCrtcSet)
{
ret = (*pScrPriv->rrCrtcSet) (pScreen, crtc, mode, x, y,
rotation, numOutputs, outputs);
}
else
#endif
{
#if RANDR_10_INTERFACE
if (pScrPriv->rrSetConfig)
{
RRScreenSize size;
RRScreenRate rate;
if (!mode)
{
RRCrtcNotify (crtc, NULL, x, y, rotation, 0, NULL);
ret = TRUE;
}
else
{
size.width = mode->mode.width;
size.height = mode->mode.height;
if (outputs[0]->mmWidth && outputs[0]->mmHeight)
{
size.mmWidth = outputs[0]->mmWidth;
size.mmHeight = outputs[0]->mmHeight;
}
else
{
size.mmWidth = pScreen->mmWidth;
size.mmHeight = pScreen->mmHeight;
}
size.nRates = 1;
rate.rate = RRVerticalRefresh (&mode->mode);
size.pRates = &rate;
ret = (*pScrPriv->rrSetConfig) (pScreen, rotation, rate.rate, &size);
/*
* Old 1.0 interface tied screen size to mode size
*/
if (ret)
{
RRCrtcNotify (crtc, mode, x, y, rotation, 1, outputs);
RRScreenSizeNotify (pScreen);
}
}
}
#endif
}
if (ret)
{
int o;
RRTellChanged (pScreen);
for (o = 0; o < numOutputs; o++)
RRPostPendingProperties (outputs[o]);
}
}
return ret;
}
/*
* Destroy a Crtc at shutdown
*/
void
RRCrtcDestroy (RRCrtcPtr crtc)
{
FreeResource (crtc->id, 0);
}
static int
RRCrtcDestroyResource (pointer value, XID pid)
{
RRCrtcPtr crtc = (RRCrtcPtr) value;
ScreenPtr pScreen = crtc->pScreen;
if (pScreen)
{
rrScrPriv(pScreen);
int i;
for (i = 0; i < pScrPriv->numCrtcs; i++)
{
if (pScrPriv->crtcs[i] == crtc)
{
memmove (pScrPriv->crtcs + i, pScrPriv->crtcs + i + 1,
(pScrPriv->numCrtcs - (i + 1)) * sizeof (RRCrtcPtr));
--pScrPriv->numCrtcs;
break;
}
}
}
if (crtc->gammaRed)
xfree (crtc->gammaRed);
if (crtc->mode)
RRModeDestroy (crtc->mode);
xfree (crtc);
return 1;
}
/*
* Request that the Crtc gamma be changed
*/
Bool
RRCrtcGammaSet (RRCrtcPtr crtc,
CARD16 *red,
CARD16 *green,
CARD16 *blue)
{
Bool ret = TRUE;
#if RANDR_12_INTERFACE
ScreenPtr pScreen = crtc->pScreen;
#endif
memcpy (crtc->gammaRed, red, crtc->gammaSize * sizeof (CARD16));
memcpy (crtc->gammaGreen, green, crtc->gammaSize * sizeof (CARD16));
memcpy (crtc->gammaBlue, blue, crtc->gammaSize * sizeof (CARD16));
#if RANDR_12_INTERFACE
if (pScreen)
{
rrScrPriv(pScreen);
if (pScrPriv->rrCrtcSetGamma)
ret = (*pScrPriv->rrCrtcSetGamma) (pScreen, crtc);
}
#endif
return ret;
}
/*
* Notify the extension that the Crtc gamma has been changed
* The driver calls this whenever it has changed the gamma values
* in the RRCrtcRec
*/
Bool
RRCrtcGammaNotify (RRCrtcPtr crtc)
{
return TRUE; /* not much going on here */
}
/**
* Returns the width/height that the crtc scans out from the framebuffer
*/
void
RRCrtcGetScanoutSize(RRCrtcPtr crtc, int *width, int *height)
{
if (crtc->mode == NULL) {
*width = 0;
*height = 0;
return;
}
switch (crtc->rotation & 0xf) {
case RR_Rotate_0:
case RR_Rotate_180:
*width = crtc->mode->mode.width;
*height = crtc->mode->mode.height;
break;
case RR_Rotate_90:
case RR_Rotate_270:
*width = crtc->mode->mode.height;
*height = crtc->mode->mode.width;
break;
}
}
/*
* Set the size of the gamma table at server startup time
*/
Bool
RRCrtcGammaSetSize (RRCrtcPtr crtc,
int size)
{
CARD16 *gamma;
if (size == crtc->gammaSize)
return TRUE;
if (size)
{
gamma = xalloc (size * 3 * sizeof (CARD16));
if (!gamma)
return FALSE;
}
else
gamma = NULL;
if (crtc->gammaRed)
xfree (crtc->gammaRed);
crtc->gammaRed = gamma;
crtc->gammaGreen = gamma + size;
crtc->gammaBlue = gamma + size*2;
crtc->gammaSize = size;
return TRUE;
}
/*
* Initialize crtc type
*/
Bool
RRCrtcInit (void)
{
RRCrtcType = CreateNewResourceType (RRCrtcDestroyResource);
if (!RRCrtcType)
return FALSE;
RegisterResourceName (RRCrtcType, "CRTC");
return TRUE;
}
int
ProcRRGetCrtcInfo (ClientPtr client)
{
REQUEST(xRRGetCrtcInfoReq);
xRRGetCrtcInfoReply rep;
RRCrtcPtr crtc;
CARD8 *extra;
unsigned long extraLen;
ScreenPtr pScreen;
rrScrPrivPtr pScrPriv;
RRModePtr mode;
RROutput *outputs;
RROutput *possible;
int i, j, k, n;
int width, height;
REQUEST_SIZE_MATCH(xRRGetCrtcInfoReq);
crtc = LookupCrtc(client, stuff->crtc, DixReadAccess);
if (!crtc)
return RRErrorBase + BadRRCrtc;
/* All crtcs must be associated with screens before client
* requests are processed
*/
pScreen = crtc->pScreen;
pScrPriv = rrGetScrPriv(pScreen);
mode = crtc->mode;
rep.type = X_Reply;
rep.status = RRSetConfigSuccess;
rep.sequenceNumber = client->sequence;
rep.length = 0;
rep.timestamp = pScrPriv->lastSetTime.milliseconds;
rep.x = crtc->x;
rep.y = crtc->y;
RRCrtcGetScanoutSize (crtc, &width, &height);
rep.width = width;
rep.height = height;
rep.mode = mode ? mode->mode.id : 0;
rep.rotation = crtc->rotation;
rep.rotations = crtc->rotations;
rep.nOutput = crtc->numOutputs;
k = 0;
for (i = 0; i < pScrPriv->numOutputs; i++)
for (j = 0; j < pScrPriv->outputs[i]->numCrtcs; j++)
if (pScrPriv->outputs[i]->crtcs[j] == crtc)
k++;
rep.nPossibleOutput = k;
rep.length = rep.nOutput + rep.nPossibleOutput;
extraLen = rep.length << 2;
if (extraLen)
{
extra = xalloc (extraLen);
if (!extra)
return BadAlloc;
}
else
extra = NULL;
outputs = (RROutput *) extra;
possible = (RROutput *) (outputs + rep.nOutput);
for (i = 0; i < crtc->numOutputs; i++)
{
outputs[i] = crtc->outputs[i]->id;
if (client->swapped)
swapl (&outputs[i], n);
}
k = 0;
for (i = 0; i < pScrPriv->numOutputs; i++)
for (j = 0; j < pScrPriv->outputs[i]->numCrtcs; j++)
if (pScrPriv->outputs[i]->crtcs[j] == crtc)
{
possible[k] = pScrPriv->outputs[i]->id;
if (client->swapped)
swapl (&possible[k], n);
k++;
}
if (client->swapped) {
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swapl(&rep.timestamp, n);
swaps(&rep.x, n);
swaps(&rep.y, n);
swaps(&rep.width, n);
swaps(&rep.height, n);
swapl(&rep.mode, n);
swaps(&rep.rotation, n);
swaps(&rep.rotations, n);
swaps(&rep.nOutput, n);
swaps(&rep.nPossibleOutput, n);
}
WriteToClient(client, sizeof(xRRGetCrtcInfoReply), (char *)&rep);
if (extraLen)
{
WriteToClient (client, extraLen, (char *) extra);
xfree (extra);
}
return client->noClientException;
}
int
ProcRRSetCrtcConfig (ClientPtr client)
{
REQUEST(xRRSetCrtcConfigReq);
xRRSetCrtcConfigReply rep;
ScreenPtr pScreen;
rrScrPrivPtr pScrPriv;
RRCrtcPtr crtc;
RRModePtr mode;
int numOutputs;
RROutputPtr *outputs = NULL;
RROutput *outputIds;
TimeStamp configTime;
TimeStamp time;
Rotation rotation;
int i, j;
REQUEST_AT_LEAST_SIZE(xRRSetCrtcConfigReq);
numOutputs = (stuff->length - (SIZEOF (xRRSetCrtcConfigReq) >> 2));
crtc = LookupIDByType (stuff->crtc, RRCrtcType);
if (!crtc)
{
client->errorValue = stuff->crtc;
return RRErrorBase + BadRRCrtc;
}
if (stuff->mode == None)
{
mode = NULL;
if (numOutputs > 0)
return BadMatch;
}
else
{
mode = LookupIDByType (stuff->mode, RRModeType);
if (!mode)
{
client->errorValue = stuff->mode;
return RRErrorBase + BadRRMode;
}
if (numOutputs == 0)
return BadMatch;
}
if (numOutputs)
{
outputs = xalloc (numOutputs * sizeof (RROutputPtr));
if (!outputs)
return BadAlloc;
}
else
outputs = NULL;
outputIds = (RROutput *) (stuff + 1);
for (i = 0; i < numOutputs; i++)
{
outputs[i] = (RROutputPtr) LookupIDByType (outputIds[i], RROutputType);
if (!outputs[i])
{
client->errorValue = outputIds[i];
if (outputs)
xfree (outputs);
return RRErrorBase + BadRROutput;
}
/* validate crtc for this output */
for (j = 0; j < outputs[i]->numCrtcs; j++)
if (outputs[i]->crtcs[j] == crtc)
break;
if (j == outputs[i]->numCrtcs)
{
if (outputs)
xfree (outputs);
return BadMatch;
}
/* validate mode for this output */
for (j = 0; j < outputs[i]->numModes + outputs[i]->numUserModes; j++)
{
RRModePtr m = (j < outputs[i]->numModes ?
outputs[i]->modes[j] :
outputs[i]->userModes[j - outputs[i]->numModes]);
if (m == mode)
break;
}
if (j == outputs[i]->numModes + outputs[i]->numUserModes)
{
if (outputs)
xfree (outputs);
return BadMatch;
}
}
/* validate clones */
for (i = 0; i < numOutputs; i++)
{
for (j = 0; j < numOutputs; j++)
{
int k;
if (i == j)
continue;
for (k = 0; k < outputs[i]->numClones; k++)
{
if (outputs[i]->clones[k] == outputs[j])
break;
}
if (k == outputs[i]->numClones)
{
if (outputs)
xfree (outputs);
return BadMatch;
}
}
}
pScreen = crtc->pScreen;
pScrPriv = rrGetScrPriv(pScreen);
time = ClientTimeToServerTime(stuff->timestamp);
configTime = ClientTimeToServerTime(stuff->configTimestamp);
if (!pScrPriv)
{
time = currentTime;
rep.status = RRSetConfigFailed;
goto sendReply;
}
#if 0
/*
* if the client's config timestamp is not the same as the last config
* timestamp, then the config information isn't up-to-date and
* can't even be validated
*/
if (CompareTimeStamps (configTime, pScrPriv->lastConfigTime) != 0)
{
rep.status = RRSetConfigInvalidConfigTime;
goto sendReply;
}
#endif
/*
* Validate requested rotation
*/
rotation = (Rotation) stuff->rotation;
/* test the rotation bits only! */
switch (rotation & 0xf) {
case RR_Rotate_0:
case RR_Rotate_90:
case RR_Rotate_180:
case RR_Rotate_270:
break;
default:
/*
* Invalid rotation
*/
client->errorValue = stuff->rotation;
if (outputs)
xfree (outputs);
return BadValue;
}
if (mode)
{
if ((~crtc->rotations) & rotation)
{
/*
* requested rotation or reflection not supported by screen
*/
client->errorValue = stuff->rotation;
if (outputs)
xfree (outputs);
return BadMatch;
}
#ifdef RANDR_12_INTERFACE
/*
* Check screen size bounds if the DDX provides a 1.2 interface
* for setting screen size. Else, assume the CrtcSet sets
* the size along with the mode
*/
if (pScrPriv->rrScreenSetSize)
{
int source_width = mode->mode.width;
int source_height = mode->mode.height;
if ((rotation & 0xf) == RR_Rotate_90 || (rotation & 0xf) == RR_Rotate_270)
{
source_width = mode->mode.height;
source_height = mode->mode.width;
}
if (stuff->x + source_width > pScreen->width)
{
client->errorValue = stuff->x;
if (outputs)
xfree (outputs);
return BadValue;
}
if (stuff->y + source_height > pScreen->height)
{
client->errorValue = stuff->y;
if (outputs)
xfree (outputs);
return BadValue;
}
}
#endif
}
/*
* Make sure the requested set-time is not older than
* the last set-time
*/
if (CompareTimeStamps (time, pScrPriv->lastSetTime) < 0)
{
rep.status = RRSetConfigInvalidTime;
goto sendReply;
}
if (!RRCrtcSet (crtc, mode, stuff->x, stuff->y,
rotation, numOutputs, outputs))
{
rep.status = RRSetConfigFailed;
goto sendReply;
}
rep.status = RRSetConfigSuccess;
sendReply:
if (outputs)
xfree (outputs);
rep.type = X_Reply;
/* rep.status has already been filled in */
rep.length = 0;
rep.sequenceNumber = client->sequence;
rep.newTimestamp = pScrPriv->lastConfigTime.milliseconds;
if (client->swapped)
{
int n;
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swapl(&rep.newTimestamp, n);
}
WriteToClient(client, sizeof(xRRSetCrtcConfigReply), (char *)&rep);
return client->noClientException;
}
int
ProcRRGetCrtcGammaSize (ClientPtr client)
{
REQUEST(xRRGetCrtcGammaSizeReq);
xRRGetCrtcGammaSizeReply reply;
RRCrtcPtr crtc;
int n;
REQUEST_SIZE_MATCH(xRRGetCrtcGammaSizeReq);
crtc = LookupCrtc (client, stuff->crtc, DixReadAccess);
if (!crtc)
return RRErrorBase + BadRRCrtc;
reply.type = X_Reply;
reply.sequenceNumber = client->sequence;
reply.length = 0;
reply.size = crtc->gammaSize;
if (client->swapped) {
swaps (&reply.sequenceNumber, n);
swapl (&reply.length, n);
swaps (&reply.size, n);
}
WriteToClient (client, sizeof (xRRGetCrtcGammaSizeReply), (char *) &reply);
return client->noClientException;
}
int
ProcRRGetCrtcGamma (ClientPtr client)
{
REQUEST(xRRGetCrtcGammaReq);
xRRGetCrtcGammaReply reply;
RRCrtcPtr crtc;
int n;
unsigned long len;
char *extra;
REQUEST_SIZE_MATCH(xRRGetCrtcGammaReq);
crtc = LookupCrtc (client, stuff->crtc, DixReadAccess);
if (!crtc)
return RRErrorBase + BadRRCrtc;
len = crtc->gammaSize * 3 * 2;
if (crtc->gammaSize) {
extra = xalloc(len);
if (!extra)
return BadAlloc;
}
reply.type = X_Reply;
reply.sequenceNumber = client->sequence;
reply.length = (len + 3) >> 2;
reply.size = crtc->gammaSize;
if (client->swapped) {
swaps (&reply.sequenceNumber, n);
swapl (&reply.length, n);
swaps (&reply.size, n);
}
WriteToClient (client, sizeof (xRRGetCrtcGammaReply), (char *) &reply);
if (crtc->gammaSize)
{
memcpy(extra, crtc->gammaRed, len);
client->pSwapReplyFunc = (ReplySwapPtr)CopySwap16Write;
WriteSwappedDataToClient (client, len, extra);
xfree(extra);
}
return client->noClientException;
}
int
ProcRRSetCrtcGamma (ClientPtr client)
{
REQUEST(xRRSetCrtcGammaReq);
RRCrtcPtr crtc;
unsigned long len;
CARD16 *red, *green, *blue;
REQUEST_AT_LEAST_SIZE(xRRSetCrtcGammaReq);
crtc = LookupCrtc (client, stuff->crtc, DixWriteAccess);
if (!crtc)
return RRErrorBase + BadRRCrtc;
len = client->req_len - (sizeof (xRRSetCrtcGammaReq) >> 2);
if (len < (stuff->size * 3 + 1) >> 1)
return BadLength;
if (stuff->size != crtc->gammaSize)
return BadMatch;
red = (CARD16 *) (stuff + 1);
green = red + crtc->gammaSize;
blue = green + crtc->gammaSize;
RRCrtcGammaSet (crtc, red, green, blue);
return Success;
}
nx-X11/programs/Xserver/randr/rrdispatch.c
0 → 100644
View file @
15cee47a
/*
* Copyright © 2006 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
#include "randrstr.h"
#define SERVER_RANDR_MAJOR 1
#define SERVER_RANDR_MINOR 2
Bool
RRClientKnowsRates
(
ClientPtr
pClient
)
{
rrClientPriv
(
pClient
);
return
(
pRRClient
->
major_version
>
1
||
(
pRRClient
->
major_version
==
1
&&
pRRClient
->
minor_version
>=
1
));
}
static
int
ProcRRQueryVersion
(
ClientPtr
client
)
{
xRRQueryVersionReply
rep
;
register
int
n
;
REQUEST
(
xRRQueryVersionReq
);
rrClientPriv
(
client
);
REQUEST_SIZE_MATCH
(
xRRQueryVersionReq
);
pRRClient
->
major_version
=
stuff
->
majorVersion
;
pRRClient
->
minor_version
=
stuff
->
minorVersion
;
rep
.
type
=
X_Reply
;
rep
.
length
=
0
;
rep
.
sequenceNumber
=
client
->
sequence
;
/*
* Report the current version; the current
* spec says they're all compatible after 1.0
*/
rep
.
majorVersion
=
SERVER_RANDR_MAJOR
;
rep
.
minorVersion
=
SERVER_RANDR_MINOR
;
if
(
client
->
swapped
)
{
swaps
(
&
rep
.
sequenceNumber
,
n
);
swapl
(
&
rep
.
length
,
n
);
swapl
(
&
rep
.
majorVersion
,
n
);
swapl
(
&
rep
.
minorVersion
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xRRQueryVersionReply
),
(
char
*
)
&
rep
);
return
(
client
->
noClientException
);
}
static
int
ProcRRSelectInput
(
ClientPtr
client
)
{
REQUEST
(
xRRSelectInputReq
);
rrClientPriv
(
client
);
RRTimesPtr
pTimes
;
WindowPtr
pWin
;
RREventPtr
pRREvent
,
*
pHead
;
XID
clientResource
;
int
rc
;
REQUEST_SIZE_MATCH
(
xRRSelectInputReq
);
#ifndef NXAGENT_SERVER
rc
=
dixLookupWindow
(
&
pWin
,
stuff
->
window
,
client
,
DixWriteAccess
);
#else
pWin
=
SecurityLookupWindow
(
stuff
->
window
,
client
,
SecurityWriteAccess
);
rc
=
pWin
?
Success
:
BadWindow
;
#endif
if
(
rc
!=
Success
)
return
rc
;
pHead
=
(
RREventPtr
*
)
SecurityLookupIDByType
(
client
,
pWin
->
drawable
.
id
,
RREventType
,
DixWriteAccess
);
if
(
stuff
->
enable
&
(
RRScreenChangeNotifyMask
|
RRCrtcChangeNotifyMask
|
RROutputChangeNotifyMask
))
{
ScreenPtr
pScreen
=
pWin
->
drawable
.
pScreen
;
rrScrPriv
(
pScreen
);
pRREvent
=
NULL
;
if
(
pHead
)
{
/* check for existing entry. */
for
(
pRREvent
=
*
pHead
;
pRREvent
;
pRREvent
=
pRREvent
->
next
)
if
(
pRREvent
->
client
==
client
)
break
;
}
if
(
!
pRREvent
)
{
/* build the entry */
pRREvent
=
(
RREventPtr
)
xalloc
(
sizeof
(
RREventRec
));
if
(
!
pRREvent
)
return
BadAlloc
;
pRREvent
->
next
=
0
;
pRREvent
->
client
=
client
;
pRREvent
->
window
=
pWin
;
pRREvent
->
mask
=
stuff
->
enable
;
/*
* add a resource that will be deleted when
* the client goes away
*/
clientResource
=
FakeClientID
(
client
->
index
);
pRREvent
->
clientResource
=
clientResource
;
if
(
!
AddResource
(
clientResource
,
RRClientType
,
(
pointer
)
pRREvent
))
return
BadAlloc
;
/*
* create a resource to contain a pointer to the list
* of clients selecting input. This must be indirect as
* the list may be arbitrarily rearranged which cannot be
* done through the resource database.
*/
if
(
!
pHead
)
{
pHead
=
(
RREventPtr
*
)
xalloc
(
sizeof
(
RREventPtr
));
if
(
!
pHead
||
!
AddResource
(
pWin
->
drawable
.
id
,
RREventType
,
(
pointer
)
pHead
))
{
FreeResource
(
clientResource
,
RT_NONE
);
return
BadAlloc
;
}
*
pHead
=
0
;
}
pRREvent
->
next
=
*
pHead
;
*
pHead
=
pRREvent
;
}
/*
* Now see if the client needs an event
*/
if
(
pScrPriv
&&
(
pRREvent
->
mask
&
RRScreenChangeNotifyMask
))
{
pTimes
=
&
((
RRTimesPtr
)
(
pRRClient
+
1
))[
pScreen
->
myNum
];
if
(
CompareTimeStamps
(
pTimes
->
setTime
,
pScrPriv
->
lastSetTime
)
!=
0
||
CompareTimeStamps
(
pTimes
->
configTime
,
pScrPriv
->
lastConfigTime
)
!=
0
)
{
RRDeliverScreenEvent
(
client
,
pWin
,
pScreen
);
}
}
}
else
if
(
stuff
->
enable
==
0
)
{
/* delete the interest */
if
(
pHead
)
{
RREventPtr
pNewRREvent
=
0
;
for
(
pRREvent
=
*
pHead
;
pRREvent
;
pRREvent
=
pRREvent
->
next
)
{
if
(
pRREvent
->
client
==
client
)
break
;
pNewRREvent
=
pRREvent
;
}
if
(
pRREvent
)
{
FreeResource
(
pRREvent
->
clientResource
,
RRClientType
);
if
(
pNewRREvent
)
pNewRREvent
->
next
=
pRREvent
->
next
;
else
*
pHead
=
pRREvent
->
next
;
xfree
(
pRREvent
);
}
}
}
else
{
client
->
errorValue
=
stuff
->
enable
;
return
BadValue
;
}
return
Success
;
}
int
(
*
ProcRandrVector
[
RRNumberRequests
])(
ClientPtr
)
=
{
ProcRRQueryVersion
,
/* 0 */
/* we skip 1 to make old clients fail pretty immediately */
NULL
,
/* 1 ProcRandrOldGetScreenInfo */
/* V1.0 apps share the same set screen config request id */
ProcRRSetScreenConfig
,
/* 2 */
NULL
,
/* 3 ProcRandrOldScreenChangeSelectInput */
/* 3 used to be ScreenChangeSelectInput; deprecated */
ProcRRSelectInput
,
/* 4 */
ProcRRGetScreenInfo
,
/* 5 */
/* V1.2 additions */
ProcRRGetScreenSizeRange
,
/* 6 */
ProcRRSetScreenSize
,
/* 7 */
ProcRRGetScreenResources
,
/* 8 */
ProcRRGetOutputInfo
,
/* 9 */
ProcRRListOutputProperties
,
/* 10 */
ProcRRQueryOutputProperty
,
/* 11 */
ProcRRConfigureOutputProperty
,
/* 12 */
ProcRRChangeOutputProperty
,
/* 13 */
ProcRRDeleteOutputProperty
,
/* 14 */
ProcRRGetOutputProperty
,
/* 15 */
ProcRRCreateMode
,
/* 16 */
ProcRRDestroyMode
,
/* 17 */
ProcRRAddOutputMode
,
/* 18 */
ProcRRDeleteOutputMode
,
/* 19 */
ProcRRGetCrtcInfo
,
/* 20 */
ProcRRSetCrtcConfig
,
/* 21 */
ProcRRGetCrtcGammaSize
,
/* 22 */
ProcRRGetCrtcGamma
,
/* 23 */
ProcRRSetCrtcGamma
,
/* 24 */
};
nx-X11/programs/Xserver/randr/rrdispatch.c.X.original
0 → 100644
View file @
15cee47a
/*
* Copyright © 2006 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
#include "randrstr.h"
#define SERVER_RANDR_MAJOR 1
#define SERVER_RANDR_MINOR 2
Bool
RRClientKnowsRates (ClientPtr pClient)
{
rrClientPriv(pClient);
return (pRRClient->major_version > 1 ||
(pRRClient->major_version == 1 && pRRClient->minor_version >= 1));
}
static int
ProcRRQueryVersion (ClientPtr client)
{
xRRQueryVersionReply rep;
register int n;
REQUEST(xRRQueryVersionReq);
rrClientPriv(client);
REQUEST_SIZE_MATCH(xRRQueryVersionReq);
pRRClient->major_version = stuff->majorVersion;
pRRClient->minor_version = stuff->minorVersion;
rep.type = X_Reply;
rep.length = 0;
rep.sequenceNumber = client->sequence;
/*
* Report the current version; the current
* spec says they're all compatible after 1.0
*/
rep.majorVersion = SERVER_RANDR_MAJOR;
rep.minorVersion = SERVER_RANDR_MINOR;
if (client->swapped) {
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swapl(&rep.majorVersion, n);
swapl(&rep.minorVersion, n);
}
WriteToClient(client, sizeof(xRRQueryVersionReply), (char *)&rep);
return (client->noClientException);
}
static int
ProcRRSelectInput (ClientPtr client)
{
REQUEST(xRRSelectInputReq);
rrClientPriv(client);
RRTimesPtr pTimes;
WindowPtr pWin;
RREventPtr pRREvent, *pHead;
XID clientResource;
int rc;
REQUEST_SIZE_MATCH(xRRSelectInputReq);
rc = dixLookupWindow(&pWin, stuff->window, client, DixWriteAccess);
if (rc != Success)
return rc;
pHead = (RREventPtr *)SecurityLookupIDByType(client,
pWin->drawable.id, RREventType,
DixWriteAccess);
if (stuff->enable & (RRScreenChangeNotifyMask|
RRCrtcChangeNotifyMask|
RROutputChangeNotifyMask))
{
ScreenPtr pScreen = pWin->drawable.pScreen;
rrScrPriv (pScreen);
pRREvent = NULL;
if (pHead)
{
/* check for existing entry. */
for (pRREvent = *pHead; pRREvent; pRREvent = pRREvent->next)
if (pRREvent->client == client)
break;
}
if (!pRREvent)
{
/* build the entry */
pRREvent = (RREventPtr) xalloc (sizeof (RREventRec));
if (!pRREvent)
return BadAlloc;
pRREvent->next = 0;
pRREvent->client = client;
pRREvent->window = pWin;
pRREvent->mask = stuff->enable;
/*
* add a resource that will be deleted when
* the client goes away
*/
clientResource = FakeClientID (client->index);
pRREvent->clientResource = clientResource;
if (!AddResource (clientResource, RRClientType, (pointer)pRREvent))
return BadAlloc;
/*
* create a resource to contain a pointer to the list
* of clients selecting input. This must be indirect as
* the list may be arbitrarily rearranged which cannot be
* done through the resource database.
*/
if (!pHead)
{
pHead = (RREventPtr *) xalloc (sizeof (RREventPtr));
if (!pHead ||
!AddResource (pWin->drawable.id, RREventType, (pointer)pHead))
{
FreeResource (clientResource, RT_NONE);
return BadAlloc;
}
*pHead = 0;
}
pRREvent->next = *pHead;
*pHead = pRREvent;
}
/*
* Now see if the client needs an event
*/
if (pScrPriv && (pRREvent->mask & RRScreenChangeNotifyMask))
{
pTimes = &((RRTimesPtr) (pRRClient + 1))[pScreen->myNum];
if (CompareTimeStamps (pTimes->setTime,
pScrPriv->lastSetTime) != 0 ||
CompareTimeStamps (pTimes->configTime,
pScrPriv->lastConfigTime) != 0)
{
RRDeliverScreenEvent (client, pWin, pScreen);
}
}
}
else if (stuff->enable == 0)
{
/* delete the interest */
if (pHead) {
RREventPtr pNewRREvent = 0;
for (pRREvent = *pHead; pRREvent; pRREvent = pRREvent->next) {
if (pRREvent->client == client)
break;
pNewRREvent = pRREvent;
}
if (pRREvent) {
FreeResource (pRREvent->clientResource, RRClientType);
if (pNewRREvent)
pNewRREvent->next = pRREvent->next;
else
*pHead = pRREvent->next;
xfree (pRREvent);
}
}
}
else
{
client->errorValue = stuff->enable;
return BadValue;
}
return Success;
}
int (*ProcRandrVector[RRNumberRequests])(ClientPtr) = {
ProcRRQueryVersion, /* 0 */
/* we skip 1 to make old clients fail pretty immediately */
NULL, /* 1 ProcRandrOldGetScreenInfo */
/* V1.0 apps share the same set screen config request id */
ProcRRSetScreenConfig, /* 2 */
NULL, /* 3 ProcRandrOldScreenChangeSelectInput */
/* 3 used to be ScreenChangeSelectInput; deprecated */
ProcRRSelectInput, /* 4 */
ProcRRGetScreenInfo, /* 5 */
/* V1.2 additions */
ProcRRGetScreenSizeRange, /* 6 */
ProcRRSetScreenSize, /* 7 */
ProcRRGetScreenResources, /* 8 */
ProcRRGetOutputInfo, /* 9 */
ProcRRListOutputProperties, /* 10 */
ProcRRQueryOutputProperty, /* 11 */
ProcRRConfigureOutputProperty, /* 12 */
ProcRRChangeOutputProperty, /* 13 */
ProcRRDeleteOutputProperty, /* 14 */
ProcRRGetOutputProperty, /* 15 */
ProcRRCreateMode, /* 16 */
ProcRRDestroyMode, /* 17 */
ProcRRAddOutputMode, /* 18 */
ProcRRDeleteOutputMode, /* 19 */
ProcRRGetCrtcInfo, /* 20 */
ProcRRSetCrtcConfig, /* 21 */
ProcRRGetCrtcGammaSize, /* 22 */
ProcRRGetCrtcGamma, /* 23 */
ProcRRSetCrtcGamma, /* 24 */
};
nx-X11/programs/Xserver/randr/rrinfo.c
0 → 100644
View file @
15cee47a
/*
* Copyright © 2006 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
#include "randrstr.h"
#ifdef RANDR_10_INTERFACE
static
RRModePtr
RROldModeAdd
(
RROutputPtr
output
,
RRScreenSizePtr
size
,
int
refresh
)
{
ScreenPtr
pScreen
=
output
->
pScreen
;
rrScrPriv
(
pScreen
);
xRRModeInfo
modeInfo
;
char
name
[
100
];
RRModePtr
mode
;
int
i
;
RRModePtr
*
modes
;
memset
(
&
modeInfo
,
'\0'
,
sizeof
(
modeInfo
));
sprintf
(
name
,
"%dx%d"
,
size
->
width
,
size
->
height
);
modeInfo
.
width
=
size
->
width
;
modeInfo
.
height
=
size
->
height
;
modeInfo
.
hTotal
=
size
->
width
;
modeInfo
.
vTotal
=
size
->
height
;
modeInfo
.
dotClock
=
((
CARD32
)
size
->
width
*
(
CARD32
)
size
->
height
*
(
CARD32
)
refresh
);
modeInfo
.
nameLength
=
strlen
(
name
);
mode
=
RRModeGet
(
&
modeInfo
,
name
);
if
(
!
mode
)
return
NULL
;
for
(
i
=
0
;
i
<
output
->
numModes
;
i
++
)
if
(
output
->
modes
[
i
]
==
mode
)
{
RRModeDestroy
(
mode
);
return
mode
;
}
if
(
output
->
numModes
)
modes
=
xrealloc
(
output
->
modes
,
(
output
->
numModes
+
1
)
*
sizeof
(
RRModePtr
));
else
modes
=
xalloc
(
sizeof
(
RRModePtr
));
if
(
!
modes
)
{
RRModeDestroy
(
mode
);
FreeResource
(
mode
->
mode
.
id
,
0
);
return
NULL
;
}
modes
[
output
->
numModes
++
]
=
mode
;
output
->
modes
=
modes
;
output
->
changed
=
TRUE
;
pScrPriv
->
changed
=
TRUE
;
pScrPriv
->
configChanged
=
TRUE
;
return
mode
;
}
static
void
RRScanOldConfig
(
ScreenPtr
pScreen
,
Rotation
rotations
)
{
rrScrPriv
(
pScreen
);
RROutputPtr
output
;
RRCrtcPtr
crtc
;
RRModePtr
mode
,
newMode
=
NULL
;
int
i
;
CARD16
minWidth
=
MAXSHORT
,
minHeight
=
MAXSHORT
;
CARD16
maxWidth
=
0
,
maxHeight
=
0
;
/*
* First time through, create a crtc and output and hook
* them together
*/
if
(
pScrPriv
->
numOutputs
==
0
&&
pScrPriv
->
numCrtcs
==
0
)
{
crtc
=
RRCrtcCreate
(
pScreen
,
NULL
);
if
(
!
crtc
)
return
;
output
=
RROutputCreate
(
pScreen
,
"default"
,
7
,
NULL
);
if
(
!
output
)
return
;
RROutputSetCrtcs
(
output
,
&
crtc
,
1
);
RROutputSetConnection
(
output
,
RR_Connected
);
#ifdef RENDER
RROutputSetSubpixelOrder
(
output
,
PictureGetSubpixelOrder
(
pScreen
));
#endif
}
output
=
pScrPriv
->
outputs
[
0
];
if
(
!
output
)
return
;
crtc
=
pScrPriv
->
crtcs
[
0
];
if
(
!
crtc
)
return
;
/* check rotations */
if
(
rotations
!=
crtc
->
rotations
)
{
crtc
->
rotations
=
rotations
;
crtc
->
changed
=
TRUE
;
pScrPriv
->
changed
=
TRUE
;
}
/* regenerate mode list */
for
(
i
=
0
;
i
<
pScrPriv
->
nSizes
;
i
++
)
{
RRScreenSizePtr
size
=
&
pScrPriv
->
pSizes
[
i
];
int
r
;
if
(
size
->
nRates
)
{
for
(
r
=
0
;
r
<
size
->
nRates
;
r
++
)
{
mode
=
RROldModeAdd
(
output
,
size
,
size
->
pRates
[
r
].
rate
);
if
(
i
==
pScrPriv
->
size
&&
size
->
pRates
[
r
].
rate
==
pScrPriv
->
rate
)
{
newMode
=
mode
;
}
}
xfree
(
size
->
pRates
);
}
else
{
mode
=
RROldModeAdd
(
output
,
size
,
0
);
if
(
i
==
pScrPriv
->
size
)
newMode
=
mode
;
}
}
if
(
pScrPriv
->
nSizes
)
xfree
(
pScrPriv
->
pSizes
);
pScrPriv
->
pSizes
=
NULL
;
pScrPriv
->
nSizes
=
0
;
/* find size bounds */
for
(
i
=
0
;
i
<
output
->
numModes
+
output
->
numUserModes
;
i
++
)
{
RRModePtr
mode
=
(
i
<
output
->
numModes
?
output
->
modes
[
i
]
:
output
->
userModes
[
i
-
output
->
numModes
]);
CARD16
width
=
mode
->
mode
.
width
;
CARD16
height
=
mode
->
mode
.
height
;
if
(
width
<
minWidth
)
minWidth
=
width
;
if
(
width
>
maxWidth
)
maxWidth
=
width
;
if
(
height
<
minHeight
)
minHeight
=
height
;
if
(
height
>
maxHeight
)
maxHeight
=
height
;
}
RRScreenSetSizeRange
(
pScreen
,
minWidth
,
minHeight
,
maxWidth
,
maxHeight
);
/* notice current mode */
if
(
newMode
)
RRCrtcNotify
(
crtc
,
newMode
,
0
,
0
,
pScrPriv
->
rotation
,
1
,
&
output
);
}
#endif
/*
* Poll the driver for changed information
*/
Bool
RRGetInfo
(
ScreenPtr
pScreen
)
{
rrScrPriv
(
pScreen
);
Rotation
rotations
;
int
i
;
for
(
i
=
0
;
i
<
pScrPriv
->
numOutputs
;
i
++
)
pScrPriv
->
outputs
[
i
]
->
changed
=
FALSE
;
for
(
i
=
0
;
i
<
pScrPriv
->
numCrtcs
;
i
++
)
pScrPriv
->
crtcs
[
i
]
->
changed
=
FALSE
;
rotations
=
0
;
pScrPriv
->
changed
=
FALSE
;
pScrPriv
->
configChanged
=
FALSE
;
if
(
!
(
*
pScrPriv
->
rrGetInfo
)
(
pScreen
,
&
rotations
))
return
FALSE
;
#if RANDR_10_INTERFACE
if
(
pScrPriv
->
nSizes
)
RRScanOldConfig
(
pScreen
,
rotations
);
#endif
RRTellChanged
(
pScreen
);
return
TRUE
;
}
/*
* Register the range of sizes for the screen
*/
void
RRScreenSetSizeRange
(
ScreenPtr
pScreen
,
CARD16
minWidth
,
CARD16
minHeight
,
CARD16
maxWidth
,
CARD16
maxHeight
)
{
rrScrPriv
(
pScreen
);
if
(
!
pScrPriv
)
return
;
if
(
pScrPriv
->
minWidth
==
minWidth
&&
pScrPriv
->
minHeight
==
minHeight
&&
pScrPriv
->
maxWidth
==
maxWidth
&&
pScrPriv
->
maxHeight
==
maxHeight
)
{
return
;
}
pScrPriv
->
minWidth
=
minWidth
;
pScrPriv
->
minHeight
=
minHeight
;
pScrPriv
->
maxWidth
=
maxWidth
;
pScrPriv
->
maxHeight
=
maxHeight
;
pScrPriv
->
changed
=
TRUE
;
pScrPriv
->
configChanged
=
TRUE
;
}
#ifdef RANDR_10_INTERFACE
static
Bool
RRScreenSizeMatches
(
RRScreenSizePtr
a
,
RRScreenSizePtr
b
)
{
if
(
a
->
width
!=
b
->
width
)
return
FALSE
;
if
(
a
->
height
!=
b
->
height
)
return
FALSE
;
if
(
a
->
mmWidth
!=
b
->
mmWidth
)
return
FALSE
;
if
(
a
->
mmHeight
!=
b
->
mmHeight
)
return
FALSE
;
return
TRUE
;
}
RRScreenSizePtr
RRRegisterSize
(
ScreenPtr
pScreen
,
short
width
,
short
height
,
short
mmWidth
,
short
mmHeight
)
{
rrScrPriv
(
pScreen
);
int
i
;
RRScreenSize
tmp
;
RRScreenSizePtr
pNew
;
if
(
!
pScrPriv
)
return
0
;
tmp
.
id
=
0
;
tmp
.
width
=
width
;
tmp
.
height
=
height
;
tmp
.
mmWidth
=
mmWidth
;
tmp
.
mmHeight
=
mmHeight
;
tmp
.
pRates
=
0
;
tmp
.
nRates
=
0
;
for
(
i
=
0
;
i
<
pScrPriv
->
nSizes
;
i
++
)
if
(
RRScreenSizeMatches
(
&
tmp
,
&
pScrPriv
->
pSizes
[
i
]))
return
&
pScrPriv
->
pSizes
[
i
];
pNew
=
xrealloc
(
pScrPriv
->
pSizes
,
(
pScrPriv
->
nSizes
+
1
)
*
sizeof
(
RRScreenSize
));
if
(
!
pNew
)
return
0
;
pNew
[
pScrPriv
->
nSizes
++
]
=
tmp
;
pScrPriv
->
pSizes
=
pNew
;
return
&
pNew
[
pScrPriv
->
nSizes
-
1
];
}
Bool
RRRegisterRate
(
ScreenPtr
pScreen
,
RRScreenSizePtr
pSize
,
int
rate
)
{
rrScrPriv
(
pScreen
);
int
i
;
RRScreenRatePtr
pNew
,
pRate
;
if
(
!
pScrPriv
)
return
FALSE
;
for
(
i
=
0
;
i
<
pSize
->
nRates
;
i
++
)
if
(
pSize
->
pRates
[
i
].
rate
==
rate
)
return
TRUE
;
pNew
=
xrealloc
(
pSize
->
pRates
,
(
pSize
->
nRates
+
1
)
*
sizeof
(
RRScreenRate
));
if
(
!
pNew
)
return
FALSE
;
pRate
=
&
pNew
[
pSize
->
nRates
++
];
pRate
->
rate
=
rate
;
pSize
->
pRates
=
pNew
;
return
TRUE
;
}
Rotation
RRGetRotation
(
ScreenPtr
pScreen
)
{
RROutputPtr
output
=
RRFirstOutput
(
pScreen
);
if
(
!
output
)
return
RR_Rotate_0
;
return
output
->
crtc
->
rotation
;
}
void
RRSetCurrentConfig
(
ScreenPtr
pScreen
,
Rotation
rotation
,
int
rate
,
RRScreenSizePtr
pSize
)
{
rrScrPriv
(
pScreen
);
if
(
!
pScrPriv
)
return
;
pScrPriv
->
size
=
pSize
-
pScrPriv
->
pSizes
;
pScrPriv
->
rotation
=
rotation
;
pScrPriv
->
rate
=
rate
;
}
#endif
nx-X11/programs/Xserver/randr/rrmode.c
0 → 100644
View file @
15cee47a
/*
* Copyright © 2006 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
/**************************************************************************/
/* */
/* Copyright (c) 2001, 2011 NoMachine, http://www.nomachine.com/. */
/* */
/* NX-X11, NX protocol compression and NX extensions to this software */
/* are copyright of NoMachine. Redistribution and use of the present */
/* software is allowed according to terms specified in the file LICENSE */
/* which comes in the source distribution. */
/* */
/* Check http://www.nomachine.com/licensing.html for applicability. */
/* */
/* NX and NoMachine are trademarks of Medialogic S.p.A. */
/* */
/* All rights reserved. */
/* */
/**************************************************************************/
#include "randrstr.h"
#include "registry.h"
RESTYPE
RRModeType
;
static
Bool
RRModeEqual
(
xRRModeInfo
*
a
,
xRRModeInfo
*
b
)
{
if
(
a
->
width
!=
b
->
width
)
return
FALSE
;
if
(
a
->
height
!=
b
->
height
)
return
FALSE
;
if
(
a
->
dotClock
!=
b
->
dotClock
)
return
FALSE
;
if
(
a
->
hSyncStart
!=
b
->
hSyncStart
)
return
FALSE
;
if
(
a
->
hSyncEnd
!=
b
->
hSyncEnd
)
return
FALSE
;
if
(
a
->
hTotal
!=
b
->
hTotal
)
return
FALSE
;
if
(
a
->
hSkew
!=
b
->
hSkew
)
return
FALSE
;
if
(
a
->
vSyncStart
!=
b
->
vSyncStart
)
return
FALSE
;
if
(
a
->
vSyncEnd
!=
b
->
vSyncEnd
)
return
FALSE
;
if
(
a
->
vTotal
!=
b
->
vTotal
)
return
FALSE
;
if
(
a
->
nameLength
!=
b
->
nameLength
)
return
FALSE
;
if
(
a
->
modeFlags
!=
b
->
modeFlags
)
return
FALSE
;
return
TRUE
;
}
/*
* Keep a list so it's easy to find modes in the resource database.
*/
static
int
num_modes
;
static
RRModePtr
*
modes
;
static
RRModePtr
RRModeCreate
(
xRRModeInfo
*
modeInfo
,
const
char
*
name
,
ScreenPtr
userScreen
)
{
RRModePtr
mode
,
*
newModes
;
if
(
!
RRInit
())
return
NULL
;
mode
=
xalloc
(
sizeof
(
RRModeRec
)
+
modeInfo
->
nameLength
+
1
);
if
(
!
mode
)
return
NULL
;
mode
->
refcnt
=
1
;
mode
->
mode
=
*
modeInfo
;
mode
->
name
=
(
char
*
)
(
mode
+
1
);
memcpy
(
mode
->
name
,
name
,
modeInfo
->
nameLength
);
mode
->
name
[
modeInfo
->
nameLength
]
=
'\0'
;
mode
->
userScreen
=
userScreen
;
if
(
num_modes
)
newModes
=
xrealloc
(
modes
,
(
num_modes
+
1
)
*
sizeof
(
RRModePtr
));
else
newModes
=
xalloc
(
sizeof
(
RRModePtr
));
if
(
!
newModes
)
{
xfree
(
mode
);
return
NULL
;
}
mode
->
mode
.
id
=
FakeClientID
(
0
);
if
(
!
AddResource
(
mode
->
mode
.
id
,
RRModeType
,
(
pointer
)
mode
))
return
NULL
;
modes
=
newModes
;
modes
[
num_modes
++
]
=
mode
;
/*
* give the caller a reference to this mode
*/
++
mode
->
refcnt
;
return
mode
;
}
static
RRModePtr
RRModeFindByName
(
const
char
*
name
,
CARD16
nameLength
)
{
int
i
;
RRModePtr
mode
;
for
(
i
=
0
;
i
<
num_modes
;
i
++
)
{
mode
=
modes
[
i
];
if
(
mode
->
mode
.
nameLength
==
nameLength
&&
!
memcmp
(
name
,
mode
->
name
,
nameLength
))
{
return
mode
;
}
}
return
NULL
;
}
RRModePtr
RRModeGet
(
xRRModeInfo
*
modeInfo
,
const
char
*
name
)
{
int
i
;
for
(
i
=
0
;
i
<
num_modes
;
i
++
)
{
RRModePtr
mode
=
modes
[
i
];
if
(
RRModeEqual
(
&
mode
->
mode
,
modeInfo
)
&&
!
memcmp
(
name
,
mode
->
name
,
modeInfo
->
nameLength
))
{
++
mode
->
refcnt
;
return
mode
;
}
}
return
RRModeCreate
(
modeInfo
,
name
,
NULL
);
}
static
RRModePtr
RRModeCreateUser
(
ScreenPtr
pScreen
,
xRRModeInfo
*
modeInfo
,
const
char
*
name
,
int
*
error
)
{
RRModePtr
mode
;
mode
=
RRModeFindByName
(
name
,
modeInfo
->
nameLength
);
if
(
mode
)
{
*
error
=
BadName
;
return
NULL
;
}
mode
=
RRModeCreate
(
modeInfo
,
name
,
pScreen
);
if
(
!
mode
)
{
*
error
=
BadAlloc
;
return
NULL
;
}
*
error
=
Success
;
return
mode
;
}
RRModePtr
*
RRModesForScreen
(
ScreenPtr
pScreen
,
int
*
num_ret
)
{
rrScrPriv
(
pScreen
);
int
o
,
c
,
m
;
RRModePtr
*
screen_modes
;
int
num_screen_modes
=
0
;
screen_modes
=
xalloc
((
num_modes
?
num_modes
:
1
)
*
sizeof
(
RRModePtr
));
if
(
!
screen_modes
)
return
NULL
;
/*
* Add modes from all outputs
*/
for
(
o
=
0
;
o
<
pScrPriv
->
numOutputs
;
o
++
)
{
RROutputPtr
output
=
pScrPriv
->
outputs
[
o
];
int
m
,
n
;
for
(
m
=
0
;
m
<
output
->
numModes
+
output
->
numUserModes
;
m
++
)
{
RRModePtr
mode
=
(
m
<
output
->
numModes
?
output
->
modes
[
m
]
:
output
->
userModes
[
m
-
output
->
numModes
]);
for
(
n
=
0
;
n
<
num_screen_modes
;
n
++
)
if
(
screen_modes
[
n
]
==
mode
)
break
;
if
(
n
==
num_screen_modes
)
screen_modes
[
num_screen_modes
++
]
=
mode
;
}
}
/*
* Add modes from all crtcs. The goal is to
* make sure all available and active modes
* are visible to the client
*/
for
(
c
=
0
;
c
<
pScrPriv
->
numCrtcs
;
c
++
)
{
RRCrtcPtr
crtc
=
pScrPriv
->
crtcs
[
c
];
RRModePtr
mode
=
crtc
->
mode
;
int
n
;
if
(
!
mode
)
continue
;
for
(
n
=
0
;
n
<
num_screen_modes
;
n
++
)
if
(
screen_modes
[
n
]
==
mode
)
break
;
if
(
n
==
num_screen_modes
)
screen_modes
[
num_screen_modes
++
]
=
mode
;
}
/*
* Add all user modes for this screen
*/
for
(
m
=
0
;
m
<
num_modes
;
m
++
)
{
RRModePtr
mode
=
modes
[
m
];
int
n
;
if
(
mode
->
userScreen
!=
pScreen
)
continue
;
for
(
n
=
0
;
n
<
num_screen_modes
;
n
++
)
if
(
screen_modes
[
n
]
==
mode
)
break
;
if
(
n
==
num_screen_modes
)
screen_modes
[
num_screen_modes
++
]
=
mode
;
}
*
num_ret
=
num_screen_modes
;
return
screen_modes
;
}
void
RRModeDestroy
(
RRModePtr
mode
)
{
int
m
;
if
(
--
mode
->
refcnt
>
0
)
return
;
for
(
m
=
0
;
m
<
num_modes
;
m
++
)
{
if
(
modes
[
m
]
==
mode
)
{
memmove
(
modes
+
m
,
modes
+
m
+
1
,
(
num_modes
-
m
-
1
)
*
sizeof
(
RRModePtr
));
num_modes
--
;
if
(
!
num_modes
)
{
xfree
(
modes
);
modes
=
NULL
;
}
break
;
}
}
xfree
(
mode
);
}
static
int
RRModeDestroyResource
(
pointer
value
,
XID
pid
)
{
RRModeDestroy
((
RRModePtr
)
value
);
return
1
;
}
Bool
RRModeInit
(
void
)
{
assert
(
num_modes
==
0
);
assert
(
modes
==
NULL
);
RRModeType
=
CreateNewResourceType
(
RRModeDestroyResource
);
if
(
!
RRModeType
)
return
FALSE
;
RegisterResourceName
(
RRModeType
,
"MODE"
);
return
TRUE
;
}
int
ProcRRCreateMode
(
ClientPtr
client
)
{
REQUEST
(
xRRCreateModeReq
);
xRRCreateModeReply
rep
;
WindowPtr
pWin
;
ScreenPtr
pScreen
;
rrScrPrivPtr
pScrPriv
;
xRRModeInfo
*
modeInfo
;
long
units_after
;
char
*
name
;
int
error
,
rc
;
RRModePtr
mode
;
REQUEST_AT_LEAST_SIZE
(
xRRCreateModeReq
);
#ifndef NXAGENT_SERVER
rc
=
dixLookupWindow
(
&
pWin
,
stuff
->
window
,
client
,
DixReadAccess
);
#else
pWin
=
SecurityLookupWindow
(
stuff
->
window
,
client
,
SecurityReadAccess
);
rc
=
pWin
?
Success
:
BadWindow
;
#endif
if
(
rc
!=
Success
)
return
rc
;
pScreen
=
pWin
->
drawable
.
pScreen
;
pScrPriv
=
rrGetScrPriv
(
pScreen
);
modeInfo
=
&
stuff
->
modeInfo
;
name
=
(
char
*
)
(
stuff
+
1
);
units_after
=
(
stuff
->
length
-
(
sizeof
(
xRRCreateModeReq
)
>>
2
));
/* check to make sure requested name fits within the data provided */
if
((
int
)
(
modeInfo
->
nameLength
+
3
)
>>
2
>
units_after
)
return
BadLength
;
mode
=
RRModeCreateUser
(
pScreen
,
modeInfo
,
name
,
&
error
);
if
(
!
mode
)
return
error
;
rep
.
type
=
X_Reply
;
rep
.
pad0
=
0
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
length
=
0
;
rep
.
mode
=
mode
->
mode
.
id
;
if
(
client
->
swapped
)
{
int
n
;
swaps
(
&
rep
.
sequenceNumber
,
n
);
swapl
(
&
rep
.
length
,
n
);
swapl
(
&
rep
.
mode
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xRRCreateModeReply
),
(
char
*
)
&
rep
);
return
client
->
noClientException
;
}
int
ProcRRDestroyMode
(
ClientPtr
client
)
{
REQUEST
(
xRRDestroyModeReq
);
RRModePtr
mode
;
REQUEST_SIZE_MATCH
(
xRRDestroyModeReq
);
mode
=
LookupIDByType
(
stuff
->
mode
,
RRModeType
);
if
(
!
mode
)
{
client
->
errorValue
=
stuff
->
mode
;
return
RRErrorBase
+
BadRRMode
;
}
if
(
!
mode
->
userScreen
)
return
BadMatch
;
if
(
mode
->
refcnt
>
1
)
return
BadAccess
;
FreeResource
(
stuff
->
mode
,
0
);
return
Success
;
}
int
ProcRRAddOutputMode
(
ClientPtr
client
)
{
REQUEST
(
xRRAddOutputModeReq
);
RRModePtr
mode
;
RROutputPtr
output
;
REQUEST_SIZE_MATCH
(
xRRAddOutputModeReq
);
output
=
LookupOutput
(
client
,
stuff
->
output
,
DixReadAccess
);
if
(
!
output
)
{
client
->
errorValue
=
stuff
->
output
;
return
RRErrorBase
+
BadRROutput
;
}
mode
=
LookupIDByType
(
stuff
->
mode
,
RRModeType
);
if
(
!
mode
)
{
client
->
errorValue
=
stuff
->
mode
;
return
RRErrorBase
+
BadRRMode
;
}
return
RROutputAddUserMode
(
output
,
mode
);
}
int
ProcRRDeleteOutputMode
(
ClientPtr
client
)
{
REQUEST
(
xRRDeleteOutputModeReq
);
RRModePtr
mode
;
RROutputPtr
output
;
REQUEST_SIZE_MATCH
(
xRRDeleteOutputModeReq
);
output
=
LookupOutput
(
client
,
stuff
->
output
,
DixReadAccess
);
if
(
!
output
)
{
client
->
errorValue
=
stuff
->
output
;
return
RRErrorBase
+
BadRROutput
;
}
mode
=
LookupIDByType
(
stuff
->
mode
,
RRModeType
);
if
(
!
mode
)
{
client
->
errorValue
=
stuff
->
mode
;
return
RRErrorBase
+
BadRRMode
;
}
return
RROutputDeleteUserMode
(
output
,
mode
);
}
nx-X11/programs/Xserver/randr/rrmode.c.NX.original
0 → 100644
View file @
15cee47a
/*
* Copyright © 2006 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
/**************************************************************************/
/* */
/* Copyright (c) 2001, 2011 NoMachine, http://www.nomachine.com/. */
/* */
/* NX-X11, NX protocol compression and NX extensions to this software */
/* are copyright of NoMachine. Redistribution and use of the present */
/* software is allowed according to terms specified in the file LICENSE */
/* which comes in the source distribution. */
/* */
/* Check http://www.nomachine.com/licensing.html for applicability. */
/* */
/* NX and NoMachine are trademarks of Medialogic S.p.A. */
/* */
/* All rights reserved. */
/* */
/**************************************************************************/
#include "randrstr.h"
#include "registry.h"
RESTYPE RRModeType;
static Bool
RRModeEqual (xRRModeInfo *a, xRRModeInfo *b)
{
if (a->width != b->width) return FALSE;
if (a->height != b->height) return FALSE;
if (a->dotClock != b->dotClock) return FALSE;
if (a->hSyncStart != b->hSyncStart) return FALSE;
if (a->hSyncEnd != b->hSyncEnd) return FALSE;
if (a->hTotal != b->hTotal) return FALSE;
if (a->hSkew != b->hSkew) return FALSE;
if (a->vSyncStart != b->vSyncStart) return FALSE;
if (a->vSyncEnd != b->vSyncEnd) return FALSE;
if (a->vTotal != b->vTotal) return FALSE;
if (a->nameLength != b->nameLength) return FALSE;
if (a->modeFlags != b->modeFlags) return FALSE;
return TRUE;
}
/*
* Keep a list so it's easy to find modes in the resource database.
*/
static int num_modes;
static RRModePtr *modes;
static RRModePtr
RRModeCreate (xRRModeInfo *modeInfo,
const char *name,
ScreenPtr userScreen)
{
RRModePtr mode, *newModes;
if (!RRInit ())
return NULL;
mode = xalloc (sizeof (RRModeRec) + modeInfo->nameLength + 1);
if (!mode)
return NULL;
mode->refcnt = 1;
mode->mode = *modeInfo;
mode->name = (char *) (mode + 1);
memcpy (mode->name, name, modeInfo->nameLength);
mode->name[modeInfo->nameLength] = '\0';
mode->userScreen = userScreen;
if (num_modes)
newModes = xrealloc (modes, (num_modes + 1) * sizeof (RRModePtr));
else
newModes = xalloc (sizeof (RRModePtr));
if (!newModes)
{
xfree (mode);
return NULL;
}
mode->mode.id = FakeClientID(0);
if (!AddResource (mode->mode.id, RRModeType, (pointer) mode))
return NULL;
modes = newModes;
modes[num_modes++] = mode;
/*
* give the caller a reference to this mode
*/
++mode->refcnt;
return mode;
}
static RRModePtr
RRModeFindByName (const char *name,
CARD16 nameLength)
{
int i;
RRModePtr mode;
for (i = 0; i < num_modes; i++)
{
mode = modes[i];
if (mode->mode.nameLength == nameLength &&
!memcmp (name, mode->name, nameLength))
{
return mode;
}
}
return NULL;
}
RRModePtr
RRModeGet (xRRModeInfo *modeInfo,
const char *name)
{
int i;
for (i = 0; i < num_modes; i++)
{
RRModePtr mode = modes[i];
if (RRModeEqual (&mode->mode, modeInfo) &&
!memcmp (name, mode->name, modeInfo->nameLength))
{
++mode->refcnt;
return mode;
}
}
return RRModeCreate (modeInfo, name, NULL);
}
static RRModePtr
RRModeCreateUser (ScreenPtr pScreen,
xRRModeInfo *modeInfo,
const char *name,
int *error)
{
RRModePtr mode;
mode = RRModeFindByName (name, modeInfo->nameLength);
if (mode)
{
*error = BadName;
return NULL;
}
mode = RRModeCreate (modeInfo, name, pScreen);
if (!mode)
{
*error = BadAlloc;
return NULL;
}
*error = Success;
return mode;
}
RRModePtr *
RRModesForScreen (ScreenPtr pScreen, int *num_ret)
{
rrScrPriv(pScreen);
int o, c, m;
RRModePtr *screen_modes;
int num_screen_modes = 0;
screen_modes = xalloc ((num_modes ? num_modes : 1) * sizeof (RRModePtr));
if (!screen_modes)
return NULL;
/*
* Add modes from all outputs
*/
for (o = 0; o < pScrPriv->numOutputs; o++)
{
RROutputPtr output = pScrPriv->outputs[o];
int m, n;
for (m = 0; m < output->numModes + output->numUserModes; m++)
{
RRModePtr mode = (m < output->numModes ?
output->modes[m] :
output->userModes[m-output->numModes]);
for (n = 0; n < num_screen_modes; n++)
if (screen_modes[n] == mode)
break;
if (n == num_screen_modes)
screen_modes[num_screen_modes++] = mode;
}
}
/*
* Add modes from all crtcs. The goal is to
* make sure all available and active modes
* are visible to the client
*/
for (c = 0; c < pScrPriv->numCrtcs; c++)
{
RRCrtcPtr crtc = pScrPriv->crtcs[c];
RRModePtr mode = crtc->mode;
int n;
if (!mode) continue;
for (n = 0; n < num_screen_modes; n++)
if (screen_modes[n] == mode)
break;
if (n == num_screen_modes)
screen_modes[num_screen_modes++] = mode;
}
/*
* Add all user modes for this screen
*/
for (m = 0; m < num_modes; m++)
{
RRModePtr mode = modes[m];
int n;
if (mode->userScreen != pScreen)
continue;
for (n = 0; n < num_screen_modes; n++)
if (screen_modes[n] == mode)
break;
if (n == num_screen_modes)
screen_modes[num_screen_modes++] = mode;
}
*num_ret = num_screen_modes;
return screen_modes;
}
void
RRModeDestroy (RRModePtr mode)
{
int m;
if (--mode->refcnt > 0)
return;
for (m = 0; m < num_modes; m++)
{
if (modes[m] == mode)
{
memmove (modes + m, modes + m + 1,
(num_modes - m - 1) * sizeof (RRModePtr));
num_modes--;
if (!num_modes)
{
xfree (modes);
modes = NULL;
}
break;
}
}
xfree (mode);
}
static int
RRModeDestroyResource (pointer value, XID pid)
{
RRModeDestroy ((RRModePtr) value);
return 1;
}
Bool
RRModeInit (void)
{
assert (num_modes == 0);
assert (modes == NULL);
RRModeType = CreateNewResourceType (RRModeDestroyResource);
if (!RRModeType)
return FALSE;
RegisterResourceName (RRModeType, "MODE");
return TRUE;
}
int
ProcRRCreateMode (ClientPtr client)
{
REQUEST(xRRCreateModeReq);
xRRCreateModeReply rep;
WindowPtr pWin;
ScreenPtr pScreen;
rrScrPrivPtr pScrPriv;
xRRModeInfo *modeInfo;
long units_after;
char *name;
int error, rc;
RRModePtr mode;
REQUEST_AT_LEAST_SIZE (xRRCreateModeReq);
#ifndef NXAGENT_SERVER
rc = dixLookupWindow(&pWin, stuff->window, client, DixReadAccess);
#else
pWin = SecurityLookupWindow(stuff->window, client, SecurityReadAccess);
rc = pWin ? Success : BadWindow;
#endif
if (rc != Success)
return rc;
pScreen = pWin->drawable.pScreen;
pScrPriv = rrGetScrPriv(pScreen);
modeInfo = &stuff->modeInfo;
name = (char *) (stuff + 1);
units_after = (stuff->length - (sizeof (xRRCreateModeReq) >> 2));
/* check to make sure requested name fits within the data provided */
if ((int) (modeInfo->nameLength + 3) >> 2 > units_after)
return BadLength;
mode = RRModeCreateUser (pScreen, modeInfo, name, &error);
if (!mode)
return error;
rep.type = X_Reply;
rep.pad0 = 0;
rep.sequenceNumber = client->sequence;
rep.length = 0;
rep.mode = mode->mode.id;
if (client->swapped)
{
int n;
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swapl(&rep.mode, n);
}
WriteToClient(client, sizeof(xRRCreateModeReply), (char *)&rep);
return client->noClientException;
}
int
ProcRRDestroyMode (ClientPtr client)
{
REQUEST(xRRDestroyModeReq);
RRModePtr mode;
REQUEST_SIZE_MATCH(xRRDestroyModeReq);
mode = LookupIDByType (stuff->mode, RRModeType);
if (!mode)
{
client->errorValue = stuff->mode;
return RRErrorBase + BadRRMode;
}
if (!mode->userScreen)
return BadMatch;
if (mode->refcnt > 1)
return BadAccess;
FreeResource (stuff->mode, 0);
return Success;
}
int
ProcRRAddOutputMode (ClientPtr client)
{
REQUEST(xRRAddOutputModeReq);
RRModePtr mode;
RROutputPtr output;
REQUEST_SIZE_MATCH(xRRAddOutputModeReq);
output = LookupOutput(client, stuff->output, DixReadAccess);
if (!output)
{
client->errorValue = stuff->output;
return RRErrorBase + BadRROutput;
}
mode = LookupIDByType (stuff->mode, RRModeType);
if (!mode)
{
client->errorValue = stuff->mode;
return RRErrorBase + BadRRMode;
}
return RROutputAddUserMode (output, mode);
}
int
ProcRRDeleteOutputMode (ClientPtr client)
{
REQUEST(xRRDeleteOutputModeReq);
RRModePtr mode;
RROutputPtr output;
REQUEST_SIZE_MATCH(xRRDeleteOutputModeReq);
output = LookupOutput(client, stuff->output, DixReadAccess);
if (!output)
{
client->errorValue = stuff->output;
return RRErrorBase + BadRROutput;
}
mode = LookupIDByType (stuff->mode, RRModeType);
if (!mode)
{
client->errorValue = stuff->mode;
return RRErrorBase + BadRRMode;
}
return RROutputDeleteUserMode (output, mode);
}
nx-X11/programs/Xserver/randr/rrmode.c.X.original
0 → 100644
View file @
15cee47a
/*
* Copyright © 2006 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
#include "randrstr.h"
#include "registry.h"
RESTYPE RRModeType;
static Bool
RRModeEqual (xRRModeInfo *a, xRRModeInfo *b)
{
if (a->width != b->width) return FALSE;
if (a->height != b->height) return FALSE;
if (a->dotClock != b->dotClock) return FALSE;
if (a->hSyncStart != b->hSyncStart) return FALSE;
if (a->hSyncEnd != b->hSyncEnd) return FALSE;
if (a->hTotal != b->hTotal) return FALSE;
if (a->hSkew != b->hSkew) return FALSE;
if (a->vSyncStart != b->vSyncStart) return FALSE;
if (a->vSyncEnd != b->vSyncEnd) return FALSE;
if (a->vTotal != b->vTotal) return FALSE;
if (a->nameLength != b->nameLength) return FALSE;
if (a->modeFlags != b->modeFlags) return FALSE;
return TRUE;
}
/*
* Keep a list so it's easy to find modes in the resource database.
*/
static int num_modes;
static RRModePtr *modes;
static RRModePtr
RRModeCreate (xRRModeInfo *modeInfo,
const char *name,
ScreenPtr userScreen)
{
RRModePtr mode, *newModes;
if (!RRInit ())
return NULL;
mode = xalloc (sizeof (RRModeRec) + modeInfo->nameLength + 1);
if (!mode)
return NULL;
mode->refcnt = 1;
mode->mode = *modeInfo;
mode->name = (char *) (mode + 1);
memcpy (mode->name, name, modeInfo->nameLength);
mode->name[modeInfo->nameLength] = '\0';
mode->userScreen = userScreen;
if (num_modes)
newModes = xrealloc (modes, (num_modes + 1) * sizeof (RRModePtr));
else
newModes = xalloc (sizeof (RRModePtr));
if (!newModes)
{
xfree (mode);
return NULL;
}
mode->mode.id = FakeClientID(0);
if (!AddResource (mode->mode.id, RRModeType, (pointer) mode))
return NULL;
modes = newModes;
modes[num_modes++] = mode;
/*
* give the caller a reference to this mode
*/
++mode->refcnt;
return mode;
}
static RRModePtr
RRModeFindByName (const char *name,
CARD16 nameLength)
{
int i;
RRModePtr mode;
for (i = 0; i < num_modes; i++)
{
mode = modes[i];
if (mode->mode.nameLength == nameLength &&
!memcmp (name, mode->name, nameLength))
{
return mode;
}
}
return NULL;
}
RRModePtr
RRModeGet (xRRModeInfo *modeInfo,
const char *name)
{
int i;
for (i = 0; i < num_modes; i++)
{
RRModePtr mode = modes[i];
if (RRModeEqual (&mode->mode, modeInfo) &&
!memcmp (name, mode->name, modeInfo->nameLength))
{
++mode->refcnt;
return mode;
}
}
return RRModeCreate (modeInfo, name, NULL);
}
static RRModePtr
RRModeCreateUser (ScreenPtr pScreen,
xRRModeInfo *modeInfo,
const char *name,
int *error)
{
RRModePtr mode;
mode = RRModeFindByName (name, modeInfo->nameLength);
if (mode)
{
*error = BadName;
return NULL;
}
mode = RRModeCreate (modeInfo, name, pScreen);
if (!mode)
{
*error = BadAlloc;
return NULL;
}
*error = Success;
return mode;
}
RRModePtr *
RRModesForScreen (ScreenPtr pScreen, int *num_ret)
{
rrScrPriv(pScreen);
int o, c, m;
RRModePtr *screen_modes;
int num_screen_modes = 0;
screen_modes = xalloc ((num_modes ? num_modes : 1) * sizeof (RRModePtr));
if (!screen_modes)
return NULL;
/*
* Add modes from all outputs
*/
for (o = 0; o < pScrPriv->numOutputs; o++)
{
RROutputPtr output = pScrPriv->outputs[o];
int m, n;
for (m = 0; m < output->numModes + output->numUserModes; m++)
{
RRModePtr mode = (m < output->numModes ?
output->modes[m] :
output->userModes[m-output->numModes]);
for (n = 0; n < num_screen_modes; n++)
if (screen_modes[n] == mode)
break;
if (n == num_screen_modes)
screen_modes[num_screen_modes++] = mode;
}
}
/*
* Add modes from all crtcs. The goal is to
* make sure all available and active modes
* are visible to the client
*/
for (c = 0; c < pScrPriv->numCrtcs; c++)
{
RRCrtcPtr crtc = pScrPriv->crtcs[c];
RRModePtr mode = crtc->mode;
int n;
if (!mode) continue;
for (n = 0; n < num_screen_modes; n++)
if (screen_modes[n] == mode)
break;
if (n == num_screen_modes)
screen_modes[num_screen_modes++] = mode;
}
/*
* Add all user modes for this screen
*/
for (m = 0; m < num_modes; m++)
{
RRModePtr mode = modes[m];
int n;
if (mode->userScreen != pScreen)
continue;
for (n = 0; n < num_screen_modes; n++)
if (screen_modes[n] == mode)
break;
if (n == num_screen_modes)
screen_modes[num_screen_modes++] = mode;
}
*num_ret = num_screen_modes;
return screen_modes;
}
void
RRModeDestroy (RRModePtr mode)
{
int m;
if (--mode->refcnt > 0)
return;
for (m = 0; m < num_modes; m++)
{
if (modes[m] == mode)
{
memmove (modes + m, modes + m + 1,
(num_modes - m - 1) * sizeof (RRModePtr));
num_modes--;
if (!num_modes)
{
xfree (modes);
modes = NULL;
}
break;
}
}
xfree (mode);
}
static int
RRModeDestroyResource (pointer value, XID pid)
{
RRModeDestroy ((RRModePtr) value);
return 1;
}
Bool
RRModeInit (void)
{
assert (num_modes == 0);
assert (modes == NULL);
RRModeType = CreateNewResourceType (RRModeDestroyResource);
if (!RRModeType)
return FALSE;
RegisterResourceName (RRModeType, "MODE");
return TRUE;
}
int
ProcRRCreateMode (ClientPtr client)
{
REQUEST(xRRCreateModeReq);
xRRCreateModeReply rep;
WindowPtr pWin;
ScreenPtr pScreen;
rrScrPrivPtr pScrPriv;
xRRModeInfo *modeInfo;
long units_after;
char *name;
int error, rc;
RRModePtr mode;
REQUEST_AT_LEAST_SIZE (xRRCreateModeReq);
rc = dixLookupWindow(&pWin, stuff->window, client, DixReadAccess);
if (rc != Success)
return rc;
pScreen = pWin->drawable.pScreen;
pScrPriv = rrGetScrPriv(pScreen);
modeInfo = &stuff->modeInfo;
name = (char *) (stuff + 1);
units_after = (stuff->length - (sizeof (xRRCreateModeReq) >> 2));
/* check to make sure requested name fits within the data provided */
if ((int) (modeInfo->nameLength + 3) >> 2 > units_after)
return BadLength;
mode = RRModeCreateUser (pScreen, modeInfo, name, &error);
if (!mode)
return error;
rep.type = X_Reply;
rep.pad0 = 0;
rep.sequenceNumber = client->sequence;
rep.length = 0;
rep.mode = mode->mode.id;
if (client->swapped)
{
int n;
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swapl(&rep.mode, n);
}
WriteToClient(client, sizeof(xRRCreateModeReply), (char *)&rep);
return client->noClientException;
}
int
ProcRRDestroyMode (ClientPtr client)
{
REQUEST(xRRDestroyModeReq);
RRModePtr mode;
REQUEST_SIZE_MATCH(xRRDestroyModeReq);
mode = LookupIDByType (stuff->mode, RRModeType);
if (!mode)
{
client->errorValue = stuff->mode;
return RRErrorBase + BadRRMode;
}
if (!mode->userScreen)
return BadMatch;
if (mode->refcnt > 1)
return BadAccess;
FreeResource (stuff->mode, 0);
return Success;
}
int
ProcRRAddOutputMode (ClientPtr client)
{
REQUEST(xRRAddOutputModeReq);
RRModePtr mode;
RROutputPtr output;
REQUEST_SIZE_MATCH(xRRAddOutputModeReq);
output = LookupOutput(client, stuff->output, DixReadAccess);
if (!output)
{
client->errorValue = stuff->output;
return RRErrorBase + BadRROutput;
}
mode = LookupIDByType (stuff->mode, RRModeType);
if (!mode)
{
client->errorValue = stuff->mode;
return RRErrorBase + BadRRMode;
}
return RROutputAddUserMode (output, mode);
}
int
ProcRRDeleteOutputMode (ClientPtr client)
{
REQUEST(xRRDeleteOutputModeReq);
RRModePtr mode;
RROutputPtr output;
REQUEST_SIZE_MATCH(xRRDeleteOutputModeReq);
output = LookupOutput(client, stuff->output, DixReadAccess);
if (!output)
{
client->errorValue = stuff->output;
return RRErrorBase + BadRROutput;
}
mode = LookupIDByType (stuff->mode, RRModeType);
if (!mode)
{
client->errorValue = stuff->mode;
return RRErrorBase + BadRRMode;
}
return RROutputDeleteUserMode (output, mode);
}
nx-X11/programs/Xserver/randr/rroutput.c
0 → 100644
View file @
15cee47a
/*
* Copyright © 2006 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
#include "randrstr.h"
#include "registry.h"
RESTYPE
RROutputType
;
/*
* Notify the output of some change
*/
void
RROutputChanged
(
RROutputPtr
output
,
Bool
configChanged
)
{
ScreenPtr
pScreen
=
output
->
pScreen
;
output
->
changed
=
TRUE
;
if
(
pScreen
)
{
rrScrPriv
(
pScreen
);
pScrPriv
->
changed
=
TRUE
;
if
(
configChanged
)
pScrPriv
->
configChanged
=
TRUE
;
}
}
/*
* Create an output
*/
RROutputPtr
RROutputCreate
(
ScreenPtr
pScreen
,
const
char
*
name
,
int
nameLength
,
void
*
devPrivate
)
{
RROutputPtr
output
;
RROutputPtr
*
outputs
;
rrScrPrivPtr
pScrPriv
;
if
(
!
RRInit
())
return
NULL
;
pScrPriv
=
rrGetScrPriv
(
pScreen
);
if
(
pScrPriv
->
numOutputs
)
outputs
=
xrealloc
(
pScrPriv
->
outputs
,
(
pScrPriv
->
numOutputs
+
1
)
*
sizeof
(
RROutputPtr
));
else
outputs
=
xalloc
(
sizeof
(
RROutputPtr
));
if
(
!
outputs
)
return
FALSE
;
pScrPriv
->
outputs
=
outputs
;
output
=
xalloc
(
sizeof
(
RROutputRec
)
+
nameLength
+
1
);
if
(
!
output
)
return
NULL
;
output
->
id
=
FakeClientID
(
0
);
output
->
pScreen
=
pScreen
;
output
->
name
=
(
char
*
)
(
output
+
1
);
output
->
nameLength
=
nameLength
;
memcpy
(
output
->
name
,
name
,
nameLength
);
output
->
name
[
nameLength
]
=
'\0'
;
output
->
connection
=
RR_UnknownConnection
;
output
->
subpixelOrder
=
SubPixelUnknown
;
output
->
mmWidth
=
0
;
output
->
mmHeight
=
0
;
output
->
crtc
=
NULL
;
output
->
numCrtcs
=
0
;
output
->
crtcs
=
NULL
;
output
->
numClones
=
0
;
output
->
clones
=
NULL
;
output
->
numModes
=
0
;
output
->
numPreferred
=
0
;
output
->
modes
=
NULL
;
output
->
numUserModes
=
0
;
output
->
userModes
=
NULL
;
output
->
properties
=
NULL
;
output
->
pendingProperties
=
FALSE
;
output
->
changed
=
FALSE
;
output
->
devPrivate
=
devPrivate
;
if
(
!
AddResource
(
output
->
id
,
RROutputType
,
(
pointer
)
output
))
return
NULL
;
pScrPriv
->
outputs
[
pScrPriv
->
numOutputs
++
]
=
output
;
return
output
;
}
/*
* Notify extension that output parameters have been changed
*/
Bool
RROutputSetClones
(
RROutputPtr
output
,
RROutputPtr
*
clones
,
int
numClones
)
{
RROutputPtr
*
newClones
;
int
i
;
if
(
numClones
==
output
->
numClones
)
{
for
(
i
=
0
;
i
<
numClones
;
i
++
)
if
(
output
->
clones
[
i
]
!=
clones
[
i
])
break
;
if
(
i
==
numClones
)
return
TRUE
;
}
if
(
numClones
)
{
newClones
=
xalloc
(
numClones
*
sizeof
(
RROutputPtr
));
if
(
!
newClones
)
return
FALSE
;
}
else
newClones
=
NULL
;
if
(
output
->
clones
)
xfree
(
output
->
clones
);
memcpy
(
newClones
,
clones
,
numClones
*
sizeof
(
RROutputPtr
));
output
->
clones
=
newClones
;
output
->
numClones
=
numClones
;
RROutputChanged
(
output
,
TRUE
);
return
TRUE
;
}
Bool
RROutputSetModes
(
RROutputPtr
output
,
RRModePtr
*
modes
,
int
numModes
,
int
numPreferred
)
{
RRModePtr
*
newModes
;
int
i
;
if
(
numModes
==
output
->
numModes
&&
numPreferred
==
output
->
numPreferred
)
{
for
(
i
=
0
;
i
<
numModes
;
i
++
)
if
(
output
->
modes
[
i
]
!=
modes
[
i
])
break
;
if
(
i
==
numModes
)
{
for
(
i
=
0
;
i
<
numModes
;
i
++
)
RRModeDestroy
(
modes
[
i
]);
return
TRUE
;
}
}
if
(
numModes
)
{
newModes
=
xalloc
(
numModes
*
sizeof
(
RRModePtr
));
if
(
!
newModes
)
return
FALSE
;
}
else
newModes
=
NULL
;
if
(
output
->
modes
)
{
for
(
i
=
0
;
i
<
output
->
numModes
;
i
++
)
RRModeDestroy
(
output
->
modes
[
i
]);
xfree
(
output
->
modes
);
}
memcpy
(
newModes
,
modes
,
numModes
*
sizeof
(
RRModePtr
));
output
->
modes
=
newModes
;
output
->
numModes
=
numModes
;
output
->
numPreferred
=
numPreferred
;
RROutputChanged
(
output
,
TRUE
);
return
TRUE
;
}
int
RROutputAddUserMode
(
RROutputPtr
output
,
RRModePtr
mode
)
{
int
m
;
ScreenPtr
pScreen
=
output
->
pScreen
;
rrScrPriv
(
pScreen
);
RRModePtr
*
newModes
;
/* Check to see if this mode is already listed for this output */
for
(
m
=
0
;
m
<
output
->
numModes
+
output
->
numUserModes
;
m
++
)
{
RRModePtr
e
=
(
m
<
output
->
numModes
?
output
->
modes
[
m
]
:
output
->
userModes
[
m
-
output
->
numModes
]);
if
(
mode
==
e
)
return
Success
;
}
/* Check with the DDX to see if this mode is OK */
if
(
pScrPriv
->
rrOutputValidateMode
)
if
(
!
pScrPriv
->
rrOutputValidateMode
(
pScreen
,
output
,
mode
))
return
BadMatch
;
if
(
output
->
userModes
)
newModes
=
xrealloc
(
output
->
userModes
,
(
output
->
numUserModes
+
1
)
*
sizeof
(
RRModePtr
));
else
newModes
=
xalloc
(
sizeof
(
RRModePtr
));
if
(
!
newModes
)
return
BadAlloc
;
output
->
userModes
=
newModes
;
output
->
userModes
[
output
->
numUserModes
++
]
=
mode
;
++
mode
->
refcnt
;
RROutputChanged
(
output
,
TRUE
);
RRTellChanged
(
pScreen
);
return
Success
;
}
int
RROutputDeleteUserMode
(
RROutputPtr
output
,
RRModePtr
mode
)
{
int
m
;
/* Find this mode in the user mode list */
for
(
m
=
0
;
m
<
output
->
numUserModes
;
m
++
)
{
RRModePtr
e
=
output
->
userModes
[
m
];
if
(
mode
==
e
)
break
;
}
/* Not there, access error */
if
(
m
==
output
->
numUserModes
)
return
BadAccess
;
/* make sure the mode isn't active for this output */
if
(
output
->
crtc
&&
output
->
crtc
->
mode
==
mode
)
return
BadMatch
;
memmove
(
output
->
userModes
+
m
,
output
->
userModes
+
m
+
1
,
(
output
->
numUserModes
-
m
-
1
)
*
sizeof
(
RRModePtr
));
output
->
numUserModes
--
;
RRModeDestroy
(
mode
);
return
Success
;
}
Bool
RROutputSetCrtcs
(
RROutputPtr
output
,
RRCrtcPtr
*
crtcs
,
int
numCrtcs
)
{
RRCrtcPtr
*
newCrtcs
;
int
i
;
if
(
numCrtcs
==
output
->
numCrtcs
)
{
for
(
i
=
0
;
i
<
numCrtcs
;
i
++
)
if
(
output
->
crtcs
[
i
]
!=
crtcs
[
i
])
break
;
if
(
i
==
numCrtcs
)
return
TRUE
;
}
if
(
numCrtcs
)
{
newCrtcs
=
xalloc
(
numCrtcs
*
sizeof
(
RRCrtcPtr
));
if
(
!
newCrtcs
)
return
FALSE
;
}
else
newCrtcs
=
NULL
;
if
(
output
->
crtcs
)
xfree
(
output
->
crtcs
);
memcpy
(
newCrtcs
,
crtcs
,
numCrtcs
*
sizeof
(
RRCrtcPtr
));
output
->
crtcs
=
newCrtcs
;
output
->
numCrtcs
=
numCrtcs
;
RROutputChanged
(
output
,
TRUE
);
return
TRUE
;
}
Bool
RROutputSetConnection
(
RROutputPtr
output
,
CARD8
connection
)
{
if
(
output
->
connection
==
connection
)
return
TRUE
;
output
->
connection
=
connection
;
RROutputChanged
(
output
,
TRUE
);
return
TRUE
;
}
Bool
RROutputSetSubpixelOrder
(
RROutputPtr
output
,
int
subpixelOrder
)
{
if
(
output
->
subpixelOrder
==
subpixelOrder
)
return
TRUE
;
output
->
subpixelOrder
=
subpixelOrder
;
RROutputChanged
(
output
,
FALSE
);
return
TRUE
;
}
Bool
RROutputSetPhysicalSize
(
RROutputPtr
output
,
int
mmWidth
,
int
mmHeight
)
{
if
(
output
->
mmWidth
==
mmWidth
&&
output
->
mmHeight
==
mmHeight
)
return
TRUE
;
output
->
mmWidth
=
mmWidth
;
output
->
mmHeight
=
mmHeight
;
RROutputChanged
(
output
,
FALSE
);
return
TRUE
;
}
void
RRDeliverOutputEvent
(
ClientPtr
client
,
WindowPtr
pWin
,
RROutputPtr
output
)
{
ScreenPtr
pScreen
=
pWin
->
drawable
.
pScreen
;
rrScrPriv
(
pScreen
);
xRROutputChangeNotifyEvent
oe
;
RRCrtcPtr
crtc
=
output
->
crtc
;
RRModePtr
mode
=
crtc
?
crtc
->
mode
:
0
;
oe
.
type
=
RRNotify
+
RREventBase
;
oe
.
subCode
=
RRNotify_OutputChange
;
oe
.
sequenceNumber
=
client
->
sequence
;
oe
.
timestamp
=
pScrPriv
->
lastSetTime
.
milliseconds
;
oe
.
configTimestamp
=
pScrPriv
->
lastConfigTime
.
milliseconds
;
oe
.
window
=
pWin
->
drawable
.
id
;
oe
.
output
=
output
->
id
;
if
(
crtc
)
{
oe
.
crtc
=
crtc
->
id
;
oe
.
mode
=
mode
?
mode
->
mode
.
id
:
None
;
oe
.
rotation
=
crtc
->
rotation
;
}
else
{
oe
.
crtc
=
None
;
oe
.
mode
=
None
;
oe
.
rotation
=
RR_Rotate_0
;
}
oe
.
connection
=
output
->
connection
;
oe
.
subpixelOrder
=
output
->
subpixelOrder
;
WriteEventsToClient
(
client
,
1
,
(
xEvent
*
)
&
oe
);
}
/*
* Destroy a Output at shutdown
*/
void
RROutputDestroy
(
RROutputPtr
output
)
{
FreeResource
(
output
->
id
,
0
);
}
static
int
RROutputDestroyResource
(
pointer
value
,
XID
pid
)
{
RROutputPtr
output
=
(
RROutputPtr
)
value
;
ScreenPtr
pScreen
=
output
->
pScreen
;
int
m
;
if
(
pScreen
)
{
rrScrPriv
(
pScreen
);
int
i
;
for
(
i
=
0
;
i
<
pScrPriv
->
numOutputs
;
i
++
)
{
if
(
pScrPriv
->
outputs
[
i
]
==
output
)
{
memmove
(
pScrPriv
->
outputs
+
i
,
pScrPriv
->
outputs
+
i
+
1
,
(
pScrPriv
->
numOutputs
-
(
i
+
1
))
*
sizeof
(
RROutputPtr
));
--
pScrPriv
->
numOutputs
;
break
;
}
}
}
if
(
output
->
modes
)
{
for
(
m
=
0
;
m
<
output
->
numModes
;
m
++
)
RRModeDestroy
(
output
->
modes
[
m
]);
xfree
(
output
->
modes
);
}
for
(
m
=
0
;
m
<
output
->
numUserModes
;
m
++
)
RRModeDestroy
(
output
->
userModes
[
m
]);
if
(
output
->
userModes
)
xfree
(
output
->
userModes
);
if
(
output
->
crtcs
)
xfree
(
output
->
crtcs
);
if
(
output
->
clones
)
xfree
(
output
->
clones
);
RRDeleteAllOutputProperties
(
output
);
xfree
(
output
);
return
1
;
}
/*
* Initialize output type
*/
Bool
RROutputInit
(
void
)
{
RROutputType
=
CreateNewResourceType
(
RROutputDestroyResource
);
if
(
!
RROutputType
)
return
FALSE
;
RegisterResourceName
(
RROutputType
,
"OUTPUT"
);
return
TRUE
;
}
#define OutputInfoExtra (SIZEOF(xRRGetOutputInfoReply) - 32)
int
ProcRRGetOutputInfo
(
ClientPtr
client
)
{
REQUEST
(
xRRGetOutputInfoReq
);
xRRGetOutputInfoReply
rep
;
RROutputPtr
output
;
CARD8
*
extra
;
unsigned
long
extraLen
;
ScreenPtr
pScreen
;
rrScrPrivPtr
pScrPriv
;
RRCrtc
*
crtcs
;
RRMode
*
modes
;
RROutput
*
clones
;
char
*
name
;
int
i
,
n
;
REQUEST_SIZE_MATCH
(
xRRGetOutputInfoReq
);
output
=
LookupOutput
(
client
,
stuff
->
output
,
DixReadAccess
);
if
(
!
output
)
{
client
->
errorValue
=
stuff
->
output
;
return
RRErrorBase
+
BadRROutput
;
}
pScreen
=
output
->
pScreen
;
pScrPriv
=
rrGetScrPriv
(
pScreen
);
rep
.
type
=
X_Reply
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
length
=
OutputInfoExtra
>>
2
;
rep
.
timestamp
=
pScrPriv
->
lastSetTime
.
milliseconds
;
rep
.
crtc
=
output
->
crtc
?
output
->
crtc
->
id
:
None
;
rep
.
mmWidth
=
output
->
mmWidth
;
rep
.
mmHeight
=
output
->
mmHeight
;
rep
.
connection
=
output
->
connection
;
rep
.
subpixelOrder
=
output
->
subpixelOrder
;
rep
.
nCrtcs
=
output
->
numCrtcs
;
rep
.
nModes
=
output
->
numModes
+
output
->
numUserModes
;
rep
.
nPreferred
=
output
->
numPreferred
;
rep
.
nClones
=
output
->
numClones
;
rep
.
nameLength
=
output
->
nameLength
;
extraLen
=
((
output
->
numCrtcs
+
output
->
numModes
+
output
->
numUserModes
+
output
->
numClones
+
((
rep
.
nameLength
+
3
)
>>
2
))
<<
2
);
if
(
extraLen
)
{
rep
.
length
+=
extraLen
>>
2
;
extra
=
xalloc
(
extraLen
);
if
(
!
extra
)
return
BadAlloc
;
}
else
extra
=
NULL
;
crtcs
=
(
RRCrtc
*
)
extra
;
modes
=
(
RRMode
*
)
(
crtcs
+
output
->
numCrtcs
);
clones
=
(
RROutput
*
)
(
modes
+
output
->
numModes
+
output
->
numUserModes
);
name
=
(
char
*
)
(
clones
+
output
->
numClones
);
for
(
i
=
0
;
i
<
output
->
numCrtcs
;
i
++
)
{
crtcs
[
i
]
=
output
->
crtcs
[
i
]
->
id
;
if
(
client
->
swapped
)
swapl
(
&
crtcs
[
i
],
n
);
}
for
(
i
=
0
;
i
<
output
->
numModes
+
output
->
numUserModes
;
i
++
)
{
if
(
i
<
output
->
numModes
)
modes
[
i
]
=
output
->
modes
[
i
]
->
mode
.
id
;
else
modes
[
i
]
=
output
->
userModes
[
i
-
output
->
numModes
]
->
mode
.
id
;
if
(
client
->
swapped
)
swapl
(
&
modes
[
i
],
n
);
}
for
(
i
=
0
;
i
<
output
->
numClones
;
i
++
)
{
clones
[
i
]
=
output
->
clones
[
i
]
->
id
;
if
(
client
->
swapped
)
swapl
(
&
clones
[
i
],
n
);
}
memcpy
(
name
,
output
->
name
,
output
->
nameLength
);
if
(
client
->
swapped
)
{
swaps
(
&
rep
.
sequenceNumber
,
n
);
swapl
(
&
rep
.
length
,
n
);
swapl
(
&
rep
.
timestamp
,
n
);
swapl
(
&
rep
.
crtc
,
n
);
swapl
(
&
rep
.
mmWidth
,
n
);
swapl
(
&
rep
.
mmHeight
,
n
);
swaps
(
&
rep
.
nCrtcs
,
n
);
swaps
(
&
rep
.
nModes
,
n
);
swaps
(
&
rep
.
nClones
,
n
);
swaps
(
&
rep
.
nameLength
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xRRGetOutputInfoReply
),
(
char
*
)
&
rep
);
if
(
extraLen
)
{
WriteToClient
(
client
,
extraLen
,
(
char
*
)
extra
);
xfree
(
extra
);
}
return
client
->
noClientException
;
}
nx-X11/programs/Xserver/randr/rrpointer.c
0 → 100644
View file @
15cee47a
/*
* Copyright © 2006 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
#include "randrstr.h"
/*
* When the pointer moves, check to see if the specified position is outside
* any of theavailable CRTCs and move it to a 'sensible' place if so, where
* sensible is the closest monitor to the departing edge.
*
* Returns whether the position was adjusted
*/
static
Bool
RRCrtcContainsPosition
(
RRCrtcPtr
crtc
,
int
x
,
int
y
)
{
RRModePtr
mode
=
crtc
->
mode
;
int
scan_width
,
scan_height
;
if
(
!
mode
)
return
FALSE
;
RRCrtcGetScanoutSize
(
crtc
,
&
scan_width
,
&
scan_height
);
if
(
crtc
->
x
<=
x
&&
x
<
crtc
->
x
+
scan_width
&&
crtc
->
y
<=
y
&&
y
<
crtc
->
y
+
scan_height
)
return
TRUE
;
return
FALSE
;
}
/*
* Find the CRTC nearest the specified position, ignoring 'skip'
*/
static
void
RRPointerToNearestCrtc
(
ScreenPtr
pScreen
,
int
x
,
int
y
,
RRCrtcPtr
skip
)
{
rrScrPriv
(
pScreen
);
int
c
;
RRCrtcPtr
nearest
=
NULL
;
int
best
=
0
;
int
best_dx
=
0
,
best_dy
=
0
;
for
(
c
=
0
;
c
<
pScrPriv
->
numCrtcs
;
c
++
)
{
RRCrtcPtr
crtc
=
pScrPriv
->
crtcs
[
c
];
RRModePtr
mode
=
crtc
->
mode
;
int
dx
,
dy
;
int
dist
;
int
scan_width
,
scan_height
;
if
(
!
mode
)
continue
;
if
(
crtc
==
skip
)
continue
;
RRCrtcGetScanoutSize
(
crtc
,
&
scan_width
,
&
scan_height
);
if
(
x
<
crtc
->
x
)
dx
=
crtc
->
x
-
x
;
else
if
(
x
>
crtc
->
x
+
scan_width
)
dx
=
x
-
(
crtc
->
x
+
scan_width
);
else
dx
=
0
;
if
(
y
<
crtc
->
y
)
dy
=
crtc
->
y
-
x
;
else
if
(
y
>
crtc
->
y
+
scan_height
)
dy
=
y
-
(
crtc
->
y
+
scan_height
);
else
dy
=
0
;
dist
=
dx
+
dy
;
if
(
!
nearest
||
dist
<
best
)
{
nearest
=
crtc
;
best_dx
=
dx
;
best_dy
=
dy
;
}
}
if
(
best_dx
||
best_dy
)
(
*
pScreen
->
SetCursorPosition
)
(
pScreen
,
x
+
best_dx
,
y
+
best_dy
,
TRUE
);
pScrPriv
->
pointerCrtc
=
nearest
;
}
void
RRPointerMoved
(
ScreenPtr
pScreen
,
int
x
,
int
y
)
{
rrScrPriv
(
pScreen
);
RRCrtcPtr
pointerCrtc
=
pScrPriv
->
pointerCrtc
;
int
c
;
/* Check last known CRTC */
if
(
pointerCrtc
&&
RRCrtcContainsPosition
(
pointerCrtc
,
x
,
y
))
return
;
/* Check all CRTCs */
for
(
c
=
0
;
c
<
pScrPriv
->
numCrtcs
;
c
++
)
{
RRCrtcPtr
crtc
=
pScrPriv
->
crtcs
[
c
];
if
(
RRCrtcContainsPosition
(
crtc
,
x
,
y
))
{
/* Remember containing CRTC */
pScrPriv
->
pointerCrtc
=
crtc
;
return
;
}
}
/* None contain pointer, find nearest */
RRPointerToNearestCrtc
(
pScreen
,
x
,
y
,
pointerCrtc
);
}
/*
* When the screen is reconfigured, move the pointer to the nearest
* CRTC
*/
void
RRPointerScreenConfigured
(
ScreenPtr
pScreen
)
{
WindowPtr
pRoot
=
GetCurrentRootWindow
();
ScreenPtr
pCurrentScreen
=
pRoot
?
pRoot
->
drawable
.
pScreen
:
NULL
;
int
x
,
y
;
if
(
pScreen
!=
pCurrentScreen
)
return
;
GetSpritePosition
(
&
x
,
&
y
);
RRPointerToNearestCrtc
(
pScreen
,
x
,
y
,
NULL
);
}
nx-X11/programs/Xserver/randr/rrproperty.c
0 → 100644
View file @
15cee47a
/*
* Copyright © 2006 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
#include "randrstr.h"
#include "propertyst.h"
#include "swaprep.h"
static
void
RRDeliverEvent
(
ScreenPtr
pScreen
,
xEvent
*
event
,
CARD32
mask
)
{
}
void
RRDeleteAllOutputProperties
(
RROutputPtr
output
)
{
RRPropertyPtr
prop
,
next
;
xRROutputPropertyNotifyEvent
event
;
for
(
prop
=
output
->
properties
;
prop
;
prop
=
next
)
{
next
=
prop
->
next
;
event
.
type
=
RREventBase
+
RRNotify
;
event
.
subCode
=
RRNotify_OutputProperty
;
event
.
output
=
output
->
id
;
event
.
state
=
PropertyDelete
;
event
.
atom
=
prop
->
propertyName
;
event
.
timestamp
=
currentTime
.
milliseconds
;
RRDeliverEvent
(
output
->
pScreen
,
(
xEvent
*
)
&
event
,
RROutputPropertyNotifyMask
);
if
(
prop
->
current
.
data
)
xfree
(
prop
->
current
.
data
);
if
(
prop
->
pending
.
data
)
xfree
(
prop
->
pending
.
data
);
xfree
(
prop
);
}
}
static
void
RRInitOutputPropertyValue
(
RRPropertyValuePtr
property_value
)
{
property_value
->
type
=
None
;
property_value
->
format
=
0
;
property_value
->
size
=
0
;
property_value
->
data
=
NULL
;
}
static
RRPropertyPtr
RRCreateOutputProperty
(
Atom
property
)
{
RRPropertyPtr
prop
;
prop
=
(
RRPropertyPtr
)
xalloc
(
sizeof
(
RRPropertyRec
));
if
(
!
prop
)
return
NULL
;
prop
->
next
=
NULL
;
prop
->
propertyName
=
property
;
prop
->
is_pending
=
FALSE
;
prop
->
range
=
FALSE
;
prop
->
immutable
=
FALSE
;
prop
->
num_valid
=
0
;
prop
->
valid_values
=
NULL
;
RRInitOutputPropertyValue
(
&
prop
->
current
);
RRInitOutputPropertyValue
(
&
prop
->
pending
);
return
prop
;
}
static
void
RRDestroyOutputProperty
(
RRPropertyPtr
prop
)
{
if
(
prop
->
valid_values
)
xfree
(
prop
->
valid_values
);
if
(
prop
->
current
.
data
)
xfree
(
prop
->
current
.
data
);
if
(
prop
->
pending
.
data
)
xfree
(
prop
->
pending
.
data
);
xfree
(
prop
);
}
void
RRDeleteOutputProperty
(
RROutputPtr
output
,
Atom
property
)
{
RRPropertyPtr
prop
,
*
prev
;
xRROutputPropertyNotifyEvent
event
;
for
(
prev
=
&
output
->
properties
;
(
prop
=
*
prev
);
prev
=
&
(
prop
->
next
))
if
(
prop
->
propertyName
==
property
)
break
;
if
(
prop
)
{
*
prev
=
prop
->
next
;
event
.
type
=
RREventBase
+
RRNotify
;
event
.
subCode
=
RRNotify_OutputProperty
;
event
.
output
=
output
->
id
;
event
.
state
=
PropertyDelete
;
event
.
atom
=
prop
->
propertyName
;
event
.
timestamp
=
currentTime
.
milliseconds
;
RRDeliverEvent
(
output
->
pScreen
,
(
xEvent
*
)
&
event
,
RROutputPropertyNotifyMask
);
RRDestroyOutputProperty
(
prop
);
}
}
int
RRChangeOutputProperty
(
RROutputPtr
output
,
Atom
property
,
Atom
type
,
int
format
,
int
mode
,
unsigned
long
len
,
pointer
value
,
Bool
sendevent
,
Bool
pending
)
{
RRPropertyPtr
prop
;
xRROutputPropertyNotifyEvent
event
;
rrScrPrivPtr
pScrPriv
=
rrGetScrPriv
(
output
->
pScreen
);
int
size_in_bytes
;
int
total_size
;
unsigned
long
total_len
;
RRPropertyValuePtr
prop_value
;
RRPropertyValueRec
new_value
;
Bool
add
=
FALSE
;
size_in_bytes
=
format
>>
3
;
/* first see if property already exists */
prop
=
RRQueryOutputProperty
(
output
,
property
);
if
(
!
prop
)
/* just add to list */
{
prop
=
RRCreateOutputProperty
(
property
);
if
(
!
prop
)
return
(
BadAlloc
);
add
=
TRUE
;
mode
=
PropModeReplace
;
}
if
(
pending
&&
prop
->
is_pending
)
prop_value
=
&
prop
->
pending
;
else
prop_value
=
&
prop
->
current
;
/* To append or prepend to a property the request format and type
must match those of the already defined property. The
existing format and type are irrelevant when using the mode
"PropModeReplace" since they will be written over. */
if
((
format
!=
prop_value
->
format
)
&&
(
mode
!=
PropModeReplace
))
return
(
BadMatch
);
if
((
prop_value
->
type
!=
type
)
&&
(
mode
!=
PropModeReplace
))
return
(
BadMatch
);
new_value
=
*
prop_value
;
if
(
mode
==
PropModeReplace
)
total_len
=
len
;
else
total_len
=
prop_value
->
size
+
len
;
if
(
mode
==
PropModeReplace
||
len
>
0
)
{
pointer
new_data
=
NULL
,
old_data
=
NULL
;
total_size
=
total_len
*
size_in_bytes
;
new_value
.
data
=
(
pointer
)
xalloc
(
total_size
);
if
(
!
new_value
.
data
&&
total_size
)
{
if
(
add
)
RRDestroyOutputProperty
(
prop
);
return
BadAlloc
;
}
new_value
.
size
=
len
;
new_value
.
type
=
type
;
new_value
.
format
=
format
;
switch
(
mode
)
{
case
PropModeReplace
:
new_data
=
new_value
.
data
;
old_data
=
NULL
;
break
;
case
PropModeAppend
:
new_data
=
(
pointer
)
(((
char
*
)
new_value
.
data
)
+
(
prop_value
->
size
*
size_in_bytes
));
old_data
=
new_value
.
data
;
break
;
case
PropModePrepend
:
new_data
=
new_value
.
data
;
old_data
=
(
pointer
)
(((
char
*
)
new_value
.
data
)
+
(
prop_value
->
size
*
size_in_bytes
));
break
;
}
if
(
new_data
)
memcpy
((
char
*
)
new_data
,
(
char
*
)
value
,
len
*
size_in_bytes
);
if
(
old_data
)
memcpy
((
char
*
)
old_data
,
(
char
*
)
prop_value
->
data
,
prop_value
->
size
*
size_in_bytes
);
if
(
pending
&&
pScrPriv
->
rrOutputSetProperty
&&
!
pScrPriv
->
rrOutputSetProperty
(
output
->
pScreen
,
output
,
prop
->
propertyName
,
&
new_value
))
{
if
(
new_value
.
data
)
xfree
(
new_value
.
data
);
return
(
BadValue
);
}
if
(
prop_value
->
data
)
xfree
(
prop_value
->
data
);
*
prop_value
=
new_value
;
}
else
if
(
len
==
0
)
{
/* do nothing */
}
if
(
add
)
{
prop
->
next
=
output
->
properties
;
output
->
properties
=
prop
;
}
if
(
pending
&&
prop
->
is_pending
)
output
->
pendingProperties
=
TRUE
;
if
(
sendevent
)
{
event
.
type
=
RREventBase
+
RRNotify
;
event
.
subCode
=
RRNotify_OutputProperty
;
event
.
output
=
output
->
id
;
event
.
state
=
PropertyNewValue
;
event
.
atom
=
prop
->
propertyName
;
event
.
timestamp
=
currentTime
.
milliseconds
;
RRDeliverEvent
(
output
->
pScreen
,
(
xEvent
*
)
&
event
,
RROutputPropertyNotifyMask
);
}
return
(
Success
);
}
Bool
RRPostPendingProperties
(
RROutputPtr
output
)
{
RRPropertyValuePtr
pending_value
;
RRPropertyValuePtr
current_value
;
RRPropertyPtr
property
;
Bool
ret
=
TRUE
;
if
(
!
output
->
pendingProperties
)
return
TRUE
;
output
->
pendingProperties
=
FALSE
;
for
(
property
=
output
->
properties
;
property
;
property
=
property
->
next
)
{
/* Skip non-pending properties */
if
(
!
property
->
is_pending
)
continue
;
pending_value
=
&
property
->
pending
;
current_value
=
&
property
->
current
;
/*
* If the pending and current values are equal, don't mark it
* as changed (which would deliver an event)
*/
if
(
pending_value
->
type
==
current_value
->
type
&&
pending_value
->
format
==
current_value
->
format
&&
pending_value
->
size
==
current_value
->
size
&&
!
memcmp
(
pending_value
->
data
,
current_value
->
data
,
pending_value
->
size
))
continue
;
if
(
RRChangeOutputProperty
(
output
,
property
->
propertyName
,
pending_value
->
type
,
pending_value
->
format
,
PropModeReplace
,
pending_value
->
size
,
pending_value
->
data
,
TRUE
,
FALSE
)
!=
Success
)
ret
=
FALSE
;
}
return
ret
;
}
RRPropertyPtr
RRQueryOutputProperty
(
RROutputPtr
output
,
Atom
property
)
{
RRPropertyPtr
prop
;
for
(
prop
=
output
->
properties
;
prop
;
prop
=
prop
->
next
)
if
(
prop
->
propertyName
==
property
)
return
prop
;
return
NULL
;
}
RRPropertyValuePtr
RRGetOutputProperty
(
RROutputPtr
output
,
Atom
property
,
Bool
pending
)
{
RRPropertyPtr
prop
=
RRQueryOutputProperty
(
output
,
property
);
if
(
!
prop
)
return
NULL
;
if
(
pending
&&
prop
->
is_pending
)
return
&
prop
->
pending
;
else
return
&
prop
->
current
;
}
int
RRConfigureOutputProperty
(
RROutputPtr
output
,
Atom
property
,
Bool
pending
,
Bool
range
,
Bool
immutable
,
int
num_values
,
INT32
*
values
)
{
RRPropertyPtr
prop
=
RRQueryOutputProperty
(
output
,
property
);
Bool
add
=
FALSE
;
INT32
*
new_values
;
if
(
!
prop
)
{
prop
=
RRCreateOutputProperty
(
property
);
if
(
!
prop
)
return
(
BadAlloc
);
add
=
TRUE
;
}
else
if
(
prop
->
immutable
&&
!
immutable
)
return
(
BadAccess
);
/*
* ranges must have even number of values
*/
if
(
range
&&
(
num_values
&
1
))
return
BadMatch
;
new_values
=
xalloc
(
num_values
*
sizeof
(
INT32
));
if
(
!
new_values
&&
num_values
)
return
BadAlloc
;
if
(
num_values
)
memcpy
(
new_values
,
values
,
num_values
*
sizeof
(
INT32
));
/*
* Property moving from pending to non-pending
* loses any pending values
*/
if
(
prop
->
is_pending
&&
!
pending
)
{
if
(
prop
->
pending
.
data
)
xfree
(
prop
->
pending
.
data
);
RRInitOutputPropertyValue
(
&
prop
->
pending
);
}
prop
->
is_pending
=
pending
;
prop
->
range
=
range
;
prop
->
immutable
=
immutable
;
prop
->
num_valid
=
num_values
;
if
(
prop
->
valid_values
)
xfree
(
prop
->
valid_values
);
prop
->
valid_values
=
new_values
;
if
(
add
)
{
prop
->
next
=
output
->
properties
;
output
->
properties
=
prop
;
}
return
Success
;
}
int
ProcRRListOutputProperties
(
ClientPtr
client
)
{
REQUEST
(
xRRListOutputPropertiesReq
);
Atom
*
pAtoms
=
NULL
,
*
temppAtoms
;
xRRListOutputPropertiesReply
rep
;
int
numProps
=
0
;
RROutputPtr
output
;
RRPropertyPtr
prop
;
REQUEST_SIZE_MATCH
(
xRRListOutputPropertiesReq
);
output
=
LookupOutput
(
client
,
stuff
->
output
,
DixReadAccess
);
if
(
!
output
)
return
RRErrorBase
+
BadRROutput
;
for
(
prop
=
output
->
properties
;
prop
;
prop
=
prop
->
next
)
numProps
++
;
if
(
numProps
)
if
(
!
(
pAtoms
=
(
Atom
*
)
xalloc
(
numProps
*
sizeof
(
Atom
))))
return
(
BadAlloc
);
rep
.
type
=
X_Reply
;
rep
.
length
=
(
numProps
*
sizeof
(
Atom
))
>>
2
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
nAtoms
=
numProps
;
if
(
client
->
swapped
)
{
int
n
;
swaps
(
&
rep
.
sequenceNumber
,
n
);
swapl
(
&
rep
.
length
,
n
);
swaps
(
&
rep
.
nAtoms
,
n
);
}
temppAtoms
=
pAtoms
;
for
(
prop
=
output
->
properties
;
prop
;
prop
=
prop
->
next
)
*
temppAtoms
++
=
prop
->
propertyName
;
WriteToClient
(
client
,
sizeof
(
xRRListOutputPropertiesReply
),
(
char
*
)
&
rep
);
if
(
numProps
)
{
client
->
pSwapReplyFunc
=
(
ReplySwapPtr
)
Swap32Write
;
WriteSwappedDataToClient
(
client
,
numProps
*
sizeof
(
Atom
),
pAtoms
);
xfree
(
pAtoms
);
}
return
(
client
->
noClientException
);
}
int
ProcRRQueryOutputProperty
(
ClientPtr
client
)
{
REQUEST
(
xRRQueryOutputPropertyReq
);
xRRQueryOutputPropertyReply
rep
;
RROutputPtr
output
;
RRPropertyPtr
prop
;
char
*
extra
;
REQUEST_SIZE_MATCH
(
xRRQueryOutputPropertyReq
);
output
=
LookupOutput
(
client
,
stuff
->
output
,
DixReadAccess
);
if
(
!
output
)
return
RRErrorBase
+
BadRROutput
;
prop
=
RRQueryOutputProperty
(
output
,
stuff
->
property
);
if
(
!
prop
)
return
BadName
;
if
(
prop
->
num_valid
)
{
extra
=
xalloc
(
prop
->
num_valid
*
sizeof
(
INT32
));
if
(
!
extra
)
return
BadAlloc
;
}
rep
.
type
=
X_Reply
;
rep
.
length
=
prop
->
num_valid
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
pending
=
prop
->
is_pending
;
rep
.
range
=
prop
->
range
;
rep
.
immutable
=
prop
->
immutable
;
if
(
client
->
swapped
)
{
int
n
;
swaps
(
&
rep
.
sequenceNumber
,
n
);
swapl
(
&
rep
.
length
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xRRQueryOutputPropertyReply
),
(
char
*
)
&
rep
);
if
(
prop
->
num_valid
)
{
memcpy
(
extra
,
prop
->
valid_values
,
prop
->
num_valid
*
sizeof
(
INT32
));
client
->
pSwapReplyFunc
=
(
ReplySwapPtr
)
Swap32Write
;
WriteSwappedDataToClient
(
client
,
prop
->
num_valid
*
sizeof
(
INT32
),
extra
);
xfree
(
extra
);
}
return
(
client
->
noClientException
);
}
int
ProcRRConfigureOutputProperty
(
ClientPtr
client
)
{
REQUEST
(
xRRConfigureOutputPropertyReq
);
RROutputPtr
output
;
int
num_valid
;
REQUEST_AT_LEAST_SIZE
(
xRRConfigureOutputPropertyReq
);
output
=
LookupOutput
(
client
,
stuff
->
output
,
DixReadAccess
);
if
(
!
output
)
return
RRErrorBase
+
BadRROutput
;
num_valid
=
stuff
->
length
-
(
sizeof
(
xRRConfigureOutputPropertyReq
)
>>
2
);
return
RRConfigureOutputProperty
(
output
,
stuff
->
property
,
stuff
->
pending
,
stuff
->
range
,
FALSE
,
num_valid
,
(
INT32
*
)
(
stuff
+
1
));
}
int
ProcRRChangeOutputProperty
(
ClientPtr
client
)
{
REQUEST
(
xRRChangeOutputPropertyReq
);
RROutputPtr
output
;
char
format
,
mode
;
unsigned
long
len
;
int
sizeInBytes
;
int
totalSize
;
int
err
;
REQUEST_AT_LEAST_SIZE
(
xRRChangeOutputPropertyReq
);
UpdateCurrentTime
();
format
=
stuff
->
format
;
mode
=
stuff
->
mode
;
if
((
mode
!=
PropModeReplace
)
&&
(
mode
!=
PropModeAppend
)
&&
(
mode
!=
PropModePrepend
))
{
client
->
errorValue
=
mode
;
return
BadValue
;
}
if
((
format
!=
8
)
&&
(
format
!=
16
)
&&
(
format
!=
32
))
{
client
->
errorValue
=
format
;
return
BadValue
;
}
len
=
stuff
->
nUnits
;
if
(
len
>
((
0xffffffff
-
sizeof
(
xChangePropertyReq
))
>>
2
))
return
BadLength
;
sizeInBytes
=
format
>>
3
;
totalSize
=
len
*
sizeInBytes
;
REQUEST_FIXED_SIZE
(
xRRChangeOutputPropertyReq
,
totalSize
);
output
=
LookupOutput
(
client
,
stuff
->
output
,
DixWriteAccess
);
if
(
!
output
)
return
RRErrorBase
+
BadRROutput
;
if
(
!
ValidAtom
(
stuff
->
property
))
{
client
->
errorValue
=
stuff
->
property
;
return
(
BadAtom
);
}
if
(
!
ValidAtom
(
stuff
->
type
))
{
client
->
errorValue
=
stuff
->
type
;
return
(
BadAtom
);
}
err
=
RRChangeOutputProperty
(
output
,
stuff
->
property
,
stuff
->
type
,
(
int
)
format
,
(
int
)
mode
,
len
,
(
pointer
)
&
stuff
[
1
],
TRUE
,
TRUE
);
if
(
err
!=
Success
)
return
err
;
else
return
client
->
noClientException
;
}
int
ProcRRDeleteOutputProperty
(
ClientPtr
client
)
{
REQUEST
(
xRRDeleteOutputPropertyReq
);
RROutputPtr
output
;
REQUEST_SIZE_MATCH
(
xRRDeleteOutputPropertyReq
);
UpdateCurrentTime
();
output
=
LookupOutput
(
client
,
stuff
->
output
,
DixWriteAccess
);
if
(
!
output
)
return
RRErrorBase
+
BadRROutput
;
if
(
!
ValidAtom
(
stuff
->
property
))
{
client
->
errorValue
=
stuff
->
property
;
return
(
BadAtom
);
}
RRDeleteOutputProperty
(
output
,
stuff
->
property
);
return
client
->
noClientException
;
}
int
ProcRRGetOutputProperty
(
ClientPtr
client
)
{
REQUEST
(
xRRGetOutputPropertyReq
);
RRPropertyPtr
prop
,
*
prev
;
RRPropertyValuePtr
prop_value
;
unsigned
long
n
,
len
,
ind
;
RROutputPtr
output
;
xRRGetOutputPropertyReply
reply
;
char
*
extra
;
REQUEST_SIZE_MATCH
(
xRRGetOutputPropertyReq
);
if
(
stuff
->
delete
)
UpdateCurrentTime
();
output
=
LookupOutput
(
client
,
stuff
->
output
,
stuff
->
delete
?
DixWriteAccess
:
DixReadAccess
);
if
(
!
output
)
return
RRErrorBase
+
BadRROutput
;
if
(
!
ValidAtom
(
stuff
->
property
))
{
client
->
errorValue
=
stuff
->
property
;
return
(
BadAtom
);
}
if
((
stuff
->
delete
!=
xTrue
)
&&
(
stuff
->
delete
!=
xFalse
))
{
client
->
errorValue
=
stuff
->
delete
;
return
(
BadValue
);
}
if
((
stuff
->
type
!=
AnyPropertyType
)
&&
!
ValidAtom
(
stuff
->
type
))
{
client
->
errorValue
=
stuff
->
type
;
return
(
BadAtom
);
}
for
(
prev
=
&
output
->
properties
;
(
prop
=
*
prev
);
prev
=
&
prop
->
next
)
if
(
prop
->
propertyName
==
stuff
->
property
)
break
;
reply
.
type
=
X_Reply
;
reply
.
sequenceNumber
=
client
->
sequence
;
if
(
!
prop
)
{
reply
.
nItems
=
0
;
reply
.
length
=
0
;
reply
.
bytesAfter
=
0
;
reply
.
propertyType
=
None
;
reply
.
format
=
0
;
if
(
client
->
swapped
)
{
int
n
;
swaps
(
&
reply
.
sequenceNumber
,
n
);
swapl
(
&
reply
.
length
,
n
);
swapl
(
&
reply
.
propertyType
,
n
);
swapl
(
&
reply
.
bytesAfter
,
n
);
swapl
(
&
reply
.
nItems
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xRRGetOutputPropertyReply
),
&
reply
);
return
(
client
->
noClientException
);
}
if
(
prop
->
immutable
&&
stuff
->
delete
)
return
BadAccess
;
if
(
stuff
->
pending
&&
prop
->
is_pending
)
prop_value
=
&
prop
->
pending
;
else
prop_value
=
&
prop
->
current
;
/* If the request type and actual type don't match. Return the
property information, but not the data. */
if
(((
stuff
->
type
!=
prop_value
->
type
)
&&
(
stuff
->
type
!=
AnyPropertyType
))
)
{
reply
.
bytesAfter
=
prop_value
->
size
;
reply
.
format
=
prop_value
->
format
;
reply
.
length
=
0
;
reply
.
nItems
=
0
;
reply
.
propertyType
=
prop_value
->
type
;
if
(
client
->
swapped
)
{
int
n
;
swaps
(
&
reply
.
sequenceNumber
,
n
);
swapl
(
&
reply
.
length
,
n
);
swapl
(
&
reply
.
propertyType
,
n
);
swapl
(
&
reply
.
bytesAfter
,
n
);
swapl
(
&
reply
.
nItems
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xRRGetOutputPropertyReply
),
&
reply
);
return
(
client
->
noClientException
);
}
/*
* Return type, format, value to client
*/
n
=
(
prop_value
->
format
/
8
)
*
prop_value
->
size
;
/* size (bytes) of prop */
ind
=
stuff
->
longOffset
<<
2
;
/* If longOffset is invalid such that it causes "len" to
be negative, it's a value error. */
if
(
n
<
ind
)
{
client
->
errorValue
=
stuff
->
longOffset
;
return
BadValue
;
}
len
=
min
(
n
-
ind
,
4
*
stuff
->
longLength
);
if
(
len
)
{
extra
=
xalloc
(
len
);
if
(
!
extra
)
return
BadAlloc
;
}
reply
.
bytesAfter
=
n
-
(
ind
+
len
);
reply
.
format
=
prop_value
->
format
;
reply
.
length
=
(
len
+
3
)
>>
2
;
if
(
prop_value
->
format
)
reply
.
nItems
=
len
/
(
prop_value
->
format
/
8
);
else
reply
.
nItems
=
0
;
reply
.
propertyType
=
prop_value
->
type
;
if
(
stuff
->
delete
&&
(
reply
.
bytesAfter
==
0
))
{
xRROutputPropertyNotifyEvent
event
;
event
.
type
=
RREventBase
+
RRNotify
;
event
.
subCode
=
RRNotify_OutputProperty
;
event
.
output
=
output
->
id
;
event
.
state
=
PropertyDelete
;
event
.
atom
=
prop
->
propertyName
;
event
.
timestamp
=
currentTime
.
milliseconds
;
RRDeliverEvent
(
output
->
pScreen
,
(
xEvent
*
)
&
event
,
RROutputPropertyNotifyMask
);
}
if
(
client
->
swapped
)
{
int
n
;
swaps
(
&
reply
.
sequenceNumber
,
n
);
swapl
(
&
reply
.
length
,
n
);
swapl
(
&
reply
.
propertyType
,
n
);
swapl
(
&
reply
.
bytesAfter
,
n
);
swapl
(
&
reply
.
nItems
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xGenericReply
),
&
reply
);
if
(
len
)
{
memcpy
(
extra
,
(
char
*
)
prop_value
->
data
+
ind
,
len
);
switch
(
reply
.
format
)
{
case
32
:
client
->
pSwapReplyFunc
=
(
ReplySwapPtr
)
CopySwap32Write
;
break
;
case
16
:
client
->
pSwapReplyFunc
=
(
ReplySwapPtr
)
CopySwap16Write
;
break
;
default:
client
->
pSwapReplyFunc
=
(
ReplySwapPtr
)
WriteToClient
;
break
;
}
WriteSwappedDataToClient
(
client
,
len
,
extra
);
xfree
(
extra
);
}
if
(
stuff
->
delete
&&
(
reply
.
bytesAfter
==
0
))
{
/* delete the Property */
*
prev
=
prop
->
next
;
RRDestroyOutputProperty
(
prop
);
}
return
(
client
->
noClientException
);
}
nx-X11/programs/Xserver/randr/rrscreen.c
0 → 100644
View file @
15cee47a
/*
* Copyright © 2006 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
/**************************************************************************/
/* */
/* Copyright (c) 2001, 2011 NoMachine, http://www.nomachine.com/. */
/* */
/* NX-X11, NX protocol compression and NX extensions to this software */
/* are copyright of NoMachine. Redistribution and use of the present */
/* software is allowed according to terms specified in the file LICENSE */
/* which comes in the source distribution. */
/* */
/* Check http://www.nomachine.com/licensing.html for applicability. */
/* */
/* NX and NoMachine are trademarks of Medialogic S.p.A. */
/* */
/* All rights reserved. */
/* */
/**************************************************************************/
#include "randrstr.h"
extern
char
*
ConnectionInfo
;
static
int
padlength
[
4
]
=
{
0
,
3
,
2
,
1
};
static
CARD16
RR10CurrentSizeID
(
ScreenPtr
pScreen
);
/*
* Edit connection information block so that new clients
* see the current screen size on connect
*/
static
void
RREditConnectionInfo
(
ScreenPtr
pScreen
)
{
xConnSetup
*
connSetup
;
char
*
vendor
;
xPixmapFormat
*
formats
;
xWindowRoot
*
root
;
xDepth
*
depth
;
xVisualType
*
visual
;
int
screen
=
0
;
int
d
;
connSetup
=
(
xConnSetup
*
)
ConnectionInfo
;
vendor
=
(
char
*
)
connSetup
+
sizeof
(
xConnSetup
);
formats
=
(
xPixmapFormat
*
)
((
char
*
)
vendor
+
connSetup
->
nbytesVendor
+
padlength
[
connSetup
->
nbytesVendor
&
3
]);
root
=
(
xWindowRoot
*
)
((
char
*
)
formats
+
sizeof
(
xPixmapFormat
)
*
screenInfo
.
numPixmapFormats
);
while
(
screen
!=
pScreen
->
myNum
)
{
depth
=
(
xDepth
*
)
((
char
*
)
root
+
sizeof
(
xWindowRoot
));
for
(
d
=
0
;
d
<
root
->
nDepths
;
d
++
)
{
visual
=
(
xVisualType
*
)
((
char
*
)
depth
+
sizeof
(
xDepth
));
depth
=
(
xDepth
*
)
((
char
*
)
visual
+
depth
->
nVisuals
*
sizeof
(
xVisualType
));
}
root
=
(
xWindowRoot
*
)
((
char
*
)
depth
);
screen
++
;
}
root
->
pixWidth
=
pScreen
->
width
;
root
->
pixHeight
=
pScreen
->
height
;
root
->
mmWidth
=
pScreen
->
mmWidth
;
root
->
mmHeight
=
pScreen
->
mmHeight
;
}
void
RRSendConfigNotify
(
ScreenPtr
pScreen
)
{
WindowPtr
pWin
=
WindowTable
[
pScreen
->
myNum
];
xEvent
event
;
event
.
u
.
u
.
type
=
ConfigureNotify
;
event
.
u
.
configureNotify
.
window
=
pWin
->
drawable
.
id
;
event
.
u
.
configureNotify
.
aboveSibling
=
None
;
event
.
u
.
configureNotify
.
x
=
0
;
event
.
u
.
configureNotify
.
y
=
0
;
/* XXX xinerama stuff ? */
event
.
u
.
configureNotify
.
width
=
pWin
->
drawable
.
width
;
event
.
u
.
configureNotify
.
height
=
pWin
->
drawable
.
height
;
event
.
u
.
configureNotify
.
borderWidth
=
wBorderWidth
(
pWin
);
event
.
u
.
configureNotify
.
override
=
pWin
->
overrideRedirect
;
DeliverEvents
(
pWin
,
&
event
,
1
,
NullWindow
);
}
void
RRDeliverScreenEvent
(
ClientPtr
client
,
WindowPtr
pWin
,
ScreenPtr
pScreen
)
{
rrScrPriv
(
pScreen
);
xRRScreenChangeNotifyEvent
se
;
RRCrtcPtr
crtc
=
pScrPriv
->
numCrtcs
?
pScrPriv
->
crtcs
[
0
]
:
NULL
;
WindowPtr
pRoot
=
WindowTable
[
pScreen
->
myNum
];
se
.
type
=
RRScreenChangeNotify
+
RREventBase
;
se
.
rotation
=
(
CARD8
)
(
crtc
?
crtc
->
rotation
:
RR_Rotate_0
);
se
.
timestamp
=
pScrPriv
->
lastSetTime
.
milliseconds
;
se
.
sequenceNumber
=
client
->
sequence
;
se
.
configTimestamp
=
pScrPriv
->
lastConfigTime
.
milliseconds
;
se
.
root
=
pRoot
->
drawable
.
id
;
se
.
window
=
pWin
->
drawable
.
id
;
#ifdef RENDER
se
.
subpixelOrder
=
PictureGetSubpixelOrder
(
pScreen
);
#else
se
.
subpixelOrder
=
SubPixelUnknown
;
#endif
se
.
sequenceNumber
=
client
->
sequence
;
se
.
sizeID
=
RR10CurrentSizeID
(
pScreen
);
if
(
se
.
rotation
&
(
RR_Rotate_90
|
RR_Rotate_270
))
{
se
.
widthInPixels
=
pScreen
->
height
;
se
.
heightInPixels
=
pScreen
->
width
;
se
.
widthInMillimeters
=
pScreen
->
mmHeight
;
se
.
heightInMillimeters
=
pScreen
->
mmWidth
;
}
else
{
se
.
widthInPixels
=
pScreen
->
width
;
se
.
heightInPixels
=
pScreen
->
height
;
se
.
widthInMillimeters
=
pScreen
->
mmWidth
;
se
.
heightInMillimeters
=
pScreen
->
mmHeight
;
}
WriteEventsToClient
(
client
,
1
,
(
xEvent
*
)
&
se
);
}
/*
* Notify the extension that the screen size has been changed.
* The driver is responsible for calling this whenever it has changed
* the size of the screen
*/
void
RRScreenSizeNotify
(
ScreenPtr
pScreen
)
{
rrScrPriv
(
pScreen
);
/*
* Deliver ConfigureNotify events when root changes
* pixel size
*/
if
(
pScrPriv
->
width
==
pScreen
->
width
&&
pScrPriv
->
height
==
pScreen
->
height
&&
pScrPriv
->
mmWidth
==
pScreen
->
mmWidth
&&
pScrPriv
->
mmHeight
==
pScreen
->
mmHeight
)
return
;
pScrPriv
->
width
=
pScreen
->
width
;
pScrPriv
->
height
=
pScreen
->
height
;
pScrPriv
->
mmWidth
=
pScreen
->
mmWidth
;
pScrPriv
->
mmHeight
=
pScreen
->
mmHeight
;
pScrPriv
->
changed
=
TRUE
;
/* pScrPriv->sizeChanged = TRUE; */
RRTellChanged
(
pScreen
);
RRSendConfigNotify
(
pScreen
);
RREditConnectionInfo
(
pScreen
);
RRPointerScreenConfigured
(
pScreen
);
/*
* Fix pointer bounds and location
*/
ScreenRestructured
(
pScreen
);
}
/*
* Request that the screen be resized
*/
Bool
RRScreenSizeSet
(
ScreenPtr
pScreen
,
CARD16
width
,
CARD16
height
,
CARD32
mmWidth
,
CARD32
mmHeight
)
{
rrScrPriv
(
pScreen
);
#if RANDR_12_INTERFACE
if
(
pScrPriv
->
rrScreenSetSize
)
{
return
(
*
pScrPriv
->
rrScreenSetSize
)
(
pScreen
,
width
,
height
,
mmWidth
,
mmHeight
);
}
#endif
#if RANDR_10_INTERFACE
if
(
pScrPriv
->
rrSetConfig
)
{
return
TRUE
;
/* can't set size separately */
}
#endif
return
FALSE
;
}
/*
* Retrieve valid screen size range
*/
int
ProcRRGetScreenSizeRange
(
ClientPtr
client
)
{
REQUEST
(
xRRGetScreenSizeRangeReq
);
xRRGetScreenSizeRangeReply
rep
;
WindowPtr
pWin
;
ScreenPtr
pScreen
;
rrScrPrivPtr
pScrPriv
;
int
rc
;
REQUEST_SIZE_MATCH
(
xRRGetScreenInfoReq
);
#ifndef NXAGENT_SERVER
rc
=
dixLookupWindow
(
&
pWin
,
stuff
->
window
,
client
,
DixReadAccess
);
#else
pWin
=
SecurityLookupWindow
(
stuff
->
window
,
client
,
SecurityReadAccess
);
rc
=
pWin
?
Success
:
BadWindow
;
#endif
if
(
rc
!=
Success
)
return
rc
;
pScreen
=
pWin
->
drawable
.
pScreen
;
pScrPriv
=
rrGetScrPriv
(
pScreen
);
rep
.
type
=
X_Reply
;
rep
.
pad
=
0
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
length
=
0
;
if
(
pScrPriv
)
{
if
(
!
RRGetInfo
(
pScreen
))
return
BadAlloc
;
rep
.
minWidth
=
pScrPriv
->
minWidth
;
rep
.
minHeight
=
pScrPriv
->
minHeight
;
rep
.
maxWidth
=
pScrPriv
->
maxWidth
;
rep
.
maxHeight
=
pScrPriv
->
maxHeight
;
}
else
{
rep
.
maxWidth
=
rep
.
minWidth
=
pScreen
->
width
;
rep
.
maxHeight
=
rep
.
minHeight
=
pScreen
->
height
;
}
if
(
client
->
swapped
)
{
int
n
;
swaps
(
&
rep
.
sequenceNumber
,
n
);
swapl
(
&
rep
.
length
,
n
);
swaps
(
&
rep
.
minWidth
,
n
);
swaps
(
&
rep
.
minHeight
,
n
);
swaps
(
&
rep
.
maxWidth
,
n
);
swaps
(
&
rep
.
maxHeight
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xRRGetScreenSizeRangeReply
),
(
char
*
)
&
rep
);
return
(
client
->
noClientException
);
}
int
ProcRRSetScreenSize
(
ClientPtr
client
)
{
REQUEST
(
xRRSetScreenSizeReq
);
WindowPtr
pWin
;
ScreenPtr
pScreen
;
rrScrPrivPtr
pScrPriv
;
int
i
,
rc
;
REQUEST_SIZE_MATCH
(
xRRSetScreenSizeReq
);
#ifndef NXAGENT_SERVER
rc
=
dixLookupWindow
(
&
pWin
,
stuff
->
window
,
client
,
DixReadAccess
);
#else
pWin
=
SecurityLookupWindow
(
stuff
->
window
,
client
,
SecurityReadAccess
);
rc
=
pWin
?
Success
:
BadWindow
;
#endif
if
(
rc
!=
Success
)
return
rc
;
pScreen
=
pWin
->
drawable
.
pScreen
;
pScrPriv
=
rrGetScrPriv
(
pScreen
);
if
(
stuff
->
width
<
pScrPriv
->
minWidth
||
pScrPriv
->
maxWidth
<
stuff
->
width
)
{
client
->
errorValue
=
stuff
->
width
;
return
BadValue
;
}
if
(
stuff
->
height
<
pScrPriv
->
minHeight
||
pScrPriv
->
maxHeight
<
stuff
->
height
)
{
client
->
errorValue
=
stuff
->
height
;
return
BadValue
;
}
for
(
i
=
0
;
i
<
pScrPriv
->
numCrtcs
;
i
++
)
{
RRCrtcPtr
crtc
=
pScrPriv
->
crtcs
[
i
];
RRModePtr
mode
=
crtc
->
mode
;
if
(
mode
)
{
int
source_width
=
mode
->
mode
.
width
;
int
source_height
=
mode
->
mode
.
height
;
Rotation
rotation
=
crtc
->
rotation
;
if
(
rotation
==
RR_Rotate_90
||
rotation
==
RR_Rotate_270
)
{
source_width
=
mode
->
mode
.
height
;
source_height
=
mode
->
mode
.
width
;
}
if
(
crtc
->
x
+
source_width
>
stuff
->
width
||
crtc
->
y
+
source_height
>
stuff
->
height
)
return
BadMatch
;
}
}
if
(
stuff
->
widthInMillimeters
==
0
||
stuff
->
heightInMillimeters
==
0
)
{
client
->
errorValue
=
0
;
return
BadValue
;
}
if
(
!
RRScreenSizeSet
(
pScreen
,
stuff
->
width
,
stuff
->
height
,
stuff
->
widthInMillimeters
,
stuff
->
heightInMillimeters
))
{
return
BadMatch
;
}
return
Success
;
}
int
ProcRRGetScreenResources
(
ClientPtr
client
)
{
REQUEST
(
xRRGetScreenResourcesReq
);
xRRGetScreenResourcesReply
rep
;
WindowPtr
pWin
;
ScreenPtr
pScreen
;
rrScrPrivPtr
pScrPriv
;
CARD8
*
extra
;
unsigned
long
extraLen
;
int
i
,
n
,
rc
;
RRCrtc
*
crtcs
;
RROutput
*
outputs
;
xRRModeInfo
*
modeinfos
;
CARD8
*
names
;
REQUEST_SIZE_MATCH
(
xRRGetScreenResourcesReq
);
#ifndef NXAGENT_SERVER
rc
=
dixLookupWindow
(
&
pWin
,
stuff
->
window
,
client
,
DixReadAccess
);
#else
pWin
=
SecurityLookupWindow
(
stuff
->
window
,
client
,
SecurityReadAccess
);
rc
=
pWin
?
Success
:
BadWindow
;
#endif
if
(
rc
!=
Success
)
return
rc
;
pScreen
=
pWin
->
drawable
.
pScreen
;
pScrPriv
=
rrGetScrPriv
(
pScreen
);
rep
.
pad
=
0
;
if
(
pScrPriv
)
if
(
!
RRGetInfo
(
pScreen
))
return
BadAlloc
;
if
(
!
pScrPriv
)
{
rep
.
type
=
X_Reply
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
length
=
0
;
rep
.
timestamp
=
currentTime
.
milliseconds
;
rep
.
configTimestamp
=
currentTime
.
milliseconds
;
rep
.
nCrtcs
=
0
;
rep
.
nOutputs
=
0
;
rep
.
nModes
=
0
;
rep
.
nbytesNames
=
0
;
extra
=
NULL
;
extraLen
=
0
;
}
else
{
RRModePtr
*
modes
;
int
num_modes
;
modes
=
RRModesForScreen
(
pScreen
,
&
num_modes
);
if
(
!
modes
)
return
BadAlloc
;
rep
.
type
=
X_Reply
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
length
=
0
;
rep
.
timestamp
=
pScrPriv
->
lastSetTime
.
milliseconds
;
rep
.
configTimestamp
=
pScrPriv
->
lastConfigTime
.
milliseconds
;
rep
.
nCrtcs
=
pScrPriv
->
numCrtcs
;
rep
.
nOutputs
=
pScrPriv
->
numOutputs
;
rep
.
nModes
=
num_modes
;
rep
.
nbytesNames
=
0
;
for
(
i
=
0
;
i
<
num_modes
;
i
++
)
rep
.
nbytesNames
+=
modes
[
i
]
->
mode
.
nameLength
;
rep
.
length
=
(
pScrPriv
->
numCrtcs
+
pScrPriv
->
numOutputs
+
num_modes
*
(
SIZEOF
(
xRRModeInfo
)
>>
2
)
+
((
rep
.
nbytesNames
+
3
)
>>
2
));
extraLen
=
rep
.
length
<<
2
;
if
(
extraLen
)
{
extra
=
xalloc
(
extraLen
);
if
(
!
extra
)
{
xfree
(
modes
);
return
BadAlloc
;
}
}
else
extra
=
NULL
;
crtcs
=
(
RRCrtc
*
)
extra
;
outputs
=
(
RROutput
*
)
(
crtcs
+
pScrPriv
->
numCrtcs
);
modeinfos
=
(
xRRModeInfo
*
)
(
outputs
+
pScrPriv
->
numOutputs
);
names
=
(
CARD8
*
)
(
modeinfos
+
num_modes
);
for
(
i
=
0
;
i
<
pScrPriv
->
numCrtcs
;
i
++
)
{
crtcs
[
i
]
=
pScrPriv
->
crtcs
[
i
]
->
id
;
if
(
client
->
swapped
)
swapl
(
&
crtcs
[
i
],
n
);
}
for
(
i
=
0
;
i
<
pScrPriv
->
numOutputs
;
i
++
)
{
outputs
[
i
]
=
pScrPriv
->
outputs
[
i
]
->
id
;
if
(
client
->
swapped
)
swapl
(
&
outputs
[
i
],
n
);
}
for
(
i
=
0
;
i
<
num_modes
;
i
++
)
{
RRModePtr
mode
=
modes
[
i
];
modeinfos
[
i
]
=
mode
->
mode
;
if
(
client
->
swapped
)
{
swapl
(
&
modeinfos
[
i
].
id
,
n
);
swaps
(
&
modeinfos
[
i
].
width
,
n
);
swaps
(
&
modeinfos
[
i
].
height
,
n
);
swapl
(
&
modeinfos
[
i
].
dotClock
,
n
);
swaps
(
&
modeinfos
[
i
].
hSyncStart
,
n
);
swaps
(
&
modeinfos
[
i
].
hSyncEnd
,
n
);
swaps
(
&
modeinfos
[
i
].
hTotal
,
n
);
swaps
(
&
modeinfos
[
i
].
hSkew
,
n
);
swaps
(
&
modeinfos
[
i
].
vSyncStart
,
n
);
swaps
(
&
modeinfos
[
i
].
vSyncEnd
,
n
);
swaps
(
&
modeinfos
[
i
].
vTotal
,
n
);
swaps
(
&
modeinfos
[
i
].
nameLength
,
n
);
swapl
(
&
modeinfos
[
i
].
modeFlags
,
n
);
}
memcpy
(
names
,
mode
->
name
,
mode
->
mode
.
nameLength
);
names
+=
mode
->
mode
.
nameLength
;
}
xfree
(
modes
);
assert
(((((
char
*
)
names
-
(
char
*
)
extra
)
+
3
)
>>
2
)
==
rep
.
length
);
}
if
(
client
->
swapped
)
{
swaps
(
&
rep
.
sequenceNumber
,
n
);
swapl
(
&
rep
.
length
,
n
);
swapl
(
&
rep
.
timestamp
,
n
);
swapl
(
&
rep
.
configTimestamp
,
n
);
swaps
(
&
rep
.
nCrtcs
,
n
);
swaps
(
&
rep
.
nOutputs
,
n
);
swaps
(
&
rep
.
nModes
,
n
);
swaps
(
&
rep
.
nbytesNames
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xRRGetScreenResourcesReply
),
(
char
*
)
&
rep
);
if
(
extraLen
)
{
WriteToClient
(
client
,
extraLen
,
(
char
*
)
extra
);
xfree
(
extra
);
}
return
client
->
noClientException
;
}
typedef
struct
_RR10Data
{
RRScreenSizePtr
sizes
;
int
nsize
;
int
nrefresh
;
int
size
;
CARD16
refresh
;
}
RR10DataRec
,
*
RR10DataPtr
;
/*
* Convert 1.2 monitor data into 1.0 screen data
*/
static
RR10DataPtr
RR10GetData
(
ScreenPtr
pScreen
,
RROutputPtr
output
)
{
RR10DataPtr
data
;
RRScreenSizePtr
size
;
int
nmode
=
output
->
numModes
+
output
->
numUserModes
;
int
o
,
os
,
l
,
r
;
RRScreenRatePtr
refresh
;
CARD16
vRefresh
;
RRModePtr
mode
;
Bool
*
used
;
/* Make sure there is plenty of space for any combination */
data
=
malloc
(
sizeof
(
RR10DataRec
)
+
sizeof
(
RRScreenSize
)
*
nmode
+
sizeof
(
RRScreenRate
)
*
nmode
+
sizeof
(
Bool
)
*
nmode
);
if
(
!
data
)
return
NULL
;
size
=
(
RRScreenSizePtr
)
(
data
+
1
);
refresh
=
(
RRScreenRatePtr
)
(
size
+
nmode
);
used
=
(
Bool
*
)
(
refresh
+
nmode
);
memset
(
used
,
'\0'
,
sizeof
(
Bool
)
*
nmode
);
data
->
sizes
=
size
;
data
->
nsize
=
0
;
data
->
nrefresh
=
0
;
data
->
size
=
0
;
data
->
refresh
=
0
;
/*
* find modes not yet listed
*/
for
(
o
=
0
;
o
<
output
->
numModes
+
output
->
numUserModes
;
o
++
)
{
if
(
used
[
o
])
continue
;
if
(
o
<
output
->
numModes
)
mode
=
output
->
modes
[
o
];
else
mode
=
output
->
userModes
[
o
-
output
->
numModes
];
l
=
data
->
nsize
;
size
[
l
].
id
=
data
->
nsize
;
size
[
l
].
width
=
mode
->
mode
.
width
;
size
[
l
].
height
=
mode
->
mode
.
height
;
if
(
output
->
mmWidth
&&
output
->
mmHeight
)
{
size
[
l
].
mmWidth
=
output
->
mmWidth
;
size
[
l
].
mmHeight
=
output
->
mmHeight
;
}
else
{
size
[
l
].
mmWidth
=
pScreen
->
mmWidth
;
size
[
l
].
mmHeight
=
pScreen
->
mmHeight
;
}
size
[
l
].
nRates
=
0
;
size
[
l
].
pRates
=
&
refresh
[
data
->
nrefresh
];
data
->
nsize
++
;
/*
* Find all modes with matching size
*/
for
(
os
=
o
;
os
<
output
->
numModes
+
output
->
numUserModes
;
os
++
)
{
if
(
os
<
output
->
numModes
)
mode
=
output
->
modes
[
os
];
else
mode
=
output
->
userModes
[
os
-
output
->
numModes
];
if
(
mode
->
mode
.
width
==
size
[
l
].
width
&&
mode
->
mode
.
height
==
size
[
l
].
height
)
{
vRefresh
=
RRVerticalRefresh
(
&
mode
->
mode
);
used
[
os
]
=
TRUE
;
for
(
r
=
0
;
r
<
size
[
l
].
nRates
;
r
++
)
if
(
vRefresh
==
size
[
l
].
pRates
[
r
].
rate
)
break
;
if
(
r
==
size
[
l
].
nRates
)
{
size
[
l
].
pRates
[
r
].
rate
=
vRefresh
;
size
[
l
].
pRates
[
r
].
mode
=
mode
;
size
[
l
].
nRates
++
;
data
->
nrefresh
++
;
}
if
(
mode
==
output
->
crtc
->
mode
)
{
data
->
size
=
l
;
data
->
refresh
=
vRefresh
;
}
}
}
}
return
data
;
}
int
ProcRRGetScreenInfo
(
ClientPtr
client
)
{
REQUEST
(
xRRGetScreenInfoReq
);
xRRGetScreenInfoReply
rep
;
WindowPtr
pWin
;
int
n
,
rc
;
ScreenPtr
pScreen
;
rrScrPrivPtr
pScrPriv
;
CARD8
*
extra
;
unsigned
long
extraLen
;
RROutputPtr
output
;
REQUEST_SIZE_MATCH
(
xRRGetScreenInfoReq
);
#ifndef NXAGENT_SERVER
rc
=
dixLookupWindow
(
&
pWin
,
stuff
->
window
,
client
,
DixReadAccess
);
#else
pWin
=
SecurityLookupWindow
(
stuff
->
window
,
client
,
SecurityReadAccess
);
rc
=
pWin
?
Success
:
BadWindow
;
#endif
if
(
rc
!=
Success
)
return
rc
;
pScreen
=
pWin
->
drawable
.
pScreen
;
pScrPriv
=
rrGetScrPriv
(
pScreen
);
rep
.
pad
=
0
;
if
(
pScrPriv
)
if
(
!
RRGetInfo
(
pScreen
))
return
BadAlloc
;
output
=
RRFirstOutput
(
pScreen
);
if
(
!
pScrPriv
||
!
output
)
{
rep
.
type
=
X_Reply
;
rep
.
setOfRotations
=
RR_Rotate_0
;;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
length
=
0
;
rep
.
root
=
WindowTable
[
pWin
->
drawable
.
pScreen
->
myNum
]
->
drawable
.
id
;
rep
.
timestamp
=
currentTime
.
milliseconds
;
rep
.
configTimestamp
=
currentTime
.
milliseconds
;
rep
.
nSizes
=
0
;
rep
.
sizeID
=
0
;
rep
.
rotation
=
RR_Rotate_0
;
rep
.
rate
=
0
;
rep
.
nrateEnts
=
0
;
extra
=
0
;
extraLen
=
0
;
}
else
{
int
i
,
j
;
xScreenSizes
*
size
;
CARD16
*
rates
;
CARD8
*
data8
;
Bool
has_rate
=
RRClientKnowsRates
(
client
);
RR10DataPtr
pData
;
RRScreenSizePtr
pSize
;
pData
=
RR10GetData
(
pScreen
,
output
);
if
(
!
pData
)
return
BadAlloc
;
rep
.
type
=
X_Reply
;
rep
.
setOfRotations
=
output
->
crtc
->
rotations
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
length
=
0
;
rep
.
root
=
WindowTable
[
pWin
->
drawable
.
pScreen
->
myNum
]
->
drawable
.
id
;
rep
.
timestamp
=
pScrPriv
->
lastSetTime
.
milliseconds
;
rep
.
configTimestamp
=
pScrPriv
->
lastConfigTime
.
milliseconds
;
rep
.
rotation
=
output
->
crtc
->
rotation
;
rep
.
nSizes
=
pData
->
nsize
;
rep
.
nrateEnts
=
pData
->
nrefresh
+
pData
->
nsize
;
rep
.
sizeID
=
pData
->
size
;
rep
.
rate
=
pData
->
refresh
;
extraLen
=
(
rep
.
nSizes
*
sizeof
(
xScreenSizes
)
+
rep
.
nrateEnts
*
sizeof
(
CARD16
));
if
(
extraLen
)
{
extra
=
(
CARD8
*
)
xalloc
(
extraLen
);
if
(
!
extra
)
{
xfree
(
pData
);
return
BadAlloc
;
}
}
else
extra
=
NULL
;
/*
* First comes the size information
*/
size
=
(
xScreenSizes
*
)
extra
;
rates
=
(
CARD16
*
)
(
size
+
rep
.
nSizes
);
for
(
i
=
0
;
i
<
pData
->
nsize
;
i
++
)
{
pSize
=
&
pData
->
sizes
[
i
];
size
->
widthInPixels
=
pSize
->
width
;
size
->
heightInPixels
=
pSize
->
height
;
size
->
widthInMillimeters
=
pSize
->
mmWidth
;
size
->
heightInMillimeters
=
pSize
->
mmHeight
;
if
(
client
->
swapped
)
{
swaps
(
&
size
->
widthInPixels
,
n
);
swaps
(
&
size
->
heightInPixels
,
n
);
swaps
(
&
size
->
widthInMillimeters
,
n
);
swaps
(
&
size
->
heightInMillimeters
,
n
);
}
size
++
;
if
(
has_rate
)
{
*
rates
=
pSize
->
nRates
;
if
(
client
->
swapped
)
{
swaps
(
rates
,
n
);
}
rates
++
;
for
(
j
=
0
;
j
<
pSize
->
nRates
;
j
++
)
{
*
rates
=
pSize
->
pRates
[
j
].
rate
;
if
(
client
->
swapped
)
{
swaps
(
rates
,
n
);
}
rates
++
;
}
}
}
xfree
(
pData
);
data8
=
(
CARD8
*
)
rates
;
if
(
data8
-
(
CARD8
*
)
extra
!=
extraLen
)
FatalError
(
"RRGetScreenInfo bad extra len %ld != %ld
\n
"
,
(
unsigned
long
)(
data8
-
(
CARD8
*
)
extra
),
extraLen
);
rep
.
length
=
(
extraLen
+
3
)
>>
2
;
}
if
(
client
->
swapped
)
{
swaps
(
&
rep
.
sequenceNumber
,
n
);
swapl
(
&
rep
.
length
,
n
);
swapl
(
&
rep
.
timestamp
,
n
);
swaps
(
&
rep
.
rotation
,
n
);
swaps
(
&
rep
.
nSizes
,
n
);
swaps
(
&
rep
.
sizeID
,
n
);
swaps
(
&
rep
.
rate
,
n
);
swaps
(
&
rep
.
nrateEnts
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xRRGetScreenInfoReply
),
(
char
*
)
&
rep
);
if
(
extraLen
)
{
WriteToClient
(
client
,
extraLen
,
(
char
*
)
extra
);
xfree
(
extra
);
}
return
(
client
->
noClientException
);
}
int
ProcRRSetScreenConfig
(
ClientPtr
client
)
{
REQUEST
(
xRRSetScreenConfigReq
);
xRRSetScreenConfigReply
rep
;
DrawablePtr
pDraw
;
int
n
,
rc
;
ScreenPtr
pScreen
;
rrScrPrivPtr
pScrPriv
;
TimeStamp
time
;
int
i
;
Rotation
rotation
;
int
rate
;
Bool
has_rate
;
RROutputPtr
output
;
RRCrtcPtr
crtc
;
RRModePtr
mode
;
RR10DataPtr
pData
=
NULL
;
RRScreenSizePtr
pSize
;
int
width
,
height
;
UpdateCurrentTime
();
if
(
RRClientKnowsRates
(
client
))
{
REQUEST_SIZE_MATCH
(
xRRSetScreenConfigReq
);
has_rate
=
TRUE
;
}
else
{
REQUEST_SIZE_MATCH
(
xRR1_0SetScreenConfigReq
);
has_rate
=
FALSE
;
}
#ifndef NXAGENT_SERVER
rc
=
dixLookupDrawable
(
&
pDraw
,
stuff
->
drawable
,
client
,
0
,
DixWriteAccess
);
#else
pDraw
=
SecurityLookupDrawable
(
stuff
->
drawable
,
client
,
SecurityWriteAccess
);
rc
=
pDraw
?
Success
:
BadDrawable
;
#endif
if
(
rc
!=
Success
)
return
rc
;
pScreen
=
pDraw
->
pScreen
;
pScrPriv
=
rrGetScrPriv
(
pScreen
);
time
=
ClientTimeToServerTime
(
stuff
->
timestamp
);
if
(
!
pScrPriv
)
{
time
=
currentTime
;
rep
.
status
=
RRSetConfigFailed
;
goto
sendReply
;
}
if
(
!
RRGetInfo
(
pScreen
))
return
BadAlloc
;
output
=
RRFirstOutput
(
pScreen
);
if
(
!
output
)
{
time
=
currentTime
;
rep
.
status
=
RRSetConfigFailed
;
goto
sendReply
;
}
crtc
=
output
->
crtc
;
/*
* If the client's config timestamp is not the same as the last config
* timestamp, then the config information isn't up-to-date and
* can't even be validated.
*
* Note that the client only knows about the milliseconds part of the
* timestamp, so using CompareTimeStamps here would cause randr to suddenly
* stop working after several hours have passed (freedesktop bug #6502).
*/
if
(
stuff
->
configTimestamp
!=
pScrPriv
->
lastConfigTime
.
milliseconds
)
{
rep
.
status
=
RRSetConfigInvalidConfigTime
;
goto
sendReply
;
}
pData
=
RR10GetData
(
pScreen
,
output
);
if
(
!
pData
)
return
BadAlloc
;
if
(
stuff
->
sizeID
>=
pData
->
nsize
)
{
/*
* Invalid size ID
*/
client
->
errorValue
=
stuff
->
sizeID
;
xfree
(
pData
);
return
BadValue
;
}
pSize
=
&
pData
->
sizes
[
stuff
->
sizeID
];
/*
* Validate requested rotation
*/
rotation
=
(
Rotation
)
stuff
->
rotation
;
/* test the rotation bits only! */
switch
(
rotation
&
0xf
)
{
case
RR_Rotate_0
:
case
RR_Rotate_90
:
case
RR_Rotate_180
:
case
RR_Rotate_270
:
break
;
default:
/*
* Invalid rotation
*/
client
->
errorValue
=
stuff
->
rotation
;
xfree
(
pData
);
return
BadValue
;
}
if
((
~
crtc
->
rotations
)
&
rotation
)
{
/*
* requested rotation or reflection not supported by screen
*/
client
->
errorValue
=
stuff
->
rotation
;
xfree
(
pData
);
return
BadMatch
;
}
/*
* Validate requested refresh
*/
if
(
has_rate
)
rate
=
(
int
)
stuff
->
rate
;
else
rate
=
0
;
if
(
rate
)
{
for
(
i
=
0
;
i
<
pSize
->
nRates
;
i
++
)
{
if
(
pSize
->
pRates
[
i
].
rate
==
rate
)
break
;
}
if
(
i
==
pSize
->
nRates
)
{
/*
* Invalid rate
*/
client
->
errorValue
=
rate
;
xfree
(
pData
);
return
BadValue
;
}
mode
=
pSize
->
pRates
[
i
].
mode
;
}
else
mode
=
pSize
->
pRates
[
0
].
mode
;
/*
* Make sure the requested set-time is not older than
* the last set-time
*/
if
(
CompareTimeStamps
(
time
,
pScrPriv
->
lastSetTime
)
<
0
)
{
rep
.
status
=
RRSetConfigInvalidTime
;
goto
sendReply
;
}
/*
* If the screen size is changing, adjust all of the other outputs
* to fit the new size, mirroring as much as possible
*/
width
=
mode
->
mode
.
width
;
height
=
mode
->
mode
.
height
;
if
(
rotation
&
(
RR_Rotate_90
|
RR_Rotate_270
))
{
width
=
mode
->
mode
.
height
;
height
=
mode
->
mode
.
width
;
}
if
(
width
!=
pScreen
->
width
||
height
!=
pScreen
->
height
)
{
int
c
;
for
(
c
=
0
;
c
<
pScrPriv
->
numCrtcs
;
c
++
)
{
if
(
!
RRCrtcSet
(
pScrPriv
->
crtcs
[
c
],
NULL
,
0
,
0
,
RR_Rotate_0
,
0
,
NULL
))
{
rep
.
status
=
RRSetConfigFailed
;
/* XXX recover from failure */
goto
sendReply
;
}
}
if
(
!
RRScreenSizeSet
(
pScreen
,
width
,
height
,
pScreen
->
mmWidth
,
pScreen
->
mmHeight
))
{
rep
.
status
=
RRSetConfigFailed
;
/* XXX recover from failure */
goto
sendReply
;
}
}
if
(
!
RRCrtcSet
(
crtc
,
mode
,
0
,
0
,
stuff
->
rotation
,
1
,
&
output
))
rep
.
status
=
RRSetConfigFailed
;
#ifndef NXAGENT_SERVER
/* Bug 21987 */
else
rep
.
status
=
RRSetConfigSuccess
;
#else
else
{
rep
.
status
=
RRSetConfigSuccess
;
pScrPriv
->
lastSetTime
=
time
;
}
#endif
/*
* XXX Configure other crtcs to mirror as much as possible
*/
sendReply:
if
(
pData
)
xfree
(
pData
);
rep
.
type
=
X_Reply
;
/* rep.status has already been filled in */
rep
.
length
=
0
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
newTimestamp
=
pScrPriv
->
lastSetTime
.
milliseconds
;
rep
.
newConfigTimestamp
=
pScrPriv
->
lastConfigTime
.
milliseconds
;
rep
.
root
=
WindowTable
[
pDraw
->
pScreen
->
myNum
]
->
drawable
.
id
;
if
(
client
->
swapped
)
{
swaps
(
&
rep
.
sequenceNumber
,
n
);
swapl
(
&
rep
.
length
,
n
);
swapl
(
&
rep
.
newTimestamp
,
n
);
swapl
(
&
rep
.
newConfigTimestamp
,
n
);
swapl
(
&
rep
.
root
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xRRSetScreenConfigReply
),
(
char
*
)
&
rep
);
return
(
client
->
noClientException
);
}
static
CARD16
RR10CurrentSizeID
(
ScreenPtr
pScreen
)
{
CARD16
sizeID
=
0xffff
;
RROutputPtr
output
=
RRFirstOutput
(
pScreen
);
if
(
output
)
{
RR10DataPtr
data
=
RR10GetData
(
pScreen
,
output
);
if
(
data
)
{
int
i
;
for
(
i
=
0
;
i
<
data
->
nsize
;
i
++
)
if
(
data
->
sizes
[
i
].
width
==
pScreen
->
width
&&
data
->
sizes
[
i
].
height
==
pScreen
->
height
)
{
sizeID
=
(
CARD16
)
i
;
break
;
}
xfree
(
data
);
}
}
return
sizeID
;
}
nx-X11/programs/Xserver/randr/rrscreen.c.NX.original
0 → 100644
View file @
15cee47a
/*
* Copyright © 2006 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
/**************************************************************************/
/* */
/* Copyright (c) 2001, 2011 NoMachine, http://www.nomachine.com/. */
/* */
/* NX-X11, NX protocol compression and NX extensions to this software */
/* are copyright of NoMachine. Redistribution and use of the present */
/* software is allowed according to terms specified in the file LICENSE */
/* which comes in the source distribution. */
/* */
/* Check http://www.nomachine.com/licensing.html for applicability. */
/* */
/* NX and NoMachine are trademarks of Medialogic S.p.A. */
/* */
/* All rights reserved. */
/* */
/**************************************************************************/
#include "randrstr.h"
extern char *ConnectionInfo;
static int padlength[4] = {0, 3, 2, 1};
static CARD16
RR10CurrentSizeID (ScreenPtr pScreen);
/*
* Edit connection information block so that new clients
* see the current screen size on connect
*/
static void
RREditConnectionInfo (ScreenPtr pScreen)
{
xConnSetup *connSetup;
char *vendor;
xPixmapFormat *formats;
xWindowRoot *root;
xDepth *depth;
xVisualType *visual;
int screen = 0;
int d;
connSetup = (xConnSetup *) ConnectionInfo;
vendor = (char *) connSetup + sizeof (xConnSetup);
formats = (xPixmapFormat *) ((char *) vendor +
connSetup->nbytesVendor +
padlength[connSetup->nbytesVendor & 3]);
root = (xWindowRoot *) ((char *) formats +
sizeof (xPixmapFormat) * screenInfo.numPixmapFormats);
while (screen != pScreen->myNum)
{
depth = (xDepth *) ((char *) root +
sizeof (xWindowRoot));
for (d = 0; d < root->nDepths; d++)
{
visual = (xVisualType *) ((char *) depth +
sizeof (xDepth));
depth = (xDepth *) ((char *) visual +
depth->nVisuals * sizeof (xVisualType));
}
root = (xWindowRoot *) ((char *) depth);
screen++;
}
root->pixWidth = pScreen->width;
root->pixHeight = pScreen->height;
root->mmWidth = pScreen->mmWidth;
root->mmHeight = pScreen->mmHeight;
}
void
RRSendConfigNotify (ScreenPtr pScreen)
{
WindowPtr pWin = WindowTable[pScreen->myNum];
xEvent event;
event.u.u.type = ConfigureNotify;
event.u.configureNotify.window = pWin->drawable.id;
event.u.configureNotify.aboveSibling = None;
event.u.configureNotify.x = 0;
event.u.configureNotify.y = 0;
/* XXX xinerama stuff ? */
event.u.configureNotify.width = pWin->drawable.width;
event.u.configureNotify.height = pWin->drawable.height;
event.u.configureNotify.borderWidth = wBorderWidth (pWin);
event.u.configureNotify.override = pWin->overrideRedirect;
DeliverEvents(pWin, &event, 1, NullWindow);
}
void
RRDeliverScreenEvent (ClientPtr client, WindowPtr pWin, ScreenPtr pScreen)
{
rrScrPriv (pScreen);
xRRScreenChangeNotifyEvent se;
RRCrtcPtr crtc = pScrPriv->numCrtcs ? pScrPriv->crtcs[0] : NULL;
WindowPtr pRoot = WindowTable[pScreen->myNum];
se.type = RRScreenChangeNotify + RREventBase;
se.rotation = (CARD8) (crtc ? crtc->rotation : RR_Rotate_0);
se.timestamp = pScrPriv->lastSetTime.milliseconds;
se.sequenceNumber = client->sequence;
se.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
se.root = pRoot->drawable.id;
se.window = pWin->drawable.id;
#ifdef RENDER
se.subpixelOrder = PictureGetSubpixelOrder (pScreen);
#else
se.subpixelOrder = SubPixelUnknown;
#endif
se.sequenceNumber = client->sequence;
se.sizeID = RR10CurrentSizeID (pScreen);
if (se.rotation & (RR_Rotate_90 | RR_Rotate_270)) {
se.widthInPixels = pScreen->height;
se.heightInPixels = pScreen->width;
se.widthInMillimeters = pScreen->mmHeight;
se.heightInMillimeters = pScreen->mmWidth;
} else {
se.widthInPixels = pScreen->width;
se.heightInPixels = pScreen->height;
se.widthInMillimeters = pScreen->mmWidth;
se.heightInMillimeters = pScreen->mmHeight;
}
WriteEventsToClient (client, 1, (xEvent *) &se);
}
/*
* Notify the extension that the screen size has been changed.
* The driver is responsible for calling this whenever it has changed
* the size of the screen
*/
void
RRScreenSizeNotify (ScreenPtr pScreen)
{
rrScrPriv(pScreen);
/*
* Deliver ConfigureNotify events when root changes
* pixel size
*/
if (pScrPriv->width == pScreen->width &&
pScrPriv->height == pScreen->height &&
pScrPriv->mmWidth == pScreen->mmWidth &&
pScrPriv->mmHeight == pScreen->mmHeight)
return;
pScrPriv->width = pScreen->width;
pScrPriv->height = pScreen->height;
pScrPriv->mmWidth = pScreen->mmWidth;
pScrPriv->mmHeight = pScreen->mmHeight;
pScrPriv->changed = TRUE;
/* pScrPriv->sizeChanged = TRUE; */
RRTellChanged (pScreen);
RRSendConfigNotify (pScreen);
RREditConnectionInfo (pScreen);
RRPointerScreenConfigured (pScreen);
/*
* Fix pointer bounds and location
*/
ScreenRestructured (pScreen);
}
/*
* Request that the screen be resized
*/
Bool
RRScreenSizeSet (ScreenPtr pScreen,
CARD16 width,
CARD16 height,
CARD32 mmWidth,
CARD32 mmHeight)
{
rrScrPriv(pScreen);
#if RANDR_12_INTERFACE
if (pScrPriv->rrScreenSetSize)
{
return (*pScrPriv->rrScreenSetSize) (pScreen,
width, height,
mmWidth, mmHeight);
}
#endif
#if RANDR_10_INTERFACE
if (pScrPriv->rrSetConfig)
{
return TRUE; /* can't set size separately */
}
#endif
return FALSE;
}
/*
* Retrieve valid screen size range
*/
int
ProcRRGetScreenSizeRange (ClientPtr client)
{
REQUEST(xRRGetScreenSizeRangeReq);
xRRGetScreenSizeRangeReply rep;
WindowPtr pWin;
ScreenPtr pScreen;
rrScrPrivPtr pScrPriv;
int rc;
REQUEST_SIZE_MATCH(xRRGetScreenInfoReq);
#ifndef NXAGENT_SERVER
rc = dixLookupWindow(&pWin, stuff->window, client, DixReadAccess);
#else
pWin = SecurityLookupWindow(stuff->window, client, SecurityReadAccess);
rc = pWin ? Success : BadWindow;
#endif
if (rc != Success)
return rc;
pScreen = pWin->drawable.pScreen;
pScrPriv = rrGetScrPriv(pScreen);
rep.type = X_Reply;
rep.pad = 0;
rep.sequenceNumber = client->sequence;
rep.length = 0;
if (pScrPriv)
{
if (!RRGetInfo (pScreen))
return BadAlloc;
rep.minWidth = pScrPriv->minWidth;
rep.minHeight = pScrPriv->minHeight;
rep.maxWidth = pScrPriv->maxWidth;
rep.maxHeight = pScrPriv->maxHeight;
}
else
{
rep.maxWidth = rep.minWidth = pScreen->width;
rep.maxHeight = rep.minHeight = pScreen->height;
}
if (client->swapped)
{
int n;
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swaps(&rep.minWidth, n);
swaps(&rep.minHeight, n);
swaps(&rep.maxWidth, n);
swaps(&rep.maxHeight, n);
}
WriteToClient(client, sizeof(xRRGetScreenSizeRangeReply), (char *)&rep);
return (client->noClientException);
}
int
ProcRRSetScreenSize (ClientPtr client)
{
REQUEST(xRRSetScreenSizeReq);
WindowPtr pWin;
ScreenPtr pScreen;
rrScrPrivPtr pScrPriv;
int i, rc;
REQUEST_SIZE_MATCH(xRRSetScreenSizeReq);
#ifndef NXAGENT_SERVER
rc = dixLookupWindow(&pWin, stuff->window, client, DixReadAccess);
#else
pWin = SecurityLookupWindow(stuff->window, client, SecurityReadAccess);
rc = pWin ? Success : BadWindow;
#endif
if (rc != Success)
return rc;
pScreen = pWin->drawable.pScreen;
pScrPriv = rrGetScrPriv(pScreen);
if (stuff->width < pScrPriv->minWidth || pScrPriv->maxWidth < stuff->width)
{
client->errorValue = stuff->width;
return BadValue;
}
if (stuff->height < pScrPriv->minHeight ||
pScrPriv->maxHeight < stuff->height)
{
client->errorValue = stuff->height;
return BadValue;
}
for (i = 0; i < pScrPriv->numCrtcs; i++)
{
RRCrtcPtr crtc = pScrPriv->crtcs[i];
RRModePtr mode = crtc->mode;
if (mode)
{
int source_width = mode->mode.width;
int source_height = mode->mode.height;
Rotation rotation = crtc->rotation;
if (rotation == RR_Rotate_90 || rotation == RR_Rotate_270)
{
source_width = mode->mode.height;
source_height = mode->mode.width;
}
if (crtc->x + source_width > stuff->width ||
crtc->y + source_height > stuff->height)
return BadMatch;
}
}
if (stuff->widthInMillimeters == 0 || stuff->heightInMillimeters == 0)
{
client->errorValue = 0;
return BadValue;
}
if (!RRScreenSizeSet (pScreen,
stuff->width, stuff->height,
stuff->widthInMillimeters,
stuff->heightInMillimeters))
{
return BadMatch;
}
return Success;
}
int
ProcRRGetScreenResources (ClientPtr client)
{
REQUEST(xRRGetScreenResourcesReq);
xRRGetScreenResourcesReply rep;
WindowPtr pWin;
ScreenPtr pScreen;
rrScrPrivPtr pScrPriv;
CARD8 *extra;
unsigned long extraLen;
int i, n, rc;
RRCrtc *crtcs;
RROutput *outputs;
xRRModeInfo *modeinfos;
CARD8 *names;
REQUEST_SIZE_MATCH(xRRGetScreenResourcesReq);
#ifndef NXAGENT_SERVER
rc = dixLookupWindow(&pWin, stuff->window, client, DixReadAccess);
#else
pWin = SecurityLookupWindow(stuff->window, client, SecurityReadAccess);
rc = pWin ? Success : BadWindow;
#endif
if (rc != Success)
return rc;
pScreen = pWin->drawable.pScreen;
pScrPriv = rrGetScrPriv(pScreen);
rep.pad = 0;
if (pScrPriv)
if (!RRGetInfo (pScreen))
return BadAlloc;
if (!pScrPriv)
{
rep.type = X_Reply;
rep.sequenceNumber = client->sequence;
rep.length = 0;
rep.timestamp = currentTime.milliseconds;
rep.configTimestamp = currentTime.milliseconds;
rep.nCrtcs = 0;
rep.nOutputs = 0;
rep.nModes = 0;
rep.nbytesNames = 0;
extra = NULL;
extraLen = 0;
}
else
{
RRModePtr *modes;
int num_modes;
modes = RRModesForScreen (pScreen, &num_modes);
if (!modes)
return BadAlloc;
rep.type = X_Reply;
rep.sequenceNumber = client->sequence;
rep.length = 0;
rep.timestamp = pScrPriv->lastSetTime.milliseconds;
rep.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
rep.nCrtcs = pScrPriv->numCrtcs;
rep.nOutputs = pScrPriv->numOutputs;
rep.nModes = num_modes;
rep.nbytesNames = 0;
for (i = 0; i < num_modes; i++)
rep.nbytesNames += modes[i]->mode.nameLength;
rep.length = (pScrPriv->numCrtcs +
pScrPriv->numOutputs +
num_modes * (SIZEOF(xRRModeInfo) >> 2) +
((rep.nbytesNames + 3) >> 2));
extraLen = rep.length << 2;
if (extraLen)
{
extra = xalloc (extraLen);
if (!extra)
{
xfree (modes);
return BadAlloc;
}
}
else
extra = NULL;
crtcs = (RRCrtc *) extra;
outputs = (RROutput *) (crtcs + pScrPriv->numCrtcs);
modeinfos = (xRRModeInfo *) (outputs + pScrPriv->numOutputs);
names = (CARD8 *) (modeinfos + num_modes);
for (i = 0; i < pScrPriv->numCrtcs; i++)
{
crtcs[i] = pScrPriv->crtcs[i]->id;
if (client->swapped)
swapl (&crtcs[i], n);
}
for (i = 0; i < pScrPriv->numOutputs; i++)
{
outputs[i] = pScrPriv->outputs[i]->id;
if (client->swapped)
swapl (&outputs[i], n);
}
for (i = 0; i < num_modes; i++)
{
RRModePtr mode = modes[i];
modeinfos[i] = mode->mode;
if (client->swapped)
{
swapl (&modeinfos[i].id, n);
swaps (&modeinfos[i].width, n);
swaps (&modeinfos[i].height, n);
swapl (&modeinfos[i].dotClock, n);
swaps (&modeinfos[i].hSyncStart, n);
swaps (&modeinfos[i].hSyncEnd, n);
swaps (&modeinfos[i].hTotal, n);
swaps (&modeinfos[i].hSkew, n);
swaps (&modeinfos[i].vSyncStart, n);
swaps (&modeinfos[i].vSyncEnd, n);
swaps (&modeinfos[i].vTotal, n);
swaps (&modeinfos[i].nameLength, n);
swapl (&modeinfos[i].modeFlags, n);
}
memcpy (names, mode->name,
mode->mode.nameLength);
names += mode->mode.nameLength;
}
xfree (modes);
assert (((((char *) names - (char *) extra) + 3) >> 2) == rep.length);
}
if (client->swapped) {
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swapl(&rep.timestamp, n);
swapl(&rep.configTimestamp, n);
swaps(&rep.nCrtcs, n);
swaps(&rep.nOutputs, n);
swaps(&rep.nModes, n);
swaps(&rep.nbytesNames, n);
}
WriteToClient(client, sizeof(xRRGetScreenResourcesReply), (char *)&rep);
if (extraLen)
{
WriteToClient (client, extraLen, (char *) extra);
xfree (extra);
}
return client->noClientException;
}
typedef struct _RR10Data {
RRScreenSizePtr sizes;
int nsize;
int nrefresh;
int size;
CARD16 refresh;
} RR10DataRec, *RR10DataPtr;
/*
* Convert 1.2 monitor data into 1.0 screen data
*/
static RR10DataPtr
RR10GetData (ScreenPtr pScreen, RROutputPtr output)
{
RR10DataPtr data;
RRScreenSizePtr size;
int nmode = output->numModes + output->numUserModes;
int o, os, l, r;
RRScreenRatePtr refresh;
CARD16 vRefresh;
RRModePtr mode;
Bool *used;
/* Make sure there is plenty of space for any combination */
data = malloc (sizeof (RR10DataRec) +
sizeof (RRScreenSize) * nmode +
sizeof (RRScreenRate) * nmode +
sizeof (Bool) * nmode);
if (!data)
return NULL;
size = (RRScreenSizePtr) (data + 1);
refresh = (RRScreenRatePtr) (size + nmode);
used = (Bool *) (refresh + nmode);
memset (used, '\0', sizeof (Bool) * nmode);
data->sizes = size;
data->nsize = 0;
data->nrefresh = 0;
data->size = 0;
data->refresh = 0;
/*
* find modes not yet listed
*/
for (o = 0; o < output->numModes + output->numUserModes; o++)
{
if (used[o]) continue;
if (o < output->numModes)
mode = output->modes[o];
else
mode = output->userModes[o - output->numModes];
l = data->nsize;
size[l].id = data->nsize;
size[l].width = mode->mode.width;
size[l].height = mode->mode.height;
if (output->mmWidth && output->mmHeight) {
size[l].mmWidth = output->mmWidth;
size[l].mmHeight = output->mmHeight;
} else {
size[l].mmWidth = pScreen->mmWidth;
size[l].mmHeight = pScreen->mmHeight;
}
size[l].nRates = 0;
size[l].pRates = &refresh[data->nrefresh];
data->nsize++;
/*
* Find all modes with matching size
*/
for (os = o; os < output->numModes + output->numUserModes; os++)
{
if (os < output->numModes)
mode = output->modes[os];
else
mode = output->userModes[os - output->numModes];
if (mode->mode.width == size[l].width &&
mode->mode.height == size[l].height)
{
vRefresh = RRVerticalRefresh (&mode->mode);
used[os] = TRUE;
for (r = 0; r < size[l].nRates; r++)
if (vRefresh == size[l].pRates[r].rate)
break;
if (r == size[l].nRates)
{
size[l].pRates[r].rate = vRefresh;
size[l].pRates[r].mode = mode;
size[l].nRates++;
data->nrefresh++;
}
if (mode == output->crtc->mode)
{
data->size = l;
data->refresh = vRefresh;
}
}
}
}
return data;
}
int
ProcRRGetScreenInfo (ClientPtr client)
{
REQUEST(xRRGetScreenInfoReq);
xRRGetScreenInfoReply rep;
WindowPtr pWin;
int n, rc;
ScreenPtr pScreen;
rrScrPrivPtr pScrPriv;
CARD8 *extra;
unsigned long extraLen;
RROutputPtr output;
REQUEST_SIZE_MATCH(xRRGetScreenInfoReq);
#ifndef NXAGENT_SERVER
rc = dixLookupWindow(&pWin, stuff->window, client, DixReadAccess);
#else
pWin = SecurityLookupWindow(stuff->window, client, SecurityReadAccess);
rc = pWin ? Success : BadWindow;
#endif
if (rc != Success)
return rc;
pScreen = pWin->drawable.pScreen;
pScrPriv = rrGetScrPriv(pScreen);
rep.pad = 0;
if (pScrPriv)
if (!RRGetInfo (pScreen))
return BadAlloc;
output = RRFirstOutput (pScreen);
if (!pScrPriv || !output)
{
rep.type = X_Reply;
rep.setOfRotations = RR_Rotate_0;;
rep.sequenceNumber = client->sequence;
rep.length = 0;
rep.root = WindowTable[pWin->drawable.pScreen->myNum]->drawable.id;
rep.timestamp = currentTime.milliseconds;
rep.configTimestamp = currentTime.milliseconds;
rep.nSizes = 0;
rep.sizeID = 0;
rep.rotation = RR_Rotate_0;
rep.rate = 0;
rep.nrateEnts = 0;
extra = 0;
extraLen = 0;
}
else
{
int i, j;
xScreenSizes *size;
CARD16 *rates;
CARD8 *data8;
Bool has_rate = RRClientKnowsRates (client);
RR10DataPtr pData;
RRScreenSizePtr pSize;
pData = RR10GetData (pScreen, output);
if (!pData)
return BadAlloc;
rep.type = X_Reply;
rep.setOfRotations = output->crtc->rotations;
rep.sequenceNumber = client->sequence;
rep.length = 0;
rep.root = WindowTable[pWin->drawable.pScreen->myNum]->drawable.id;
rep.timestamp = pScrPriv->lastSetTime.milliseconds;
rep.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
rep.rotation = output->crtc->rotation;
rep.nSizes = pData->nsize;
rep.nrateEnts = pData->nrefresh + pData->nsize;
rep.sizeID = pData->size;
rep.rate = pData->refresh;
extraLen = (rep.nSizes * sizeof (xScreenSizes) +
rep.nrateEnts * sizeof (CARD16));
if (extraLen)
{
extra = (CARD8 *) xalloc (extraLen);
if (!extra)
{
xfree (pData);
return BadAlloc;
}
}
else
extra = NULL;
/*
* First comes the size information
*/
size = (xScreenSizes *) extra;
rates = (CARD16 *) (size + rep.nSizes);
for (i = 0; i < pData->nsize; i++)
{
pSize = &pData->sizes[i];
size->widthInPixels = pSize->width;
size->heightInPixels = pSize->height;
size->widthInMillimeters = pSize->mmWidth;
size->heightInMillimeters = pSize->mmHeight;
if (client->swapped)
{
swaps (&size->widthInPixels, n);
swaps (&size->heightInPixels, n);
swaps (&size->widthInMillimeters, n);
swaps (&size->heightInMillimeters, n);
}
size++;
if (has_rate)
{
*rates = pSize->nRates;
if (client->swapped)
{
swaps (rates, n);
}
rates++;
for (j = 0; j < pSize->nRates; j++)
{
*rates = pSize->pRates[j].rate;
if (client->swapped)
{
swaps (rates, n);
}
rates++;
}
}
}
xfree (pData);
data8 = (CARD8 *) rates;
if (data8 - (CARD8 *) extra != extraLen)
FatalError ("RRGetScreenInfo bad extra len %ld != %ld\n",
(unsigned long)(data8 - (CARD8 *) extra), extraLen);
rep.length = (extraLen + 3) >> 2;
}
if (client->swapped) {
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swapl(&rep.timestamp, n);
swaps(&rep.rotation, n);
swaps(&rep.nSizes, n);
swaps(&rep.sizeID, n);
swaps(&rep.rate, n);
swaps(&rep.nrateEnts, n);
}
WriteToClient(client, sizeof(xRRGetScreenInfoReply), (char *)&rep);
if (extraLen)
{
WriteToClient (client, extraLen, (char *) extra);
xfree (extra);
}
return (client->noClientException);
}
int
ProcRRSetScreenConfig (ClientPtr client)
{
REQUEST(xRRSetScreenConfigReq);
xRRSetScreenConfigReply rep;
DrawablePtr pDraw;
int n, rc;
ScreenPtr pScreen;
rrScrPrivPtr pScrPriv;
TimeStamp time;
int i;
Rotation rotation;
int rate;
Bool has_rate;
RROutputPtr output;
RRCrtcPtr crtc;
RRModePtr mode;
RR10DataPtr pData = NULL;
RRScreenSizePtr pSize;
int width, height;
UpdateCurrentTime ();
if (RRClientKnowsRates (client))
{
REQUEST_SIZE_MATCH (xRRSetScreenConfigReq);
has_rate = TRUE;
}
else
{
REQUEST_SIZE_MATCH (xRR1_0SetScreenConfigReq);
has_rate = FALSE;
}
#ifndef NXAGENT_SERVER
rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0, DixWriteAccess);
#else
pDraw = SecurityLookupDrawable(stuff->drawable, client, SecurityWriteAccess);
rc = pDraw ? Success : BadDrawable;
#endif
if (rc != Success)
return rc;
pScreen = pDraw->pScreen;
pScrPriv = rrGetScrPriv(pScreen);
time = ClientTimeToServerTime(stuff->timestamp);
if (!pScrPriv)
{
time = currentTime;
rep.status = RRSetConfigFailed;
goto sendReply;
}
if (!RRGetInfo (pScreen))
return BadAlloc;
output = RRFirstOutput (pScreen);
if (!output)
{
time = currentTime;
rep.status = RRSetConfigFailed;
goto sendReply;
}
crtc = output->crtc;
/*
* If the client's config timestamp is not the same as the last config
* timestamp, then the config information isn't up-to-date and
* can't even be validated.
*
* Note that the client only knows about the milliseconds part of the
* timestamp, so using CompareTimeStamps here would cause randr to suddenly
* stop working after several hours have passed (freedesktop bug #6502).
*/
if (stuff->configTimestamp != pScrPriv->lastConfigTime.milliseconds)
{
rep.status = RRSetConfigInvalidConfigTime;
goto sendReply;
}
pData = RR10GetData (pScreen, output);
if (!pData)
return BadAlloc;
if (stuff->sizeID >= pData->nsize)
{
/*
* Invalid size ID
*/
client->errorValue = stuff->sizeID;
xfree (pData);
return BadValue;
}
pSize = &pData->sizes[stuff->sizeID];
/*
* Validate requested rotation
*/
rotation = (Rotation) stuff->rotation;
/* test the rotation bits only! */
switch (rotation & 0xf) {
case RR_Rotate_0:
case RR_Rotate_90:
case RR_Rotate_180:
case RR_Rotate_270:
break;
default:
/*
* Invalid rotation
*/
client->errorValue = stuff->rotation;
xfree (pData);
return BadValue;
}
if ((~crtc->rotations) & rotation)
{
/*
* requested rotation or reflection not supported by screen
*/
client->errorValue = stuff->rotation;
xfree (pData);
return BadMatch;
}
/*
* Validate requested refresh
*/
if (has_rate)
rate = (int) stuff->rate;
else
rate = 0;
if (rate)
{
for (i = 0; i < pSize->nRates; i++)
{
if (pSize->pRates[i].rate == rate)
break;
}
if (i == pSize->nRates)
{
/*
* Invalid rate
*/
client->errorValue = rate;
xfree (pData);
return BadValue;
}
mode = pSize->pRates[i].mode;
}
else
mode = pSize->pRates[0].mode;
/*
* Make sure the requested set-time is not older than
* the last set-time
*/
if (CompareTimeStamps (time, pScrPriv->lastSetTime) < 0)
{
rep.status = RRSetConfigInvalidTime;
goto sendReply;
}
/*
* If the screen size is changing, adjust all of the other outputs
* to fit the new size, mirroring as much as possible
*/
width = mode->mode.width;
height = mode->mode.height;
if (rotation & (RR_Rotate_90|RR_Rotate_270))
{
width = mode->mode.height;
height = mode->mode.width;
}
if (width != pScreen->width || height != pScreen->height)
{
int c;
for (c = 0; c < pScrPriv->numCrtcs; c++)
{
if (!RRCrtcSet (pScrPriv->crtcs[c], NULL, 0, 0, RR_Rotate_0,
0, NULL))
{
rep.status = RRSetConfigFailed;
/* XXX recover from failure */
goto sendReply;
}
}
if (!RRScreenSizeSet (pScreen, width, height,
pScreen->mmWidth, pScreen->mmHeight))
{
rep.status = RRSetConfigFailed;
/* XXX recover from failure */
goto sendReply;
}
}
if (!RRCrtcSet (crtc, mode, 0, 0, stuff->rotation, 1, &output))
rep.status = RRSetConfigFailed;
#ifndef NXAGENT_SERVER /* Bug 21987 */
else
rep.status = RRSetConfigSuccess;
#else
else {
rep.status = RRSetConfigSuccess;
pScrPriv->lastSetTime = time;
}
#endif
/*
* XXX Configure other crtcs to mirror as much as possible
*/
sendReply:
if (pData)
xfree (pData);
rep.type = X_Reply;
/* rep.status has already been filled in */
rep.length = 0;
rep.sequenceNumber = client->sequence;
rep.newTimestamp = pScrPriv->lastSetTime.milliseconds;
rep.newConfigTimestamp = pScrPriv->lastConfigTime.milliseconds;
rep.root = WindowTable[pDraw->pScreen->myNum]->drawable.id;
if (client->swapped)
{
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swapl(&rep.newTimestamp, n);
swapl(&rep.newConfigTimestamp, n);
swapl(&rep.root, n);
}
WriteToClient(client, sizeof(xRRSetScreenConfigReply), (char *)&rep);
return (client->noClientException);
}
static CARD16
RR10CurrentSizeID (ScreenPtr pScreen)
{
CARD16 sizeID = 0xffff;
RROutputPtr output = RRFirstOutput (pScreen);
if (output)
{
RR10DataPtr data = RR10GetData (pScreen, output);
if (data)
{
int i;
for (i = 0; i < data->nsize; i++)
if (data->sizes[i].width == pScreen->width &&
data->sizes[i].height == pScreen->height)
{
sizeID = (CARD16) i;
break;
}
xfree (data);
}
}
return sizeID;
}
nx-X11/programs/Xserver/randr/rrscreen.c.X.original
0 → 100644
View file @
15cee47a
/*
* Copyright © 2006 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
#include "randrstr.h"
extern char *ConnectionInfo;
static int padlength[4] = {0, 3, 2, 1};
static CARD16
RR10CurrentSizeID (ScreenPtr pScreen);
/*
* Edit connection information block so that new clients
* see the current screen size on connect
*/
static void
RREditConnectionInfo (ScreenPtr pScreen)
{
xConnSetup *connSetup;
char *vendor;
xPixmapFormat *formats;
xWindowRoot *root;
xDepth *depth;
xVisualType *visual;
int screen = 0;
int d;
connSetup = (xConnSetup *) ConnectionInfo;
vendor = (char *) connSetup + sizeof (xConnSetup);
formats = (xPixmapFormat *) ((char *) vendor +
connSetup->nbytesVendor +
padlength[connSetup->nbytesVendor & 3]);
root = (xWindowRoot *) ((char *) formats +
sizeof (xPixmapFormat) * screenInfo.numPixmapFormats);
while (screen != pScreen->myNum)
{
depth = (xDepth *) ((char *) root +
sizeof (xWindowRoot));
for (d = 0; d < root->nDepths; d++)
{
visual = (xVisualType *) ((char *) depth +
sizeof (xDepth));
depth = (xDepth *) ((char *) visual +
depth->nVisuals * sizeof (xVisualType));
}
root = (xWindowRoot *) ((char *) depth);
screen++;
}
root->pixWidth = pScreen->width;
root->pixHeight = pScreen->height;
root->mmWidth = pScreen->mmWidth;
root->mmHeight = pScreen->mmHeight;
}
void
RRSendConfigNotify (ScreenPtr pScreen)
{
WindowPtr pWin = WindowTable[pScreen->myNum];
xEvent event;
event.u.u.type = ConfigureNotify;
event.u.configureNotify.window = pWin->drawable.id;
event.u.configureNotify.aboveSibling = None;
event.u.configureNotify.x = 0;
event.u.configureNotify.y = 0;
/* XXX xinerama stuff ? */
event.u.configureNotify.width = pWin->drawable.width;
event.u.configureNotify.height = pWin->drawable.height;
event.u.configureNotify.borderWidth = wBorderWidth (pWin);
event.u.configureNotify.override = pWin->overrideRedirect;
DeliverEvents(pWin, &event, 1, NullWindow);
}
void
RRDeliverScreenEvent (ClientPtr client, WindowPtr pWin, ScreenPtr pScreen)
{
rrScrPriv (pScreen);
xRRScreenChangeNotifyEvent se;
RRCrtcPtr crtc = pScrPriv->numCrtcs ? pScrPriv->crtcs[0] : NULL;
WindowPtr pRoot = WindowTable[pScreen->myNum];
se.type = RRScreenChangeNotify + RREventBase;
se.rotation = (CARD8) (crtc ? crtc->rotation : RR_Rotate_0);
se.timestamp = pScrPriv->lastSetTime.milliseconds;
se.sequenceNumber = client->sequence;
se.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
se.root = pRoot->drawable.id;
se.window = pWin->drawable.id;
#ifdef RENDER
se.subpixelOrder = PictureGetSubpixelOrder (pScreen);
#else
se.subpixelOrder = SubPixelUnknown;
#endif
se.sequenceNumber = client->sequence;
se.sizeID = RR10CurrentSizeID (pScreen);
if (se.rotation & (RR_Rotate_90 | RR_Rotate_270)) {
se.widthInPixels = pScreen->height;
se.heightInPixels = pScreen->width;
se.widthInMillimeters = pScreen->mmHeight;
se.heightInMillimeters = pScreen->mmWidth;
} else {
se.widthInPixels = pScreen->width;
se.heightInPixels = pScreen->height;
se.widthInMillimeters = pScreen->mmWidth;
se.heightInMillimeters = pScreen->mmHeight;
}
WriteEventsToClient (client, 1, (xEvent *) &se);
}
/*
* Notify the extension that the screen size has been changed.
* The driver is responsible for calling this whenever it has changed
* the size of the screen
*/
void
RRScreenSizeNotify (ScreenPtr pScreen)
{
rrScrPriv(pScreen);
/*
* Deliver ConfigureNotify events when root changes
* pixel size
*/
if (pScrPriv->width == pScreen->width &&
pScrPriv->height == pScreen->height &&
pScrPriv->mmWidth == pScreen->mmWidth &&
pScrPriv->mmHeight == pScreen->mmHeight)
return;
pScrPriv->width = pScreen->width;
pScrPriv->height = pScreen->height;
pScrPriv->mmWidth = pScreen->mmWidth;
pScrPriv->mmHeight = pScreen->mmHeight;
pScrPriv->changed = TRUE;
/* pScrPriv->sizeChanged = TRUE; */
RRTellChanged (pScreen);
RRSendConfigNotify (pScreen);
RREditConnectionInfo (pScreen);
RRPointerScreenConfigured (pScreen);
/*
* Fix pointer bounds and location
*/
ScreenRestructured (pScreen);
}
/*
* Request that the screen be resized
*/
Bool
RRScreenSizeSet (ScreenPtr pScreen,
CARD16 width,
CARD16 height,
CARD32 mmWidth,
CARD32 mmHeight)
{
rrScrPriv(pScreen);
#if RANDR_12_INTERFACE
if (pScrPriv->rrScreenSetSize)
{
return (*pScrPriv->rrScreenSetSize) (pScreen,
width, height,
mmWidth, mmHeight);
}
#endif
#if RANDR_10_INTERFACE
if (pScrPriv->rrSetConfig)
{
return TRUE; /* can't set size separately */
}
#endif
return FALSE;
}
/*
* Retrieve valid screen size range
*/
int
ProcRRGetScreenSizeRange (ClientPtr client)
{
REQUEST(xRRGetScreenSizeRangeReq);
xRRGetScreenSizeRangeReply rep;
WindowPtr pWin;
ScreenPtr pScreen;
rrScrPrivPtr pScrPriv;
int rc;
REQUEST_SIZE_MATCH(xRRGetScreenInfoReq);
rc = dixLookupWindow(&pWin, stuff->window, client, DixReadAccess);
if (rc != Success)
return rc;
pScreen = pWin->drawable.pScreen;
pScrPriv = rrGetScrPriv(pScreen);
rep.type = X_Reply;
rep.pad = 0;
rep.sequenceNumber = client->sequence;
rep.length = 0;
if (pScrPriv)
{
if (!RRGetInfo (pScreen))
return BadAlloc;
rep.minWidth = pScrPriv->minWidth;
rep.minHeight = pScrPriv->minHeight;
rep.maxWidth = pScrPriv->maxWidth;
rep.maxHeight = pScrPriv->maxHeight;
}
else
{
rep.maxWidth = rep.minWidth = pScreen->width;
rep.maxHeight = rep.minHeight = pScreen->height;
}
if (client->swapped)
{
int n;
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swaps(&rep.minWidth, n);
swaps(&rep.minHeight, n);
swaps(&rep.maxWidth, n);
swaps(&rep.maxHeight, n);
}
WriteToClient(client, sizeof(xRRGetScreenSizeRangeReply), (char *)&rep);
return (client->noClientException);
}
int
ProcRRSetScreenSize (ClientPtr client)
{
REQUEST(xRRSetScreenSizeReq);
WindowPtr pWin;
ScreenPtr pScreen;
rrScrPrivPtr pScrPriv;
int i, rc;
REQUEST_SIZE_MATCH(xRRSetScreenSizeReq);
rc = dixLookupWindow(&pWin, stuff->window, client, DixReadAccess);
if (rc != Success)
return rc;
pScreen = pWin->drawable.pScreen;
pScrPriv = rrGetScrPriv(pScreen);
if (stuff->width < pScrPriv->minWidth || pScrPriv->maxWidth < stuff->width)
{
client->errorValue = stuff->width;
return BadValue;
}
if (stuff->height < pScrPriv->minHeight ||
pScrPriv->maxHeight < stuff->height)
{
client->errorValue = stuff->height;
return BadValue;
}
for (i = 0; i < pScrPriv->numCrtcs; i++)
{
RRCrtcPtr crtc = pScrPriv->crtcs[i];
RRModePtr mode = crtc->mode;
if (mode)
{
int source_width = mode->mode.width;
int source_height = mode->mode.height;
Rotation rotation = crtc->rotation;
if (rotation == RR_Rotate_90 || rotation == RR_Rotate_270)
{
source_width = mode->mode.height;
source_height = mode->mode.width;
}
if (crtc->x + source_width > stuff->width ||
crtc->y + source_height > stuff->height)
return BadMatch;
}
}
if (stuff->widthInMillimeters == 0 || stuff->heightInMillimeters == 0)
{
client->errorValue = 0;
return BadValue;
}
if (!RRScreenSizeSet (pScreen,
stuff->width, stuff->height,
stuff->widthInMillimeters,
stuff->heightInMillimeters))
{
return BadMatch;
}
return Success;
}
int
ProcRRGetScreenResources (ClientPtr client)
{
REQUEST(xRRGetScreenResourcesReq);
xRRGetScreenResourcesReply rep;
WindowPtr pWin;
ScreenPtr pScreen;
rrScrPrivPtr pScrPriv;
CARD8 *extra;
unsigned long extraLen;
int i, n, rc;
RRCrtc *crtcs;
RROutput *outputs;
xRRModeInfo *modeinfos;
CARD8 *names;
REQUEST_SIZE_MATCH(xRRGetScreenResourcesReq);
rc = dixLookupWindow(&pWin, stuff->window, client, DixReadAccess);
if (rc != Success)
return rc;
pScreen = pWin->drawable.pScreen;
pScrPriv = rrGetScrPriv(pScreen);
rep.pad = 0;
if (pScrPriv)
if (!RRGetInfo (pScreen))
return BadAlloc;
if (!pScrPriv)
{
rep.type = X_Reply;
rep.sequenceNumber = client->sequence;
rep.length = 0;
rep.timestamp = currentTime.milliseconds;
rep.configTimestamp = currentTime.milliseconds;
rep.nCrtcs = 0;
rep.nOutputs = 0;
rep.nModes = 0;
rep.nbytesNames = 0;
extra = NULL;
extraLen = 0;
}
else
{
RRModePtr *modes;
int num_modes;
modes = RRModesForScreen (pScreen, &num_modes);
if (!modes)
return BadAlloc;
rep.type = X_Reply;
rep.sequenceNumber = client->sequence;
rep.length = 0;
rep.timestamp = pScrPriv->lastSetTime.milliseconds;
rep.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
rep.nCrtcs = pScrPriv->numCrtcs;
rep.nOutputs = pScrPriv->numOutputs;
rep.nModes = num_modes;
rep.nbytesNames = 0;
for (i = 0; i < num_modes; i++)
rep.nbytesNames += modes[i]->mode.nameLength;
rep.length = (pScrPriv->numCrtcs +
pScrPriv->numOutputs +
num_modes * (SIZEOF(xRRModeInfo) >> 2) +
((rep.nbytesNames + 3) >> 2));
extraLen = rep.length << 2;
if (extraLen)
{
extra = xalloc (extraLen);
if (!extra)
{
xfree (modes);
return BadAlloc;
}
}
else
extra = NULL;
crtcs = (RRCrtc *) extra;
outputs = (RROutput *) (crtcs + pScrPriv->numCrtcs);
modeinfos = (xRRModeInfo *) (outputs + pScrPriv->numOutputs);
names = (CARD8 *) (modeinfos + num_modes);
for (i = 0; i < pScrPriv->numCrtcs; i++)
{
crtcs[i] = pScrPriv->crtcs[i]->id;
if (client->swapped)
swapl (&crtcs[i], n);
}
for (i = 0; i < pScrPriv->numOutputs; i++)
{
outputs[i] = pScrPriv->outputs[i]->id;
if (client->swapped)
swapl (&outputs[i], n);
}
for (i = 0; i < num_modes; i++)
{
RRModePtr mode = modes[i];
modeinfos[i] = mode->mode;
if (client->swapped)
{
swapl (&modeinfos[i].id, n);
swaps (&modeinfos[i].width, n);
swaps (&modeinfos[i].height, n);
swapl (&modeinfos[i].dotClock, n);
swaps (&modeinfos[i].hSyncStart, n);
swaps (&modeinfos[i].hSyncEnd, n);
swaps (&modeinfos[i].hTotal, n);
swaps (&modeinfos[i].hSkew, n);
swaps (&modeinfos[i].vSyncStart, n);
swaps (&modeinfos[i].vSyncEnd, n);
swaps (&modeinfos[i].vTotal, n);
swaps (&modeinfos[i].nameLength, n);
swapl (&modeinfos[i].modeFlags, n);
}
memcpy (names, mode->name,
mode->mode.nameLength);
names += mode->mode.nameLength;
}
xfree (modes);
assert (((((char *) names - (char *) extra) + 3) >> 2) == rep.length);
}
if (client->swapped) {
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swapl(&rep.timestamp, n);
swapl(&rep.configTimestamp, n);
swaps(&rep.nCrtcs, n);
swaps(&rep.nOutputs, n);
swaps(&rep.nModes, n);
swaps(&rep.nbytesNames, n);
}
WriteToClient(client, sizeof(xRRGetScreenResourcesReply), (char *)&rep);
if (extraLen)
{
WriteToClient (client, extraLen, (char *) extra);
xfree (extra);
}
return client->noClientException;
}
typedef struct _RR10Data {
RRScreenSizePtr sizes;
int nsize;
int nrefresh;
int size;
CARD16 refresh;
} RR10DataRec, *RR10DataPtr;
/*
* Convert 1.2 monitor data into 1.0 screen data
*/
static RR10DataPtr
RR10GetData (ScreenPtr pScreen, RROutputPtr output)
{
RR10DataPtr data;
RRScreenSizePtr size;
int nmode = output->numModes + output->numUserModes;
int o, os, l, r;
RRScreenRatePtr refresh;
CARD16 vRefresh;
RRModePtr mode;
Bool *used;
/* Make sure there is plenty of space for any combination */
data = malloc (sizeof (RR10DataRec) +
sizeof (RRScreenSize) * nmode +
sizeof (RRScreenRate) * nmode +
sizeof (Bool) * nmode);
if (!data)
return NULL;
size = (RRScreenSizePtr) (data + 1);
refresh = (RRScreenRatePtr) (size + nmode);
used = (Bool *) (refresh + nmode);
memset (used, '\0', sizeof (Bool) * nmode);
data->sizes = size;
data->nsize = 0;
data->nrefresh = 0;
data->size = 0;
data->refresh = 0;
/*
* find modes not yet listed
*/
for (o = 0; o < output->numModes + output->numUserModes; o++)
{
if (used[o]) continue;
if (o < output->numModes)
mode = output->modes[o];
else
mode = output->userModes[o - output->numModes];
l = data->nsize;
size[l].id = data->nsize;
size[l].width = mode->mode.width;
size[l].height = mode->mode.height;
if (output->mmWidth && output->mmHeight) {
size[l].mmWidth = output->mmWidth;
size[l].mmHeight = output->mmHeight;
} else {
size[l].mmWidth = pScreen->mmWidth;
size[l].mmHeight = pScreen->mmHeight;
}
size[l].nRates = 0;
size[l].pRates = &refresh[data->nrefresh];
data->nsize++;
/*
* Find all modes with matching size
*/
for (os = o; os < output->numModes + output->numUserModes; os++)
{
if (os < output->numModes)
mode = output->modes[os];
else
mode = output->userModes[os - output->numModes];
if (mode->mode.width == size[l].width &&
mode->mode.height == size[l].height)
{
vRefresh = RRVerticalRefresh (&mode->mode);
used[os] = TRUE;
for (r = 0; r < size[l].nRates; r++)
if (vRefresh == size[l].pRates[r].rate)
break;
if (r == size[l].nRates)
{
size[l].pRates[r].rate = vRefresh;
size[l].pRates[r].mode = mode;
size[l].nRates++;
data->nrefresh++;
}
if (mode == output->crtc->mode)
{
data->size = l;
data->refresh = vRefresh;
}
}
}
}
return data;
}
int
ProcRRGetScreenInfo (ClientPtr client)
{
REQUEST(xRRGetScreenInfoReq);
xRRGetScreenInfoReply rep;
WindowPtr pWin;
int n, rc;
ScreenPtr pScreen;
rrScrPrivPtr pScrPriv;
CARD8 *extra;
unsigned long extraLen;
RROutputPtr output;
REQUEST_SIZE_MATCH(xRRGetScreenInfoReq);
rc = dixLookupWindow(&pWin, stuff->window, client, DixReadAccess);
if (rc != Success)
return rc;
pScreen = pWin->drawable.pScreen;
pScrPriv = rrGetScrPriv(pScreen);
rep.pad = 0;
if (pScrPriv)
if (!RRGetInfo (pScreen))
return BadAlloc;
output = RRFirstOutput (pScreen);
if (!pScrPriv || !output)
{
rep.type = X_Reply;
rep.setOfRotations = RR_Rotate_0;;
rep.sequenceNumber = client->sequence;
rep.length = 0;
rep.root = WindowTable[pWin->drawable.pScreen->myNum]->drawable.id;
rep.timestamp = currentTime.milliseconds;
rep.configTimestamp = currentTime.milliseconds;
rep.nSizes = 0;
rep.sizeID = 0;
rep.rotation = RR_Rotate_0;
rep.rate = 0;
rep.nrateEnts = 0;
extra = 0;
extraLen = 0;
}
else
{
int i, j;
xScreenSizes *size;
CARD16 *rates;
CARD8 *data8;
Bool has_rate = RRClientKnowsRates (client);
RR10DataPtr pData;
RRScreenSizePtr pSize;
pData = RR10GetData (pScreen, output);
if (!pData)
return BadAlloc;
rep.type = X_Reply;
rep.setOfRotations = output->crtc->rotations;
rep.sequenceNumber = client->sequence;
rep.length = 0;
rep.root = WindowTable[pWin->drawable.pScreen->myNum]->drawable.id;
rep.timestamp = pScrPriv->lastSetTime.milliseconds;
rep.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
rep.rotation = output->crtc->rotation;
rep.nSizes = pData->nsize;
rep.nrateEnts = pData->nrefresh + pData->nsize;
rep.sizeID = pData->size;
rep.rate = pData->refresh;
extraLen = (rep.nSizes * sizeof (xScreenSizes) +
rep.nrateEnts * sizeof (CARD16));
if (extraLen)
{
extra = (CARD8 *) xalloc (extraLen);
if (!extra)
{
xfree (pData);
return BadAlloc;
}
}
else
extra = NULL;
/*
* First comes the size information
*/
size = (xScreenSizes *) extra;
rates = (CARD16 *) (size + rep.nSizes);
for (i = 0; i < pData->nsize; i++)
{
pSize = &pData->sizes[i];
size->widthInPixels = pSize->width;
size->heightInPixels = pSize->height;
size->widthInMillimeters = pSize->mmWidth;
size->heightInMillimeters = pSize->mmHeight;
if (client->swapped)
{
swaps (&size->widthInPixels, n);
swaps (&size->heightInPixels, n);
swaps (&size->widthInMillimeters, n);
swaps (&size->heightInMillimeters, n);
}
size++;
if (has_rate)
{
*rates = pSize->nRates;
if (client->swapped)
{
swaps (rates, n);
}
rates++;
for (j = 0; j < pSize->nRates; j++)
{
*rates = pSize->pRates[j].rate;
if (client->swapped)
{
swaps (rates, n);
}
rates++;
}
}
}
xfree (pData);
data8 = (CARD8 *) rates;
if (data8 - (CARD8 *) extra != extraLen)
FatalError ("RRGetScreenInfo bad extra len %ld != %ld\n",
(unsigned long)(data8 - (CARD8 *) extra), extraLen);
rep.length = (extraLen + 3) >> 2;
}
if (client->swapped) {
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swapl(&rep.timestamp, n);
swaps(&rep.rotation, n);
swaps(&rep.nSizes, n);
swaps(&rep.sizeID, n);
swaps(&rep.rate, n);
swaps(&rep.nrateEnts, n);
}
WriteToClient(client, sizeof(xRRGetScreenInfoReply), (char *)&rep);
if (extraLen)
{
WriteToClient (client, extraLen, (char *) extra);
xfree (extra);
}
return (client->noClientException);
}
int
ProcRRSetScreenConfig (ClientPtr client)
{
REQUEST(xRRSetScreenConfigReq);
xRRSetScreenConfigReply rep;
DrawablePtr pDraw;
int n, rc;
ScreenPtr pScreen;
rrScrPrivPtr pScrPriv;
TimeStamp time;
int i;
Rotation rotation;
int rate;
Bool has_rate;
RROutputPtr output;
RRCrtcPtr crtc;
RRModePtr mode;
RR10DataPtr pData = NULL;
RRScreenSizePtr pSize;
int width, height;
UpdateCurrentTime ();
if (RRClientKnowsRates (client))
{
REQUEST_SIZE_MATCH (xRRSetScreenConfigReq);
has_rate = TRUE;
}
else
{
REQUEST_SIZE_MATCH (xRR1_0SetScreenConfigReq);
has_rate = FALSE;
}
rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0, DixWriteAccess);
if (rc != Success)
return rc;
pScreen = pDraw->pScreen;
pScrPriv = rrGetScrPriv(pScreen);
time = ClientTimeToServerTime(stuff->timestamp);
if (!pScrPriv)
{
time = currentTime;
rep.status = RRSetConfigFailed;
goto sendReply;
}
if (!RRGetInfo (pScreen))
return BadAlloc;
output = RRFirstOutput (pScreen);
if (!output)
{
time = currentTime;
rep.status = RRSetConfigFailed;
goto sendReply;
}
crtc = output->crtc;
/*
* If the client's config timestamp is not the same as the last config
* timestamp, then the config information isn't up-to-date and
* can't even be validated.
*
* Note that the client only knows about the milliseconds part of the
* timestamp, so using CompareTimeStamps here would cause randr to suddenly
* stop working after several hours have passed (freedesktop bug #6502).
*/
if (stuff->configTimestamp != pScrPriv->lastConfigTime.milliseconds)
{
rep.status = RRSetConfigInvalidConfigTime;
goto sendReply;
}
pData = RR10GetData (pScreen, output);
if (!pData)
return BadAlloc;
if (stuff->sizeID >= pData->nsize)
{
/*
* Invalid size ID
*/
client->errorValue = stuff->sizeID;
xfree (pData);
return BadValue;
}
pSize = &pData->sizes[stuff->sizeID];
/*
* Validate requested rotation
*/
rotation = (Rotation) stuff->rotation;
/* test the rotation bits only! */
switch (rotation & 0xf) {
case RR_Rotate_0:
case RR_Rotate_90:
case RR_Rotate_180:
case RR_Rotate_270:
break;
default:
/*
* Invalid rotation
*/
client->errorValue = stuff->rotation;
xfree (pData);
return BadValue;
}
if ((~crtc->rotations) & rotation)
{
/*
* requested rotation or reflection not supported by screen
*/
client->errorValue = stuff->rotation;
xfree (pData);
return BadMatch;
}
/*
* Validate requested refresh
*/
if (has_rate)
rate = (int) stuff->rate;
else
rate = 0;
if (rate)
{
for (i = 0; i < pSize->nRates; i++)
{
if (pSize->pRates[i].rate == rate)
break;
}
if (i == pSize->nRates)
{
/*
* Invalid rate
*/
client->errorValue = rate;
xfree (pData);
return BadValue;
}
mode = pSize->pRates[i].mode;
}
else
mode = pSize->pRates[0].mode;
/*
* Make sure the requested set-time is not older than
* the last set-time
*/
if (CompareTimeStamps (time, pScrPriv->lastSetTime) < 0)
{
rep.status = RRSetConfigInvalidTime;
goto sendReply;
}
/*
* If the screen size is changing, adjust all of the other outputs
* to fit the new size, mirroring as much as possible
*/
width = mode->mode.width;
height = mode->mode.height;
if (rotation & (RR_Rotate_90|RR_Rotate_270))
{
width = mode->mode.height;
height = mode->mode.width;
}
if (width != pScreen->width || height != pScreen->height)
{
int c;
for (c = 0; c < pScrPriv->numCrtcs; c++)
{
if (!RRCrtcSet (pScrPriv->crtcs[c], NULL, 0, 0, RR_Rotate_0,
0, NULL))
{
rep.status = RRSetConfigFailed;
/* XXX recover from failure */
goto sendReply;
}
}
if (!RRScreenSizeSet (pScreen, width, height,
pScreen->mmWidth, pScreen->mmHeight))
{
rep.status = RRSetConfigFailed;
/* XXX recover from failure */
goto sendReply;
}
}
if (!RRCrtcSet (crtc, mode, 0, 0, stuff->rotation, 1, &output))
rep.status = RRSetConfigFailed;
else
rep.status = RRSetConfigSuccess;
/*
* XXX Configure other crtcs to mirror as much as possible
*/
sendReply:
if (pData)
xfree (pData);
rep.type = X_Reply;
/* rep.status has already been filled in */
rep.length = 0;
rep.sequenceNumber = client->sequence;
rep.newTimestamp = pScrPriv->lastSetTime.milliseconds;
rep.newConfigTimestamp = pScrPriv->lastConfigTime.milliseconds;
rep.root = WindowTable[pDraw->pScreen->myNum]->drawable.id;
if (client->swapped)
{
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swapl(&rep.newTimestamp, n);
swapl(&rep.newConfigTimestamp, n);
swapl(&rep.root, n);
}
WriteToClient(client, sizeof(xRRSetScreenConfigReply), (char *)&rep);
return (client->noClientException);
}
static CARD16
RR10CurrentSizeID (ScreenPtr pScreen)
{
CARD16 sizeID = 0xffff;
RROutputPtr output = RRFirstOutput (pScreen);
if (output)
{
RR10DataPtr data = RR10GetData (pScreen, output);
if (data)
{
int i;
for (i = 0; i < data->nsize; i++)
if (data->sizes[i].width == pScreen->width &&
data->sizes[i].height == pScreen->height)
{
sizeID = (CARD16) i;
break;
}
xfree (data);
}
}
return sizeID;
}
nx-X11/programs/Xserver/randr/rrsdispatch.c
0 → 100644
View file @
15cee47a
/*
* Copyright © 2006 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
#include "randrstr.h"
static
int
SProcRRQueryVersion
(
ClientPtr
client
)
{
register
int
n
;
REQUEST
(
xRRQueryVersionReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
majorVersion
,
n
);
swapl
(
&
stuff
->
minorVersion
,
n
);
return
(
*
ProcRandrVector
[
stuff
->
randrReqType
])
(
client
);
}
static
int
SProcRRGetScreenInfo
(
ClientPtr
client
)
{
register
int
n
;
REQUEST
(
xRRGetScreenInfoReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
window
,
n
);
return
(
*
ProcRandrVector
[
stuff
->
randrReqType
])
(
client
);
}
static
int
SProcRRSetScreenConfig
(
ClientPtr
client
)
{
register
int
n
;
REQUEST
(
xRRSetScreenConfigReq
);
if
(
RRClientKnowsRates
(
client
))
{
REQUEST_SIZE_MATCH
(
xRRSetScreenConfigReq
);
swaps
(
&
stuff
->
rate
,
n
);
}
else
{
REQUEST_SIZE_MATCH
(
xRR1_0SetScreenConfigReq
);
}
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
drawable
,
n
);
swapl
(
&
stuff
->
timestamp
,
n
);
swaps
(
&
stuff
->
sizeID
,
n
);
swaps
(
&
stuff
->
rotation
,
n
);
return
(
*
ProcRandrVector
[
stuff
->
randrReqType
])
(
client
);
}
static
int
SProcRRSelectInput
(
ClientPtr
client
)
{
register
int
n
;
REQUEST
(
xRRSelectInputReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
window
,
n
);
swaps
(
&
stuff
->
enable
,
n
);
return
(
*
ProcRandrVector
[
stuff
->
randrReqType
])
(
client
);
}
static
int
SProcRRGetScreenSizeRange
(
ClientPtr
client
)
{
int
n
;
REQUEST
(
xRRGetScreenSizeRangeReq
);
REQUEST_SIZE_MATCH
(
xRRGetScreenSizeRangeReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
window
,
n
);
return
(
*
ProcRandrVector
[
stuff
->
randrReqType
])
(
client
);
}
static
int
SProcRRSetScreenSize
(
ClientPtr
client
)
{
int
n
;
REQUEST
(
xRRSetScreenSizeReq
);
REQUEST_SIZE_MATCH
(
xRRSetScreenSizeReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
window
,
n
);
swaps
(
&
stuff
->
width
,
n
);
swaps
(
&
stuff
->
height
,
n
);
swapl
(
&
stuff
->
widthInMillimeters
,
n
);
swapl
(
&
stuff
->
heightInMillimeters
,
n
);
return
(
*
ProcRandrVector
[
stuff
->
randrReqType
])
(
client
);
}
static
int
SProcRRGetScreenResources
(
ClientPtr
client
)
{
int
n
;
REQUEST
(
xRRGetScreenResourcesReq
);
REQUEST_SIZE_MATCH
(
xRRGetScreenResourcesReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
window
,
n
);
return
(
*
ProcRandrVector
[
stuff
->
randrReqType
])
(
client
);
}
static
int
SProcRRGetOutputInfo
(
ClientPtr
client
)
{
int
n
;
REQUEST
(
xRRGetOutputInfoReq
);;
REQUEST_SIZE_MATCH
(
xRRGetOutputInfoReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
output
,
n
);
swapl
(
&
stuff
->
configTimestamp
,
n
);
return
(
*
ProcRandrVector
[
stuff
->
randrReqType
])
(
client
);
}
static
int
SProcRRListOutputProperties
(
ClientPtr
client
)
{
int
n
;
REQUEST
(
xRRListOutputPropertiesReq
);
REQUEST_SIZE_MATCH
(
xRRListOutputPropertiesReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
output
,
n
);
return
(
*
ProcRandrVector
[
stuff
->
randrReqType
])
(
client
);
}
static
int
SProcRRQueryOutputProperty
(
ClientPtr
client
)
{
int
n
;
REQUEST
(
xRRQueryOutputPropertyReq
);
REQUEST_SIZE_MATCH
(
xRRQueryOutputPropertyReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
output
,
n
);
swapl
(
&
stuff
->
property
,
n
);
return
(
*
ProcRandrVector
[
stuff
->
randrReqType
])
(
client
);
}
static
int
SProcRRConfigureOutputProperty
(
ClientPtr
client
)
{
int
n
;
REQUEST
(
xRRConfigureOutputPropertyReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
output
,
n
);
swapl
(
&
stuff
->
property
,
n
);
SwapRestL
(
stuff
);
return
(
*
ProcRandrVector
[
stuff
->
randrReqType
])
(
client
);
}
static
int
SProcRRChangeOutputProperty
(
ClientPtr
client
)
{
int
n
;
REQUEST
(
xRRChangeOutputPropertyReq
);
REQUEST_AT_LEAST_SIZE
(
xRRChangeOutputPropertyReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
output
,
n
);
swapl
(
&
stuff
->
property
,
n
);
swapl
(
&
stuff
->
type
,
n
);
swapl
(
&
stuff
->
nUnits
,
n
);
switch
(
stuff
->
format
)
{
case
8
:
break
;
case
16
:
SwapRestS
(
stuff
);
break
;
case
32
:
SwapRestL
(
stuff
);
break
;
default:
client
->
errorValue
=
stuff
->
format
;
return
BadValue
;
}
return
(
*
ProcRandrVector
[
stuff
->
randrReqType
])
(
client
);
}
static
int
SProcRRDeleteOutputProperty
(
ClientPtr
client
)
{
int
n
;
REQUEST
(
xRRDeleteOutputPropertyReq
);
REQUEST_SIZE_MATCH
(
xRRDeleteOutputPropertyReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
output
,
n
);
swapl
(
&
stuff
->
property
,
n
);
return
(
*
ProcRandrVector
[
stuff
->
randrReqType
])
(
client
);
}
static
int
SProcRRGetOutputProperty
(
ClientPtr
client
)
{
int
n
;
REQUEST
(
xRRGetOutputPropertyReq
);
REQUEST_SIZE_MATCH
(
xRRGetOutputPropertyReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
output
,
n
);
swapl
(
&
stuff
->
property
,
n
);
swapl
(
&
stuff
->
type
,
n
);
swapl
(
&
stuff
->
longOffset
,
n
);
swapl
(
&
stuff
->
longLength
,
n
);
return
(
*
ProcRandrVector
[
stuff
->
randrReqType
])
(
client
);
}
static
int
SProcRRCreateMode
(
ClientPtr
client
)
{
int
n
;
xRRModeInfo
*
modeinfo
;
REQUEST
(
xRRCreateModeReq
);
REQUEST_AT_LEAST_SIZE
(
xRRCreateModeReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
window
,
n
);
modeinfo
=
&
stuff
->
modeInfo
;
swapl
(
&
modeinfo
->
id
,
n
);
swaps
(
&
modeinfo
->
width
,
n
);
swaps
(
&
modeinfo
->
height
,
n
);
swapl
(
&
modeinfo
->
dotClock
,
n
);
swaps
(
&
modeinfo
->
hSyncStart
,
n
);
swaps
(
&
modeinfo
->
hSyncEnd
,
n
);
swaps
(
&
modeinfo
->
hTotal
,
n
);
swaps
(
&
modeinfo
->
vSyncStart
,
n
);
swaps
(
&
modeinfo
->
vSyncEnd
,
n
);
swaps
(
&
modeinfo
->
vTotal
,
n
);
swaps
(
&
modeinfo
->
nameLength
,
n
);
swapl
(
&
modeinfo
->
modeFlags
,
n
);
return
(
*
ProcRandrVector
[
stuff
->
randrReqType
])
(
client
);
}
static
int
SProcRRDestroyMode
(
ClientPtr
client
)
{
int
n
;
REQUEST
(
xRRDestroyModeReq
);
REQUEST_SIZE_MATCH
(
xRRDestroyModeReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
mode
,
n
);
return
(
*
ProcRandrVector
[
stuff
->
randrReqType
])
(
client
);
}
static
int
SProcRRAddOutputMode
(
ClientPtr
client
)
{
int
n
;
REQUEST
(
xRRAddOutputModeReq
);
REQUEST_SIZE_MATCH
(
xRRAddOutputModeReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
output
,
n
);
swapl
(
&
stuff
->
mode
,
n
);
return
(
*
ProcRandrVector
[
stuff
->
randrReqType
])
(
client
);
}
static
int
SProcRRDeleteOutputMode
(
ClientPtr
client
)
{
int
n
;
REQUEST
(
xRRDeleteOutputModeReq
);
REQUEST_SIZE_MATCH
(
xRRDeleteOutputModeReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
output
,
n
);
swapl
(
&
stuff
->
mode
,
n
);
return
(
*
ProcRandrVector
[
stuff
->
randrReqType
])
(
client
);
}
static
int
SProcRRGetCrtcInfo
(
ClientPtr
client
)
{
int
n
;
REQUEST
(
xRRGetCrtcInfoReq
);
REQUEST_SIZE_MATCH
(
xRRGetCrtcInfoReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
crtc
,
n
);
swapl
(
&
stuff
->
configTimestamp
,
n
);
return
(
*
ProcRandrVector
[
stuff
->
randrReqType
])
(
client
);
}
static
int
SProcRRSetCrtcConfig
(
ClientPtr
client
)
{
int
n
;
REQUEST
(
xRRSetCrtcConfigReq
);
REQUEST_AT_LEAST_SIZE
(
xRRSetCrtcConfigReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
crtc
,
n
);
swapl
(
&
stuff
->
timestamp
,
n
);
swapl
(
&
stuff
->
configTimestamp
,
n
);
swaps
(
&
stuff
->
x
,
n
);
swaps
(
&
stuff
->
y
,
n
);
swapl
(
&
stuff
->
mode
,
n
);
swaps
(
&
stuff
->
rotation
,
n
);
SwapRestL
(
stuff
);
return
(
*
ProcRandrVector
[
stuff
->
randrReqType
])
(
client
);
}
static
int
SProcRRGetCrtcGammaSize
(
ClientPtr
client
)
{
int
n
;
REQUEST
(
xRRGetCrtcGammaSizeReq
);
REQUEST_SIZE_MATCH
(
xRRGetCrtcGammaSizeReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
crtc
,
n
);
return
(
*
ProcRandrVector
[
stuff
->
randrReqType
])
(
client
);
}
static
int
SProcRRGetCrtcGamma
(
ClientPtr
client
)
{
int
n
;
REQUEST
(
xRRGetCrtcGammaReq
);
REQUEST_SIZE_MATCH
(
xRRGetCrtcGammaReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
crtc
,
n
);
return
(
*
ProcRandrVector
[
stuff
->
randrReqType
])
(
client
);
}
static
int
SProcRRSetCrtcGamma
(
ClientPtr
client
)
{
int
n
;
REQUEST
(
xRRSetCrtcGammaReq
);
REQUEST_AT_LEAST_SIZE
(
xRRSetCrtcGammaReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
crtc
,
n
);
swaps
(
&
stuff
->
size
,
n
);
SwapRestS
(
stuff
);
return
(
*
ProcRandrVector
[
stuff
->
randrReqType
])
(
client
);
}
int
(
*
SProcRandrVector
[
RRNumberRequests
])(
ClientPtr
)
=
{
SProcRRQueryVersion
,
/* 0 */
/* we skip 1 to make old clients fail pretty immediately */
NULL
,
/* 1 SProcRandrOldGetScreenInfo */
/* V1.0 apps share the same set screen config request id */
SProcRRSetScreenConfig
,
/* 2 */
NULL
,
/* 3 SProcRandrOldScreenChangeSelectInput */
/* 3 used to be ScreenChangeSelectInput; deprecated */
SProcRRSelectInput
,
/* 4 */
SProcRRGetScreenInfo
,
/* 5 */
/* V1.2 additions */
SProcRRGetScreenSizeRange
,
/* 6 */
SProcRRSetScreenSize
,
/* 7 */
SProcRRGetScreenResources
,
/* 8 */
SProcRRGetOutputInfo
,
/* 9 */
SProcRRListOutputProperties
,
/* 10 */
SProcRRQueryOutputProperty
,
/* 11 */
SProcRRConfigureOutputProperty
,
/* 12 */
SProcRRChangeOutputProperty
,
/* 13 */
SProcRRDeleteOutputProperty
,
/* 14 */
SProcRRGetOutputProperty
,
/* 15 */
SProcRRCreateMode
,
/* 16 */
SProcRRDestroyMode
,
/* 17 */
SProcRRAddOutputMode
,
/* 18 */
SProcRRDeleteOutputMode
,
/* 19 */
SProcRRGetCrtcInfo
,
/* 20 */
SProcRRSetCrtcConfig
,
/* 21 */
SProcRRGetCrtcGammaSize
,
/* 22 */
SProcRRGetCrtcGamma
,
/* 23 */
SProcRRSetCrtcGamma
,
/* 24 */
};
nx-X11/programs/Xserver/randr/rrxinerama.c
0 → 100644
View file @
15cee47a
/*
* Copyright © 2006 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
/*
* This Xinerama implementation comes from the SiS driver which has
* the following notice:
*/
/*
* SiS driver main code
*
* Copyright (C) 2001-2005 by Thomas Winischhofer, Vienna, Austria.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1) Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2) Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3) The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Author: Thomas Winischhofer <thomas@winischhofer.net>
* - driver entirely rewritten since 2001, only basic structure taken from
* old code (except sis_dri.c, sis_shadow.c, sis_accel.c and parts of
* sis_dga.c; these were mostly taken over; sis_dri.c was changed for
* new versions of the DRI layer)
*
* This notice covers the entire driver code unless indicated otherwise.
*
* Formerly based on code which was
* Copyright (C) 1998, 1999 by Alan Hourihane, Wigan, England.
* Written by:
* Alan Hourihane <alanh@fairlite.demon.co.uk>,
* Mike Chapman <mike@paranoia.com>,
* Juanjo Santamarta <santamarta@ctv.es>,
* Mitani Hiroshi <hmitani@drl.mei.co.jp>,
* David Thomas <davtom@dream.org.uk>.
*/
/**************************************************************************/
/* */
/* Copyright (c) 2001, 2011 NoMachine, http://www.nomachine.com/. */
/* */
/* NX-X11, NX protocol compression and NX extensions to this software */
/* are copyright of NoMachine. Redistribution and use of the present */
/* software is allowed according to terms specified in the file LICENSE */
/* which comes in the source distribution. */
/* */
/* Check http://www.nomachine.com/licensing.html for applicability. */
/* */
/* NX and NoMachine are trademarks of Medialogic S.p.A. */
/* */
/* All rights reserved. */
/* */
/**************************************************************************/
#include "randrstr.h"
#include "swaprep.h"
#ifndef NXAGENT_SERVER
#include <X11/extensions/panoramiXproto.h>
#else
#include "panoramiXproto.h"
#endif
#define RR_XINERAMA_MAJOR_VERSION 1
#define RR_XINERAMA_MINOR_VERSION 1
/* Xinerama is not multi-screen capable; just report about screen 0 */
#define RR_XINERAMA_SCREEN 0
static
int
ProcRRXineramaQueryVersion
(
ClientPtr
client
);
static
int
ProcRRXineramaGetState
(
ClientPtr
client
);
static
int
ProcRRXineramaGetScreenCount
(
ClientPtr
client
);
static
int
ProcRRXineramaGetScreenSize
(
ClientPtr
client
);
static
int
ProcRRXineramaIsActive
(
ClientPtr
client
);
static
int
ProcRRXineramaQueryScreens
(
ClientPtr
client
);
static
int
SProcRRXineramaDispatch
(
ClientPtr
client
);
/* Proc */
int
ProcRRXineramaQueryVersion
(
ClientPtr
client
)
{
xPanoramiXQueryVersionReply
rep
;
register
int
n
;
REQUEST_SIZE_MATCH
(
xPanoramiXQueryVersionReq
);
rep
.
type
=
X_Reply
;
rep
.
length
=
0
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
majorVersion
=
RR_XINERAMA_MAJOR_VERSION
;
rep
.
minorVersion
=
RR_XINERAMA_MINOR_VERSION
;
if
(
client
->
swapped
)
{
swaps
(
&
rep
.
sequenceNumber
,
n
);
swapl
(
&
rep
.
length
,
n
);
swaps
(
&
rep
.
majorVersion
,
n
);
swaps
(
&
rep
.
minorVersion
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xPanoramiXQueryVersionReply
),
(
char
*
)
&
rep
);
return
(
client
->
noClientException
);
}
int
ProcRRXineramaGetState
(
ClientPtr
client
)
{
REQUEST
(
xPanoramiXGetStateReq
);
WindowPtr
pWin
;
xPanoramiXGetStateReply
rep
;
register
int
n
,
rc
;
ScreenPtr
pScreen
;
rrScrPrivPtr
pScrPriv
;
Bool
active
=
FALSE
;
REQUEST_SIZE_MATCH
(
xPanoramiXGetStateReq
);
#ifndef NXAGENT_SERVER
rc
=
dixLookupWindow
(
&
pWin
,
stuff
->
window
,
client
,
DixGetAttrAccess
);
#else
pWin
=
SecurityLookupWindow
(
stuff
->
window
,
client
,
SecurityReadAccess
);
rc
=
pWin
?
Success
:
BadWindow
;
#endif
if
(
rc
!=
Success
)
return
rc
;
pScreen
=
pWin
->
drawable
.
pScreen
;
pScrPriv
=
rrGetScrPriv
(
pScreen
);
if
(
pScrPriv
)
{
/* XXX do we need more than this? */
active
=
TRUE
;
}
rep
.
type
=
X_Reply
;
rep
.
length
=
0
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
state
=
active
;
rep
.
window
=
stuff
->
window
;
if
(
client
->
swapped
)
{
swaps
(
&
rep
.
sequenceNumber
,
n
);
swapl
(
&
rep
.
length
,
n
);
swapl
(
&
rep
.
window
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xPanoramiXGetStateReply
),
(
char
*
)
&
rep
);
return
client
->
noClientException
;
}
static
Bool
RRXineramaCrtcActive
(
RRCrtcPtr
crtc
)
{
return
crtc
->
mode
!=
NULL
&&
crtc
->
numOutputs
>
0
;
}
static
int
RRXineramaScreenCount
(
ScreenPtr
pScreen
)
{
int
i
,
n
;
n
=
0
;
if
(
rrGetScrPriv
(
pScreen
))
{
rrScrPriv
(
pScreen
);
for
(
i
=
0
;
i
<
pScrPriv
->
numCrtcs
;
i
++
)
if
(
RRXineramaCrtcActive
(
pScrPriv
->
crtcs
[
i
]))
n
++
;
}
return
n
;
}
static
Bool
RRXineramaScreenActive
(
ScreenPtr
pScreen
)
{
return
RRXineramaScreenCount
(
pScreen
)
>
0
;
}
int
ProcRRXineramaGetScreenCount
(
ClientPtr
client
)
{
REQUEST
(
xPanoramiXGetScreenCountReq
);
WindowPtr
pWin
;
xPanoramiXGetScreenCountReply
rep
;
register
int
n
,
rc
;
REQUEST_SIZE_MATCH
(
xPanoramiXGetScreenCountReq
);
#ifndef NXAGENT_SERVER
rc
=
dixLookupWindow
(
&
pWin
,
stuff
->
window
,
client
,
DixGetAttrAccess
);
#else
pWin
=
SecurityLookupWindow
(
stuff
->
window
,
client
,
SecurityReadAccess
);
rc
=
pWin
?
Success
:
BadWindow
;
#endif
if
(
rc
!=
Success
)
return
rc
;
rep
.
type
=
X_Reply
;
rep
.
length
=
0
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
ScreenCount
=
RRXineramaScreenCount
(
pWin
->
drawable
.
pScreen
);
rep
.
window
=
stuff
->
window
;
if
(
client
->
swapped
)
{
swaps
(
&
rep
.
sequenceNumber
,
n
);
swapl
(
&
rep
.
length
,
n
);
swapl
(
&
rep
.
window
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xPanoramiXGetScreenCountReply
),
(
char
*
)
&
rep
);
return
client
->
noClientException
;
}
int
ProcRRXineramaGetScreenSize
(
ClientPtr
client
)
{
REQUEST
(
xPanoramiXGetScreenSizeReq
);
WindowPtr
pWin
,
pRoot
;
ScreenPtr
pScreen
;
xPanoramiXGetScreenSizeReply
rep
;
register
int
n
,
rc
;
REQUEST_SIZE_MATCH
(
xPanoramiXGetScreenSizeReq
);
#ifndef NXAGENT_SERVER
rc
=
dixLookupWindow
(
&
pWin
,
stuff
->
window
,
client
,
DixGetAttrAccess
);
#else
pWin
=
SecurityLookupWindow
(
stuff
->
window
,
client
,
SecurityReadAccess
);
rc
=
pWin
?
Success
:
BadWindow
;
#endif
if
(
rc
!=
Success
)
return
rc
;
pScreen
=
pWin
->
drawable
.
pScreen
;
pRoot
=
WindowTable
[
pScreen
->
myNum
];
rep
.
type
=
X_Reply
;
rep
.
length
=
0
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
width
=
pRoot
->
drawable
.
width
;
rep
.
height
=
pRoot
->
drawable
.
height
;
rep
.
window
=
stuff
->
window
;
rep
.
screen
=
stuff
->
screen
;
if
(
client
->
swapped
)
{
swaps
(
&
rep
.
sequenceNumber
,
n
);
swapl
(
&
rep
.
length
,
n
);
swapl
(
&
rep
.
width
,
n
);
swapl
(
&
rep
.
height
,
n
);
swapl
(
&
rep
.
window
,
n
);
swapl
(
&
rep
.
screen
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xPanoramiXGetScreenSizeReply
),
(
char
*
)
&
rep
);
return
client
->
noClientException
;
}
int
ProcRRXineramaIsActive
(
ClientPtr
client
)
{
xXineramaIsActiveReply
rep
;
REQUEST_SIZE_MATCH
(
xXineramaIsActiveReq
);
rep
.
type
=
X_Reply
;
rep
.
length
=
0
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
state
=
RRXineramaScreenActive
(
screenInfo
.
screens
[
RR_XINERAMA_SCREEN
]);
if
(
client
->
swapped
)
{
register
int
n
;
swaps
(
&
rep
.
sequenceNumber
,
n
);
swapl
(
&
rep
.
length
,
n
);
swapl
(
&
rep
.
state
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xXineramaIsActiveReply
),
(
char
*
)
&
rep
);
return
client
->
noClientException
;
}
int
ProcRRXineramaQueryScreens
(
ClientPtr
client
)
{
xXineramaQueryScreensReply
rep
;
ScreenPtr
pScreen
=
screenInfo
.
screens
[
RR_XINERAMA_SCREEN
];
REQUEST_SIZE_MATCH
(
xXineramaQueryScreensReq
);
if
(
RRXineramaScreenActive
(
pScreen
))
{
rrScrPriv
(
pScreen
);
if
(
pScrPriv
->
numCrtcs
==
0
||
pScrPriv
->
numOutputs
==
0
)
RRGetInfo
(
pScreen
);
}
rep
.
type
=
X_Reply
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
number
=
RRXineramaScreenCount
(
pScreen
);
rep
.
length
=
rep
.
number
*
sz_XineramaScreenInfo
>>
2
;
if
(
client
->
swapped
)
{
register
int
n
;
swaps
(
&
rep
.
sequenceNumber
,
n
);
swapl
(
&
rep
.
length
,
n
);
swapl
(
&
rep
.
number
,
n
);
}
WriteToClient
(
client
,
sizeof
(
xXineramaQueryScreensReply
),
(
char
*
)
&
rep
);
if
(
rep
.
number
)
{
rrScrPriv
(
pScreen
);
xXineramaScreenInfo
scratch
;
int
i
;
for
(
i
=
0
;
i
<
pScrPriv
->
numCrtcs
;
i
++
)
{
RRCrtcPtr
crtc
=
pScrPriv
->
crtcs
[
i
];
if
(
RRXineramaCrtcActive
(
crtc
))
{
int
width
,
height
;
RRCrtcGetScanoutSize
(
crtc
,
&
width
,
&
height
);
scratch
.
x_org
=
crtc
->
x
;
scratch
.
y_org
=
crtc
->
y
;
scratch
.
width
=
width
;
scratch
.
height
=
height
;
if
(
client
->
swapped
)
{
register
int
n
;
swaps
(
&
scratch
.
x_org
,
n
);
swaps
(
&
scratch
.
y_org
,
n
);
swaps
(
&
scratch
.
width
,
n
);
swaps
(
&
scratch
.
height
,
n
);
}
WriteToClient
(
client
,
sz_XineramaScreenInfo
,
(
char
*
)
&
scratch
);
}
}
}
return
client
->
noClientException
;
}
static
int
ProcRRXineramaDispatch
(
ClientPtr
client
)
{
REQUEST
(
xReq
);
switch
(
stuff
->
data
)
{
case
X_PanoramiXQueryVersion
:
return
ProcRRXineramaQueryVersion
(
client
);
case
X_PanoramiXGetState
:
return
ProcRRXineramaGetState
(
client
);
case
X_PanoramiXGetScreenCount
:
return
ProcRRXineramaGetScreenCount
(
client
);
case
X_PanoramiXGetScreenSize
:
return
ProcRRXineramaGetScreenSize
(
client
);
case
X_XineramaIsActive
:
return
ProcRRXineramaIsActive
(
client
);
case
X_XineramaQueryScreens
:
return
ProcRRXineramaQueryScreens
(
client
);
}
return
BadRequest
;
}
/* SProc */
static
int
SProcRRXineramaQueryVersion
(
ClientPtr
client
)
{
REQUEST
(
xPanoramiXQueryVersionReq
);
register
int
n
;
swaps
(
&
stuff
->
length
,
n
);
REQUEST_SIZE_MATCH
(
xPanoramiXQueryVersionReq
);
return
ProcRRXineramaQueryVersion
(
client
);
}
static
int
SProcRRXineramaGetState
(
ClientPtr
client
)
{
REQUEST
(
xPanoramiXGetStateReq
);
register
int
n
;
swaps
(
&
stuff
->
length
,
n
);
REQUEST_SIZE_MATCH
(
xPanoramiXGetStateReq
);
swapl
(
&
stuff
->
window
,
n
);
return
ProcRRXineramaGetState
(
client
);
}
static
int
SProcRRXineramaGetScreenCount
(
ClientPtr
client
)
{
REQUEST
(
xPanoramiXGetScreenCountReq
);
register
int
n
;
swaps
(
&
stuff
->
length
,
n
);
REQUEST_SIZE_MATCH
(
xPanoramiXGetScreenCountReq
);
swapl
(
&
stuff
->
window
,
n
);
return
ProcRRXineramaGetScreenCount
(
client
);
}
static
int
SProcRRXineramaGetScreenSize
(
ClientPtr
client
)
{
REQUEST
(
xPanoramiXGetScreenSizeReq
);
register
int
n
;
swaps
(
&
stuff
->
length
,
n
);
REQUEST_SIZE_MATCH
(
xPanoramiXGetScreenSizeReq
);
swapl
(
&
stuff
->
window
,
n
);
swapl
(
&
stuff
->
screen
,
n
);
return
ProcRRXineramaGetScreenSize
(
client
);
}
static
int
SProcRRXineramaIsActive
(
ClientPtr
client
)
{
REQUEST
(
xXineramaIsActiveReq
);
register
int
n
;
swaps
(
&
stuff
->
length
,
n
);
REQUEST_SIZE_MATCH
(
xXineramaIsActiveReq
);
return
ProcRRXineramaIsActive
(
client
);
}
static
int
SProcRRXineramaQueryScreens
(
ClientPtr
client
)
{
REQUEST
(
xXineramaQueryScreensReq
);
register
int
n
;
swaps
(
&
stuff
->
length
,
n
);
REQUEST_SIZE_MATCH
(
xXineramaQueryScreensReq
);
return
ProcRRXineramaQueryScreens
(
client
);
}
int
SProcRRXineramaDispatch
(
ClientPtr
client
)
{
REQUEST
(
xReq
);
switch
(
stuff
->
data
)
{
case
X_PanoramiXQueryVersion
:
return
SProcRRXineramaQueryVersion
(
client
);
case
X_PanoramiXGetState
:
return
SProcRRXineramaGetState
(
client
);
case
X_PanoramiXGetScreenCount
:
return
SProcRRXineramaGetScreenCount
(
client
);
case
X_PanoramiXGetScreenSize
:
return
SProcRRXineramaGetScreenSize
(
client
);
case
X_XineramaIsActive
:
return
SProcRRXineramaIsActive
(
client
);
case
X_XineramaQueryScreens
:
return
SProcRRXineramaQueryScreens
(
client
);
}
return
BadRequest
;
}
static
void
RRXineramaResetProc
(
ExtensionEntry
*
extEntry
)
{
}
void
RRXineramaExtensionInit
(
void
)
{
#ifdef PANORAMIX
if
(
!
noPanoramiXExtension
)
return
;
#endif
/*
* Xinerama isn't capable enough to have multiple protocol screens each
* with their own output geometry. So if there's more than one protocol
* screen, just don't even try.
*/
if
(
screenInfo
.
numScreens
>
1
)
return
;
(
void
)
AddExtension
(
PANORAMIX_PROTOCOL_NAME
,
0
,
0
,
ProcRRXineramaDispatch
,
SProcRRXineramaDispatch
,
RRXineramaResetProc
,
StandardMinorOpcode
);
}
nx-X11/programs/Xserver/randr/rrxinerama.c.NX.original
0 → 100644
View file @
15cee47a
/*
* Copyright © 2006 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
/*
* This Xinerama implementation comes from the SiS driver which has
* the following notice:
*/
/*
* SiS driver main code
*
* Copyright (C) 2001-2005 by Thomas Winischhofer, Vienna, Austria.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1) Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2) Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3) The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Author: Thomas Winischhofer <thomas@winischhofer.net>
* - driver entirely rewritten since 2001, only basic structure taken from
* old code (except sis_dri.c, sis_shadow.c, sis_accel.c and parts of
* sis_dga.c; these were mostly taken over; sis_dri.c was changed for
* new versions of the DRI layer)
*
* This notice covers the entire driver code unless indicated otherwise.
*
* Formerly based on code which was
* Copyright (C) 1998, 1999 by Alan Hourihane, Wigan, England.
* Written by:
* Alan Hourihane <alanh@fairlite.demon.co.uk>,
* Mike Chapman <mike@paranoia.com>,
* Juanjo Santamarta <santamarta@ctv.es>,
* Mitani Hiroshi <hmitani@drl.mei.co.jp>,
* David Thomas <davtom@dream.org.uk>.
*/
/**************************************************************************/
/* */
/* Copyright (c) 2001, 2011 NoMachine, http://www.nomachine.com/. */
/* */
/* NX-X11, NX protocol compression and NX extensions to this software */
/* are copyright of NoMachine. Redistribution and use of the present */
/* software is allowed according to terms specified in the file LICENSE */
/* which comes in the source distribution. */
/* */
/* Check http://www.nomachine.com/licensing.html for applicability. */
/* */
/* NX and NoMachine are trademarks of Medialogic S.p.A. */
/* */
/* All rights reserved. */
/* */
/**************************************************************************/
#include "randrstr.h"
#include "swaprep.h"
#ifndef NXAGENT_SERVER
#include <X11/extensions/panoramiXproto.h>
#else
#include "panoramiXproto.h"
#endif
#define RR_XINERAMA_MAJOR_VERSION 1
#define RR_XINERAMA_MINOR_VERSION 1
/* Xinerama is not multi-screen capable; just report about screen 0 */
#define RR_XINERAMA_SCREEN 0
static int ProcRRXineramaQueryVersion(ClientPtr client);
static int ProcRRXineramaGetState(ClientPtr client);
static int ProcRRXineramaGetScreenCount(ClientPtr client);
static int ProcRRXineramaGetScreenSize(ClientPtr client);
static int ProcRRXineramaIsActive(ClientPtr client);
static int ProcRRXineramaQueryScreens(ClientPtr client);
static int SProcRRXineramaDispatch(ClientPtr client);
/* Proc */
int
ProcRRXineramaQueryVersion(ClientPtr client)
{
xPanoramiXQueryVersionReply rep;
register int n;
REQUEST_SIZE_MATCH(xPanoramiXQueryVersionReq);
rep.type = X_Reply;
rep.length = 0;
rep.sequenceNumber = client->sequence;
rep.majorVersion = RR_XINERAMA_MAJOR_VERSION;
rep.minorVersion = RR_XINERAMA_MINOR_VERSION;
if(client->swapped) {
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swaps(&rep.majorVersion, n);
swaps(&rep.minorVersion, n);
}
WriteToClient(client, sizeof(xPanoramiXQueryVersionReply), (char *)&rep);
return (client->noClientException);
}
int
ProcRRXineramaGetState(ClientPtr client)
{
REQUEST(xPanoramiXGetStateReq);
WindowPtr pWin;
xPanoramiXGetStateReply rep;
register int n, rc;
ScreenPtr pScreen;
rrScrPrivPtr pScrPriv;
Bool active = FALSE;
REQUEST_SIZE_MATCH(xPanoramiXGetStateReq);
#ifndef NXAGENT_SERVER
rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
#else
pWin = SecurityLookupWindow(stuff->window, client, SecurityReadAccess);
rc = pWin ? Success : BadWindow;
#endif
if(rc != Success)
return rc;
pScreen = pWin->drawable.pScreen;
pScrPriv = rrGetScrPriv(pScreen);
if (pScrPriv)
{
/* XXX do we need more than this? */
active = TRUE;
}
rep.type = X_Reply;
rep.length = 0;
rep.sequenceNumber = client->sequence;
rep.state = active;
rep.window = stuff->window;
if(client->swapped) {
swaps (&rep.sequenceNumber, n);
swapl (&rep.length, n);
swapl (&rep.window, n);
}
WriteToClient(client, sizeof(xPanoramiXGetStateReply), (char *)&rep);
return client->noClientException;
}
static Bool
RRXineramaCrtcActive (RRCrtcPtr crtc)
{
return crtc->mode != NULL && crtc->numOutputs > 0;
}
static int
RRXineramaScreenCount (ScreenPtr pScreen)
{
int i, n;
n = 0;
if (rrGetScrPriv (pScreen))
{
rrScrPriv(pScreen);
for (i = 0; i < pScrPriv->numCrtcs; i++)
if (RRXineramaCrtcActive (pScrPriv->crtcs[i]))
n++;
}
return n;
}
static Bool
RRXineramaScreenActive (ScreenPtr pScreen)
{
return RRXineramaScreenCount (pScreen) > 0;
}
int
ProcRRXineramaGetScreenCount(ClientPtr client)
{
REQUEST(xPanoramiXGetScreenCountReq);
WindowPtr pWin;
xPanoramiXGetScreenCountReply rep;
register int n, rc;
REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq);
#ifndef NXAGENT_SERVER
rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
#else
pWin = SecurityLookupWindow(stuff->window, client, SecurityReadAccess);
rc = pWin ? Success : BadWindow;
#endif
if (rc != Success)
return rc;
rep.type = X_Reply;
rep.length = 0;
rep.sequenceNumber = client->sequence;
rep.ScreenCount = RRXineramaScreenCount (pWin->drawable.pScreen);
rep.window = stuff->window;
if(client->swapped) {
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swapl(&rep.window, n);
}
WriteToClient(client, sizeof(xPanoramiXGetScreenCountReply), (char *)&rep);
return client->noClientException;
}
int
ProcRRXineramaGetScreenSize(ClientPtr client)
{
REQUEST(xPanoramiXGetScreenSizeReq);
WindowPtr pWin, pRoot;
ScreenPtr pScreen;
xPanoramiXGetScreenSizeReply rep;
register int n, rc;
REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq);
#ifndef NXAGENT_SERVER
rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
#else
pWin = SecurityLookupWindow(stuff->window, client, SecurityReadAccess);
rc = pWin ? Success : BadWindow;
#endif
if (rc != Success)
return rc;
pScreen = pWin->drawable.pScreen;
pRoot = WindowTable[pScreen->myNum];
rep.type = X_Reply;
rep.length = 0;
rep.sequenceNumber = client->sequence;
rep.width = pRoot->drawable.width;
rep.height = pRoot->drawable.height;
rep.window = stuff->window;
rep.screen = stuff->screen;
if(client->swapped) {
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swapl(&rep.width, n);
swapl(&rep.height, n);
swapl(&rep.window, n);
swapl(&rep.screen, n);
}
WriteToClient(client, sizeof(xPanoramiXGetScreenSizeReply), (char *)&rep);
return client->noClientException;
}
int
ProcRRXineramaIsActive(ClientPtr client)
{
xXineramaIsActiveReply rep;
REQUEST_SIZE_MATCH(xXineramaIsActiveReq);
rep.type = X_Reply;
rep.length = 0;
rep.sequenceNumber = client->sequence;
rep.state = RRXineramaScreenActive (screenInfo.screens[RR_XINERAMA_SCREEN]);
if(client->swapped) {
register int n;
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swapl(&rep.state, n);
}
WriteToClient(client, sizeof(xXineramaIsActiveReply), (char *) &rep);
return client->noClientException;
}
int
ProcRRXineramaQueryScreens(ClientPtr client)
{
xXineramaQueryScreensReply rep;
ScreenPtr pScreen = screenInfo.screens[RR_XINERAMA_SCREEN];
REQUEST_SIZE_MATCH(xXineramaQueryScreensReq);
if (RRXineramaScreenActive (pScreen))
{
rrScrPriv(pScreen);
if (pScrPriv->numCrtcs == 0 || pScrPriv->numOutputs == 0)
RRGetInfo (pScreen);
}
rep.type = X_Reply;
rep.sequenceNumber = client->sequence;
rep.number = RRXineramaScreenCount (pScreen);
rep.length = rep.number * sz_XineramaScreenInfo >> 2;
if(client->swapped) {
register int n;
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swapl(&rep.number, n);
}
WriteToClient(client, sizeof(xXineramaQueryScreensReply), (char *)&rep);
if(rep.number) {
rrScrPriv(pScreen);
xXineramaScreenInfo scratch;
int i;
for(i = 0; i < pScrPriv->numCrtcs; i++) {
RRCrtcPtr crtc = pScrPriv->crtcs[i];
if (RRXineramaCrtcActive (crtc))
{
int width, height;
RRCrtcGetScanoutSize (crtc, &width, &height);
scratch.x_org = crtc->x;
scratch.y_org = crtc->y;
scratch.width = width;
scratch.height = height;
if(client->swapped) {
register int n;
swaps(&scratch.x_org, n);
swaps(&scratch.y_org, n);
swaps(&scratch.width, n);
swaps(&scratch.height, n);
}
WriteToClient(client, sz_XineramaScreenInfo, (char *)&scratch);
}
}
}
return client->noClientException;
}
static int
ProcRRXineramaDispatch(ClientPtr client)
{
REQUEST(xReq);
switch (stuff->data) {
case X_PanoramiXQueryVersion:
return ProcRRXineramaQueryVersion(client);
case X_PanoramiXGetState:
return ProcRRXineramaGetState(client);
case X_PanoramiXGetScreenCount:
return ProcRRXineramaGetScreenCount(client);
case X_PanoramiXGetScreenSize:
return ProcRRXineramaGetScreenSize(client);
case X_XineramaIsActive:
return ProcRRXineramaIsActive(client);
case X_XineramaQueryScreens:
return ProcRRXineramaQueryScreens(client);
}
return BadRequest;
}
/* SProc */
static int
SProcRRXineramaQueryVersion (ClientPtr client)
{
REQUEST(xPanoramiXQueryVersionReq);
register int n;
swaps(&stuff->length,n);
REQUEST_SIZE_MATCH (xPanoramiXQueryVersionReq);
return ProcRRXineramaQueryVersion(client);
}
static int
SProcRRXineramaGetState(ClientPtr client)
{
REQUEST(xPanoramiXGetStateReq);
register int n;
swaps (&stuff->length, n);
REQUEST_SIZE_MATCH(xPanoramiXGetStateReq);
swapl (&stuff->window, n);
return ProcRRXineramaGetState(client);
}
static int
SProcRRXineramaGetScreenCount(ClientPtr client)
{
REQUEST(xPanoramiXGetScreenCountReq);
register int n;
swaps (&stuff->length, n);
REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq);
swapl (&stuff->window, n);
return ProcRRXineramaGetScreenCount(client);
}
static int
SProcRRXineramaGetScreenSize(ClientPtr client)
{
REQUEST(xPanoramiXGetScreenSizeReq);
register int n;
swaps (&stuff->length, n);
REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq);
swapl (&stuff->window, n);
swapl (&stuff->screen, n);
return ProcRRXineramaGetScreenSize(client);
}
static int
SProcRRXineramaIsActive(ClientPtr client)
{
REQUEST(xXineramaIsActiveReq);
register int n;
swaps (&stuff->length, n);
REQUEST_SIZE_MATCH(xXineramaIsActiveReq);
return ProcRRXineramaIsActive(client);
}
static int
SProcRRXineramaQueryScreens(ClientPtr client)
{
REQUEST(xXineramaQueryScreensReq);
register int n;
swaps (&stuff->length, n);
REQUEST_SIZE_MATCH(xXineramaQueryScreensReq);
return ProcRRXineramaQueryScreens(client);
}
int
SProcRRXineramaDispatch(ClientPtr client)
{
REQUEST(xReq);
switch (stuff->data) {
case X_PanoramiXQueryVersion:
return SProcRRXineramaQueryVersion(client);
case X_PanoramiXGetState:
return SProcRRXineramaGetState(client);
case X_PanoramiXGetScreenCount:
return SProcRRXineramaGetScreenCount(client);
case X_PanoramiXGetScreenSize:
return SProcRRXineramaGetScreenSize(client);
case X_XineramaIsActive:
return SProcRRXineramaIsActive(client);
case X_XineramaQueryScreens:
return SProcRRXineramaQueryScreens(client);
}
return BadRequest;
}
static void
RRXineramaResetProc(ExtensionEntry* extEntry)
{
}
void
RRXineramaExtensionInit(void)
{
#ifdef PANORAMIX
if(!noPanoramiXExtension)
return;
#endif
/*
* Xinerama isn't capable enough to have multiple protocol screens each
* with their own output geometry. So if there's more than one protocol
* screen, just don't even try.
*/
if (screenInfo.numScreens > 1)
return;
(void) AddExtension(PANORAMIX_PROTOCOL_NAME, 0,0,
ProcRRXineramaDispatch,
SProcRRXineramaDispatch,
RRXineramaResetProc,
StandardMinorOpcode);
}
nx-X11/programs/Xserver/randr/rrxinerama.c.X.original
0 → 100644
View file @
15cee47a
/*
* Copyright © 2006 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and
* that the name of the copyright holders not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. The copyright holders make no representations
* about the suitability of this software for any purpose. It is provided "as
* is" without express or implied warranty.
*
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
/*
* This Xinerama implementation comes from the SiS driver which has
* the following notice:
*/
/*
* SiS driver main code
*
* Copyright (C) 2001-2005 by Thomas Winischhofer, Vienna, Austria.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1) Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2) Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3) The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Author: Thomas Winischhofer <thomas@winischhofer.net>
* - driver entirely rewritten since 2001, only basic structure taken from
* old code (except sis_dri.c, sis_shadow.c, sis_accel.c and parts of
* sis_dga.c; these were mostly taken over; sis_dri.c was changed for
* new versions of the DRI layer)
*
* This notice covers the entire driver code unless indicated otherwise.
*
* Formerly based on code which was
* Copyright (C) 1998, 1999 by Alan Hourihane, Wigan, England.
* Written by:
* Alan Hourihane <alanh@fairlite.demon.co.uk>,
* Mike Chapman <mike@paranoia.com>,
* Juanjo Santamarta <santamarta@ctv.es>,
* Mitani Hiroshi <hmitani@drl.mei.co.jp>,
* David Thomas <davtom@dream.org.uk>.
*/
#include "randrstr.h"
#include "swaprep.h"
#include <X11/extensions/panoramiXproto.h>
#define RR_XINERAMA_MAJOR_VERSION 1
#define RR_XINERAMA_MINOR_VERSION 1
/* Xinerama is not multi-screen capable; just report about screen 0 */
#define RR_XINERAMA_SCREEN 0
static int ProcRRXineramaQueryVersion(ClientPtr client);
static int ProcRRXineramaGetState(ClientPtr client);
static int ProcRRXineramaGetScreenCount(ClientPtr client);
static int ProcRRXineramaGetScreenSize(ClientPtr client);
static int ProcRRXineramaIsActive(ClientPtr client);
static int ProcRRXineramaQueryScreens(ClientPtr client);
static int SProcRRXineramaDispatch(ClientPtr client);
/* Proc */
int
ProcRRXineramaQueryVersion(ClientPtr client)
{
xPanoramiXQueryVersionReply rep;
register int n;
REQUEST_SIZE_MATCH(xPanoramiXQueryVersionReq);
rep.type = X_Reply;
rep.length = 0;
rep.sequenceNumber = client->sequence;
rep.majorVersion = RR_XINERAMA_MAJOR_VERSION;
rep.minorVersion = RR_XINERAMA_MINOR_VERSION;
if(client->swapped) {
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swaps(&rep.majorVersion, n);
swaps(&rep.minorVersion, n);
}
WriteToClient(client, sizeof(xPanoramiXQueryVersionReply), (char *)&rep);
return (client->noClientException);
}
int
ProcRRXineramaGetState(ClientPtr client)
{
REQUEST(xPanoramiXGetStateReq);
WindowPtr pWin;
xPanoramiXGetStateReply rep;
register int n, rc;
ScreenPtr pScreen;
rrScrPrivPtr pScrPriv;
Bool active = FALSE;
REQUEST_SIZE_MATCH(xPanoramiXGetStateReq);
rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
if(rc != Success)
return rc;
pScreen = pWin->drawable.pScreen;
pScrPriv = rrGetScrPriv(pScreen);
if (pScrPriv)
{
/* XXX do we need more than this? */
active = TRUE;
}
rep.type = X_Reply;
rep.length = 0;
rep.sequenceNumber = client->sequence;
rep.state = active;
rep.window = stuff->window;
if(client->swapped) {
swaps (&rep.sequenceNumber, n);
swapl (&rep.length, n);
swapl (&rep.window, n);
}
WriteToClient(client, sizeof(xPanoramiXGetStateReply), (char *)&rep);
return client->noClientException;
}
static Bool
RRXineramaCrtcActive (RRCrtcPtr crtc)
{
return crtc->mode != NULL && crtc->numOutputs > 0;
}
static int
RRXineramaScreenCount (ScreenPtr pScreen)
{
int i, n;
n = 0;
if (rrGetScrPriv (pScreen))
{
rrScrPriv(pScreen);
for (i = 0; i < pScrPriv->numCrtcs; i++)
if (RRXineramaCrtcActive (pScrPriv->crtcs[i]))
n++;
}
return n;
}
static Bool
RRXineramaScreenActive (ScreenPtr pScreen)
{
return RRXineramaScreenCount (pScreen) > 0;
}
int
ProcRRXineramaGetScreenCount(ClientPtr client)
{
REQUEST(xPanoramiXGetScreenCountReq);
WindowPtr pWin;
xPanoramiXGetScreenCountReply rep;
register int n, rc;
REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq);
rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
if (rc != Success)
return rc;
rep.type = X_Reply;
rep.length = 0;
rep.sequenceNumber = client->sequence;
rep.ScreenCount = RRXineramaScreenCount (pWin->drawable.pScreen);
rep.window = stuff->window;
if(client->swapped) {
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swapl(&rep.window, n);
}
WriteToClient(client, sizeof(xPanoramiXGetScreenCountReply), (char *)&rep);
return client->noClientException;
}
int
ProcRRXineramaGetScreenSize(ClientPtr client)
{
REQUEST(xPanoramiXGetScreenSizeReq);
WindowPtr pWin, pRoot;
ScreenPtr pScreen;
xPanoramiXGetScreenSizeReply rep;
register int n, rc;
REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq);
rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
if (rc != Success)
return rc;
pScreen = pWin->drawable.pScreen;
pRoot = WindowTable[pScreen->myNum];
rep.type = X_Reply;
rep.length = 0;
rep.sequenceNumber = client->sequence;
rep.width = pRoot->drawable.width;
rep.height = pRoot->drawable.height;
rep.window = stuff->window;
rep.screen = stuff->screen;
if(client->swapped) {
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swapl(&rep.width, n);
swapl(&rep.height, n);
swapl(&rep.window, n);
swapl(&rep.screen, n);
}
WriteToClient(client, sizeof(xPanoramiXGetScreenSizeReply), (char *)&rep);
return client->noClientException;
}
int
ProcRRXineramaIsActive(ClientPtr client)
{
xXineramaIsActiveReply rep;
REQUEST_SIZE_MATCH(xXineramaIsActiveReq);
rep.type = X_Reply;
rep.length = 0;
rep.sequenceNumber = client->sequence;
rep.state = RRXineramaScreenActive (screenInfo.screens[RR_XINERAMA_SCREEN]);
if(client->swapped) {
register int n;
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swapl(&rep.state, n);
}
WriteToClient(client, sizeof(xXineramaIsActiveReply), (char *) &rep);
return client->noClientException;
}
int
ProcRRXineramaQueryScreens(ClientPtr client)
{
xXineramaQueryScreensReply rep;
ScreenPtr pScreen = screenInfo.screens[RR_XINERAMA_SCREEN];
REQUEST_SIZE_MATCH(xXineramaQueryScreensReq);
if (RRXineramaScreenActive (pScreen))
{
rrScrPriv(pScreen);
if (pScrPriv->numCrtcs == 0 || pScrPriv->numOutputs == 0)
RRGetInfo (pScreen);
}
rep.type = X_Reply;
rep.sequenceNumber = client->sequence;
rep.number = RRXineramaScreenCount (pScreen);
rep.length = rep.number * sz_XineramaScreenInfo >> 2;
if(client->swapped) {
register int n;
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swapl(&rep.number, n);
}
WriteToClient(client, sizeof(xXineramaQueryScreensReply), (char *)&rep);
if(rep.number) {
rrScrPriv(pScreen);
xXineramaScreenInfo scratch;
int i;
for(i = 0; i < pScrPriv->numCrtcs; i++) {
RRCrtcPtr crtc = pScrPriv->crtcs[i];
if (RRXineramaCrtcActive (crtc))
{
int width, height;
RRCrtcGetScanoutSize (crtc, &width, &height);
scratch.x_org = crtc->x;
scratch.y_org = crtc->y;
scratch.width = width;
scratch.height = height;
if(client->swapped) {
register int n;
swaps(&scratch.x_org, n);
swaps(&scratch.y_org, n);
swaps(&scratch.width, n);
swaps(&scratch.height, n);
}
WriteToClient(client, sz_XineramaScreenInfo, (char *)&scratch);
}
}
}
return client->noClientException;
}
static int
ProcRRXineramaDispatch(ClientPtr client)
{
REQUEST(xReq);
switch (stuff->data) {
case X_PanoramiXQueryVersion:
return ProcRRXineramaQueryVersion(client);
case X_PanoramiXGetState:
return ProcRRXineramaGetState(client);
case X_PanoramiXGetScreenCount:
return ProcRRXineramaGetScreenCount(client);
case X_PanoramiXGetScreenSize:
return ProcRRXineramaGetScreenSize(client);
case X_XineramaIsActive:
return ProcRRXineramaIsActive(client);
case X_XineramaQueryScreens:
return ProcRRXineramaQueryScreens(client);
}
return BadRequest;
}
/* SProc */
static int
SProcRRXineramaQueryVersion (ClientPtr client)
{
REQUEST(xPanoramiXQueryVersionReq);
register int n;
swaps(&stuff->length,n);
REQUEST_SIZE_MATCH (xPanoramiXQueryVersionReq);
return ProcRRXineramaQueryVersion(client);
}
static int
SProcRRXineramaGetState(ClientPtr client)
{
REQUEST(xPanoramiXGetStateReq);
register int n;
swaps (&stuff->length, n);
REQUEST_SIZE_MATCH(xPanoramiXGetStateReq);
swapl (&stuff->window, n);
return ProcRRXineramaGetState(client);
}
static int
SProcRRXineramaGetScreenCount(ClientPtr client)
{
REQUEST(xPanoramiXGetScreenCountReq);
register int n;
swaps (&stuff->length, n);
REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq);
swapl (&stuff->window, n);
return ProcRRXineramaGetScreenCount(client);
}
static int
SProcRRXineramaGetScreenSize(ClientPtr client)
{
REQUEST(xPanoramiXGetScreenSizeReq);
register int n;
swaps (&stuff->length, n);
REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq);
swapl (&stuff->window, n);
swapl (&stuff->screen, n);
return ProcRRXineramaGetScreenSize(client);
}
static int
SProcRRXineramaIsActive(ClientPtr client)
{
REQUEST(xXineramaIsActiveReq);
register int n;
swaps (&stuff->length, n);
REQUEST_SIZE_MATCH(xXineramaIsActiveReq);
return ProcRRXineramaIsActive(client);
}
static int
SProcRRXineramaQueryScreens(ClientPtr client)
{
REQUEST(xXineramaQueryScreensReq);
register int n;
swaps (&stuff->length, n);
REQUEST_SIZE_MATCH(xXineramaQueryScreensReq);
return ProcRRXineramaQueryScreens(client);
}
int
SProcRRXineramaDispatch(ClientPtr client)
{
REQUEST(xReq);
switch (stuff->data) {
case X_PanoramiXQueryVersion:
return SProcRRXineramaQueryVersion(client);
case X_PanoramiXGetState:
return SProcRRXineramaGetState(client);
case X_PanoramiXGetScreenCount:
return SProcRRXineramaGetScreenCount(client);
case X_PanoramiXGetScreenSize:
return SProcRRXineramaGetScreenSize(client);
case X_XineramaIsActive:
return SProcRRXineramaIsActive(client);
case X_XineramaQueryScreens:
return SProcRRXineramaQueryScreens(client);
}
return BadRequest;
}
static void
RRXineramaResetProc(ExtensionEntry* extEntry)
{
}
void
RRXineramaExtensionInit(void)
{
#ifdef PANORAMIX
if(!noPanoramiXExtension)
return;
#endif
/*
* Xinerama isn't capable enough to have multiple protocol screens each
* with their own output geometry. So if there's more than one protocol
* screen, just don't even try.
*/
if (screenInfo.numScreens > 1)
return;
(void) AddExtension(PANORAMIX_PROTOCOL_NAME, 0,0,
ProcRRXineramaDispatch,
SProcRRXineramaDispatch,
RRXineramaResetProc,
StandardMinorOpcode);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment