~ubuntu-branches/ubuntu/trusty/xinput/trusty

« back to all changes in this revision

Viewing changes to src/transform.c

  • Committer: Package Import Robot
  • Author(s): Cyril Brulebois, Julien Cristau, Chase Douglas, Cyril Brulebois
  • Date: 2012-05-20 13:56:03 UTC
  • mfrom: (1.1.9) (4.1.6 sid)
  • Revision ID: package-import@ubuntu.com-20120520135603-kz0mjqk7s0p84mz0
Tags: 1.6.0-1
[ Julien Cristau ]
* Change Maintainer to the X Strike Force.
* Add Vcs-* control fields.

[ Chase Douglas ]
* Bump Standards-Version to 3.9.2
* Add build deps on libxrandr-dev and libxinerama-dev
* Bump build deps on libxi and x11proto-input-dev

[ Cyril Brulebois ]
* New upstream release.
* Replace Julien with myself in Uploaders.

Show diffs side-by-side

added added

removed removed

Lines of Context:
135
135
#endif
136
136
}
137
137
 
138
 
static int
139
 
map_crtc_xrandr(Display *dpy, int deviceid, const char *output_name)
 
138
/* Caller must free return value */
 
139
static XRROutputInfo*
 
140
find_output_xrandr(Display *dpy, const char *output_name)
140
141
{
141
 
    int i, found = 0;
142
 
    int rc = EXIT_FAILURE;
143
142
    XRRScreenResources *res;
144
 
    XRROutputInfo *output_info;
145
 
    XRRCrtcInfo *crtc_info;
 
143
    XRROutputInfo *output_info = NULL;
 
144
    int i;
 
145
    int found = 0;
146
146
 
147
147
    res = XRRGetScreenResources(dpy, DefaultRootWindow(dpy));
148
148
 
149
149
    for (i = 0; i < res->noutput && !found; i++)
150
150
    {
151
151
        output_info = XRRGetOutputInfo(dpy, res, res->outputs[i]);
152
 
        if (!output_info->crtc || output_info->connection != RR_Connected)
153
 
            continue;
154
152
 
155
 
        crtc_info = XRRGetCrtcInfo (dpy, res, output_info->crtc);
156
 
        if (strcmp(output_info->name, output_name) == 0)
 
153
        if (output_info->crtc && output_info->connection == RR_Connected &&
 
154
            strcmp(output_info->name, output_name) == 0)
157
155
        {
158
156
            found = 1;
159
157
            break;
160
158
        }
 
159
 
 
160
        XRRFreeOutputInfo(output_info);
161
161
    }
162
162
 
 
163
    XRRFreeScreenResources(res);
 
164
 
 
165
    if (!found)
 
166
        output_info = NULL;
 
167
 
 
168
    return output_info;
 
169
}
 
170
 
 
171
static int
 
172
map_output_xrandr(Display *dpy, int deviceid, const char *output_name)
 
173
{
 
174
    int rc = EXIT_FAILURE;
 
175
    XRRScreenResources *res;
 
176
    XRROutputInfo *output_info;
 
177
 
 
178
    res = XRRGetScreenResources(dpy, DefaultRootWindow(dpy));
 
179
    output_info = find_output_xrandr(dpy, output_name);
 
180
 
163
181
    /* crtc holds our screen info, need to compare to actual screen size */
164
 
    if (found)
 
182
    if (output_info)
165
183
    {
 
184
        XRRCrtcInfo *crtc_info;
166
185
        Matrix m;
167
186
        matrix_set_unity(&m);
 
187
        crtc_info = XRRGetCrtcInfo (dpy, res, output_info->crtc);
168
188
        set_transformation_matrix(dpy, &m, crtc_info->x, crtc_info->y,
169
189
                                  crtc_info->width, crtc_info->height);
170
190
        rc = apply_matrix(dpy, deviceid, &m);
 
191
        XRRFreeCrtcInfo(crtc_info);
 
192
        XRRFreeOutputInfo(output_info);
171
193
    } else
172
194
        printf("Unable to find output '%s'. "
173
195
                "Output may not be connected.\n", output_name);
178
200
}
179
201
 
180
202
static int
181
 
map_crtc_xinerama(Display *dpy, int deviceid, const char *output_name)
 
203
map_output_xinerama(Display *dpy, int deviceid, const char *output_name)
182
204
{
183
205
    const char *prefix = "HEAD-";
184
206
    XineramaScreenInfo *screens = NULL;
229
251
}
230
252
 
231
253
int
232
 
map_to_crtc(Display *dpy, int argc, char *argv[], char *name, char *desc)
 
254
map_to_output(Display *dpy, int argc, char *argv[], char *name, char *desc)
233
255
{
234
 
    int opcode, event, error;
235
 
    int maj, min;
236
 
    char *crtc_name;
 
256
    char *output_name;
237
257
    XIDeviceInfo *info;
 
258
    XRROutputInfo *output_info;
238
259
 
239
260
    if (argc < 2)
240
261
    {
245
266
    info = xi2_find_device_info(dpy, argv[0]);
246
267
    if (!info)
247
268
    {
248
 
        fprintf(stderr, "unable to find device %s\n", argv[0]);
 
269
        fprintf(stderr, "unable to find device '%s'\n", argv[0]);
249
270
        return EXIT_FAILURE;
250
271
    }
251
272
 
252
 
    crtc_name = argv[1];
 
273
    output_name = argv[1];
 
274
    output_info = find_output_xrandr(dpy, output_name);
 
275
    if (!output_info)
 
276
    {
 
277
        /* Output doesn't exist. Is this a (partial) non-RandR setup?  */
 
278
        output_info = find_output_xrandr(dpy, "default");
 
279
        if (output_info)
 
280
        {
 
281
            XRRFreeOutputInfo(output_info);
 
282
            if (strncmp("HEAD-", output_name, strlen("HEAD-")) == 0)
 
283
                return map_output_xinerama(dpy, info->deviceid, output_name);
 
284
        }
 
285
    } else
 
286
        XRRFreeOutputInfo(output_info);
253
287
 
254
 
    /* Check for RandR 1.2. Server bug causes the NVIDIA driver to
255
 
     * report with RandR 1.3 support but it doesn't expose RandR CRTCs.
256
 
     * Force Xinerama if NV-CONTROL is present */
257
 
    if (XQueryExtension(dpy, "NV-CONTROL", &opcode, &event, &error) ||
258
 
        !XQueryExtension(dpy, "RANDR", &opcode, &event, &error) ||
259
 
        !XRRQueryVersion(dpy, &maj, &min) || (maj * 1000 + min) < 1002)
260
 
       return map_crtc_xinerama(dpy, info->deviceid, crtc_name);
261
 
    else
262
 
       return map_crtc_xrandr(dpy, info->deviceid, crtc_name);
 
288
    return map_output_xrandr(dpy, info->deviceid, output_name);
263
289
}