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/viewtopi ... 43#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
Fenster 'klauen'
Fenster 'klauen'
Hygge
Re: Fenster 'klauen'
Hallo Kiffi!
gdk_window_reparent_() passt!
Nutze z.B. "xwininfo" (Einfach mal im Terminal eingeben.)
gdk_window_reparent_() passt!
Nutze z.B. "xwininfo" (Einfach mal im Terminal eingeben.)
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat
Re: Fenster 'klauen'
Hallo ccode_new,
Danke für Deine Antwort.
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.)
Danke für Deine Antwort.
Aber xwininfo (oder wmctrl) liefert -- soweit ich informiert bin -- ja nicht die GTK-Handles.ccode_new hat geschrieben:gdk_window_reparent_() passt!
Nutze z.B. "xwininfo" (Einfach mal im Terminal eingeben.)
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.)
Hygge
Re: Fenster 'klauen'
Grüß dich Kiffi,
hier mal eine Funktion zum finden eines Gdk-Handles.
hier mal eine Funktion zum finden eines Gdk-Handles.
Code: Alles auswählen
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()
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat
Re: Fenster 'klauen'
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.
Weil du oben gar keine Lib fuer den Import angegeben hast. Pb macht das sobald irgendwo eine Funktion im Quellcode steht.
Mit der Funktion "gdk_x11_window_foreign_new_for_display" laesst sich die XID auch in ein GDK Handle umwandeln.
Code: Alles auswählen
[...]
Procedure Test() ;Bei Entfernung dieser unaufgerufenen Funktion klappt es nicht. (Warum auch immer ?)
[...]
Re: Fenster 'klauen'
Hallo edel!
Diese Tatsache ist mir inzwischen auch schon klar gewurden. Ich fande es schon etwas seltsam.
Ja, danke für die Antwort.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.
Diese Tatsache ist mir inzwischen auch schon klar gewurden. Ich fande es schon etwas seltsam.
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat
-
- Beiträge: 6267
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Re: Fenster 'klauen'
Hallo,
Das vorhaben nennt sich unter Linux XEmbedding. Mit GTK geht das wohl ungefähr so: https://gist.github.com/bert/809126
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.