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

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

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

revision 1.36 by mark, Sat Jul 31 21:28:31 2004 UTC revision 1.37 by mkoch, Wed Sep 22 11:03:10 2004 UTC
# Line 49  static gboolean focus_in_cb (GtkWidget * Line 49  static gboolean focus_in_cb (GtkWidget *
49  static gboolean focus_out_cb (GtkWidget *widget,  static gboolean focus_out_cb (GtkWidget *widget,
50                                GdkEventFocus *event,                                GdkEventFocus *event,
51                                jobject peer);                                jobject peer);
52    
53  /*  /*
54   * This method returns a GDK keyval that corresponds to one of the   * This method returns a GDK keyval that corresponds to one of the
55   * keysyms in the X keymap table.  The return value is only used to   * keysyms in the X keymap table.  The return value is only used to
# Line 492  Java_gnu_java_awt_peer_gtk_GtkComponentP Line 493  Java_gnu_java_awt_peer_gtk_GtkComponentP
493    if (GTK_IS_WINDOW (parent_widget))    if (GTK_IS_WINDOW (parent_widget))
494      {      {
495        GList *children = gtk_container_children        GList *children = gtk_container_children
496          (GTK_CONTAINER (GTK_BIN (parent_widget)->child));          (GTK_CONTAINER (parent_widget));
497    
498        if (GTK_IS_MENU_BAR (children->data))        if (GTK_IS_MENU_BAR (children->data))
499          gtk_layout_put (GTK_LAYOUT (children->next->data), widget, 0, 0);          gtk_fixed_put (GTK_FIXED (children->next->data), widget, 0, 0);
500        else        else
501          gtk_layout_put (GTK_LAYOUT (children->data), widget, 0, 0);          gtk_fixed_put (GTK_FIXED (children->data), widget, 0, 0);
502      }      }
503    else    else
504      if (GTK_IS_SCROLLED_WINDOW (parent_widget))      if (GTK_IS_SCROLLED_WINDOW (parent_widget))
# Line 509  Java_gnu_java_awt_peer_gtk_GtkComponentP Line 510  Java_gnu_java_awt_peer_gtk_GtkComponentP
510    
511        }        }
512      else      else
513        gtk_layout_put (GTK_LAYOUT (parent_widget), widget, 0, 0);        gtk_fixed_put (GTK_FIXED (parent_widget), widget, 0, 0);
514    
515    gdk_threads_leave ();    gdk_threads_leave ();
516  }  }
# Line 792  JNIEXPORT void JNICALL Java_gnu_java_awt Line 793  JNIEXPORT void JNICALL Java_gnu_java_awt
793    else    else
794      {      {
795        gtk_widget_set_size_request (widget, width, height);        gtk_widget_set_size_request (widget, width, height);
796        gtk_layout_move (GTK_LAYOUT (widget->parent), widget, x, y);        gtk_fixed_move (GTK_FIXED (widget->parent), widget, x, y);
797      }      }
798    
799    gdk_threads_leave ();    gdk_threads_leave ();
# Line 908  Java_gnu_java_awt_peer_gtk_GtkComponentP Line 909  Java_gnu_java_awt_peer_gtk_GtkComponentP
909  }  }
910    
911  JNIEXPORT void JNICALL  JNIEXPORT void JNICALL
 Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkSetFont  
   (JNIEnv *env, jobject obj, jstring name, jint style, jint size)  
 {  
   const char *font_name;  
   void *ptr;  
   PangoFontDescription *font_desc;  
   
   ptr = NSA_GET_PTR (env, obj);  
   
   font_name = (*env)->GetStringUTFChars (env, name, NULL);  
   
   gdk_threads_enter();  
   
   font_desc = pango_font_description_from_string (font_name);  
   pango_font_description_set_size (font_desc, size * dpi_conversion_factor);  
   
   if (style & AWT_STYLE_BOLD)  
     pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);  
   
   if (style & AWT_STYLE_ITALIC)  
     pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE);  
   
   gtk_widget_modify_font (GTK_WIDGET(ptr), font_desc);  
   
   pango_font_description_free (font_desc);  
   
   gdk_threads_leave();  
   
   (*env)->ReleaseStringUTFChars (env, name, font_name);  
 }  
   
 JNIEXPORT void JNICALL  
912  Java_gnu_java_awt_peer_gtk_GtkComponentPeer_show  Java_gnu_java_awt_peer_gtk_GtkComponentPeer_show
913    (JNIEnv *env, jobject obj)    (JNIEnv *env, jobject obj)
914  {  {
# Line 965  Java_gnu_java_awt_peer_gtk_GtkComponentP Line 934  Java_gnu_java_awt_peer_gtk_GtkComponentP
934    gdk_threads_leave();    gdk_threads_leave();
935  }  }
936    
 GtkLayout *  
 find_gtk_layout (GtkWidget *parent)  
 {  
   if (GTK_IS_WINDOW (parent))  
     {  
       GList *children = gtk_container_children  
                           (GTK_CONTAINER (GTK_BIN (parent)->child));  
   
       if (GTK_IS_MENU_BAR (children->data))  
         return GTK_LAYOUT (children->next->data);  
       else /* GTK_IS_LAYOUT (children->data) */  
         return GTK_LAYOUT (children->data);  
     }  
   
   return NULL;  
 }  
   
