/[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.34 by mark, Mon Aug 9 22:54:49 2004 UTC revision 1.35 by mkoch, Wed Sep 22 11:03:10 2004 UTC
# Line 37  exception statement from your version. * Line 37  exception statement from your version. *
37    
38    
39  #include "gtkpeer.h"  #include "gtkpeer.h"
 #include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"  
40  #include "gnu_java_awt_peer_gtk_GtkWindowPeer.h"  #include "gnu_java_awt_peer_gtk_GtkWindowPeer.h"
 #include "gnu_java_awt_peer_gtk_GtkFramePeer.h"  
41  #include <gdk/gdkprivate.h>  #include <gdk/gdkprivate.h>
42  #include <gdk/gdkx.h>  #include <gdk/gdkx.h>
43  #include <X11/Xatom.h>  #include <X11/Xatom.h>
# Line 58  static Bool property_notify_predicate (D Line 56  static Bool property_notify_predicate (D
56                                         XEvent  *xevent,                                         XEvent  *xevent,
57                                         XPointer arg);                                         XPointer arg);
58    
 static GtkLayout *find_layout (GtkWindow *window);  
   
59  static void window_delete_cb (GtkWidget *widget, GdkEvent *event,  static void window_delete_cb (GtkWidget *widget, GdkEvent *event,
60                                jobject peer);                                jobject peer);
61  static void window_destroy_cb (GtkWidget *widget, GdkEvent *event,  static void window_destroy_cb (GtkWidget *widget, GdkEvent *event,
# Line 93  Java_gnu_java_awt_peer_gtk_GtkWindowPeer Line 89  Java_gnu_java_awt_peer_gtk_GtkWindowPeer
89    GtkWidget *window_widget;    GtkWidget *window_widget;
90    GtkWindow *window;    GtkWindow *window;
91    void *window_parent;    void *window_parent;
92    GtkWidget *vbox;    GtkWidget *fixed;
   GtkWidget *layout;  
93    int top = 0;    int top = 0;
94    int left = 0;    int left = 0;
95    int bottom = 0;    int bottom = 0;
# Line 124  Java_gnu_java_awt_peer_gtk_GtkWindowPeer Line 119  Java_gnu_java_awt_peer_gtk_GtkWindowPeer
119    
120    gtk_window_group_add_window (global_gtk_window_group, window);    gtk_window_group_add_window (global_gtk_window_group, window);
121    
122    vbox = gtk_vbox_new (0, 0);    fixed = gtk_fixed_new ();
123    layout = gtk_layout_new (NULL, NULL);    gtk_container_add (GTK_CONTAINER (window_widget), fixed);
   gtk_box_pack_end (GTK_BOX (vbox), layout, 1, 1, 0);  
   gtk_container_add (GTK_CONTAINER (window_widget), vbox);  
124    
125    gtk_widget_show (layout);    gtk_widget_show (fixed);
   gtk_widget_show (vbox);  
126    gtk_widget_realize (window_widget);    gtk_widget_realize (window_widget);
127    
128    if (decorated)    if (decorated)
# Line 236  Java_gnu_java_awt_peer_gtk_GtkWindowPeer Line 228  Java_gnu_java_awt_peer_gtk_GtkWindowPeer
228    (JNIEnv *env, jobject obj)    (JNIEnv *env, jobject obj)
229  {  {
230    void *ptr;    void *ptr;
   GtkLayout *layout;  
231    
232    ptr = NSA_GET_PTR (env, obj);    ptr = NSA_GET_PTR (env, obj);
233    
234    gdk_threads_enter ();    gdk_threads_enter ();
235    
236    layout = find_layout (GTK_WINDOW (ptr));    gtk_widget_realize (GTK_WIDGET (ptr));
   
   gtk_widget_realize (GTK_WIDGET (layout));  
   
   connect_awt_hook (env, obj, 1, layout->bin_window);  
   
   gtk_widget_realize (ptr);  
237    
238    connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window);    connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window);
239    
# Line 261  Java_gnu_java_awt_peer_gtk_GtkWindowPeer Line 246  Java_gnu_java_awt_peer_gtk_GtkWindowPeer
246  {  {
247    void *ptr;    void *ptr;
248    jobject *gref;    jobject *gref;
   GtkLayout *layout;  
249    
250    ptr = NSA_GET_PTR (env, obj);    ptr = NSA_GET_PTR (env, obj);
   
251    gref = NSA_GET_GLOBAL_REF (env, obj);    gref = NSA_GET_GLOBAL_REF (env, obj);
252    
253    gdk_threads_enter ();    gdk_threads_enter ();
254    
255    gtk_widget_realize (ptr);    gtk_widget_realize (GTK_WIDGET (ptr));
   
   /* Receive events from the GtkLayout too */  
   layout = find_layout (GTK_WINDOW (ptr));  
256    
257    g_signal_connect (G_OBJECT (layout), "event",    g_signal_connect (G_OBJECT (ptr), "event",
258                      G_CALLBACK (pre_event_handler), *gref);                      G_CALLBACK (pre_event_handler), *gref);
259    
   /* Connect signals for window event support. */  
260    g_signal_connect (G_OBJECT (ptr), "delete-event",    g_signal_connect (G_OBJECT (ptr), "delete-event",
261                      G_CALLBACK (window_delete_cb), *gref);                      G_CALLBACK (window_delete_cb), *gref);
262    
# Line 306  Java_gnu_java_awt_peer_gtk_GtkWindowPeer Line 285  Java_gnu_java_awt_peer_gtk_GtkWindowPeer
285                      G_CALLBACK (window_property_changed_cb), *gref);                      G_CALLBACK (window_property_changed_cb), *gref);
286    
287    gdk_threads_leave ();    gdk_threads_leave ();
   
   /* Connect the superclass signals.  */  
   Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj);  
288  }  }
289    
 /*  
  * Lower the z-level of a window.  
  */  
   
