Bir metin konsolu için çıktı izleyiciyi Linux / Ubuntu 12.10’da nasıl değiştiririm?


2

Bir nVidia kartı ve çoklu monitörlerle çalışıyorum ve metin modu için varsayılan olarak kullanılan monitör, portre modunda, beni bir konsola geçirdiğimde kullanmam için başımı yana yatırmam için zorluyor. Varsayılan metin modu izleyicisini bağlı diğer monitörlerden birine nasıl geçirebilirim? Kabloları kartın etrafında değiştirmek bir seçenek değildir.

Yanıtlar:


0

Belirli bir VT’yi başka bir kafaya con2fb ( kaynak kodu , ayrıca ilk linkte ve ayrıca bu linklerin buharlaşması durumunda da ayrıca). O zaman kullan con2fb /dev/fb1 /dev/tty2 TTY2’yi ikinci çerçeveye taşımak için

Bunun olası dezavantajı, eski monitörün (bu durumda portre monitörünüz) artık girişi kabul etmemesidir. Birinin odağı terminaller arasında nasıl değiştireceğini bilemedim. gibi bir şey kullanmadan Alt + F1 veya Ctrl + Alt + F1 , bu yüzden bu oldukça küçük bir dezavantaj.

Ayrıca bakınız: LinuxQuestions ve LWN Ayrıca, yaşlarına rağmen, bu soruyu yanıtlama girişimleri de var (ilk bağlantı geçmesi durumunda da burada). Bunu yaptıktan sonra X'i çalıştırmayı denerseniz, LWN postu korkunç uyarıları tehdit eder, ancak aynı zamanda çoklu framebuffer yamalarının henüz çekirdekte olmadıklarını ve bu nedenle biraz güncel olmadığını da tartışır.

con2fb.c:

/* This is a userspace utility which allows you to redirect the console to
another framebuffer device.  You can specify devices & consoles by both numbers
and devices.  Framebuffers numbers are zero-based (/dev/fb0, ...), while
consoles are one-based (/dev/tty1, ...).

Original source: https://www.dafyddcrosby.com/dual-framebuffers/   
Slightly updated from the original by Ben Stern to fix some minor warnings.
License: GPL v2.  Compile with: gcc -O2 -Wall -Werror -o con2fb con2fb.c */

#include <errno.h>
#include <linux/fb.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char* argv[]) {
    struct fb_con2fbmap c2m;
    char* fbPath;
    u_int32_t con, fb;
    char* e;
    char* progname;
    struct stat sbf;
    int rv = 0;
    int f = -1;

    progname = strrchr(argv[0], '/');

    if (progname != NULL) {
        progname++;
    } else {
        progname = argv[0];
    }
    if (argc < 3) {
        fprintf(stderr, "usage: %s fbdev console\n", progname);
        return ENOENT;
    }

    do {
        fb = strtoul(argv[1], &e, 10);
        if (*e) {
            if (stat(argv[1], &sbf) < 0) {      
                rv = errno;
                fprintf(stderr, "%s: Can't stat %s: %s\n",
                    progname, argv[1], strerror(errno));
                break;
            }

            if (!S_ISCHR(sbf.st_mode)) {
                fprintf(stderr, "%s: %s isn't a character device!\n",
                    progname, argv[1]);
                rv = EINVAL;
                break;
            }

            fb = sbf.st_rdev & 0xFF;
            if (fb >= 32) {
                fb >>= 5;
            }
            fbPath = argv[1];
        } else  {
            fbPath = "/dev/fb0";
        }

        con = strtoul(argv[2], &e, 10);
        if (*e) {
            if (stat(argv[2], &sbf) < 0) {
                rv = errno;
                fprintf(stderr, "%s: Can't stat %s: %s\n",
                    progname, argv[2], strerror(errno));
                break;
            }
            if (!S_ISCHR(sbf.st_mode)) {
                fprintf(stderr, "%s: %s isn't a character device!\n",
                    progname, argv[2]);
                rv = EINVAL;
                break;
            }
            con = sbf.st_rdev & 0xFF;
        }

        c2m.console = con;
        c2m.framebuffer = fb;
        f = open(fbPath, O_RDWR);
        if (f < 0) {
            rv = errno;
            fprintf(stderr, "%s: Can't open %s: %s\n",
                progname, fbPath, strerror(errno));
            break;
        }

        if (ioctl(f, FBIOPUT_CON2FBMAP, &c2m)) {
            rv = errno;
            fprintf(stderr, "%s: Can't set console mapping: %s\n",
                progname, strerror(errno));
            break;
        }
    } while (0);

    if (f >= 0) {
        close(f);
    }
    return rv;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.