This is the mail archive of the java-patches@sources.redhat.com mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Patch: minor Gtk peer work


Here's some Gtk peer work that I wrote over Christmas break but only
tried compiling today.  It compiles but is not yet tested (or even
ready for testing).  I just wanted to clear it out of my working
directory.

2001-01-12  Tom Tromey  <tromey@redhat.com>

	* gnu/awt/gtk/natGtkComponentPeer.cc (getLocationOnScreen):
	Wrote.
	(setCursor): Wrote.
	Include Cursor.h.
	* gnu/awt/gtk/natGtkLabelPeer.cc: New file.
	* gnu/awt/gtk/natGtkButtonPeer.cc: New file.
	* gnu/awt/gtk/gtkcommon.h (class _Jv_GdkThreadLock): New class.
	* gnu/awt/gtk/GtkLabelPeer.java: New file.
	* gnu/awt/gtk/GtkButtonPeer.java: New file.

Tom

Index: gnu/awt/gtk/GtkButtonPeer.java
===================================================================
RCS file: GtkButtonPeer.java
diff -N GtkButtonPeer.java
--- /dev/null	Tue May  5 13:32:27 1998
+++ GtkButtonPeer.java	Fri Jan 12 15:00:40 2001
@@ -0,0 +1,61 @@
+/* GtkButtonPeer.java -- Implements ButtonPeer with GTK
+   Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+
+This file is part of the peer AWT libraries of GNU Classpath.
+
+This library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Library General Public License as published 
+by the Free Software Foundation, either version 2 of the License, or
+(at your option) any later verion.
+
+This library is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public License
+along with this library; if not, write to the Free Software Foundation
+Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307 USA. */
+
+
+package gnu.awt.gtk;
+
+import java.awt.*;
+import java.awt.event.MouseEvent;
+import java.awt.event.KeyEvent;
+import java.awt.peer.*;
+
+public class GtkButtonPeer extends GtkComponentPeer
+    implements ButtonPeer
+{
+  protected native void create ();
+  public native void setLabel (String label);
+
+  public GtkButtonPeer (Button b)
+  {
+    super (b);
+  }
+
+  public void handleEvent (AWTEvent e)
+  {
+//      if (e.getID () == MouseEvent.MOUSE_CLICKED && isEnabled () 
+//  	&& !modalHasGrab ())
+//        {
+//  	MouseEvent me = (MouseEvent) e;
+//  	if (!me.isConsumed ()
+//  	    && (me.getModifiers () & MouseEvent.BUTTON1_MASK) != 0)
+//  	  postActionEvent (((Button)awtComponent).getActionCommand (), 
+//  			   me.getModifiers ());
+//        }
+
+//      if (e.getID () == KeyEvent.KEY_PRESSED)
+//        {
+//  	KeyEvent ke = (KeyEvent) e;
+//  	if (!ke.isConsumed () && ke.getKeyCode () == KeyEvent.VK_SPACE)
+//  	  postActionEvent (((Button)awtComponent).getActionCommand (),
+//  			   ke.getModifiers ());
+//        }
+
+    super.handleEvent (e);
+  }
+}
Index: gnu/awt/gtk/GtkLabelPeer.java
===================================================================
RCS file: GtkLabelPeer.java
diff -N GtkLabelPeer.java
--- /dev/null	Tue May  5 13:32:27 1998
+++ GtkLabelPeer.java	Fri Jan 12 15:00:40 2001
@@ -0,0 +1,37 @@
+/* GtkLabelPeer.java -- Implements LabelPeer with GTK
+   Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+
+This file is part of the peer AWT libraries of GNU Classpath.
+
+This library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Library General Public License as published 
+by the Free Software Foundation, either version 2 of the License, or
+(at your option) any later verion.
+
+This library is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public License
+along with this library; if not, write to the Free Software Foundation
+Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307 USA. */
+
+
+package gnu.awt.gtk;
+
+import java.awt.*;
+import java.awt.peer.*;
+
+public class GtkLabelPeer extends GtkComponentPeer
+    implements LabelPeer
+{
+  public GtkLabelPeer (Label l)
+  {
+    super (l);
+  }
+    
+  public native void setText (String text);
+  public native void setAlignment (int alignment);
+  protected native void create ();
+}
Index: gnu/awt/gtk/gtkcommon.h
===================================================================
RCS file: /cvs/gcc/egcs/libjava/gnu/awt/gtk/gtkcommon.h,v
retrieving revision 1.1
diff -u -r1.1 gtkcommon.h
--- gtkcommon.h	2000/10/02 05:14:25	1.1
+++ gtkcommon.h	2001/01/12 23:00:40
@@ -17,6 +17,20 @@
 
 #include <java/awt/Color.h>
 