290  JNIEXPORT void JNICALL  JNIEXPORT void JNICALL
291  Java_gnu_java_awt_peer_gtk_GtkWindowPeer_toBack (JNIEnv *env,  Java_gnu_java_awt_peer_gtk_GtkWindowPeer_toBack (JNIEnv *env,
292      jobject obj)      jobject obj)
# Line 323  Java_gnu_java_awt_peer_gtk_GtkWindowPeer Line 295  Java_gnu_java_awt_peer_gtk_GtkWindowPeer
295    ptr = NSA_GET_PTR (env, obj);    ptr = NSA_GET_PTR (env, obj);
296            
297    gdk_threads_enter ();    gdk_threads_enter ();
298    
299    gdk_window_lower (GTK_WIDGET (ptr)->window);    gdk_window_lower (GTK_WIDGET (ptr)->window);
300      gdk_flush ();
301    
   XFlush (GDK_DISPLAY ());  
302    gdk_threads_leave ();    gdk_threads_leave ();
303  }  }
304    
 /*  
  * Raise the z-level of a window.  
  */  
   
305  JNIEXPORT void JNICALL  JNIEXPORT void JNICALL
306  Java_gnu_java_awt_peer_gtk_GtkWindowPeer_toFront (JNIEnv *env,  Java_gnu_java_awt_peer_gtk_GtkWindowPeer_toFront (JNIEnv *env,
307      jobject obj)      jobject obj)
# Line 341  Java_gnu_java_awt_peer_gtk_GtkWindowPeer Line 310  Java_gnu_java_awt_peer_gtk_GtkWindowPeer
310    ptr = NSA_GET_PTR (env, obj);    ptr = NSA_GET_PTR (env, obj);
311            
312    gdk_threads_enter ();    gdk_threads_enter ();
313    
314    gdk_window_raise (GTK_WIDGET (ptr)->window);    gdk_window_raise (GTK_WIDGET (ptr)->window);
315      gdk_flush ();
316    
   XFlush (GDK_DISPLAY ());  
