LINUX.ORG.RU

Лор тебе задание проверить работу XScreenSaverQueryInfo state

 libxss


0

1

Код для проверки такой

-lX11 -lXext -lXss линковать с этим

#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/extensions/scrnsaver.h>

int
main(int argc, char *argv[])
{
    XScreenSaverInfo info;
    Display *dpy = XOpenDisplay(NULL);

    if(NULL == dpy) {
        fprintf(stderr, "failed to open display\n");
        return 1;
    }

    int a = 0;
    int b = 0;
    XScreenSaverQueryExtension(dpy, &a, &b);
    printf("%d %d\n", a, b);

    XScreenSaverQueryInfo(dpy, RootWindow(dpy, DefaultScreen(dpy)), &info);
    printf("%d %d %d %d\n", info.state, info.til_or_since, info.idle, info.kind);
    return 0;
}

Во второй строке выхдопа первая цифра должна быть не только 3, например на рабочем скринсейвере она обязана быть другая.

А я пошел спать. Совсем просчитался, модераторы, пожалуйста, перенесите а development, там анонимы умные.

Перемещено Dimez из talks

★★★★★

Последнее исправление: tazhate (всего исправлений: 4)

Нормально, он пошел спать , а я должен ключи подбирать, команду компиляции влом было написать.

ilovewindows ★★★★★
()

На, я добрый:

for a in {1..20}; do  ./a.out; sleep 1; done
92 0
0 599999 1 0
92 0
0 599083 917 0
92 0
0 598079 1921 0
92 0
0 597075 2925 0
92 0
0 599757 243 0
92 0
0 599777 223 0
92 0
0 599549 451 0
92 0
0 599761 239 0
92 0
0 599365 635 0
92 0
0 599946 54 0
92 0
0 599502 498 0
92 0
0 599802 198 0
92 0
0 599830 170 0
92 0
0 599986 14 0
92 0
0 599943 57 0
92 0
0 599525 475 0
92 0
0 599786 214 0
92 0
0 599927 73 0
92 0
0 599915 85 0
92 0
0 599943 57 0

Eddy_Em ☆☆☆☆☆
()

Вот так и идёт разработка под x11: «посоны, я тут написал, довайте разбираться что оно делает».

anonymous
()
Ответ на: комментарий от oh-la-la

потому что YetAnotherStupidVeryLongFunctionNameNotCompatibleWithCSpirit(int x)

buddhist ★★★★★
()

Лор тебе задание

«Лор тебе, задание»? Или «Лор, тебе задание»?

XScreenSaverQueryInfo(dpy, RootWindow(dpy, DefaultScreen(dpy)), &info);

Монструозно.

Меня не покидает ощущение, что всё это - детали какого-то немыслимого велосипеда.

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

Как так? Какая версия у тебя xorg-server и libxss? В моей кубунте оно не работает, но думаю это потому что я поломал систему сильно...

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

Арчик у меня

На, кстати, побалуйся:

// use -std=gnu99 -lX11 2 compile
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/cursorfont.h>

