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, &notify_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 + -
显示快捷键?