OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libjava/] [classpath/] [native/] [jni/] [gtk-peer/] [gnu_java_awt_peer_gtk_GtkComponentPeer.c] - Blame information for rev 774

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 774 jeremybenn
/* gtkcomponentpeer.c -- Native implementation of GtkComponentPeer
2
   Copyright (C) 1998, 1999, 2002, 2004, 2006 Free Software Foundation, Inc.
3
 
4
This file is part of GNU Classpath.
5
 
6
GNU Classpath is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; either version 2, or (at your option)
9
any later version.
10
 
11
GNU Classpath is distributed in the hope that it will be useful, but
12
WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
General Public License for more details.
15
 
16
You should have received a copy of the GNU General Public License
17
along with GNU Classpath; see the file COPYING.  If not, write to the
18
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19
02110-1301 USA.
20
 
21
Linking this library statically or dynamically with other modules is
22
making a combined work based on this library.  Thus, the terms and
23
conditions of the GNU General Public License cover the whole
24
combination.
25
 
26
As a special exception, the copyright holders of this library give you
27
permission to link this library with independent modules to produce an
28
executable, regardless of the license terms of these independent
29
modules, and to copy and distribute the resulting executable under
30
terms of your choice, provided that you also meet, for each linked
31
independent module, the terms and conditions of the license of that
32
module.  An independent module is a module which is not derived from
33
or based on this library.  If you modify this library, you may extend
34
this exception to your version of the library, but you are not
35
obligated to do so.  If you do not wish to do so, delete this
36
exception statement from your version. */
37
 
38
 
39
#include "gtkpeer.h"
40
#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
41
 
42
#include <gtk/gtkprivate.h>
43
 
44
#define AWT_DEFAULT_CURSOR 0
45
#define AWT_CROSSHAIR_CURSOR 1
46
#define AWT_TEXT_CURSOR 2
47
#define AWT_WAIT_CURSOR 3
48
#define AWT_SW_RESIZE_CURSOR 4
49
#define AWT_SE_RESIZE_CURSOR 5
50
#define AWT_NW_RESIZE_CURSOR 6
51
#define AWT_NE_RESIZE_CURSOR 7
52
#define AWT_N_RESIZE_CURSOR 8
53
#define AWT_S_RESIZE_CURSOR 9
54
#define AWT_W_RESIZE_CURSOR 10
55
#define AWT_E_RESIZE_CURSOR 11
56
#define AWT_HAND_CURSOR 12
57
#define AWT_MOVE_CURSOR 13
58
 
59
/* FIXME: use gtk-double-click-time, gtk-double-click-distance */
60
#define MULTI_CLICK_TIME   250
61
/* as opposed to a MULTI_PASS_TIME :) */
62
 
63
#define AWT_MOUSE_CLICKED  500
64
#define AWT_MOUSE_PRESSED  501
65
#define AWT_MOUSE_RELEASED 502
66
#define AWT_MOUSE_MOVED    503
67
#define AWT_MOUSE_ENTERED  504
68
#define AWT_MOUSE_EXITED   505
69
#define AWT_MOUSE_DRAGGED  506
70
#define AWT_MOUSE_WHEEL    507
71
 
72
#define AWT_WHEEL_UNIT_SCROLL 0
73
 
74
#define AWT_FOCUS_GAINED 1004
75
#define AWT_FOCUS_LOST 1005
76
 
77
static GtkWidget *find_fg_color_widget (GtkWidget *widget);
78
static GtkWidget *find_bg_color_widget (GtkWidget *widget);
79
static GtkWidget *get_widget (GtkWidget *widget);
80
 
81
static jmethodID postMouseEventID;
82
static jmethodID postMouseWheelEventID;
83
static jmethodID postExposeEventID;
84
static jmethodID postFocusEventID;
85
 
86
void
87
cp_gtk_component_init_jni (void)
88
 {
89
  jclass gtkcomponentpeer;
90
 
91
  gtkcomponentpeer = (*cp_gtk_gdk_env())->FindClass (cp_gtk_gdk_env(),
92
                                     "gnu/java/awt/peer/gtk/GtkComponentPeer");
93
 
94
  postMouseEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkcomponentpeer,
95
                                               "postMouseEvent", "(IJIIIIZ)V");
96
 
97
  postMouseWheelEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(),
98
                                                        gtkcomponentpeer,
99
                                                        "postMouseWheelEvent",
100
                                                        "(IJIIIIZIII)V");
101
 
102
  postExposeEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkcomponentpeer,
103
                                                 "postExposeEvent", "(IIII)V");
104
 
105
  postFocusEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkcomponentpeer,
106
                                                "postFocusEvent", "(IZ)V");
107
}
108
 
109
static gboolean component_button_press_cb (GtkWidget *widget,
110
                                           GdkEventButton *event,
111
                                           jobject peer);
112
static gboolean component_button_release_cb (GtkWidget *widget,
113
                                             GdkEventButton *event,
114
                                             jobject peer);
115
static gboolean component_motion_notify_cb (GtkWidget *widget,
116
                                            GdkEventMotion *event,
117
                                            jobject peer);
118
static gboolean component_scroll_cb (GtkWidget *widget,
119
                                     GdkEventScroll *event,
120
                                     jobject peer);
121
static gboolean component_enter_notify_cb (GtkWidget *widget,
122
                                           GdkEventCrossing *event,
123
                                           jobject peer);
124
static gboolean component_leave_notify_cb (GtkWidget *widget,
125
                                           GdkEventCrossing *event,
126
                                           jobject peer);
127
static gboolean component_expose_cb (GtkWidget *widget,
128
                                     GdkEventExpose *event,
129
                                     jobject peer);
130
static gboolean component_focus_in_cb (GtkWidget *widget,
131
                                       GdkEventFocus *event,
132
                                       jobject peer);
133
static gboolean component_focus_out_cb (GtkWidget *widget,
134
                                        GdkEventFocus *event,
135
                                        jobject peer);
136
 
