Seite 1 von 2

Titelzeile von Firefox auslese

Verfasst: 02.07.2011 14:48
von teamO
Hi Leute,

Ich habe vor kurzem den Entschluss gefasst meine Zeit auf zeitfressenden Seiten (facebook youtube, ect.) zu beschränken.
Das ganze würde ich gerne programmiertechnisch lösen. Sodass diese Seiten nur für eine gewisse Zeit geöffnet sein dürfen und danach irgendeine Strafe kommt ^^

Ich hab allerdings keine Ahnung, wie ich erkennen kann, welche websiten gerade geöffnet sind. Ein Ansatz wäre die Titelzeile des momentan geöffneten Fensters auszulesn und zu schauen ob bestimmte Schlagwörter vorkommen. Geht das auslesen mit purebasic bordmitteln? Gibt es bessere Möglichkeiten?
das ganze sollte unter ubuntu laufen. Es wäre schön, wenn es auch unter windows ging, ist aber nicht essentiell.

Hat jemand eine Idee?

Danke,
teamO

Re: Titelzeile von Firefox auslese

Verfasst: 02.07.2011 14:52
von RSBasic
teamO hat geschrieben:Geht das auslesen mit purebasic bordmitteln?
Leider nein. Ich hätte ein WinAPI-Befehl vorgeschlagen, aber du möchtest ja lieber unter Ubuntu ermitteln.

Re: Titelzeile von Firefox auslese

Verfasst: 03.07.2011 16:20
von teamO
für ubuntu müsste es auch was wie die winAPI geben, oder?

ist es für normalsterbliche möglich damit umzugehen?
im Zweifelsfall würde ich es jetzt nur für ubuntu programmieren. Wäre auch schon ein Anfang.

Re: Titelzeile von Firefox auslese

Verfasst: 03.07.2011 16:27
von RSBasic
Ja für Ubuntu (Linux) gibt es auch eine API-Schnittstelle, aber damit kenn' ich mich nicht aus und kann dir auch nicht helfen.
Wenn du zwar APIs verwenden möchtest, aber dennoch gewährleisten möchtest, dass spezifische Funktionen überall angeboten werden, kannst du dein Code etwa so aufbauen:

Code: Alles auswählen

CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_Windows
    ;Win32 API[...]
  CompilerCase #PB_OS_Linux
    ;Linux API[...]   
CompilerEndSelect

Re: Titelzeile von Firefox auslese

Verfasst: 03.07.2011 16:29
von ts-soft
Warum nicht einfach einen eigenen Browser programmieren? WebGadget bietet doch viele Möglichkeiten.

Re: Titelzeile von Firefox auslese

Verfasst: 03.07.2011 16:29
von DarkDragon
Unter Linux gibts Xlib für X-Server. Da Ubuntu aber ja was ganz eigenes sein will hat man auf einen X-Server verzichtet und Unity eingebaut. D.h. da musst du wieder zwischen 2 APIs unterscheiden :lol: . Viel spaß. Bin schon am Wrappen der Xlib aus Motivationsgründen gescheitert. Da nutze ich doch lieber eine Programmiersprache in der es bereits Anbindungen dafür gibt.

Re: Titelzeile von Firefox auslese

Verfasst: 03.07.2011 18:28
von Dark
Ich habe einfach mal mein Ubuntu 10.10 in VirtualBox gestartet und einen Versuch gewagt. Der Code funktioniert bei mir und sollte auch noch unter Ubuntu 11.04 funktionieren, da hier Standardmäßig ein X Server verwendet wird. Die Umstellung auf Wayland (dem XServer Ersatz) ist noch nicht vollzogen kann aber optional installiert werden.

Damit der Code funktioniert, brauchst du noch die passenden Libs, welche mit folgendem Befehl installiert werden können:

Code: Alles auswählen

sudo apt-get install xorg-dev
Und hier der Code:

Code: Alles auswählen

EnableExplicit

Structure children
  *window[0]
EndStructure

Structure XTextProperty 
  *value
  enconding.i
  format.i
  nitems.l
EndStructure

ImportC "/usr/lib/libX11.a"
  XOpenDisplay        (*Display_name)
  XDefaultRootWindow  (*Display)
  XQueryTree          (*Display, *Window, *root_return, *parent_return, *children_return.children,  *nchildren_return.i) 
  XFetchName          (*Display, *Window, *Name)
  XInternAtom         (*Display, atom_name.p-ascii, only_if_exists.i)
  XGetWindowProperty  (*Display, *Window, property.i, long_offset.i, long_length.i, delete.i, req_type.i, *actual_type_return.i, *actual_format_return.i, *nitems_return, *bytes_after_return, *prop_return)
  XGetTextProperty    (*Display, *Window, *text_prop_return, property.i)
  XCloseDisplay       (*Display)
  XFree               (*Memory) 
EndImport

;Wir brauchen die libs nur um die Abhängigkeiten aufzulösen
ImportC "/usr/lib/libxcb.a"
EndImport
ImportC "/usr/lib/libXau.a"
EndImport
ImportC "/usr/lib/libXdmcp.a"
EndImport

