gnu_java_awt_peer_gtk_gtkwindowpeer.c
来自「Mac OS X 10.4.9 for x86 Source Code gcc」· C语言 代码 · 共 732 行 · 第 1/2 页
C
732 行
/* Request that the window manager set window's _NET_FRAME_EXTENTS property. */ request_frame_extents (window); /* Attempt to retrieve window's frame extents. */ gu_ex.extents = &extents; if (gdk_property_get (window->window, gdk_atom_intern ("_NET_FRAME_EXTENTS", FALSE), gdk_atom_intern ("CARDINAL", FALSE), 0, sizeof (unsigned long) * 4, FALSE, NULL, NULL, NULL, gu_ex.gu_extents)) { *left = extents [0]; *right = extents [1]; *top = extents [2]; *bottom = extents [3]; }}static Atom extents_atom = 0;/* Requests that the window manager set window's _NET_FRAME_EXTENTS property. */static voidrequest_frame_extents (GtkWidget *window){ const char *request_str = "_NET_REQUEST_FRAME_EXTENTS"; GdkAtom request_extents = gdk_atom_intern (request_str, FALSE); /* Check if the current window manager supports _NET_REQUEST_FRAME_EXTENTS. */ if (gdk_net_wm_supports (request_extents)) { GdkDisplay *display = gtk_widget_get_display (window); Display *xdisplay = GDK_DISPLAY_XDISPLAY (display); GdkWindow *root_window = gdk_get_default_root_window (); Window xroot_window = GDK_WINDOW_XID (root_window); Atom extents_request_atom = gdk_x11_get_xatom_by_name_for_display (display, request_str); XEvent xevent; XEvent notify_xevent; unsigned long window_id = GDK_WINDOW_XID (GDK_DRAWABLE(window->window)); if (!extents_atom) { const char *extents_str = "_NET_FRAME_EXTENTS"; extents_atom = gdk_x11_get_xatom_by_name_for_display (display, extents_str); } xevent.xclient.type = ClientMessage; xevent.xclient.message_type = extents_request_atom; xevent.xclient.display = xdisplay; xevent.xclient.window = window_id; xevent.xclient.format = 32; xevent.xclient.data.l[0] = 0; xevent.xclient.data.l[1] = 0; xevent.xclient.data.l[2] = 0; xevent.xclient.data.l[3] = 0; xevent.xclient.data.l[4] = 0; XSendEvent (xdisplay, xroot_window, False, (SubstructureRedirectMask | SubstructureNotifyMask), &xevent); XIfEvent(xdisplay, ¬ify_xevent, property_notify_predicate, (XPointer) &window_id); }}static Boolproperty_notify_predicate (Display *xdisplay __attribute__((unused)), XEvent *event, XPointer window_id){ unsigned long *window = (unsigned long *) window_id; if (event->xany.type == PropertyNotify && event->xany.window == *window && event->xproperty.atom == extents_atom) return True; else return False;}static voidwindow_delete_cb (GtkWidget *widget __attribute__((unused)), GdkEvent *event __attribute__((unused)), jobject peer){ gdk_threads_leave (); (*gdk_env())->CallVoidMethod (gdk_env(), peer, postWindowEventID, (jint) AWT_WINDOW_CLOSING, (jobject) NULL, (jint) 0); gdk_threads_enter ();}static voidwindow_destroy_cb (GtkWidget *widget __attribute__((unused)), GdkEvent *event __attribute__((unused)), jobject peer){ gdk_threads_leave (); (*gdk_env())->CallVoidMethod (gdk_env(), peer, postWindowEventID, (jint) AWT_WINDOW_CLOSED, (jobject) NULL, (jint) 0); gdk_threads_enter ();}static voidwindow_show_cb (GtkWidget *widget __attribute__((unused)), jobject peer){ gdk_threads_leave (); (*gdk_env())->CallVoidMethod (gdk_env(), peer, postWindowEventID, (jint) AWT_WINDOW_OPENED, (jobject) NULL, (jint) 0); gdk_threads_enter ();}static voidwindow_active_state_change_cb (GtkWidget *widget __attribute__((unused)), GParamSpec *pspec __attribute__((unused)), jobject peer __attribute__((unused))){ /* FIXME: not sure if this is needed or not. */ /* Remove the unused attributes if you fix the below. */#if 0 gdk_threads_leave (); if (GTK_WINDOW (widget)->is_active) (*gdk_env())->CallVoidMethod (gdk_env(), peer, postWindowEventID, (jint) AWT_WINDOW_GAINED_FOCUS, (jobject) NULL, (jint) 0); else (*gdk_env())->CallVoidMethod (gdk_env(), peer, postWindowEventID, (jint) AWT_WINDOW_DEACTIVATED, (jobject) NULL, (jint) 0); gdk_threads_enter ();#endif}static voidwindow_focus_state_change_cb (GtkWidget *widget, GParamSpec *pspec __attribute__((unused)), jobject peer){ gdk_threads_leave (); if (GTK_WINDOW (widget)->has_toplevel_focus) (*gdk_env())->CallVoidMethod (gdk_env(), peer, postWindowEventID, (jint) AWT_WINDOW_ACTIVATED, (jobject) NULL, (jint) 0); else (*gdk_env())->CallVoidMethod (gdk_env(), peer, postWindowEventID, (jint) AWT_WINDOW_DEACTIVATED, (jobject) NULL, (jint) 0); gdk_threads_enter ();}static gbooleanwindow_focus_in_cb (GtkWidget * widget __attribute__((unused)), GdkEventFocus *event __attribute__((unused)), jobject peer){ gdk_threads_leave (); (*gdk_env())->CallVoidMethod (gdk_env(), peer, postWindowEventID, (jint) AWT_WINDOW_GAINED_FOCUS, (jobject) NULL, (jint) 0); /* FIXME: somewhere after this is handled, the child window is getting an expose event. */ gdk_threads_enter (); return FALSE;}static gbooleanwindow_focus_out_cb (GtkWidget * widget __attribute__((unused)), GdkEventFocus *event __attribute__((unused)), jobject peer){ gdk_threads_leave (); (*gdk_env())->CallVoidMethod (gdk_env(), peer, postWindowEventID, (jint) AWT_WINDOW_LOST_FOCUS, (jobject) NULL, (jint) 0); /* FIXME: somewhere after this is handled, the child window is getting an expose event. */ gdk_threads_enter (); return FALSE;}static gbooleanwindow_window_state_cb (GtkWidget *widget, GdkEvent *event, jobject peer){ jint new_state; /* Handle WINDOW_ICONIFIED and WINDOW_DEICONIFIED events. */ if (event->window_state.changed_mask & GDK_WINDOW_STATE_ICONIFIED) { /* We've either been iconified or deiconified. */ if (event->window_state.new_window_state & GDK_WINDOW_STATE_ICONIFIED) { /* We've been iconified. */ gdk_threads_leave (); (*gdk_env())->CallVoidMethod (gdk_env(), peer, postWindowEventID, (jint) AWT_WINDOW_ICONIFIED, (jobject) NULL, (jint) 0); gdk_threads_enter (); } else { /* We've been deiconified. */ gdk_threads_leave (); (*gdk_env())->CallVoidMethod (gdk_env(), peer, postWindowEventID, (jint) AWT_WINDOW_DEICONIFIED, (jobject) NULL, (jint) 0); gdk_threads_enter (); } } /* Post a WINDOW_STATE_CHANGED event, passing the new frame state to GtkWindowPeer. */ new_state = AWT_FRAME_STATE_NORMAL; if (event->window_state.new_window_state & GDK_WINDOW_STATE_ICONIFIED) new_state |= AWT_FRAME_STATE_ICONIFIED; new_state |= window_get_new_state (widget); gdk_threads_leave (); (*gdk_env())->CallVoidMethod (gdk_env(), peer, postWindowEventID, (jint) AWT_WINDOW_STATE_CHANGED, (jobject) NULL, new_state); gdk_threads_enter (); return TRUE;}static jintwindow_get_new_state (GtkWidget *widget){ GdkDisplay *display = gtk_widget_get_display(widget); jint new_state = AWT_FRAME_STATE_NORMAL; Atom type; gint format; gulong atom_count; gulong bytes_after; Atom *atom_list = NULL; union atom_list_union alu; gulong i; alu.atom_list = &atom_list; XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), GDK_WINDOW_XID (widget->window), gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE"), 0, G_MAXLONG, False, XA_ATOM, &type, &format, &atom_count, &bytes_after, alu.gu_extents); if (type != None) { Atom maxvert = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE_MAXIMIZED_VERT"); Atom maxhorz = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE_MAXIMIZED_HORZ"); i = 0; while (i < atom_count) { if (atom_list[i] == maxhorz) new_state |= AWT_FRAME_STATE_MAXIMIZED_HORIZ; else if (atom_list[i] == maxvert) new_state |= AWT_FRAME_STATE_MAXIMIZED_VERT; ++i; } XFree (atom_list); } return new_state;}static gbooleanwindow_property_changed_cb (GtkWidget *widget __attribute__((unused)), GdkEventProperty *event, jobject peer){ unsigned long *extents; union extents_union gu_ex; gu_ex.extents = &extents; if (gdk_atom_intern ("_NET_FRAME_EXTENTS", FALSE) == event->atom && gdk_property_get (event->window, gdk_atom_intern ("_NET_FRAME_EXTENTS", FALSE), gdk_atom_intern ("CARDINAL", FALSE), 0, sizeof (unsigned long) * 4, FALSE, NULL, NULL, NULL, gu_ex.gu_extents)) { gdk_threads_leave (); (*gdk_env())->CallVoidMethod (gdk_env(), peer, postInsetsChangedEventID, (jint) extents[2], /* top */ (jint) extents[0], /* left */ (jint) extents[3], /* bottom */ (jint) extents[1]); /* right */ gdk_threads_enter (); } return FALSE;}static voidrealize_cb (GtkWidget *widget, jobject peer){ jint top = 0; jint left = 0; jint bottom = 0; jint right = 0; jint width = 0; jint height = 0; width = (*gdk_env())->CallIntMethod (gdk_env(), peer, windowGetWidthID); height = (*gdk_env())->CallIntMethod (gdk_env(), peer, windowGetHeightID); window_get_frame_extents (widget, &top, &left, &bottom, &right); (*gdk_env())->CallVoidMethod (gdk_env(), peer, postInsetsChangedEventID, top, left, bottom, right); gtk_window_set_default_size (GTK_WINDOW (widget), MAX (1, width - left - right), MAX (1, height - top - bottom)); /* set the size like we do in nativeSetBounds */ gtk_widget_set_size_request (widget, MAX (1, width - left - right), MAX (1, height - top - bottom)); gtk_window_resize (GTK_WINDOW (widget), MAX (1, width - left - right), MAX (1, height - top - bottom));}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?