137
static jint
138
button_to_awt_mods (int button)
139
{
140
  switch (button)
141
    {
142
    case 1:
143
      return AWT_BUTTON1_DOWN_MASK | AWT_BUTTON1_MASK;
144
    case 2:
145
      return AWT_BUTTON2_DOWN_MASK | AWT_BUTTON2_MASK;
146
    case 3:
147
      return AWT_BUTTON3_DOWN_MASK | AWT_BUTTON3_MASK;
148
    }
149
 
150
  return 0;
151
}
152
 
153
jint
154
cp_gtk_state_to_awt_mods (guint state)
155
{
156
  jint result = 0;
157
 
158
  if (state & GDK_SHIFT_MASK)
159
    result |= (AWT_SHIFT_DOWN_MASK | AWT_SHIFT_MASK);
160
  if (state & GDK_CONTROL_MASK)
161
    result |= (AWT_CTRL_DOWN_MASK | AWT_CTRL_MASK);
162
  if (state & GDK_MOD1_MASK)
163
    result |= (AWT_ALT_DOWN_MASK | AWT_ALT_MASK);
164
 
165
  return result;
166
}
167
 
168
static jint
169
state_to_awt_mods_with_button_states (guint state)
170
{
171
  jint result = 0;
172
 
173
  if (state & GDK_SHIFT_MASK)
174
    result |= AWT_SHIFT_DOWN_MASK | AWT_SHIFT_MASK;
175
  if (state & GDK_CONTROL_MASK)
176
    result |= AWT_CTRL_DOWN_MASK | AWT_CTRL_MASK;
177
  if (state & GDK_MOD1_MASK)
178
    result |= AWT_ALT_DOWN_MASK | AWT_ALT_MASK;
179
  if (state & GDK_BUTTON1_MASK)
180
    result |= AWT_BUTTON1_DOWN_MASK | AWT_BUTTON1_MASK;
181
  if (state & GDK_BUTTON2_MASK)
182
    result |= AWT_BUTTON2_DOWN_MASK;
183
  if (state & GDK_BUTTON3_MASK)
184
    result |= AWT_BUTTON3_DOWN_MASK;
185
 
186
  return result;
187
}
188
 
189
JNIEXPORT void JNICALL
190
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetCursor
191
  (JNIEnv *env, jobject obj, jint type, jobject image, jint x, jint y)
192
{
193
  gdk_threads_enter ();
194
 
195
  Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetCursorUnlocked
196
    (env, obj, type, image, x, y);
197
 
198
  gdk_threads_leave ();
199
}
200
 
201
JNIEXPORT void JNICALL
202
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetCursorUnlocked
203
  (JNIEnv *env, jobject obj, jint type, jobject image, jint x, jint y)
204
{
205
  void *ptr;
206
  GtkWidget *widget;
207
  GdkWindow *win;
208
  GdkCursorType gdk_cursor_type;
209
  GdkCursor *gdk_cursor;
210
 
211
  ptr = gtkpeer_get_widget (env, obj);
212
 
213
  switch (type)
214
    {
215
    case AWT_CROSSHAIR_CURSOR:
216
      gdk_cursor_type = GDK_CROSSHAIR;
217
      break;
218
    case AWT_TEXT_CURSOR:
219
      gdk_cursor_type = GDK_XTERM;
220
      break;
221
    case AWT_WAIT_CURSOR:
222
      gdk_cursor_type = GDK_WATCH;
223
      break;
224
    case AWT_SW_RESIZE_CURSOR:
225
      gdk_cursor_type = GDK_BOTTOM_LEFT_CORNER;
226
      break;
227
    case AWT_SE_RESIZE_CURSOR:
228
      gdk_cursor_type = GDK_BOTTOM_RIGHT_CORNER;
229
      break;
230
    case AWT_NW_RESIZE_CURSOR:
231
      gdk_cursor_type = GDK_TOP_LEFT_CORNER;
232
      break;
233
    case AWT_NE_RESIZE_CURSOR:
234
      gdk_cursor_type = GDK_TOP_RIGHT_CORNER;
235
      break;
236
    case AWT_N_RESIZE_CURSOR:
237
      gdk_cursor_type = GDK_TOP_SIDE;
238
      break;
239
    case AWT_S_RESIZE_CURSOR:
240
      gdk_cursor_type = GDK_BOTTOM_SIDE;
241
      break;
242
    case AWT_W_RESIZE_CURSOR:
243
      gdk_cursor_type = GDK_LEFT_SIDE;
244
      break;
245
    case AWT_E_RESIZE_CURSOR:
246
      gdk_cursor_type = GDK_RIGHT_SIDE;
247
      break;
248
    case AWT_HAND_CURSOR:
249
      gdk_cursor_type = GDK_HAND2;
250
      break;
251
    case AWT_MOVE_CURSOR:
252
      gdk_cursor_type = GDK_FLEUR;
253
      break;
254
    default:
255
      gdk_cursor_type = GDK_LEFT_PTR;
256
    }
257
 
258
  widget = get_widget(GTK_WIDGET(ptr));
259
 
260
  win = widget->window;
261
  if ((widget->window) == NULL)
262
    win = GTK_WIDGET(ptr)->window;
263
 
264
  if (image == NULL)
265
    gdk_cursor = gdk_cursor_new (gdk_cursor_type);
266
  else
267
    gdk_cursor
268
      = gdk_cursor_new_from_pixbuf (gdk_drawable_get_display (win),
269
                                    cp_gtk_image_get_pixbuf (env, image),
270
                                    x, y);
271
 
272
  gdk_window_set_cursor (win, gdk_cursor);
273
  gdk_cursor_unref (gdk_cursor);
274
 
275
  /* Make sure the cursor is replaced on screen. */
276
  gdk_flush();
277
}
278
 
279
JNIEXPORT void JNICALL
280
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetParent
281
  (JNIEnv *env, jobject obj, jobject parent)