int main(){
	Display* display;
	int screen_num;
	Screen *screen;
	Window root_win;
	XGCValues gc_val;
	XEvent report;
	XButtonEvent *xb = (XButtonEvent *)&report;
	XKeyEvent *xk = (XKeyEvent *)&report;
	int status, x,y,oldx = -1, oldy = -1;
	Cursor cursor;

sleep(1); // without this it don't want to start by hotkey

	display = XOpenDisplay(0);
	if (display == NULL){
		perror("Cannot connect to X server");
		exit (-1);
	}
	//XGrabServer(display);
	screen_num = DefaultScreen(display);
	screen = XScreenOfDisplay(display, screen_num);
	root_win = RootWindow(display, XScreenNumberOfScreen(screen));

	cursor = XCreateFontCursor(display, XC_crosshair);
	status = XGrabPointer(display, root_win, False,
				ButtonReleaseMask | ButtonPressMask|Button1MotionMask, GrabModeSync,
				GrabModeAsync, root_win, cursor, CurrentTime);
	if(status != GrabSuccess){
		perror("Can't grab the mouse");
		exit(-1);
	}
	status = XGrabKeyboard(display, root_win, False,
				GrabModeSync, GrabModeAsync, CurrentTime);
	if(status != GrabSuccess){
		perror("Can't grab the keyboard");
		exit(-1);
	}

	gc_val.function           = GXxor;
	gc_val.plane_mask         = AllPlanes;
	gc_val.foreground         = 0x00ff0000L;
	gc_val.background         = BlackPixel(display, screen_num);
	gc_val.line_width         = 3;
	gc_val.line_style         = LineSolid;
	gc_val.cap_style          = CapButt;
	gc_val.join_style         = JoinMiter;
	gc_val.fill_style         = FillOpaqueStippled;
	gc_val.fill_rule          = WindingRule;
	gc_val.graphics_exposures = False;
	gc_val.clip_x_origin      = 0;
	gc_val.clip_y_origin      = 0;
	gc_val.clip_mask          = None;
	gc_val.subwindow_mode     = IncludeInferiors;

#define MKGC()  XCreateGC(display, root_win, GCFunction | GCPlaneMask |  GCForeground | GCBackground | GCLineWidth | GCLineStyle | \
							GCCapStyle  | GCJoinStyle  |  GCFillStyle  |  GCFillRule  |  GCGraphicsExposures | \
							GCClipXOrigin |  GCClipYOrigin  |  GCClipMask  | GCSubwindowMode, &gc_val)
	GC  gc_red = MKGC();
	gc_val.foreground = 0x0000ff00L;
	GC  gc_green = MKGC();
	gc_val.foreground = 0x000000ffL;
	GC gc_blue = MKGC();
	GC *gc_cur = &gc_red;
	do{
		XAllowEvents(display, SyncPointer, CurrentTime);
		XWindowEvent(display, root_win, ButtonMotionMask | KeyPressMask| ButtonPressMask | ButtonReleaseMask, &report);
		switch(report.type){
			case KeyPress: // color
				switch(xk->keycode){
					case 9: goto End; break; // ESC
					case 27: gc_cur = &gc_red; break; // R
					case 42: gc_cur = &gc_green; break; // G
					case 56: gc_cur = &gc_blue; break; // B
				}
			break;
			case MotionNotify:
			xb->button = 1;
			case ButtonPress:
				x = xb->x_root, y = xb->y_root;
				switch(xb->button){
					case 1:
						if(oldx>-1 && oldy>-1)
						XDrawLine(display, root_win, *gc_cur,
									oldx, oldy, x, y);
						oldx = x; oldy = y;
					break;
					case 2:
						if(oldx>-1 && oldy>-1){
							int lx,ly,rx,ry;
							lx = (oldx < x) ? oldx : x;
							ly = (oldy < y) ? oldy : y;
							rx = (oldx > x) ? oldx : x;
							ry = (oldy > y) ? oldy : y;
							XDrawRectangle(display, root_win, *gc_cur,
										lx, ly, rx-lx, ry-ly);
							oldx = -1; oldy = -1;
						}else{
							oldx = x; oldy = y;}
					break;
					case 3:
						if(oldx>-1 && oldy>-1)
						XDrawLine(display, root_win, *gc_cur,
									oldx, oldy, x, y);
						oldx = x; oldy = y;
					break;
				}
			break;
			case ButtonRelease:
				if(xb->button == 1){oldx = -1; oldy = -1;}
			break;
		}
	}while(1);
End:
	XFlush(display);
	XUngrabServer(display);
	XCloseDisplay( display );
	return 0;
}

Eddy_Em ☆☆☆☆☆
()
Последнее исправление: Eddy_Em (всего исправлений: 1)
Ответ на: комментарий от bhfq

Ты скомпиль, да запусти. Потом будешь спасибо говорить. При скринкастах — полезная штука. Недавно себе накалякал в этой теме.

Вообще, люблю ЛОР: четкое решение тут дадут процентов так в двух-трех случаев. Зато дельные советы всегда предложат, чтобы ты сам решил задачу. Это тебе не какой-нибудь говнофорум.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от bhfq

Поставил Arch Linux, поставил KDE, вобщем системе идентичная kubuntu, есть kscreensaver и нету xscreensaver. Kscreensaver запускается и работает как положено.

Но проверка state всегда возвращает 3, то есть «screensaverdisabled» даже не «screensaveroff».

Как вообще в этом линуксе жить если в винде проверка скринсейвера реализуется в 3 строки кода :(

Кстати dbus всегда возвращает правильное состояние скринсейвера в системе. Но использовать dbus не очень то хочется.

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

Я нашел багрепорт но только в дебиане http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=636684

Судя по комитами http://cgit.freedesktop.org/xorg/lib/libXScrnSaver/ там ничего не починили, зато версию подняли.

Или же у libxss все впорядке, а виноваты разработчики KDE? Но нафиг тогда профит от libxss на десктопном линуксе если там работает только idle...

Ага иксы это страшная хрень :(

Днем проверю в opensuse gnome или в fedora gnome.

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

ну ладно, открытым текстом намекну, в свеже установленной убунте libxss-dev нет

выдаёт
65 0
0 599989 11 0
с этим можно жить или надо ставить винду ?

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

зачем тогда спрашиваешь ключи для линковки?

ставь винду я не против, мне без разницы

bhfq ★★★★★
() автор топика
Последнее исправление: bhfq (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

Да конечно я же совсем забыл в 2012 году я должен запускать ЦДЕ. Я смотрю у линукса прекрасное будующее на десктопе.

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

Задача простая определить если работает фулскрин приложение или скринсейвер то кое чего не выводить на экран тем самым не мешать смотреть фильм и случайно не отключить скринсейвер. Да и просто экономия ресурсов там где она возможна. Разработчики иксов наверное не знаю что это такое.

bhfq ★★★★★
() автор топика
Последнее исправление: bhfq (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.