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. |
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 |
|
|
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 |
|
} |