282
{
283
  void *ptr;
284
  void *parent_ptr;
285
  GtkWidget *widget;
286
  GtkWidget *parent_widget;
287
 
288
  gdk_threads_enter ();
289
 
290
  ptr = gtkpeer_get_widget (env, obj);
291
  parent_ptr = gtkpeer_get_widget (env, parent);
292
 
293
  widget = GTK_WIDGET (ptr);
294
  parent_widget = get_widget(GTK_WIDGET (parent_ptr));
295
 
296
  if (widget->parent == NULL)
297
    {
298
      if (GTK_IS_WINDOW (parent_widget))
299
        {
300
          GList *children = gtk_container_get_children
301
            (GTK_CONTAINER (parent_widget));
302
 
303
          if (GTK_IS_MENU_BAR (children->data))
304
            gtk_fixed_put (GTK_FIXED (children->next->data), widget, 0, 0);
305
          else
306
            gtk_fixed_put (GTK_FIXED (children->data), widget, 0, 0);
307
        }
308
      else
309
        if (GTK_IS_SCROLLED_WINDOW (parent_widget))
310
          {
311
            gtk_scrolled_window_add_with_viewport
312
              (GTK_SCROLLED_WINDOW (parent_widget), widget);
313
            gtk_viewport_set_shadow_type (GTK_VIEWPORT (widget->parent),
314
                                          GTK_SHADOW_NONE);
315
 
316
          }
317
        else
318
          {
319
            if (widget->parent == NULL)
320
              gtk_fixed_put (GTK_FIXED (parent_widget), widget, 0, 0);
321
          }
322
    }
323
 
324
  gdk_threads_leave ();
325
}
326
 
327
JNIEXPORT void JNICALL
328
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetSensitive
329
  (JNIEnv *env, jobject obj, jboolean sensitive)
330
{
331
  void *ptr;
332
 
333
  gdk_threads_enter ();
334
 
335
  ptr = gtkpeer_get_widget (env, obj);
336
 
337
  gtk_widget_set_sensitive (get_widget(GTK_WIDGET (ptr)), sensitive);
338
 
339
  gdk_threads_leave ();
340
}
341
 
342
JNIEXPORT jboolean JNICALL
343
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetHasFocus
344
(JNIEnv *env, jobject obj)
345
{
346
  void *ptr;
347
  jboolean retval;
348
 
349
  gdk_threads_enter ();
350
 
351
  ptr = gtkpeer_get_widget (env, obj);
352
 
353
  retval = GTK_WIDGET_HAS_FOCUS((GTK_WIDGET (ptr)));
354
 
355
  gdk_threads_leave ();
356
 
357
  return retval;
358
}
359
 
360
JNIEXPORT jboolean JNICALL
361
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetCanFocus
362
(JNIEnv *env, jobject obj)
363
{
364
  void *ptr;
365
  jboolean retval;
366
 
367
  gdk_threads_enter ();
368
 
369
  ptr = gtkpeer_get_widget (env, obj);
370
 
371
  retval = GTK_WIDGET_CAN_FOCUS((GTK_WIDGET (ptr)));
372
 
373
  gdk_threads_leave ();
374
 
375
  return retval;
376
}
377
 
378
JNIEXPORT void JNICALL
379
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetRequestFocus
380
  (JNIEnv *env, jobject obj)
381
{
382
  void *ptr;
383
 
384
  gdk_threads_enter ();
385
 
386
  ptr = gtkpeer_get_widget (env, obj);
387
 
388
  gtk_widget_grab_focus (get_widget(GTK_WIDGET (ptr)));
389
 
390
  gdk_threads_leave ();
391
}
392
 
393
/*
394
 * Translate a Java KeyEvent object into a GdkEventKey event, then
395
 * pass it to the GTK main loop for processing.
396
 */
397
JNIEXPORT void JNICALL
398
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetDispatchKeyEvent
399
  (JNIEnv *env, jobject obj, jint id, jlong when, jint mods,
400
   jint keyCode, jint keyLocation)
