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 <uticdmarceau2...@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 <
> uticdmarceau2...@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
> >>
> >
>
>
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to