/[classpath]/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
ViewVC logotype

Diff of /classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.13 by fitzsim, Thu Oct 9 00:34:16 2003 UTC revision 1.14 by fitzsim, Fri Oct 24 19:54:24 2003 UTC
# Line 41  exception statement from your version. * Line 41  exception statement from your version. *
41  #include "gnu_java_awt_peer_gtk_GtkFramePeer.h"  #include "gnu_java_awt_peer_gtk_GtkFramePeer.h"
42  #include <gdk/gdkprivate.h>  #include <gdk/gdkprivate.h>
43  #include <gdk/gdkx.h>  #include <gdk/gdkx.h>
44    #include <X11/Xatom.h>
45    
46    static void window_delete_cb (GtkWidget *widget, GdkEvent *event,
47                                  jobject peer);
48    static void window_destroy_cb (GtkWidget *widget, GdkEvent *event,
49                                   jobject peer);
50    static void window_show_cb (GtkWidget *widget, jobject peer);
51    static gboolean window_focus_in_cb (GtkWidget * widget,
52                                        GdkEventFocus *event,
53                                        jobject peer);
54    static gboolean window_focus_out_cb (GtkWidget * widget,
55                                         GdkEventFocus *event,
56                                         jobject peer);
57    static gboolean window_window_state_cb (GtkWidget *widget,
58                                            GdkEvent *event,
59                                            jobject peer);
60    static jint window_get_new_state (GtkWidget *widget);
61    
62  /*  /*
63   * Make a new window.   * Make a new window.
# Line 152  JNIEXPORT void JNICALL Java_gnu_java_awt Line 169  JNIEXPORT void JNICALL Java_gnu_java_awt
169    
170    connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window);    connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window);
171    
172      /* Connect signals for window event support. */
173      g_signal_connect (G_OBJECT (ptr), "delete-event",
174                        G_CALLBACK (window_delete_cb), obj);
175    
176      g_signal_connect (G_OBJECT (ptr), "destroy-event",
177                        G_CALLBACK (window_destroy_cb), obj);
178    
179      g_signal_connect (G_OBJECT (ptr), "show",
180                        G_CALLBACK (window_show_cb), obj);
181    
182      g_signal_connect (G_OBJECT (ptr), "focus-in-event",
183                        G_CALLBACK (window_focus_in_cb), obj);
184    
185      g_signal_connect (G_OBJECT (ptr), "focus-out-event",
186                        G_CALLBACK (window_focus_out_cb), obj);
187    
188      g_signal_connect (G_OBJECT (ptr), "window-state-event",
189                        G_CALLBACK (window_window_state_cb), obj);
190    
191    gdk_threads_leave ();    gdk_threads_leave ();
192  }  }
193    
# Line 302  Java_gnu_java_awt_peer_gtk_GtkFramePeer_ Line 338  Java_gnu_java_awt_peer_gtk_GtkFramePeer_
338    
339    return height;    return height;
340  }  }
341    
342    static void
343    window_delete_cb (GtkWidget *widget __attribute__((unused)),
344                      GdkEvent *event __attribute__((unused)),
345                      jobject peer)
346    {
347      (*gdk_env)->CallVoidMethod (gdk_env, peer,
348                                  postWindowEventID,
349                                  (jint) AWT_WINDOW_CLOSING,
350                                  (jobject) NULL, (jint) 0);
351    }
352    
353    static void
354    window_destroy_cb (GtkWidget *widget __attribute__((unused)),
355                       GdkEvent *event __attribute__((unused)),
356                       jobject peer)
357    {
358      (*gdk_env)->CallVoidMethod (gdk_env, peer,
359                                  postWindowEventID,
360                                  (jint) AWT_WINDOW_CLOSED,
361                                  (jobject) NULL, (jint) 0);
362    }
363    
364    static void
365    window_show_cb (GtkWidget *widget __attribute__((unused)),
366                    jobject peer)
367    {
368      (*gdk_env)->CallVoidMethod (gdk_env, peer,
369                                  postWindowEventID,
370                                  (jint) AWT_WINDOW_OPENED,
371                                  (jobject) NULL, (jint) 0);
372    }
373    
374    static gboolean
375    window_focus_in_cb (GtkWidget * widget __attribute__((unused)),
376                        GdkEventFocus *event __attribute__((unused)),
377                        jobject peer)
378    {
379      /* FIXME: when hiding then showing, we get two sets of
380         (LOST_FOCUS/DEACTIVATED, ACTIVATED/GAINED_FOCUS) events. */
381      (*gdk_env)->CallVoidMethod (gdk_env, peer,
382                                  postWindowEventID,
383                                  (jint) AWT_WINDOW_ACTIVATED,
384                                  (jobject) NULL, (jint) 0);
385    
386      (*gdk_env)->CallVoidMethod (gdk_env, peer,
387                                  postWindowEventID,
388                                  (jint) AWT_WINDOW_GAINED_FOCUS,
389                                  (jobject) NULL, (jint) 0);
390      return TRUE;
391    }
392    
393    static gboolean
394    window_focus_out_cb (GtkWidget * widget __attribute__((unused)),
395                         GdkEventFocus *event __attribute__((unused)),
396                         jobject peer)
397    {
398      (*gdk_env)->CallVoidMethod (gdk_env, peer,
399                                  postWindowEventID,
400                                  (jint) AWT_WINDOW_LOST_FOCUS,
401                                  (jobject) NULL, (jint) 0);
402    
403      (*gdk_env)->CallVoidMethod (gdk_env, peer,
404                                  postWindowEventID,
405                                  (jint) AWT_WINDOW_DEACTIVATED,
406                                  (jobject) NULL, (jint) 0);
407      return TRUE;
408    }
409    
410    static gboolean
411    window_window_state_cb (GtkWidget *widget,
412                            GdkEvent *event,
413                            jobject peer)
414    {
415      jint new_state;
416    
417      /* Handle WINDOW_ICONIFIED and WINDOW_DEICONIFIED events. */
418      if (event->window_state.changed_mask & GDK_WINDOW_STATE_ICONIFIED)
419        {
420          /* We've either been iconified or deiconified. */
421          if (event->window_state.new_window_state & GDK_WINDOW_STATE_ICONIFIED)
422            {
423              /* We've been iconified. */
424              (*gdk_env)->CallVoidMethod (gdk_env, peer,
425                                          postWindowEventID,
426                                          (jint) AWT_WINDOW_ICONIFIED,
427                                          (jobject) NULL, (jint) 0);
428            }
429          else
430            {
431              /* We've been deiconified. */
432              (*gdk_env)->CallVoidMethod (gdk_env, peer,
433                                          postWindowEventID,
434                                          (jint) AWT_WINDOW_DEICONIFIED,
435                                          (jobject) NULL, (jint) 0);
436            }
437        }
438    
439      /* Post a WINDOW_STATE_CHANGED event, passing the new frame state to
440         GtkWindowPeer. */
441      new_state = AWT_FRAME_STATE_NORMAL;
442    
443      if (event->window_state.new_window_state & GDK_WINDOW_STATE_ICONIFIED)
444        new_state |= AWT_FRAME_STATE_ICONIFIED;
445    
446      new_state |= window_get_new_state (widget);
447    
448      (*gdk_env)->CallVoidMethod (gdk_env, peer,
449                                  postWindowEventID,
450                                  (jint) AWT_WINDOW_STATE_CHANGED,
451                                  (jobject) NULL, new_state);
452      return TRUE;
453    }
454    
455    static jint
456    window_get_new_state (GtkWidget *widget)
457    {
458      GdkDisplay *display = gtk_widget_get_display(widget);
459      jint new_state = AWT_FRAME_STATE_NORMAL;
460      Atom type;
461      gint format;
462      gulong atom_count;
463      gulong bytes_after;
464      Atom *atom_list = NULL;
465      gulong i;
466    
467      XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), GDK_WINDOW_XID (widget->window),
468                          gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE"),
469                          0, G_MAXLONG, False, XA_ATOM, &type, &format, &atom_count,
470                          &bytes_after, (guchar **)&atom_list);
471    
472      if (type != None)
473        {
474          Atom maxvert = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE_MAXIMIZED_VERT");
475          Atom maxhorz      = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE_MAXIMIZED_HORZ");
476    
477          i = 0;
478          while (i < atom_count)
479            {
480              if (atom_list[i] == maxhorz)
481                new_state |= AWT_FRAME_STATE_MAXIMIZED_HORIZ;
482              else if (atom_list[i] == maxvert)
483                new_state |= AWT_FRAME_STATE_MAXIMIZED_VERT;
484    
485              ++i;
486            }
487    
488          XFree (atom_list);
489        }
490      return new_state;
491    }

Legend:
Removed from v.1.13  
changed lines
  Added in v.1.14

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26