401
{
402
  void *ptr;
403
  GdkEvent *event = NULL;
404
  GdkKeymapKey *keymap_keys = NULL;
405
  gint n_keys = 0;
406
  guint lookup_keyval = 0;
407
 
408
  gdk_threads_enter ();
409
 
410
  ptr = gtkpeer_get_widget (env, obj);
411
 
412
  if (id == AWT_KEY_PRESSED)
413
    event = gdk_event_new (GDK_KEY_PRESS);
414
  else if (id == AWT_KEY_RELEASED)
415
    event = gdk_event_new (GDK_KEY_RELEASE);
416
  else
417
    {
418
      gdk_threads_leave ();
419
      /* Don't send AWT KEY_TYPED events to GTK. */
420
      return;
421
    }
422
 
423
  if (GTK_IS_BUTTON (ptr))
424
    event->key.window = GTK_BUTTON (get_widget(GTK_WIDGET (ptr)))->event_window;
425
  else if (GTK_IS_SCROLLED_WINDOW (get_widget(GTK_WIDGET (ptr))))
426
    event->key.window = GTK_WIDGET (GTK_SCROLLED_WINDOW (get_widget(GTK_WIDGET (ptr)))->container.child)->window;
427
  else
428
    event->key.window = get_widget(GTK_WIDGET (ptr))->window;
429
 
430
  event->key.send_event = 0;
431
  event->key.time = (guint32) when;
432
 
433
  if (mods & AWT_SHIFT_DOWN_MASK)
434
    event->key.state |= GDK_SHIFT_MASK;
435
  if (mods & AWT_CTRL_DOWN_MASK)
436
    event->key.state |= GDK_CONTROL_MASK;
437
  if (mods & AWT_ALT_DOWN_MASK)
438
    event->key.state |= GDK_MOD1_MASK;
439
 
440
  /* This hack is needed because the AWT has no notion of num lock.
441
     It infers numlock state from the only Java virtual keys that are
442
     affected by it. */
443
  if (keyCode == VK_NUMPAD9
444
      || keyCode == VK_NUMPAD8
445
      || keyCode == VK_NUMPAD7
446
      || keyCode == VK_NUMPAD6
447
      || keyCode == VK_NUMPAD5
448
      || keyCode == VK_NUMPAD4
449
      || keyCode == VK_NUMPAD3
450
      || keyCode == VK_NUMPAD2
451
      || keyCode == VK_NUMPAD1
452
      || keyCode == VK_NUMPAD0
453
      || keyCode == VK_DECIMAL)
454
    event->key.state |= GDK_MOD2_MASK;
455
 
456
  /* These values don't need to be filled in since GTK doesn't use
457
     them. */
458
  event->key.length = 0;
459
  event->key.string = NULL;
460
 
461
  lookup_keyval = cp_gtk_awt_keycode_to_keysym (keyCode, keyLocation);
462
 
463
  if (!gdk_keymap_get_entries_for_keyval (gdk_keymap_get_default (),
464
                                          lookup_keyval,
465
                                          &keymap_keys,
466
                                          &n_keys))
467
    {
468
      /* No matching keymap entry was found. */
469
      g_printerr ("No matching keymap entries were found\n");
470
      gdk_threads_leave ();
471
      return;
472
    }
473
 
474
  /* Note: if n_keys > 1 then there are multiple hardware keycodes
475
     that translate to lookup_keyval.  We arbitrarily choose the first
476
     hardware keycode from the list returned by
477
     gdk_keymap_get_entries_for_keyval. */
478
 
479
  event->key.hardware_keycode = keymap_keys[0].keycode;
480
  event->key.group =  keymap_keys[0].group;
481
 
482
  g_free (keymap_keys);
483
 
484
  if (!gdk_keymap_translate_keyboard_state (gdk_keymap_get_default (),
485
                                            event->key.hardware_keycode,
486
                                            event->key.state,
487
                                            event->key.group,
488
                                            &event->key.keyval,
489
                                            NULL, NULL, NULL))
490
    {
491
      /* No matching keyval was found. */
492
      g_printerr ("No matching keyval was found\n");
493
      gdk_threads_leave ();
494
      return;
495
    }
496
 
497
  /*  keyevent = (GdkEventKey *) event; */
498
  /*  g_printerr ("generated event: sent: %d  time: %d  state: %d  keyval: %d  length: %d  string: %s  hardware_keycode: %d  group: %d\n", keyevent->send_event, keyevent->time, keyevent->state, keyevent->keyval, keyevent->length, keyevent->string, keyevent->hardware_keycode, keyevent->group); */
499
 
500
  /* We already received the original key event on the window itself,
501
     so we don't want to resend it. */
502
  if (!GTK_IS_WINDOW (ptr))
503
    {
504
      if (GTK_IS_SCROLLED_WINDOW (get_widget(GTK_WIDGET (ptr))))
505
        gtk_widget_event (GTK_WIDGET (GTK_SCROLLED_WINDOW (get_widget(GTK_WIDGET (ptr)))->container.child), event);
506
      else
507
        gtk_widget_event (get_widget(GTK_WIDGET (ptr)), event);
508
    }
509
 
510
  gdk_threads_leave ();
511
}
512
 
513
/*
514
 * Find the origin of a widget's window.
515
 */
516
JNIEXPORT void JNICALL
517
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWindowGetLocationOnScreen
518
  (JNIEnv * env, jobject obj, jintArray jpoint)
519
{
520
  gdk_threads_enter();
521
 
522
  Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWindowGetLocationOnScreenUnlocked
523
    (env, obj, jpoint);
524
 
525
  gdk_threads_leave();
526
 
527
}
528
JNIEXPORT void JNICALL
529
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWindowGetLocationOnScreenUnlocked
530
  (JNIEnv * env, jobject obj, jintArray jpoint)
531
{
532
  void *ptr;
533
  jint *point;
534
 
535
  ptr = gtkpeer_get_widget (env, obj);
536
  point = (*env)->GetIntArrayElements (env, jpoint, 0);
537
 
538
  gdk_window_get_root_origin (get_widget(GTK_WIDGET (ptr))->window, point, point+1);
539
 
540
  (*env)->ReleaseIntArrayElements(env, jpoint, point, 0);
541
}
542
 
543
/*
544
 * Find the origin of a widget
545
 */
546
JNIEXPORT void JNICALL
547
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetLocationOnScreen
548
  (JNIEnv * env, jobject obj, jintArray jpoint)
549
{
550
  gdk_threads_enter();
551
 
552
  Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetLocationOnScreenUnlocked
553
    (env, obj, jpoint);
554
 
555
  gdk_threads_leave();
556
}
557
 
558
JNIEXPORT void JNICALL
559
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetLocationOnScreenUnlocked
560
  (JNIEnv * env, jobject obj, jintArray jpoint)
561
{
562
  void *ptr;
563
  jint *point;
564
  GtkWidget *widget;
565
 
566
  ptr = gtkpeer_get_widget (env, obj);
567
  point = (*env)->GetIntArrayElements (env, jpoint, 0);
568
 
569
  widget = get_widget(GTK_WIDGET (ptr));
570
  while(gtk_widget_get_parent(widget) != NULL)
571
    widget = gtk_widget_get_parent(widget);
572
  gdk_window_get_position (GTK_WIDGET(widget)->window, point, point+1);
573
 
574
  *point += GTK_WIDGET(ptr)->allocation.x;
575
  *(point+1) += GTK_WIDGET(ptr)->allocation.y;
576
 
577
  (*env)->ReleaseIntArrayElements(env, jpoint, point, 0);
578
}
579
 
580
/*
581
 * Find this widget's current size.
582
 */
583
JNIEXPORT void JNICALL
584
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetDimensions
585
  (JNIEnv *env, jobject obj, jintArray jdims)
586
{
587
  void *ptr;
588
  jint *dims;
589
  GtkRequisition requisition;
590
 
591
  gdk_threads_enter ();
592
 
593
  ptr = gtkpeer_get_widget (env, obj);
594
 
595
  dims = (*env)->GetIntArrayElements (env, jdims, 0);
596
  dims[0] = dims[1] = 0;
597
 
598
  gtk_widget_size_request (get_widget(GTK_WIDGET (ptr)), &requisition);
599
 
600
  dims[0] = requisition.width;
601
  dims[1] = requisition.height;
602
 
603
  (*env)->ReleaseIntArrayElements (env, jdims, dims, 0);
604
 
605
  gdk_threads_leave ();
606
}
607
 