317    gdk_threads_leave ();    gdk_threads_leave ();
318  }  }
319    
# Line 369  Java_gnu_java_awt_peer_gtk_GtkWindowPeer Line 339  Java_gnu_java_awt_peer_gtk_GtkWindowPeer
339    height = (height < 1) ? 1 : height;    height = (height < 1) ? 1 : height;
340    
341    gdk_threads_enter ();    gdk_threads_enter ();
342    
343    gtk_widget_set_size_request (GTK_WIDGET(ptr), width, height);    gtk_widget_set_size_request (GTK_WIDGET(ptr), width, height);
344    
345    gdk_threads_leave ();    gdk_threads_leave ();
346  }  }
347    
# Line 408  Java_gnu_java_awt_peer_gtk_GtkWindowPeer Line 380  Java_gnu_java_awt_peer_gtk_GtkWindowPeer
380    gdk_threads_leave ();    gdk_threads_leave ();
381  }  }
382    
 JNIEXPORT void JNICALL  
 Java_gnu_java_awt_peer_gtk_GtkFramePeer_removeMenuBarPeer  
   (JNIEnv *env, jobject obj)  
 {  
   void *wptr;  
   GtkWidget *box;  
   GtkWidget *mptr;  
   GList* children;  
   
   wptr = NSA_GET_PTR (env, obj);  
     
   gdk_threads_enter ();  
   
   box = GTK_BIN (wptr)->child;  
     
   children = gtk_container_get_children (GTK_CONTAINER (box));  
     
   while (children != NULL && !GTK_IS_MENU_SHELL (children->data))  
   {  
     children = children->next;  
   }  
     
   /* If there isn't a MenuBar in this Frame's list of children  
      then we can just return. */  
   if (!GTK_IS_MENU_SHELL (children->data))  
     return;  
   else  
     mptr = children->data;  
       
   /* This will actually destroy the MenuBar. By removing it from  
      its parent, the reference count for the MenuBar widget will  
      decrement to 0. The widget will be automatically destroyed  
      by Gtk. */  
   gtk_container_remove (GTK_CONTAINER (box), GTK_WIDGET (mptr));    
     
   gdk_threads_leave();  
 }    
     
 JNIEXPORT void JNICALL  
 Java_gnu_java_awt_peer_gtk_GtkFramePeer_setMenuBarPeer  
   (JNIEnv *env, jobject obj, jobject menubar)  
 {  
   void *wptr;  
   GtkWidget *mptr;  
   GtkWidget *box;  
   
   wptr = NSA_GET_PTR (env, obj);  
   mptr = NSA_GET_PTR (env, menubar);  
     
   gdk_threads_enter ();  
   
   box = GTK_BIN (wptr)->child;                
   gtk_box_pack_start (GTK_BOX (box), mptr, 0, 0, 0);  
   
   gtk_widget_show (mptr);  
   
   
   gdk_threads_leave ();  
 }  
   
 JNIEXPORT jint JNICALL  
 Java_gnu_java_awt_peer_gtk_GtkFramePeer_getMenuBarHeight  
   (JNIEnv *env, jobject obj __attribute__((unused)), jobject menubar)  
 {  
   GtkWidget *ptr;  
   jint height;  
   GtkRequisition gtkreq;  
     
   ptr = NSA_GET_PTR (env, menubar);  
   
   gdk_threads_enter ();  
   gtk_widget_size_request (ptr, &gtkreq);  
   
   height = gtkreq.height;  
   gdk_threads_leave ();  
   return height;  
 }  
   
 JNIEXPORT void JNICALL  
 Java_gnu_java_awt_peer_gtk_GtkFramePeer_moveLayout  
   (JNIEnv *env, jobject obj, jint offset)  
 {  
   void* ptr;  
   GList* children;  
   GtkLayout* layout;  
   GtkWidget* widget;  
   
   ptr = NSA_GET_PTR (env, obj);  
   
   gdk_threads_enter ();  
   
   layout = find_layout (GTK_WINDOW (ptr));  
   
   children = gtk_container_get_children (GTK_CONTAINER (layout));  
     
   while (children != NULL)  
   {  
     widget = children->data;  
     gtk_layout_move (layout, widget, widget->allocation.x,  
                      widget->allocation.y+offset);  
     children = children->next;  
   }  
     
   gdk_threads_leave ();  
 }  
     
 JNIEXPORT void JNICALL  
 Java_gnu_java_awt_peer_gtk_GtkFramePeer_gtkLayoutSetVisible  
   (JNIEnv *env, jobject obj, jboolean visible)  
 {  
   void *ptr;  
   GtkLayout *layout;  
   
   ptr = NSA_GET_PTR (env, obj);  
   
   gdk_threads_enter ();  
   
   layout = find_layout (GTK_WINDOW (ptr));  
   
   if (visible)  
     gtk_widget_show (GTK_WIDGET (layout));  
   else  
     gtk_widget_hide (GTK_WIDGET (layout));  
   
   gdk_threads_leave ();  
 }  
   
 JNIEXPORT void JNICALL  
 Java_gnu_java_awt_peer_gtk_GtkFramePeer_nativeSetIconImageFromDecoder  
   (JNIEnv *env, jobject obj, jobject decoder)  
 {  
   void *ptr;  
   GdkPixbufLoader *loader = NULL;  
   GdkPixbuf *pixbuf = NULL;  
   
   ptr = NSA_GET_PTR (env, obj);  
   
   loader = NSA_GET_PB_PTR (env, decoder);  
   g_assert (loader != NULL);  
   
   gdk_threads_enter ();  
   
   pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);  
   g_assert (pixbuf != NULL);  
   
   gtk_window_set_icon (GTK_WINDOW (ptr), pixbuf);  
   
   gdk_threads_leave ();  
 }  
   
 void free_pixbuf_data (guchar *pixels, gpointer data __attribute__((unused)))  
 {  
   free(pixels);  
 }  
   
 JNIEXPORT void JNICALL  
 Java_gnu_java_awt_peer_gtk_GtkFramePeer_nativeSetIconImageFromData  
   (JNIEnv *env, jobject obj, jintArray pixelArray, jint width, jint height)  
 {  
   void *ptr;  
   GdkPixbuf *pixbuf;  
   jint *pixels;  
   int pixels_length, i;  
   guchar *data;  
   
   ptr = NSA_GET_PTR (env, obj);  
   
   pixels = (*env)->GetIntArrayElements (env, pixelArray, 0);  
   pixels_length = (*env)->GetArrayLength (env, pixelArray);  
   
   data = malloc (sizeof (guchar) * pixels_length);  
   for (i = 0; i < pixels_length; i++)  
     data[i] = (guchar) pixels[i];  
   
   gdk_threads_enter ();  
   
   pixbuf = gdk_pixbuf_new_from_data (data,  
                                      GDK_COLORSPACE_RGB,  
                                      TRUE,  
                                      8,  
                                      width,  
                                      height,  
                                      width*4,  
                                      free_pixbuf_data,  
                                      NULL);  
   
   gtk_window_set_icon (GTK_WINDOW (ptr), pixbuf);  
   
   gdk_threads_leave ();  
   
   (*env)->ReleaseIntArrayElements(env, pixelArray, pixels, 0);  
 }  
   
