LINUX.ORG.RU

Как установить хук на смену виртуальной консоли?


1

1

Видеокарта — nVidia 8600GTS. Debian wheezy, 2.6.32-5-amd64, nvidia drivers 195.36.31-6.

Когда я переключаюсь из текстовой консоли в иксы и обратно, теряются настройки шрифтов. В частности, я установил шрифт высотой в 14 точек, а после переключения он устанавливается в 16 точек высотой и нижние две-три строчки уползают за нижнюю границу экрана. Ах да, и еще шрифт сбрасывается, так что русские буквы становятся нечитаемыми. Обычно помогает запуск /usr/bin/cyr (из console-cyrillic), но каждый раз это делать напряжно, а из под midnight commander'а этот способ вообще не работает.

Идеальным решением проблемы был бы автоматический запуск cyr в тот момент, когда я переключаю виртуальные консоли. Поиск дал только советы исопльзовать framebuffer, но с grub2 этот совет не работает, а тот, что работает, вызывает еще более жуткие глюки.

Собственно вопрос: Как установить хук на смену виртуальной консоли?

★★★★★

>но с grub2 этот совет не работает
да лан?
/etc/default/grub:
..
GRUB_CMDLINE_LINUX_DEFAULT=«quiet splash video=vesafb:mode=1024x768-32 vga=790 pci=nocrs nomodeset»
..

snoopcat ★★★★★
()
Ответ на: комментарий от snoopcat

Спасибо, этого способа не видел. Я сталкивался с проблемами при использовании payload=keep в grub2 и при использовании uvesfb. А этот способ я как-то проглядел.

В любом случае, основной вопрос остаётся в силе.

i-rinat ★★★★★
() автор топика
Ответ на: комментарий от Deleted

И то и то работает. Суть одна, сводится к запуску setfont.

i-rinat ★★★★★
() автор топика
Ответ на: комментарий от ipwww

Написал свой велосипед. Не смог толком разобраться в pthreads, но это не мешает программе работать (я надеюсь). С execl у меня тоже не получилось, использовал popen.

// gcc -o cyrhook cyrhook.c -lpthread
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <linux/vt.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>

int fd;
int vts[6];
pthread_t threads[6];
pthread_cond_t vt_changed_cv;
pthread_mutex_t vt_changed_mutex;

void *thread_routine(void * param){
	int vt = *(int *)param;
	int res;

	printf("hello from child %d\n", vt);
	while (1) {
		
		res = ioctl(fd, VT_WAITACTIVE, vt);
		if (0 != res) {
			printf("ioctl error (thread %d) %d\n", vt, errno);
			break;
		}
		printf("activated %d\n", vt);
		FILE *pp = popen("/usr/bin/cyr", "r");
		usleep(100000);
		pclose(pp);
		
		pthread_mutex_lock(&vt_changed_mutex);
		pthread_cond_broadcast(&vt_changed_cv);
		pthread_cond_wait(&vt_changed_cv, &vt_changed_mutex);
		pthread_mutex_unlock(&vt_changed_mutex);
	}
	
	pthread_exit(NULL);
}

int main(void) {
	int k, res;
	pthread_attr_t attr;
	
	fd = open("/proc/self/fd/0", O_RDWR);
	printf("fd = %d\n", fd);
	
	pthread_mutex_init (&vt_changed_mutex, NULL);
	pthread_cond_init (&vt_changed_cv, NULL);
	pthread_attr_init(&attr);
	pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
	for (k = 0; k < 6; k ++) {
		vts[k] = k + 1;
		res = pthread_create( &threads[k], &attr, &thread_routine, (void *)&(vts[k]) );
		if (0 != res) {
			printf("error creating thread\n");
			return 1;
		}
	}
	
	for (k = 0; k < 6; k ++) {
		pthread_join(threads[k], NULL);
	}	
	
	pthread_attr_destroy(&attr);
	pthread_mutex_destroy(&vt_changed_mutex);
	pthread_cond_destroy(&vt_changed_cv);
	printf("parent done.\n");
	return 0;
}

Не понял пока только, как это запускать на автомате. При старте из rc.local оно обламывается.

ipwww, поясните, пожалуйста суть высказывания «толсто».

i-rinat ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.