+class _Jv_GdkThreadLock
+{
+public:
+  _Jv_GdkThreadLock ()
+  {
+    GDK_THREADS_ENTER ();
+  }
+
+  ~_Jv_GdkThreadLock ()
+  {
+    GDK_THREADS_LEAVE ();
+  }
+};
+
 // Convert AWT Color to gdk color value.
 static inline void 
 _Jv_ConvertAwtColor(java::awt::Color* awtcolor, GdkColor* gdkcolor)
Index: gnu/awt/gtk/natGtkButtonPeer.cc
===================================================================
RCS file: natGtkButtonPeer.cc
diff -N natGtkButtonPeer.cc
--- /dev/null	Tue May  5 13:32:27 1998
+++ natGtkButtonPeer.cc	Fri Jan 12 15:00:40 2001
@@ -0,0 +1,52 @@
+// Native Gtk AWT button code
+
+#include <config.h>
+
+#include <gcj/cni.h>
+
+#include "gtkcommon.h"
+#include <gnu/awt/gtk/GtkButtonPeer.h>
+#include <java/awt/Button.h>
+
+void
+gnu::awt::gtk::GtkButtonPeer::setLabel (java::lang::String *label)
+{
+  _Jv_GdkThreadLock sync;
+  jsize len = 0;
+  if (label)
+    len = JvGetStringUTFLength (label);
+  char buf[len + 1];
+  // FIXME: this can allocate an unbounded amount.  Should use heap
+  // even though it is slower.
+  if (label)
+    JvGetStringUTFRegion (label, 0, len, buf);
+  buf[len] = '\0';
+  // The button child is a label.
+  GtkBin *bin = GTK_BIN (ptr);
+  gtk_label_set_text (GTK_LABEL (bin->child), buf);
+}
+
+void
+gnu::awt::gtk::GtkButtonPeer::create ()
+{
+  if (! ptr)
+    {
+      _Jv_GdkThreadLock sync;
+      // This is a little inefficient.
+      ptr = (gnu::gcj::RawData *) gtk_button_new_with_label ("");
+
+      using namespace ::java::awt;
+      Button *button = reinterpret_cast<Button *> (awtComponent);
+      setLabel (button->getLabel ());
+    }
+
+  gnu::awt::gtk::GtkComponentPeer::create ();
+}
+
+//  void
+//  gnu::awt::gtk::GtkButtonPeer::clicked (::gnu::gcj::RawData *button_wrap,
+//  				       ::gnu::gcj::RawData *peer_wrap)
+//  {
+//    GtkButtonPeer *button = reinterpret_cast<GtkButtonPeer *> (peer_wrap);
+  
+//  }
Index: gnu/awt/gtk/natGtkComponentPeer.cc
===================================================================
RCS file: /cvs/gcc/egcs/libjava/gnu/awt/gtk/natGtkComponentPeer.cc,v
retrieving revision 1.1
diff -u -r1.1 natGtkComponentPeer.cc
--- natGtkComponentPeer.cc	2000/10/02 05:14:25	1.1
+++ natGtkComponentPeer.cc	2001/01/12 23:00:40
@@ -5,14 +5,18 @@
 // Be aware: running `gcjh -stubs ' once more for this class may
 // overwrite any edits you have made to this file.
 
+#include <config.h>
+
+#include <gcj/cni.h>
+
 #include <java/awt/Point.h>
 #include <java/awt/Dimension.h>
+#include <java/awt/Cursor.h>
 
+#include "gtkcommon.h"
+
 #include <gnu/awt/gtk/GtkComponentPeer.h>
-#include <gcj/cni.h>
-#include <gtk/gtk.h>
 
-#include "gtkcommon.h"
 
 void
 gnu::awt::gtk::GtkComponentPeer::dispose ()
@@ -26,12 +30,10 @@
 ::java::awt::Point *
 gnu::awt::gtk::GtkComponentPeer::getLocationOnScreen ()
 {
-  GDK_THREADS_ENTER ();
-  GDK_THREADS_LEAVE ();
-  
-  // FIXME
-  
-  return NULL;  
+  gint x, y;
+  _Jv_GdkThreadLock sync;
+  gdk_window_get_root_origin (GTK_WIDGET (ptr)->window, &x, &y);
+  return new ::java::awt::Point (x, y);
 }
 
 
@@ -86,9 +88,67 @@
 
 
 void