937  JNIEXPORT jboolean JNICALL  JNIEXPORT jboolean JNICALL
938  Java_gnu_java_awt_peer_gtk_GtkComponentPeer_isEnabled  Java_gnu_java_awt_peer_gtk_GtkComponentPeer_isEnabled
939    (JNIEnv *env, jobject obj)    (JNIEnv *env, jobject obj)
# Line 1013  Java_gnu_java_awt_peer_gtk_GtkComponentP Line 965  Java_gnu_java_awt_peer_gtk_GtkComponentP
965    return retval;    return retval;
966  }  }
967    
968  static gboolean  JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetRepaintArea
 filter_expose_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer)  
 {  
   /*  
    * Prevent the default event handler from getting this signal if applicable  
    * FIXME: I came up with these filters by looking for patterns in the unwanted  
    *        expose events that are fed back to us from gtk/X. Perhaps there is  
    *        a way to prevent them from occuring in the first place.  
    */  
   if (event->type == GDK_EXPOSE && (!GTK_IS_LAYOUT(widget)  
                                     || event->any.window != widget->window))  
     {  
       g_signal_stop_emission_by_name(GTK_OBJECT(widget), "event");  
       return FALSE;  
     }  
   else  
     {  
       /* There may be non-expose events that are triggered while we're  
         painting a heavyweight peer. */  
       return pre_event_handler(widget, event, peer);  
     }  
 }  
   
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_addExposeFilter  
   (JNIEnv *env, jobject obj)  
 {  
   GtkObject *filterobj;  
   GtkWidget *vbox, *layout;  
   GList *children;  
   void *ptr = NSA_GET_PTR (env, obj);  
   jobject *gref = NSA_GET_GLOBAL_REF (env, obj);  
   gulong hid;  
   
   g_assert (gref);  
   
   gdk_threads_enter ();  
   
   /* GtkFramePeer is built as a GtkLayout inside a GtkVBox inside a GtkWindow.  
      Events go to the GtkLayout layer, so we filter them there. */  
   if (GTK_IS_WINDOW(ptr))  
     {  
       children = gtk_container_get_children(GTK_CONTAINER(ptr));  
       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));  
   
       filterobj = GTK_OBJECT(layout);  
     }  
   else if (GTK_IS_SCROLLED_WINDOW(ptr))  
     {  
       /* The event will go to the parent GtkLayout. */  
       filterobj = GTK_OBJECT(GTK_WIDGET(ptr)->parent);  
     }  
   else  
     {  
       filterobj = GTK_OBJECT(ptr);  
     }  
   hid = g_signal_handler_find(filterobj,  
                               G_SIGNAL_MATCH_FUNC,  
                               0, 0, NULL, *pre_event_handler, NULL);  
   if (hid > 0)  
   {  
     g_signal_handler_block(filterobj, hid);  
   }  
   g_signal_connect( filterobj, "event",  
                     G_CALLBACK(filter_expose_event_handler), *gref);  
   
   gdk_threads_leave ();  
 }  
   
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_removeExposeFilter  
   (JNIEnv *env, jobject obj)  
 {  
   GtkObject *filterobj;  
   GtkWidget *vbox, *layout;  
   GList *children;  
   void *ptr = NSA_GET_PTR (env, obj);  
   jobject *gref = NSA_GET_GLOBAL_REF (env, obj);  
   gulong hid;  
   
   g_assert (gref);  
   
   gdk_threads_enter ();  
   
   /* GtkFramePeer is built as a GtkLayout inside a GtkVBox inside a GtkWindow.  
      Events go to the GtkLayout layer, so we filter them there. */  
   if (GTK_IS_WINDOW(ptr))  
     {  
       children = gtk_container_get_children(GTK_CONTAINER(ptr));  
       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));  
   
       filterobj = GTK_OBJECT(layout);  
     }  
   else if (GTK_IS_SCROLLED_WINDOW(ptr))  
     {  
       /* The event will go to the parent GtkLayout. */  
       filterobj = GTK_OBJECT(GTK_WIDGET(ptr)->parent);  
     }  
   else  
     {  
       filterobj = GTK_OBJECT(ptr);  
     }  
   
   g_signal_handlers_disconnect_by_func (filterobj,  
                                         *filter_expose_event_handler, *gref);  
   hid = g_signal_handler_find(filterobj,  
                               G_SIGNAL_MATCH_FUNC,  
                               0, 0, NULL, *pre_event_handler, NULL);  
   if (hid > 0)  
   {  
     g_signal_handler_unblock(filterobj, hid);  
   }  
   
   gdk_threads_leave ();  
 }  
   
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetQueueDrawArea  
969    (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height)    (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height)
970  {  {
971    GdkRectangle rect;    GdkRectangle rect;
# Line 1155  JNIEXPORT void JNICALL Java_gnu_java_awt Line 973  JNIEXPORT void JNICALL Java_gnu_java_awt
973    
974    ptr = NSA_GET_PTR (env, obj);    ptr = NSA_GET_PTR (env, obj);
975    
976    rect.x = x + GTK_WIDGET(ptr)->allocation.x;    gdk_threads_enter ();
977    rect.y = y + GTK_WIDGET(ptr)->allocation.y;  
978      rect.x = x;
979      rect.y = y;
980    rect.width = width;    rect.width = width;
981    rect.height = height;    rect.height = height;
982    
   gdk_threads_enter ();  
   
983    gdk_window_invalidate_rect (GTK_WIDGET (ptr)->window, &rect, 0);    gdk_window_invalidate_rect (GTK_WIDGET (ptr)->window, &rect, 0);
984    gdk_window_process_all_updates();    gdk_window_process_updates (GTK_WIDGET (ptr)->window, TRUE);
985    
986    gdk_threads_leave ();    gdk_threads_leave ();
987  }  }
# Line 1187  JNIEXPORT void JNICALL Java_gnu_java_awt Line 1005  JNIEXPORT void JNICALL Java_gnu_java_awt
1005  JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals  JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals
1006    (JNIEnv *env, jobject obj)    (JNIEnv *env, jobject obj)
1007  {  {
1008    void *ptr = NSA_GET_PTR (env, obj);    void *ptr;
1009    jobject *gref = NSA_GET_GLOBAL_REF (env, obj);    jobject *gref;
1010    g_assert (gref);  
1011      ptr = NSA_GET_PTR (env, obj);
1012      gref = NSA_GET_GLOBAL_REF (env, obj);
1013    
1014    gdk_threads_enter ();    gdk_threads_enter ();
1015    
1016    gtk_widget_realize (GTK_WIDGET (ptr));    gtk_widget_realize (GTK_WIDGET (ptr));
     
   /* FIXME: We could check here if this is a scrolled window with a  
      single child that does not have an associated jobject.  This  
      means that it is one of our wrapped widgets like List or TextArea  
      and thus we could connect the signal to the child without having  
      to specialize this method. */  
1017    
1018    /* Connect EVENT signal, which happens _before_ any specific signal. */    /* Connect EVENT signal, which happens _before_ any specific signal. */
1019    
1020    g_signal_connect (GTK_OBJECT (ptr), "event",    g_signal_connect (GTK_OBJECT (ptr), "event",
1021                      G_CALLBACK (pre_event_handler), *gref);                      G_CALLBACK (pre_event_handler), *gref);
1022    
1023    g_signal_connect (G_OBJECT (ptr), "focus-in-event",    g_signal_connect (G_OBJECT (ptr), "focus-in-event",
# Line 1235  find_bg_color_widget (GtkWidget *widget) Line 1049  find_bg_color_widget (GtkWidget *widget)
1049  {  {
1050    GtkWidget *bg_color_widget;    GtkWidget *bg_color_widget;
1051    
1052    if (GTK_IS_WINDOW (widget))    bg_color_widget = widget;
     {  
       GtkWidget *vbox;  
       GList* children;  
   
       children = gtk_container_get_children(GTK_CONTAINER(widget));  
       vbox = children->data;  
   
       children = gtk_container_get_children(GTK_CONTAINER(vbox));  
       bg_color_widget = children->data;  
     }  
   else  
     bg_color_widget = widget;  
1053    
1054    return bg_color_widget;    return bg_color_widget;
1055  }  }

Legend:
Removed from v.1.36  
changed lines
  Added in v.1.37

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