screen edge actions unter Linux

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
bazooka
User
Beiträge: 5
Registriert: Sonntag 15. August 2010, 19:16

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
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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?
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
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 :)
bazooka
User
Beiträge: 5
Registriert: Sonntag 15. August 2010, 19:16

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.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
bazooka
User
Beiträge: 5
Registriert: Sonntag 15. August 2010, 19:16

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.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Ich würde auf einer fluxbox Mailingliste bzw. im irc nachfragen. :)
bazooka
User
Beiträge: 5
Registriert: Sonntag 15. August 2010, 19:16

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
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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
the more they change the more they stay the same
bazooka
User
Beiträge: 5
Registriert: Sonntag 15. August 2010, 19:16

Herrlich! Das war die Idee. Kleine Änderung, große Wirkung. Bei mir auch 0%.
Vielen Dank!
Antworten