Seite 1 von 1

screen edge actions unter Linux

Verfasst: Sonntag 15. August 2010, 19:23
von bazooka
Hi,

im Grunde möchte ich ein Python script schreiben, dass ein Kommando ausführt, sobald der Mauszeiger den linken oder rechten Rand des Bildschirms berührt. Ich möchte dazu benutzen, den Workspace (unter fluxbox) zu wechseln, wenn ich die Maus an den Bildschirmrand schiebe.
Das script ist im Grunde fertig und funktioniert auch einwandfrei, jedoch verbraucht es zu viel CPU power (ca. 5%, Core2duo, 1 GHz). Ich frage nämlich alle viertel Sekunde die Mausposition ab. Das muss doch irgendwie besser gehen?

Hier das script:

Code: Alles auswählen

#! /usr/bin/env python

from Xlib import display
from Xlib.ext.xtest import fake_input
from Xlib import X
import time
import os

def mousemove(x, y):
	my_screen = display.Display()
	fake_input(my_screen, X.MotionNotify, x=x, y=y)
	my_screen.sync()
	
def mousepos():
	data = display.Display().screen().root.query_pointer()._data
	return data["root_x"], data["root_y"]
	

check_intervall = 0.25
left_trigger = 0
right_trigger = display.Display().screen().width_in_pixels-1

while True:
	time.sleep(check_intervall)
	pos = mousepos()
	if pos[0] == left_trigger:
		mousemove(right_trigger-1, pos[1])	
		os.system('fluxbox-remote PrevWorkspace')
	elif pos[0] == right_trigger:
		mousemove(left_trigger+1, pos[1])
		os.system('fluxbox-remote NextWorkspace')
liebe Grüße

Re: screen edge actions unter Linux

Verfasst: Sonntag 15. August 2010, 19:36
von Rebecca
Ich kenne mich zwar mit FluxBox nicht aus, aber sollte es nicht andersherum funktionieren, d.h. FluxBox ruft dein Script auf wenn die Maus am Rand ist?

Re: screen edge actions unter Linux

Verfasst: Sonntag 15. August 2010, 19:46
von lunar
Du kannst alternativ global auf Mausereignisse lauschen. Dazu gibt es die XRecord-Erweiterung mit dazugehöriger API. Frag mich aber nicht nach Details, X-Bibliotheken zeichnen sich vor allem immer durch abwesende oder mangelhafte Dokumentation aus :)

Re: screen edge actions unter Linux

Verfasst: Sonntag 15. August 2010, 20:36
von bazooka
Rebecca hat geschrieben:Ich kenne mich zwar mit FluxBox nicht aus, aber sollte es nicht andersherum funktionieren, d.h. FluxBox ruft dein Script auf wenn die Maus am Rand ist?
Sicherlich, das wäre am besten. Ein entsprechender Verbesserungsvorschlag wurde auch bereits von jemandem erstellt, ist aber leider nicht umgesetzt: http://sourceforge.net/tracker/?func=de ... tid=413963
Mein Ansatz hätte den Vorteil, dass er völlig unabhängig vom Windowmanager wäre, so ein Programm habe ich bis jetzt noch nicht gefunden.
lunar hat geschrieben:Du kannst alternativ global auf Mausereignisse lauschen. Dazu gibt es die XRecord-Erweiterung mit dazugehöriger API.
Leider finde ich dazu nichts, was mir weiterhelfen würde. Ich muss zugeben, dass dies auch mein erstes Python script ist, von daher weiß ich auch nicht genau, wonach ich suchen soll. Google über xrecord und python auszufragen hat mir keine brauchbaren Resultate geliefert.

Re: screen edge actions unter Linux

Verfasst: Montag 16. August 2010, 07:49
von snafu
Es beantwortet nicht die Frage, aber weißt du bereits wie man Keybindings unter Fluxbox festlegt? Falls es nur um ein schnelles Wechseln der Arbeitsfläche geht, dann könntest du das z.B. auf Strg + Alt + Pfeil-nach-links bzw. Pfeil-nach-rechts legen.

Und sofern deine Maus ein Mausrad hat, findest du hier eine Anleitung wie man damit den Wechsel der Arbeitsfläche verknüpft.

Re: screen edge actions unter Linux

Verfasst: Montag 16. August 2010, 11:18
von bazooka
Ja, das ist mir alles bekannt. Der Clou wären halt "active edges", wenn das script im Prinzip funktioniert, ergeben sich dadurch ja auch viele andere Anwendungsmöglichkeiten.

Re: screen edge actions unter Linux

Verfasst: Montag 16. August 2010, 12:45
von mkesper
Ich würde auf einer fluxbox Mailingliste bzw. im irc nachfragen. :)

Re: screen edge actions unter Linux

Verfasst: Montag 16. August 2010, 15:29
von bazooka
naja, damit habe ich das Programmierproblem nicht gelöst. Die Frage ist ja, wie ich das in Python effizient lösen kann. Ob es eine bessere Lösung für das spezielle Problem seitens von Fluxbox ist, tut ja nix zur Sache...
Okay, ich hätte den Threadtitel anders wählen sollen :D

Re: screen edge actions unter Linux

Verfasst: Montag 16. August 2010, 16:18
von Dav1d
Bei mir verbraucht das Skript 1% , allerdings ist meine CPU auch Leistungsstärker (Q9550)

Ich hab's geschafft, den CPU verbrauch auf 0.0% zu verringern (laut htop) ;)

Code: Alles auswählen

#! /usr/bin/env python

from Xlib import display
from Xlib.ext.xtest import fake_input
from Xlib import X
import time
import os

disp = display.Display()
screen = disp.screen()

def mousemove(x, y):
   fake_input(disp, X.MotionNotify, x=x, y=y)
   disp.sync()
   
def mousepos():
   data = screen.root.query_pointer()._data
   return data["root_x"], data["root_y"]
   

check_intervall = 0.25
left_trigger = 0
right_trigger = screen.width_in_pixels-1

while True:
   time.sleep(check_intervall)
   pos = mousepos()
   if pos[0] == left_trigger:
      mousemove(right_trigger-1, pos[1])   
      os.system('fluxbox-remote PrevWorkspace')
   elif pos[0] == right_trigger:
      mousemove(left_trigger+1, pos[1])
      os.system('fluxbox-remote NextWorkspace')
System: Archlinux 2.6.34-ARCH, dwm

Die 2 globalen vars, haben das Problem "gelöst", ich hab auch getesetet ob os.system noch ausgeführt wird, das funktioniert auch noch.

//Edit: btw. Danke für das Skript, mal schauen wie ich das intregrieren kann

Re: screen edge actions unter Linux

Verfasst: Montag 16. August 2010, 20:19
von bazooka
Herrlich! Das war die Idee. Kleine Änderung, große Wirkung. Bei mir auch 0%.
Vielen Dank!