Howto monitor Window Manager Moving my Top Level Window (related topics: GtkSocket and gtk_socket_steal())



Hi All,

Short version of my question...
-------------------------------

How can I get an indication, whenever the window manager moves (only
moves, not resizes) my top level window ? When such move occures, I want
to fireup one of my functions. How can I do that ( hopefully using GDK
or GTK interface, without having to resort to Xlib calls ).

Is there a signal I can connect to ? 
Any thoughts/help would be greatly appreciated !

My setup: RH 8.0, Gtk 1.2.10, Using Gtk through its C Interface.

Long version
------------

I'm experimenting with gtk_socket_steal(), in order to embed an external
(non-Gtk) arbitrary top level window into my Gtk Application.

The external application is written in Motif (it's the NEdit text
editor).

By large, the embedding works (after a small correction in gtksocket.c &
rebuilding Gtk, I'm using Gtk 1.2.10), and I can move my app around and
resize it, and the NEdit window moves OK and resizes OK.

However, I'm getting problems with NEdit's pop down menu(s). When I move
my app around, and try to launch a pop down menu, they pop down menu
tends to appear in its initial position, i.e. the pop down menu think
the app did not move one bit from its original position. For example, if
the app was initially positioned at the top left, then I move (without
resizing) to bottom down corner, then the pop down menu(s) will still
open at top left.

But it seems that when I resize my window, then this 'fixes' the problem
for the current location of the app, and the pop down menu(s) open at
the correct location (which should be just under the menu bar ..).

It appears, that the problem originates from the fact (fact ? more like
speculation..), that Motif pop down menus (and probably any toolkit's
pop down menu), are not descendants (in terms of X Windows Hierarchy) of
the the top level window (which I am trying to embed/steal). From what
I've read thus far, it seems that pop down menus in general are top
level windows on their own.

However, although the lack of parent-child between the top level window
and the pop down menu(s), I would guess that the pop down menus are
monitoring the size/position of top level window, and re-loacting
themselfs relative to it everytime it moves/resizes, so they would
always open at the correct position. 

However, after stealing the top level window and reparenting it to my
GtkSocket, when I move my app, the former top level window does not get
an X Window event for move/resize, because it has not moved/resized
relative to its new parent (which is now the GtkSocket) ! Therefor, the
pop down which monitor move/resize on the former top level window, do
not re-calculate their position, and thus open up at the wrong position.

If I can somehow monitor (via a signal, or similar) when my app is being
moved by the window manager, then I can send a dummy event to the
(formerly top level) embedded window, and the pop down menu(s) will be
updated. However I don't know how.


Any ideas/thoughts will be much appreciated,

Thanks a lot - Gal Aviel.








[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]