383  static void  static void
384  window_get_frame_extents (GtkWidget *window,  window_get_frame_extents (GtkWidget *window,
385                            int *top, int *left, int *bottom, int *right)                            int *top, int *left, int *bottom, int *right)
# Line 785  window_focus_in_cb (GtkWidget * widget, Line 564  window_focus_in_cb (GtkWidget * widget,
564                                postWindowEventID,                                postWindowEventID,
565                                (jint) AWT_WINDOW_GAINED_FOCUS,                                (jint) AWT_WINDOW_GAINED_FOCUS,
566                                (jobject) NULL, (jint) 0);                                (jobject) NULL, (jint) 0);
567      /* FIXME: somewhere after this is handled, the child window is
568         getting an expose event. */
569    return FALSE;    return FALSE;
570  }  }
571    
# Line 797  window_focus_out_cb (GtkWidget * widget, Line 578  window_focus_out_cb (GtkWidget * widget,
578                                postWindowEventID,                                postWindowEventID,
579                                (jint) AWT_WINDOW_LOST_FOCUS,                                (jint) AWT_WINDOW_LOST_FOCUS,
580                                (jobject) NULL, (jint) 0);                                (jobject) NULL, (jint) 0);
581      /* FIXME: somewhere after this is handled, the child window is
582         getting an expose event. */
583    return FALSE;    return FALSE;
584  }  }
585    
# Line 924  window_property_changed_cb (GtkWidget *w Line 707  window_property_changed_cb (GtkWidget *w
707    
708    return FALSE;    return FALSE;
709  }  }
   
 static GtkLayout *  
 find_layout (GtkWindow *window)  
 {  
   GList* children;  
   GtkBox* vbox;  
   GtkLayout* layout;  
   
   children = gtk_container_get_children (GTK_CONTAINER (window));  
   vbox = children->data;  
   g_assert (GTK_IS_VBOX (vbox));  
   
   children = gtk_container_get_children (GTK_CONTAINER (vbox));  
   do  
   {  
     layout = children->data;  
     children = children->next;  
   }  
   while (!GTK_IS_LAYOUT (layout) && children != NULL);  
   g_assert (GTK_IS_LAYOUT (layout));  
   
   return layout;  
 }  

Legend:
Removed from v.1.34  
changed lines
  Added in v.1.35

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