608
/*
609
 * Find this widget's preferred size.
610
 */
611
JNIEXPORT void JNICALL
612
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetPreferredDimensions
613
  (JNIEnv *env, jobject obj, jintArray jdims)
614
{
615
  void *ptr;
616
  jint *dims;
617
  GtkRequisition current_req;
618
  GtkRequisition natural_req;
619
 
620
  gdk_threads_enter ();
621
 
622
  ptr = gtkpeer_get_widget (env, obj);
623
 
624
  dims = (*env)->GetIntArrayElements (env, jdims, 0);
625
  dims[0] = dims[1] = 0;
626
 
627
  /* Widgets that extend GtkWindow such as GtkFileChooserDialog may have
628
     a default size.  These values seem more useful then the natural
629
     requisition values, particularly for GtkFileChooserDialog. */
630
  if (GTK_IS_WINDOW (get_widget(GTK_WIDGET (ptr))))
631
    {
632
      gint width, height;
633
      gtk_window_get_default_size (GTK_WINDOW (get_widget(GTK_WIDGET (ptr))), &width, &height);
634
 
635
      dims[0] = width;
636
      dims[1] = height;
637
    }
638
  else
639
    {
640
      /* Save the widget's current size request. */
641
      gtk_widget_size_request (get_widget(GTK_WIDGET (ptr)), &current_req);
642
 
643
      /* Get the widget's "natural" size request. */
644
      gtk_widget_set_size_request (get_widget(GTK_WIDGET (ptr)), -1, -1);
645
      gtk_widget_size_request (get_widget(GTK_WIDGET (ptr)), &natural_req);
646
 
647
      /* Reset the widget's size request. */
648
      gtk_widget_set_size_request (get_widget(GTK_WIDGET (ptr)),
649
                                   current_req.width, current_req.height);
650
 
651
      dims[0] = natural_req.width;
652
      dims[1] = natural_req.height;
653
    }
654
 
655
  (*env)->ReleaseIntArrayElements (env, jdims, dims, 0);
656
 
657
  gdk_threads_leave ();
658
}
659
 
660
JNIEXPORT void JNICALL
661
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_setNativeBounds
662
  (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height)
663
{
664
  GtkWidget *widget;
665
  void *ptr;
666
 
667
  gdk_threads_enter ();
668
 
669
  ptr = gtkpeer_get_widget (env, obj);
670
 
671
  widget = GTK_WIDGET (ptr);
672
 
673
  /* We assume that -1 is a width or height and not a request for the
674
     widget's natural size. */
675
  width = width < 0 ? 0 : width;
676
  height = height < 0 ? 0 : height;
677
 
678
  if (!(width == 0 && height == 0))
679
    {
680
      gtk_widget_set_size_request (widget, width, height);
681
      /* The GTK_IS_FIXED check here prevents gtk_fixed_move being
682
         called when our parent is a GtkScrolledWindow.  In that
683
         case though, moving the child widget is invalid since a
684
         ScrollPane only has one child and that child is always
685
         located at (0, 0) in viewport coordinates. */
686
      if (widget->parent != NULL && GTK_IS_FIXED (widget->parent))
687
        gtk_fixed_move (GTK_FIXED (widget->parent), widget, x, y);
688
    }
689
 
690
  gdk_threads_leave ();
691
}
692
 
693
JNIEXPORT jintArray JNICALL
694
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetBackground
695
  (JNIEnv *env, jobject obj)
696
{
697
  void *ptr;
698
  jintArray array;
699
  int *rgb;
700
  GdkColor bg;
701
 
702
  gdk_threads_enter ();
703
 
704
  ptr = gtkpeer_get_widget (env, obj);
705
 
706
  bg = GTK_WIDGET (ptr)->style->bg[GTK_STATE_NORMAL];
707
 
708
  array = (*env)->NewIntArray (env, 3);
709
 
710
  rgb = (*env)->GetIntArrayElements (env, array, NULL);
711
  /* convert color data from 16 bit values down to 8 bit values */
712
  rgb[0] = bg.red   >> 8;
713
  rgb[1] = bg.green >> 8;
714
  rgb[2] = bg.blue  >> 8;
715
  (*env)->ReleaseIntArrayElements (env, array, rgb, 0);
716
 
717
  gdk_threads_leave ();
718
 
719
  return array;
720
}
721
 
722
JNIEXPORT jintArray JNICALL
723
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetForeground
724
  (JNIEnv *env, jobject obj)
725
{
726
  void *ptr;
727
  jintArray array;
728
  jint *rgb;
729
  GdkColor fg;
730
 
731
  gdk_threads_enter ();
732
 
733
  ptr = gtkpeer_get_widget (env, obj);
734
 
735
  fg = get_widget(GTK_WIDGET (ptr))->style->fg[GTK_STATE_NORMAL];
736
 
737
  array = (*env)->NewIntArray (env, 3);
738
 
739
  rgb = (*env)->GetIntArrayElements (env, array, NULL);
740
  /* convert color data from 16 bit values down to 8 bit values */
741
  rgb[0] = fg.red   >> 8;
742
  rgb[1] = fg.green >> 8;
743
  rgb[2] = fg.blue  >> 8;
744
  (*env)->ReleaseIntArrayElements (env, array, rgb, 0);
745
 
746
  gdk_threads_leave ();
747
 
748
  return array;
749
}
750
 
751
JNIEXPORT void JNICALL
752
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetBackground
753
  (JNIEnv *env, jobject obj, jint red, jint green, jint blue)