Global _NET_WM_VISIBLE_NAME.i
Global _NET_WM_NAME.i
Global WM_NAME.i
Global UTF8_STRING.i


Procedure.s GetWindowName(*Display, *Window)
  Protected Result.s
  
  If UTF8_STRING
    
    Protected Type.i
    Protected Format.i
    Protected nItems.i
    Protected bytes_after.i
    Protected *Name
      
    If _NET_WM_VISIBLE_NAME
     
      If XGetWindowProperty(*Display, *Window, _NET_WM_VISIBLE_NAME, 0, 256, #False, UTF8_STRING, @Type, @Format, @nItems, @bytes_after, @*Name) = 0
        
        If Type = UTF8_STRING And nItems > 0 And format = 8 
        
          Result = PeekS(*Name, -1, #PB_UTF8)  
          XFree(*Name)
          
          ProcedureReturn Result
          
        EndIf
        
        XFree(*Name)
        
      EndIf  
      
      If XGetWindowProperty(*Display, *Window, _NET_WM_NAME, 0, 256, #False, UTF8_STRING, @Type, @Format, @nItems, @bytes_after, @*Name) = 0
        
        If Type = UTF8_STRING And nItems > 0 And format = 8 
        
          Result = PeekS(*Name, -1, #PB_UTF8)  
          XFree(*Name)
          
          ProcedureReturn Result
          
        EndIf
        
        XFree(*Name)
        
      EndIf 
      
    EndIf
  
  EndIf
  
  Protected Text.XTextProperty
  
  If XGetTextProperty(*Display, *Window, @Text, WM_NAME)
  
    If text\value
    
      If text\format = 8 And text\enconding = UTF8_STRING And text\nitems > 0
        Result = PeekS(text\value, -1, #PB_UTF8)
      EndIf
      
      XFree(text\value)
      
    EndIf
    
  EndIf
    
  ProcedureReturn Result
EndProcedure


Procedure Enumerate(*Display, *Window)

  Protected *childrens.children
  Protected nchildren.i = 256
  Protected *root
  Protected *parent
  
  If XQueryTree(*Display, *Window, @*root, @*parent, @*childrens, @nchildren)
  
    If *childrens
    
      If nchildren > 0
     
        Protected i.i
        For i = 0 To nchildren -1
       
          Protected Name.s = GetWindowName(*Display, *childrens\window[i])
          
          If Name <> ""
          
            If FindString(Name, "Mozilla Firefox", 1)
              Debug ">>>> " + Name
            Else
              Debug Name
            EndIf  
            
          EndIf
          
          Enumerate(*Display, *childrens\window[i])
         
        Next
    
      EndIf
   
      Xfree(*childrens)
 
    EndIf
 
  EndIf
  
EndProcedure

Define *Display = XOpenDisplay(0)

If *Display

  Define *RootWindow = XDefaultRootWindow(*Display)
  
  _NET_WM_VISIBLE_NAME  = XInternAtom(*Display, "_NET_WM_VISIBLE_NAME", #True)
  _NET_WM_NAME          = XInternAtom(*Display, "_NET_WM_NAME",         #True)
  WM_NAME               = XInternAtom(*Display, "WM_NAME",              #True)
  UTF8_STRING           = XInternAtom(*Display, "UTF8_STRING",          #True)
  
  Enumerate(*Display, *RootWindow)
  
  XCloseDisplay(*Display)
  
EndIf
Mfg,
Dark

Re: Titelzeile von Firefox auslese

Verfasst: 03.07.2011 18:39
von ts-soft
Funktioniert unter Ubuntu 11.04 nicht, libX11.a usw. fehlen.

Re: Titelzeile von Firefox auslese

Verfasst: 04.07.2011 14:13
von Shardik
ts-soft hat geschrieben:Funktioniert unter Ubuntu 11.04 nicht, libX11.a usw. fehlen.
Darks Beispiel funktioniert einwandfrei unter Ubuntu 11.04, wenn man sich ein bißchen
mehr Mühe gibt... :mrgreen:

Neben dem von Dark beschriebenen
Dark hat geschrieben:sudo apt-get install xorg-dev
zur Installation der unbedingt benötigten X-Server Libs muß unter Ubuntu 11.04 noch
der Pfad zu den Libs angepaßt werden. Die 4 Zeilen mit

ImportC "/usr/lib/lib..."

müssen in

ImportC "/usr/lib/i386-linux-gnu/lib..."

abgeändert werden... :wink:

Re: Titelzeile von Firefox auslese

Verfasst: 04.07.2011 19:49
von teamO
@Dark:
wow! gleich ein funktionierender code!
vielen Dank! :D
das hätte meine Fähigkeiten nun doch deutlich überstiegen ^^
ganz verstanden hab ich aber noch nicht, was da abgeht. kommen die Funktionen mit dem X am anfang von dem XServer?
muss mir das ganze noch ein bisschen anschauen und versuchen es nachzuvollziehen ;)

@all: hab es schon mal gesagt, will es aber nochmal sagen: echt eine super community hier!