-gnu::awt::gtk::GtkComponentPeer::setCursor (::java::awt::Cursor *)
+gnu::awt::gtk::GtkComponentPeer::setCursor (::java::awt::Cursor *cursor)
 {
-//  JvFail ("gnu::awt::gtk::GtkComponentPeer::setCursor (::java::awt::Cursor *) not implemented");
+  GdkCursorType type;
+
+  switch (cursor->type)
+    {
+    case ::java::awt::Cursor::CROSSHAIR_CURSOR:
+      type = GDK_CROSSHAIR;
+      break;
+    case ::java::awt::Cursor::TEXT_CURSOR:
+      type = GDK_XTERM;
+      break;
+    case ::java::awt::Cursor::WAIT_CURSOR:
+      type = GDK_WATCH;
+      break;
+    case ::java::awt::Cursor::SW_RESIZE_CURSOR:
+      type = GDK_BOTTOM_LEFT_CORNER;
+      break;
+    case ::java::awt::Cursor::SE_RESIZE_CURSOR:
+      type = GDK_BOTTOM_RIGHT_CORNER;
+      break;
+    case ::java::awt::Cursor::NW_RESIZE_CURSOR:
+      type = GDK_TOP_LEFT_CORNER;
+      break;
+    case ::java::awt::Cursor::NE_RESIZE_CURSOR:
+      type = GDK_TOP_RIGHT_CORNER;
+      break;
+    case ::java::awt::Cursor::N_RESIZE_CURSOR:
+      type = GDK_TOP_SIDE;
+      break;
+    case ::java::awt::Cursor::S_RESIZE_CURSOR:
+      type = GDK_RIGHT_SIDE;
+      break;
+    case ::java::awt::Cursor::W_RESIZE_CURSOR:
+      type = GDK_LEFT_SIDE;
+      break;
+    case ::java::awt::Cursor::E_RESIZE_CURSOR:
+      type = GDK_BOTTOM_SIDE;
+      break;
+    case ::java::awt::Cursor::HAND_CURSOR:
+      type = GDK_HAND1;
+      break;
+    case ::java::awt::Cursor::MOVE_CURSOR:
+      type = GDK_FLEUR;
+      break;
+    case ::java::awt::Cursor::CUSTOM_CURSOR:
+      // FIXME: not implemented yet.  We want a gtk-specific subclass
+      // of Cursor which holds a new gdk cursor.  For now, fall
+      // through.
+
+    case ::java::awt::Cursor::DEFAULT_CURSOR:
+    default:
+      type = GDK_LEFT_PTR;
+      break;
+    }
+
+  _Jv_GdkThreadLock sync;
+  GtkWidget *widget = GTK_WIDGET (ptr);
+  GdkCursor *cursor = gdk_cursor_new (type);
+  gdk_window_set_cursor (widget->window, cursor);
+  gdk_cursor_destroy (cursor);
 }
 
 
Index: gnu/awt/gtk/natGtkLabelPeer.cc
===================================================================
RCS file: natGtkLabelPeer.cc
diff -N natGtkLabelPeer.cc
--- /dev/null	Tue May  5 13:32:27 1998
+++ natGtkLabelPeer.cc	Fri Jan 12 15:00:41 2001
@@ -0,0 +1,59 @@
+// Native Gtk AWT label code.
+
+#include <config.h>
+
+#include <gcj/cni.h>
+
+#include "gtkcommon.h"
+
+#include <gnu/awt/gtk/GtkLabelPeer.h>
+#include <java/awt/Label.h>
+
+void
+gnu::awt::gtk::GtkLabelPeer::setText (java::lang::String *text)
+{
+  _Jv_GdkThreadLock sync;
+  jsize len = 0;
+  if (text)
+    len = JvGetStringUTFLength (text);
+  // FIXME: this can allocate an unbounded amount.  Should use heap
+  // even though it is slower.
+  char buf[len + 1];
+  if (text)
+    JvGetStringUTFRegion (text, 0, len, buf);
+  buf[len] = '\0';
+  gtk_label_set_text (GTK_LABEL (ptr), buf);
+}
+
+void
+gnu::awt::gtk::GtkLabelPeer::setAlignment (jint alignment)
+{
+  using namespace java::awt;
+
+  gfloat value = 0.5;
+  if (alignment == Label::LEFT)
+    value = 0.0;
+  else if (alignment == Label::RIGHT)
+    value = 1.0;
+
+  _Jv_GdkThreadLock sync;
+  gtk_misc_set_alignment (GTK_MISC (ptr), 0.5f, value);
+}
+
+void
+gnu::awt::gtk::GtkLabelPeer::create ()
+{
+  if (! ptr)
+    {
+      _Jv_GdkThreadLock sync;
+      // This is a little inefficient.
+      ptr = (gnu::gcj::RawData *) gtk_label_new ("");
+
+      using namespace ::java::awt;
+      Label *label = reinterpret_cast<Label *> (awtComponent);
+      setText (label->getText ());
+      setAlignment (label->getAlignment ());
+    }
+
+  gnu::awt::gtk::GtkComponentPeer::create ();
+}

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]