754
{
755
  GdkColor normal_color;
756
  GdkColor active_color;
757
  GtkWidget *widget;
758
  void *ptr;
759
 
760
  gdk_threads_enter ();
761
 
762
  ptr = gtkpeer_get_widget (env, obj);
763
 
764
  normal_color.red = (red / 255.0) * 65535;
765
  normal_color.green = (green / 255.0) * 65535;
766
  normal_color.blue = (blue / 255.0) * 65535;
767
 
768
  /* This calculation only approximates the active colors produced by
769
     Sun's AWT. */
770
  active_color.red = 0.85 * (red / 255.0) * 65535;
771
  active_color.green = 0.85 * (green / 255.0) * 65535;
772
  active_color.blue = 0.85 * (blue / 255.0) * 65535;
773
 
774
  widget = find_bg_color_widget (GTK_WIDGET (ptr));
775
 
776
  gtk_widget_modify_bg (widget, GTK_STATE_NORMAL, &normal_color);
777
  gtk_widget_modify_bg (widget, GTK_STATE_ACTIVE, &active_color);
778
  gtk_widget_modify_bg (widget, GTK_STATE_PRELIGHT, &normal_color);
779
 
780
  gdk_threads_leave ();
781
}
782
 
783
JNIEXPORT void JNICALL
784
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetForeground
785
  (JNIEnv *env, jobject obj, jint red, jint green, jint blue)
786
{
787
  GdkColor color;
788
  GtkWidget *widget;
789
  void *ptr;
790
 
791
  gdk_threads_enter ();
792
 
793
  ptr = gtkpeer_get_widget (env, obj);
794
 
795
  color.red = (red / 255.0) * 65535;
796
  color.green = (green / 255.0) * 65535;
797
  color.blue = (blue / 255.0) * 65535;
798
 
799
  widget = find_fg_color_widget (GTK_WIDGET (ptr));
800
 
801
  gtk_widget_modify_fg (widget, GTK_STATE_NORMAL, &color);
802
  gtk_widget_modify_fg (widget, GTK_STATE_ACTIVE, &color);
803
  gtk_widget_modify_fg (widget, GTK_STATE_PRELIGHT, &color);
804
 
805
  gdk_threads_leave ();
806
}
807
 
808
JNIEXPORT void JNICALL
809
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_realize (JNIEnv *env, jobject obj)
810
{
811
  void *ptr;
812
 
813
  gdk_threads_enter ();
814
 
815
  ptr = gtkpeer_get_widget (env, obj);
816
 
817
  gtk_widget_realize (GTK_WIDGET (ptr));
818
 
819
  gdk_threads_leave ();
820
}
821
 
822
JNIEXPORT void JNICALL
823
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_setVisibleNative
824
  (JNIEnv *env, jobject obj, jboolean visible)
825
{
826
  gdk_threads_enter();
827
 
828
  Java_gnu_java_awt_peer_gtk_GtkComponentPeer_setVisibleNativeUnlocked
829
    (env, obj, visible);
830
 
831
  gdk_threads_leave();
832
}
833
 
834
JNIEXPORT void JNICALL
835
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_setVisibleNativeUnlocked
836
  (JNIEnv *env, jobject obj, jboolean visible)
837
{
838
  void *ptr;
839
 
840
  ptr = gtkpeer_get_widget (env, obj);
841
 
842
  if (visible)
843
    gtk_widget_show (GTK_WIDGET (ptr));
844
  else
845
    gtk_widget_hide (GTK_WIDGET (ptr));
846
}
847
 
848
JNIEXPORT jboolean JNICALL
849
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_isEnabled
850
  (JNIEnv *env, jobject obj)
851
{
852
  void *ptr;
853
  jboolean ret_val;
854
 
855
  gdk_threads_enter ();
856
 
857
  ptr = gtkpeer_get_widget (env, obj);
858
 
859
  ret_val = GTK_WIDGET_IS_SENSITIVE (get_widget(GTK_WIDGET (ptr)));
860
 
861
  gdk_threads_leave ();
862
 
863
  return ret_val;
864
}
865
 
866
JNIEXPORT jboolean JNICALL
867
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_modalHasGrab
868
  (JNIEnv *env __attribute__((unused)), jclass clazz __attribute__((unused)))
869
{
870
  GtkWidget *widget;
871
  jboolean retval;
872
 
873
  gdk_threads_enter ();
874
 
875
  widget = gtk_grab_get_current ();
876
  retval = (widget && GTK_IS_WINDOW (widget) && GTK_WINDOW (widget)->modal);
877
 
878
  gdk_threads_leave ();
879
 
880
  return retval;
881
}
882
 
883
JNIEXPORT void JNICALL
884
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals
885
  (JNIEnv *env, jobject obj)
886
{
887
  void *ptr;
888
  jobject gref;
889
 
890
  gdk_threads_enter ();
891
 
892
  ptr = gtkpeer_get_widget (env, obj);
893
  gref = gtkpeer_get_global_ref (env, obj);
894
 
895
  cp_gtk_component_connect_signals (ptr, gref);
896
 
897
  gdk_threads_leave ();
898
}
899
 
900
JNIEXPORT void JNICALL
901
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_setNativeEventMask
902
  (JNIEnv *env, jobject obj)
903
{
904
  void *ptr;
905
 
906
  gdk_threads_enter ();
907
 
908
  ptr = gtkpeer_get_widget (env, obj);
909
 
910
  gtk_widget_add_events (get_widget(GTK_WIDGET (ptr)),
911
                         GDK_POINTER_MOTION_MASK
912
                         | GDK_BUTTON_MOTION_MASK
913
                         | GDK_BUTTON_PRESS_MASK
914
                         | GDK_BUTTON_RELEASE_MASK
915
                         | GDK_KEY_PRESS_MASK
916
                         | GDK_KEY_RELEASE_MASK
917
                         | GDK_ENTER_NOTIFY_MASK
918
                         | GDK_LEAVE_NOTIFY_MASK
919
                         | GDK_STRUCTURE_MASK
920
                         | GDK_KEY_PRESS_MASK
921
                         | GDK_FOCUS_CHANGE_MASK);
922
 
923
  gdk_threads_leave ();
924
}
925
 
926
static GtkWidget *
927
get_widget (GtkWidget *widget)
928
{
929
  GtkWidget *w;
930
 
931
  if (GTK_IS_EVENT_BOX (widget))
932
    w = gtk_bin_get_child (GTK_BIN(widget));
933
  else
934
    w = widget;
935
 
936
  return w;
937
}
938
 
939
/* FIXME: these functions should be implemented by overridding the
940
   appropriate GtkComponentPeer methods. */
941
static GtkWidget *
942
find_fg_color_widget (GtkWidget *widget)
943
{
944
  GtkWidget *fg_color_widget;
945
 
946
  if (GTK_IS_EVENT_BOX (widget)
947
      || (GTK_IS_BUTTON (widget)
948
          && !GTK_IS_COMBO_BOX (widget)))
949
    fg_color_widget = gtk_bin_get_child (GTK_BIN(widget));
950
  else
951
    fg_color_widget = widget;
952
 
953
  return fg_color_widget;
954
}
955
 
956
static GtkWidget *
957
find_bg_color_widget (GtkWidget *widget)
958
{
959
  GtkWidget *bg_color_widget;
960
 
961
  bg_color_widget = widget;
962
 
963
  return bg_color_widget;
964
}
965
 
966
void
967
cp_gtk_component_connect_expose_signals (GObject *ptr, jobject gref)
968
{
969
  g_signal_connect (G_OBJECT (ptr), "expose-event",
970
                    G_CALLBACK (component_expose_cb), gref);
971
}
972
 
973
void
974
cp_gtk_component_connect_focus_signals (GObject *ptr, jobject gref)
975
{
976
  g_signal_connect (G_OBJECT (ptr), "focus-in-event",
977
                    G_CALLBACK (component_focus_in_cb), gref);
978
 
979
  g_signal_connect (G_OBJECT (ptr), "focus-out-event",
980
                    G_CALLBACK (component_focus_out_cb), gref);
981
}
982
 
983
void
984
cp_gtk_component_connect_mouse_signals (GObject *ptr, jobject gref)
985
{
986
  g_signal_connect (G_OBJECT (ptr), "button-press-event",
987
                    G_CALLBACK (component_button_press_cb), gref);
988
 
989
  g_signal_connect (G_OBJECT (ptr), "button-release-event",
990
                    G_CALLBACK (component_button_release_cb), gref);
991
 
992
  g_signal_connect (G_OBJECT (ptr), "enter-notify-event",
993
                    G_CALLBACK (component_enter_notify_cb), gref);
994
 
995
  g_signal_connect (G_OBJECT (ptr), "leave-notify-event",
996
                    G_CALLBACK (component_leave_notify_cb), gref);
997
 
998
  g_signal_connect (G_OBJECT (ptr), "motion-notify-event",
999
                    G_CALLBACK (component_motion_notify_cb), gref);
1000
 
1001
  g_signal_connect (G_OBJECT (ptr), "scroll-event",
1002
                    G_CALLBACK (component_scroll_cb), gref);
1003
}
1004
 
1005
void
1006
cp_gtk_component_connect_signals (GObject *ptr, jobject gref)
1007
{
1008
  cp_gtk_component_connect_expose_signals (ptr, gref);
1009
  cp_gtk_component_connect_focus_signals (ptr, gref);
1010
  cp_gtk_component_connect_mouse_signals (ptr, gref);
1011
}
1012
 
1013
/* These variables are used to keep track of click counts.  The AWT
1014
   allows more than a triple click to occur but GTK doesn't report
1015
   more-than-triple clicks.  Also used for keeping track of scroll events.*/
1016
static jint click_count = 1;
1017
static guint32 button_click_time = 0;
1018
static GdkWindow *button_window = NULL;
1019
static guint button_number_direction = -1;
1020
static int hasBeenDragged;
1021
 
1022
static gboolean
1023
component_button_press_cb (GtkWidget *widget __attribute__((unused)),
1024
                           GdkEventButton *event,
1025
                           jobject peer)
1026
{
1027
  /* Ignore double and triple click events. */
1028
  if (event->type == GDK_2BUTTON_PRESS
1029
      || event->type == GDK_3BUTTON_PRESS)
1030
    return FALSE;
1031
 
1032
  if ((event->time < (button_click_time + MULTI_CLICK_TIME))
1033
      && (event->window == button_window)
1034
      && (event->button == button_number_direction))
1035
    click_count++;
1036
  else
1037
    click_count = 1;
1038
 
1039
  button_click_time = event->time;
1040
  button_window = event->window;
1041
  button_number_direction = event->button;
1042
 
1043
  (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
1044
                                postMouseEventID,
1045
                                AWT_MOUSE_PRESSED,
1046
                                (jlong)event->time,
1047
                                cp_gtk_state_to_awt_mods (event->state)
1048
                                | button_to_awt_mods (event->button),
1049
                                (jint)event->x,
1050
                                (jint)event->y,
1051
                                click_count,
1052
                                (event->button == 3) ? JNI_TRUE :
1053
                                JNI_FALSE);
1054
 
1055
  hasBeenDragged = FALSE;
1056
 
1057
  return FALSE;
1058
}
1059
 
1060
static gboolean
1061
component_button_release_cb (GtkWidget *widget __attribute__((unused)),
1062
                             GdkEventButton *event,
1063
                             jobject peer)
1064
{
1065
  int width, height;
1066
 
1067
  (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
1068
                                postMouseEventID,
1069
                                AWT_MOUSE_RELEASED,
1070
                                (jlong)event->time,
1071
                                cp_gtk_state_to_awt_mods (event->state)
1072
                                | button_to_awt_mods (event->button),
1073
                                (jint)event->x,
1074
                                (jint)event->y,
1075
                                click_count,
1076
                                JNI_FALSE);
1077
 
1078
  /* Generate an AWT click event only if the release occured in the
1079
     window it was pressed in, and the mouse has not been dragged since
1080
     the last time it was pressed. */
1081
  gdk_drawable_get_size (event->window, &width, &height);
1082
  if (! hasBeenDragged
1083
      && event->x >= 0
1084
      && event->y >= 0
1085
      && event->x <= width
1086
      && event->y <= height)
1087
    {
1088
      (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
1089
                                    postMouseEventID,
1090
                                    AWT_MOUSE_CLICKED,
1091
                                    (jlong)event->time,
1092
                                    cp_gtk_state_to_awt_mods (event->state)
1093
                                    | button_to_awt_mods (event->button),
1094
                                    (jint)event->x,
1095
                                    (jint)event->y,
1096
                                    click_count,
1097
                                    JNI_FALSE);
1098
    }
1099
  return FALSE;
1100
}
1101
 
1102
static gboolean
1103
component_motion_notify_cb (GtkWidget *widget __attribute__((unused)),
1104
                            GdkEventMotion *event,
1105
                            jobject peer)
1106
{
1107
  if (event->state & (GDK_BUTTON1_MASK
1108
                      | GDK_BUTTON2_MASK
1109
                      | GDK_BUTTON3_MASK
1110
                      | GDK_BUTTON4_MASK
1111
                      | GDK_BUTTON5_MASK))
1112
    {
1113
      (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
1114
                                    postMouseEventID,
1115
                                    AWT_MOUSE_DRAGGED,
1116
                                    (jlong)event->time,
1117
                                    state_to_awt_mods_with_button_states (event->state),
1118
                                    (jint)event->x,
1119
                                    (jint)event->y,
1120
                                    0,
1121
                                    JNI_FALSE);
1122
 
1123
      hasBeenDragged = TRUE;
1124
    }
1125
  else
1126
    {
1127
      (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postMouseEventID,
1128
                                    AWT_MOUSE_MOVED,
1129
                                    (jlong)event->time,
1130
                                    cp_gtk_state_to_awt_mods (event->state),
1131
                                    (jint)event->x,
1132
                                    (jint)event->y,
1133
                                    0,
1134
                                    JNI_FALSE);
1135
    }
1136
  return FALSE;
1137
}
1138
 
1139
static gboolean
1140
component_scroll_cb (GtkWidget *widget __attribute__((unused)),
1141
                     GdkEventScroll *event,
1142
                     jobject peer)
1143
{
1144
  int rotation;
1145
  /** Record click count for specific direction. */
1146
  if ((event->time < (button_click_time + MULTI_CLICK_TIME))
1147
      && (event->window == button_window)
1148
      && (event->direction == button_number_direction))
1149
    click_count++;
1150
  else
1151
    click_count = 1;
1152
 
1153
  button_click_time = event->time;
1154
  button_window = event->window;
1155
  button_number_direction = event->direction;
1156
 
1157
  if (event->direction == GDK_SCROLL_UP
1158
      || event->direction == GDK_SCROLL_LEFT)
1159
    rotation = -1;
1160
  else
1161
    rotation = 1;
1162
 
1163
  (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
1164
                                       postMouseWheelEventID,
1165
                                       AWT_MOUSE_WHEEL,
1166
                                       (jlong)event->time,
1167
                                       cp_gtk_state_to_awt_mods (event->state),
1168
                                       (jint)event->x,
1169
                                       (jint)event->y,
1170
                                       click_count,
1171
                                       JNI_FALSE,
1172
                                       AWT_WHEEL_UNIT_SCROLL,
1173
                                       1 /* amount */,
1174
                                       rotation);
1175
  return FALSE;
1176
}
1177
 
1178
static gboolean
1179
component_enter_notify_cb (GtkWidget *widget __attribute__((unused)),
1180
                           GdkEventCrossing *event,
1181
                           jobject peer)
1182
{
1183
  /* We are not interested in enter events that are due to
1184
     grab/ungrab and not to actually crossing boundaries */
1185
  if (event->mode == GDK_CROSSING_NORMAL)
1186
    {
1187
      (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postMouseEventID,
1188
                                    AWT_MOUSE_ENTERED,
1189
                                    (jlong)event->time,
1190
                                    state_to_awt_mods_with_button_states (event->state),
1191
                                    (jint)event->x,
1192
                                    (jint)event->y,
1193
                                    0,
1194
                                    JNI_FALSE);
1195
    }
1196
  return FALSE;
1197
}
1198
 
1199
static gboolean
1200
component_leave_notify_cb (GtkWidget *widget __attribute__((unused)),
1201
                           GdkEventCrossing *event,
1202
                           jobject peer)
1203
{
1204
  /* We are not interested in leave events that are due to
1205
     grab/ungrab and not to actually crossing boundaries */
1206
  if (event->mode == GDK_CROSSING_NORMAL)
1207
    {
1208
      (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
1209
                                    postMouseEventID,
1210
                                    AWT_MOUSE_EXITED,
1211
                                    (jlong)event->time,
1212
                                    state_to_awt_mods_with_button_states (event->state),
1213
                                    (jint)event->x,
1214
                                    (jint)event->y,
1215
                                    0,
1216
                                    JNI_FALSE);
1217
    }
1218
  return FALSE;
1219
}
1220
 
1221
static gboolean
1222
component_expose_cb (GtkWidget *widget __attribute__((unused)),
1223
                     GdkEventExpose *event,
1224
                     jobject peer)
1225
{
1226
  (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
1227
                                postExposeEventID,
1228
                                (jint)event->area.x,
1229
                                (jint)event->area.y,
1230
                                (jint)event->area.width,
1231
                                (jint)event->area.height);
1232
 
1233
  return FALSE;
1234
}
1235
 
1236
static gboolean
1237
component_focus_in_cb (GtkWidget *widget __attribute((unused)),
1238
                       GdkEventFocus *event __attribute((unused)),
1239
                       jobject peer)
1240
{
1241
  (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
1242
                                postFocusEventID,
1243
                                AWT_FOCUS_GAINED,
1244
                                JNI_FALSE);
1245
 
1246
  return FALSE;
1247
}
1248
 
1249
static gboolean
1250
component_focus_out_cb (GtkWidget *widget __attribute((unused)),
1251
                        GdkEventFocus *event __attribute((unused)),
1252
                        jobject peer)
1253
{
1254
  (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
1255
                                postFocusEventID,
1256
                                AWT_FOCUS_LOST,
1257
                                JNI_FALSE);
1258
 
1259
  return FALSE;
1260
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.