Aktuelle Zeit: 23.09.2018 04:21

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Fenster 'klauen'
BeitragVerfasst: 10.04.2018 00:05 
Offline
Benutzeravatar

Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9
Hallo,

wie man unter Windows das Fenster eines Fremdprogrammes in sein eigenes PB-Fenster entführt hat RSBasic ja hier schön demonstriert:

http://www.purebasic.fr/german/viewtopic.php?p=338543#p338543

Wie macht man allerdings sowas unter Linux? Hat vermutlich was mit gdk_window_reparent_() zu tun, aber wie komme ich an das Handle des Fremdfensters?

Danke im Voraus & Grüße ... Peter

_________________
einfach ist schwierig


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Fenster 'klauen'
BeitragVerfasst: 10.04.2018 19:01 
Offline

Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge
Hallo Kiffi!

gdk_window_reparent_() passt!

Nutze z.B. "xwininfo" (Einfach mal im Terminal eingeben.)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Fenster 'klauen'
BeitragVerfasst: 11.04.2018 09:58 
Offline
Benutzeravatar

Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9
Hallo ccode_new,

Danke für Deine Antwort.

ccode_new hat geschrieben:
gdk_window_reparent_() passt!

Nutze z.B. "xwininfo" (Einfach mal im Terminal eingeben.)


Aber xwininfo (oder wmctrl) liefert -- soweit ich informiert bin -- ja nicht die GTK-Handles.

Grüße ... Peter

// Edit: Ich werde mein ursprüngliches Vorhaben jetzt anders lösen, weil sich bestimmte Umstände geändert haben. (Ich schreib's nur, damit sich jetzt niemand ein Bein ausreißt, um das Problem zu lösen.)

_________________
einfach ist schwierig


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Fenster 'klauen'
BeitragVerfasst: 11.04.2018 19:17 
Offline

Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge
Grüß dich Kiffi,

hier mal eine Funktion zum finden eines Gdk-Handles.

Code:
EnableExplicit

ImportC ""
  gdk_screen_get_window_stack(*screen.GdkScreen)
  gtk_widget_get_window(*widget.GtkWidget)
  gdk_x11_window_get_desktop(*window)
  gdk_x11_window_get_xid(*window)
EndImport

#Win_Main  = 0

Global.i gEvent, gEventWin, gQuit

Structure SCREENWINDOWS
  xid.s
  title.s
EndStructure
Global NewList ScreenWindowList.SCREENWINDOWS()

Procedure Screen_GetWindowStack()
  Protected   *gList0.GList  = gdk_screen_get_window_stack(gdk_display_get_default_screen_(gdk_display_get_default_()))
  Protected   *gList.GList   = *gList0
  Protected   *window, *decorations, *title
  Protected.i x_orig, y_orig, width, height, rect.GdkRectangle, gpointer
 
  If *gList
    Repeat
      *window= *glist\data
      gdk_window_get_user_data_(*window, @gpointer)
      If gpointer
        Debug PeekS(gtk_window_get_title_(gpointer), -1, #PB_UTF8)
      EndIf
      gdk_window_get_frame_extents_(*window, @rect)
      gdk_window_get_decorations_(*window, @*decorations)
      Debug "XID        : " + "#"+Hex(gdk_x11_window_get_xid(*window))
      Debug "GdkWindow  : " + Str(*window) ;Das GdkWindow-Handle ändert sich bei jedem Aufruf.
      Debug "outer-size : " + Str(rect\x) + ", " + Str(rect\y) + ", " + Str(rect\width) + ", " + Str(rect\height)
      Debug "decorations: " + Str(*decorations)
      Debug "on monitor : " + Str(gdk_screen_get_monitor_at_window_(gdk_screen_get_default_(), *window))
      Debug "on desktop : " + Str(gdk_x11_window_get_desktop(*window))
      Debug ""
     
      *gList= *gList\next
      g_object_unref_(*window)
     
      If "#"+Hex(gdk_x11_window_get_xid(*window)) = "#6000038" ;Das Gdk-Handle ist flüchtig. Darum muss mit der XID geprüft werden.
        *title = AllocateMemory(100)
       
        PokeS(*title, "Huhu", -1, #PB_Ascii)
       
        gdk_window_set_title_(*window, *title) ;Titel eines ausgewählten Fensters ändern. (Bei mir ist es der PureBasic-Editor)
      EndIf
    Until *gList = 0
  EndIf
  g_list_free_(*gList0)
EndProcedure

;Erhaltungsfunktion (Darf nicht ausgeklammert werden.)
Procedure Test() ;Bei Entfernung dieser unaufgerufenen Funktion klappt es nicht. (Warum auch immer ?)
  If OpenWindow(#Win_Main, 0, 0, 100, 100, "GdkWindow-Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  EndIf
EndProcedure

;Handleverwaltung und Finden!
Screen_GetWindowStack()


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Fenster 'klauen'
BeitragVerfasst: 14.04.2018 13:32 
Offline
Benutzeravatar

Registriert: 28.07.2005 12:39
Das Thema ist bei Kiffi zwar schon durch, aber der vollstaendigkeit halber :

Mit der Funktion "gdk_x11_window_foreign_new_for_display" laesst sich die XID auch in ein GDK Handle umwandeln.

Code:
[...]
Procedure Test() ;Bei Entfernung dieser unaufgerufenen Funktion klappt es nicht. (Warum auch immer ?)
[...]


Weil du oben gar keine Lib fuer den Import angegeben hast. Pb macht das sobald irgendwo eine Funktion im Quellcode steht.

_________________
Suche


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Fenster 'klauen'
BeitragVerfasst: 14.04.2018 14:19 
Offline

Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge
Hallo edel!

Zitat:
Code:
[...]
Procedure Test() ;Bei Entfernung dieser unaufgerufenen Funktion klappt es nicht. (Warum auch immer ?)
[...]

Weil du oben gar keine Lib fuer den Import angegeben hast. Pb macht das sobald irgendwo eine Funktion im Quellcode steht.


Ja, danke für die Antwort.
Diese Tatsache ist mir inzwischen auch schon klar gewurden. Ich fande es schon etwas seltsam.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Fenster 'klauen'
BeitragVerfasst: 17.04.2018 20:10 
Offline
Benutzeravatar

Registriert: 29.08.2004 08:37
Hallo,

Das vorhaben nennt sich unter Linux XEmbedding. Mit GTK geht das wohl ungefähr so: https://gist.github.com/bert/809126

_________________
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye