Fwd: Help with GdkWindow size



Getting resize and expose events through XWindows, but still nothing
through gdk.  The g_signal_connect still complains about invalid instance.
Based on some other docs (
http://gtk.10911.n7.nabble.com/Capture-GdkWindow-event-td8313.html) it
seems like I can't attach the configure-event to the GdkWindow.

So now I'm still left with the fact that the GdkWindow doesn't update it's
internal size, even if I use gdk_window_get_geometry to pull the info from
the X Server, the GdkWindow doesn't update it's internal cache.

So... how to get the GdkWindow to update it's internal size values?

Code and output below:

// Written by Ch. Tronche (http://tronche.lri.fr:8000/)
// Modified by C. Nygard to illustrate gdk_window resize issue
// Copyright by the author. This is unmaintained, no-warranty free
software.
// Please use freely. It is appreciated (but by no means mandatory) to
// acknowledge the author's contribution. Thank you.
// Started on Thu Jun 26 23:29:03 1997

// gcc -o test test.c `pkg-config --libs --cflags gtk+-2.0 gtk+-x11-2.0`


#include <X11/Xlib.h>
#include <assert.h>
#include <unistd.h>
#include <gdk/gdk.h>
#include <gdk/gdkx.h>
#include <gtk/gtk.h>
#define NIL (0)

void frame_callback(GtkWindow *window,
      GdkEvent *event, gpointer data)
{
   printf("frame_callback: %d, %d\n",
          event->configure.x, event->configure.y);
}

gboolean window_expose_event (GtkWidget *widget, GdkEventExpose *event)
{
    printf("expose_event: (%d, %d) (%d,%d)\n",
           event->area.x, event->area.y,
           event->area.width, event->area.height);
    return FALSE;

}

main(int argc, char **argv)
{
      GdkWindow *gdk_win;
      gdk_init(&argc, &argv);

      // Open the display
      Display *dpy = XOpenDisplay(NIL);
      int blackColor = BlackPixel(dpy, DefaultScreen(dpy));
      int whiteColor = WhitePixel(dpy, DefaultScreen(dpy));
      Window w = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 0,
                                     200, 100, 0, blackColor, blackColor);
      gdk_win = gdk_window_foreign_new((guint32)w);
      printf("gdk_win = %p (should be null since window isn't mapped\n",
             gdk_win);

      // We want to get MapNotify events
      XSelectInput(dpy, w, StructureNotifyMask | ExposureMask);
      XMapWindow(dpy, w);

      GC gc = XCreateGC(dpy, w, 0, NIL);

      // Tell the GC we draw using the white color
      XSetForeground(dpy, gc, whiteColor);

      // Wait for the MapNotify event
      int done = 0;
      while(!done) {
            XEvent e;
            Window root;
            int x, y, xret, yret;
            unsigned int widthret,heightret,borderwidthret,depthret;

            // process gdk event loop
            while(gdk_events_pending()) {
                GdkEvent *ev = gdk_event_get();
                if(ev) {
                    printf("Processing event [%d]\n", ev->type);
                    switch(ev->type) {
                    case GDK_DELETE:
                        done = 1;
                        break;
                    default:
                        printf("GDK Event: [%d]", ev->type);
                        break;
                    }
                    gdk_event_free(ev);
                }else{
                    printf("Pending event null\n");
                }
            }

            XNextEvent(dpy, &e);
            printf("Handling event (%d)\n", e.type);
            switch(e.type) {
            case Expose:
                printf("  Expose (%d,%d) (%d,%d)\n",
                       e.xexpose.x, e.xexpose.y,
                       e.xexpose.width, e.xexpose.height);
                // Draw the line
                XDrawLine(dpy, w, gc, e.xexpose.x, e.xexpose.y,
                          e.xexpose.width, e.xexpose.height);
                XFlush(dpy);
                break;
            case MapNotify:
                gdk_win = gdk_window_foreign_new((guint32)w);
                g_signal_connect(G_OBJECT(gdk_win), "configure-event",
                                 G_CALLBACK(frame_callback), NULL);
                g_signal_connect(G_OBJECT(gdk_win), "expose-event",
                                 G_CALLBACK(window_expose_event), NULL);
                gdk_window_get_size(gdk_win, &x, &y);
                printf("  MapNotify [%p] dims: (%d, %d)\n", gdk_win, x, y);
                break;
            case ConfigureNotify:
                printf("  ConfigureNotify dims: (%d, %d) \n",
                       e.xconfigure.width, e.xconfigure.height);
                if(gdk_win) {
                    gdk_window_get_geometry(gdk_win, NULL, NULL,
                                            &widthret,&heightret, NULL);
                    gdk_window_get_size(gdk_win, &x, &y);
                    printf("  GdkWindow[%p] geometry:(%d, %d) dims:(%d,
%d)\n",
                       gdk_win, widthret, heightret, x, y);
                }
                break;
            default:
                printf("  Unhandled event: (%d)\n", e.type);

            }
            XGetGeometry(dpy, w,
                         &root, &xret, &yret,
                         &widthret, &heightret, &borderwidthret, &depthret);
      }
}

gdk_win = (nil) (should be null since window isn't mapped
Pending event null
Handling event (21)
  Unhandled event: (21)
Handling event (22)
  ConfigureNotify dims: (200, 100)
Handling event (19)

(test:35771): GLib-GObject-WARNING **: gsignal.c:2275: signal
`configure-event' is invalid for instance `0x193e350'

(test:35771): GLib-GObject-WARNING **: gsignal.c:2275: signal
`expose-event' is invalid for instance `0x193e350'
  MapNotify [0x193e350] dims: (200, 100)
Handling event (12)
  Expose (0,0) (200,100)
Handling event (22)
  ConfigureNotify dims: (204, 104)
  GdkWindow[0x193e350] geometry:(204, 104) dims:(200, 100)
Handling event (12)
  Expose (0,0) (204,104)
Handling event (22)
  ConfigureNotify dims: (212, 111)
  GdkWindow[0x193e350] geometry:(212, 111) dims:(200, 100)
Handling event (12)
  Expose (0,0) (212,111)
Handling event (22)
  ConfigureNotify dims: (217, 117)
  GdkWindow[0x193e350] geometry:(217, 117) dims:(200, 100)
Handling event (12)
  Expose (0,0) (217,117)
Handling event (22)
  ConfigureNotify dims: (224, 124)
  GdkWindow[0x193e350] geometry:(224, 124) dims:(200, 100)
Handling event (12)
  Expose (0,0) (224,124)
Handling event (22)
  ConfigureNotify dims: (227, 128)
  GdkWindow[0x193e350] geometry:(227, 128) dims:(200, 100)
Handling event (12)
  Expose (0,0) (227,128)
Handling event (22)
  ConfigureNotify dims: (228, 130)
  GdkWindow[0x193e350] geometry:(228, 130) dims:(200, 100)
Handling event (12)
  Expose (0,0) (228,130)




On Mon, Mar 24, 2014 at 5:51 AM, David Marceau <uticdmarceau2007 yahoo ca>wrote:

On 03/23/2014 11:07 PM, Carl Nygard wrote:
Thanks for the links.  However, most of the information is geared toward
GtkWindow instead of GdkWindow. I tried adding the configure-event signal
connection but I get a message from Gtk saying:
(test:25776): GLib-GObject-WARNING **: gsignal.c:2275: signal
`configure-event' is invalid for instance `0xe45350'

two possibilities:
-bad window handle
-configure-event not flagged on at window create

Suggestions:
-you create the window with x, so set the configure-event flag, right
after the win create at the x level for starters.
-validate the x window handle before hand, right after its creation.
-Get the x callback to at least log some resize/expose events.  Don't do
anything here apart from that for the time being.

-validate the gdk window handle before hand, right after its creation.
-then again set the callback with the configure event at the gdk window
level and log the resize event and expose events.

-you will need to delete the pixmap and recreate a new one with a
different size within the window resize and set it within the window
with the respective position and size.  From what I understand you still
don't correctly capture the window resize event yet so deal with that
first with log messages.  Once that's settled you can fix this.

Cheers,
David Marceau

All I really care about is getting GdkWindow to have current size
information when the XWindow resizes.

To answer your question about the code, it does work on FC4, but we're
porting the existing code to RH5 and some of the drawing started
breaking.
Specifically, we are drawing to a backing pixmap to create animation
frames, but when the frames are copied to the windows, the area that is
rendered is limited to whatever the window size was at the time we create
the GdkWindow via gdk_window_foreign_new().  This is because the
GdkWindow
does not have accurate information regarding it's true size.

--carl




On Sun, Mar 23, 2014 at 4:09 PM, David Marceau <
uticdmarceau2007 yahoo ca>wrote:

There is a difference between resize and expose events.  You're going to
have to take care of this difference within your code and possibly force
the expose event to trigger a resize event which is not necessarily done
by default.

The urls below show how to set the configure event in X, Motif and
GTK/GDK to the appropriate window resize callback.  The gtk tutorial
mentioned a drawing area pixmap to be removed and recreated with the
correct size.

http://www.lemoda.net/c/xlib-resize/
http://zetcode.com/tutorials/gtktutorial/gtkevents/
http://www.gtk.org/tutorial1.2/gtk_tut-23.html
http://www-f9.ijs.si/~matevz/docs/007-2392-003/sgi_html/ch03.html

With all the above being said, have you succeeded in running your app on
the newer os without changing the lines of code?  I tend to believe you
don't need to change your c code if you simply recompile and run on the
newer os.  Motif Libs exist on the newer os, just to get it running.

Cheers,
David Marceau





_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list gnome org
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list






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