⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gdkwindow-fb.c

📁 linux下电话本所依赖的一些图形库
💻 C
📖 第 1 页 / 共 4 页
字号:
    gdk_fb_window_containing_pointer = gdk_window_ref (_gdk_parent_root);  if (src)    a = src;  else    a = gdk_fb_window_containing_pointer;  b = dest;  if (a==b)    return;  /* gdk_fb_window_containing_pointer might have been destroyed.   * The refcount we hold on it should keep it, but it's parents   * might have died.   */  if (GDK_WINDOW_DESTROYED (a))    a = _gdk_parent_root;    gdk_fb_mouse_get_info (&x, &y, &my_mask);  c = gdk_fb_find_common_ancestor (a, b);  non_linear = (c != a) && (c != b);  event_win = gdk_fb_pointer_event_window (a, GDK_LEAVE_NOTIFY);  if (event_win)    {      event = gdk_event_make (event_win, GDK_LEAVE_NOTIFY, TRUE);      event->crossing.subwindow = NULL;      gdk_window_get_root_origin (a, &x_int, &y_int);      event->crossing.x = x - x_int;      event->crossing.y = y - y_int;      event->crossing.x_root = x;      event->crossing.y_root = y;      event->crossing.mode = mode;      if (non_linear)	event->crossing.detail = GDK_NOTIFY_NONLINEAR;      else if (c==a)	event->crossing.detail = GDK_NOTIFY_INFERIOR;      else	event->crossing.detail = GDK_NOTIFY_ANCESTOR;      event->crossing.focus = FALSE;      event->crossing.state = my_mask;    }    /* Traverse up from a to (excluding) c */  if (c != a)    {      last = a;      win = GDK_WINDOW (GDK_WINDOW_OBJECT (a)->parent);      while (win != c)	{	  event_win = gdk_fb_pointer_event_window (win, GDK_LEAVE_NOTIFY);	  if (event_win)	    {	      event = gdk_event_make (event_win, GDK_LEAVE_NOTIFY, TRUE);	      event->crossing.subwindow = gdk_window_ref (last);	      gdk_window_get_root_origin (win, &x_int, &y_int);	      event->crossing.x = x - x_int;	      event->crossing.y = y - y_int;	      event->crossing.x_root = x;	      event->crossing.y_root = y;	      event->crossing.mode = mode;	      if (non_linear)		event->crossing.detail = GDK_NOTIFY_NONLINEAR_VIRTUAL;	      else		event->crossing.detail = GDK_NOTIFY_VIRTUAL;	      event->crossing.focus = FALSE;	      event->crossing.state = my_mask;	    }	  last = win;	  win = GDK_WINDOW (GDK_WINDOW_OBJECT (win)->parent);	}    }    /* Traverse down from c to b */  if (c != b)     {      path = NULL;      win = GDK_WINDOW( GDK_WINDOW_OBJECT (b)->parent);      while (win != c)	{	  path = g_list_prepend (path, win);	  win = GDK_WINDOW( GDK_WINDOW_OBJECT (win)->parent);	}            list = path;      while (list) 	{	  win = (GdkWindow *)list->data;	  list = g_list_next (list);	  if (list)	    next = (GdkWindow *)list->data;	  else 	    next = b;	  	  event_win = gdk_fb_pointer_event_window (win, GDK_ENTER_NOTIFY);	  if (event_win)	    {	      event = gdk_event_make (event_win, GDK_ENTER_NOTIFY, TRUE);	      event->crossing.subwindow = gdk_window_ref (next);	      gdk_window_get_root_origin (win, &x_int, &y_int);	      event->crossing.x = x - x_int;	      event->crossing.y = y - y_int;	      event->crossing.x_root = x;	      event->crossing.y_root = y;	      event->crossing.mode = mode;	      if (non_linear)		event->crossing.detail = GDK_NOTIFY_NONLINEAR_VIRTUAL;	      else		event->crossing.detail = GDK_NOTIFY_VIRTUAL;	      event->crossing.focus = FALSE;	      event->crossing.state = my_mask;	    }	}      g_list_free (path);    }  event_win = gdk_fb_pointer_event_window (b, GDK_ENTER_NOTIFY);  if (event_win)    {      event = gdk_event_make (event_win, GDK_ENTER_NOTIFY, TRUE);      event->crossing.subwindow = NULL;      gdk_window_get_root_origin (b, &x_int, &y_int);      event->crossing.x = x - x_int;      event->crossing.y = y - y_int;      event->crossing.x_root = x;      event->crossing.y_root = y;      event->crossing.mode = mode;      if (non_linear)	event->crossing.detail = GDK_NOTIFY_NONLINEAR;      else if (c==a)	event->crossing.detail = GDK_NOTIFY_ANCESTOR;      else	event->crossing.detail = GDK_NOTIFY_INFERIOR;      event->crossing.focus = FALSE;      event->crossing.state = my_mask;    }  if (mode != GDK_CROSSING_GRAB)    {      gdk_fb_change_focus (b);      if (b != gdk_fb_window_containing_pointer)	{	  gdk_window_unref (gdk_fb_window_containing_pointer);	  gdk_fb_window_containing_pointer = gdk_window_ref (b);	}    }}static voidshow_window_internal (GdkWindow *window,                      gboolean   raise){  GdkWindowObject *private;  GdkWindow *mousewin;  g_return_if_fail (window != NULL);    private = (GdkWindowObject*) window;  if (!private->destroyed && !GDK_WINDOW_IS_MAPPED (private))    {      private->state = 0;      if (raise)        gdk_fb_window_raise (window);            if (all_parents_shown ((GdkWindowObject *)private->parent))	{	  GdkRectangle rect;	  recompute_drawable ((GdkDrawable *)window);	  send_map_events (private, TRUE);	  mousewin = gdk_window_at_pointer (NULL, NULL);	  gdk_fb_window_send_crossing_events (NULL,					      mousewin, 					      GDK_CROSSING_NORMAL);	  if (private->input_only)	    return;	  rect.x = GDK_DRAWABLE_IMPL_FBDATA (window)->llim_x;	  rect.y = GDK_DRAWABLE_IMPL_FBDATA (window)->llim_y;	  rect.width = GDK_DRAWABLE_IMPL_FBDATA (window)->lim_x - rect.x;	  rect.height = GDK_DRAWABLE_IMPL_FBDATA (window)->lim_y - rect.y;	  gdk_window_invalidate_rect (_gdk_parent_root, &rect, TRUE);	}    }}voidgdk_window_show_unraised (GdkWindow *window){  g_return_if_fail (window != NULL);  show_window_internal (window, FALSE);}voidgdk_window_show (GdkWindow *window){  g_return_if_fail (window != NULL);  show_window_internal (window, TRUE);}voidgdk_window_hide (GdkWindow *window){  GdkWindowObject *private;  GdkWindow *mousewin;  GdkWindow *event_win;    g_return_if_fail (window != NULL);    private = (GdkWindowObject*) window;  if (!private->destroyed && GDK_WINDOW_IS_MAPPED (private))    {      GdkEvent *event;      GdkRectangle r;      gboolean do_hide;      event_win = gdk_fb_other_event_window (window, GDK_UNMAP);      if (event_win)	event = gdk_event_make (event_win, GDK_UNMAP, TRUE);      r.x = GDK_DRAWABLE_IMPL_FBDATA (window)->llim_x;      r.y = GDK_DRAWABLE_IMPL_FBDATA (window)->llim_y;      r.width = GDK_DRAWABLE_IMPL_FBDATA (window)->lim_x - r.x;      r.height = GDK_DRAWABLE_IMPL_FBDATA (window)->lim_y - r.y;      private->state = GDK_WINDOW_STATE_WITHDRAWN;      mousewin = gdk_window_at_pointer (NULL, NULL);      gdk_fb_window_send_crossing_events (NULL,					  mousewin, 					  GDK_CROSSING_NORMAL);      do_hide = gdk_fb_cursor_need_hide (&r);      if (do_hide)	gdk_fb_cursor_hide ();      if (window == _gdk_fb_pointer_grab_window)	gdk_pointer_ungrab (GDK_CURRENT_TIME);      if (window == _gdk_fb_keyboard_grab_window)	gdk_keyboard_ungrab (GDK_CURRENT_TIME);      /* Clear the root window, as it might be visible under	 the hidden window*/      gdk_window_clear_area (_gdk_parent_root,			     r.x,			     r.y,			     r.width,			     r.height);      /* Invalidate the rect */      gdk_window_invalidate_rect (_gdk_parent_root, &r, TRUE);            if (do_hide)	gdk_fb_cursor_unhide ();    }}voidgdk_window_withdraw (GdkWindow *window){  gdk_window_hide (window);}voidgdk_window_move (GdkWindow *window,		 gint       x,		 gint       y){  GdkWindowObject *private = (GdkWindowObject *)window;    g_return_if_fail (window != NULL);  g_return_if_fail (GDK_IS_WINDOW (window));  gdk_window_move_resize (window, x, y,			  GDK_DRAWABLE_IMPL_FBDATA (private)->width,			  GDK_DRAWABLE_IMPL_FBDATA (private)->height);}voidgdk_window_resize (GdkWindow *window,		   gint       width,		   gint       height){  GdkWindowObject *private;  gint x, y;    g_return_if_fail (window != NULL);  g_return_if_fail (GDK_IS_WINDOW (window));    private = (GdkWindowObject*) window;    if (width < 1)    width = 1;  if (height < 1)    height = 1;  x = private->x;  y = private->y;    if (private->parent && (private->parent->window_type != GDK_WINDOW_CHILD))    {      GdkWindowChildHandlerData *data;            data = g_object_get_data (G_OBJECT (private->parent), "gdk-window-child-handler");      if (data)	(*data->get_pos) (window, &x, &y, data->user_data);    }  gdk_window_move_resize (window, x, y, width, height);}static voidrecompute_abs_positions(GdkDrawable *drawable,			gint parent_x, gint parent_y,			gint parent_llim_x, gint parent_llim_y,			gint parent_lim_x, gint parent_lim_y){  GList *l;  if (GDK_IS_WINDOW (drawable))    {      GdkWindowObject *private = GDK_WINDOW_P (drawable);      int x, y;      if (!GDK_WINDOW_IS_MAPPED (private))	return;            GDK_DRAWABLE_IMPL_FBDATA (private)->abs_x = parent_x + private->x;      GDK_DRAWABLE_IMPL_FBDATA (private)->abs_y = parent_y + private->y;      x = MAX (parent_llim_x, GDK_DRAWABLE_IMPL_FBDATA (private)->abs_x);      x = MIN (x, parent_lim_x);      GDK_DRAWABLE_IMPL_FBDATA (private)->llim_x = x;      y = MAX (parent_llim_y, GDK_DRAWABLE_IMPL_FBDATA (private)->abs_y);      y = MIN (y, parent_lim_y);      GDK_DRAWABLE_IMPL_FBDATA (private)->llim_y = y;      x = MIN (parent_lim_x,	       GDK_DRAWABLE_IMPL_FBDATA (private)->abs_x + GDK_DRAWABLE_IMPL_FBDATA (private)->width);      x = MAX (x, GDK_DRAWABLE_IMPL_FBDATA (private)->llim_x);      GDK_DRAWABLE_IMPL_FBDATA (private)->lim_x = x;      y = MIN (parent_lim_y,	       GDK_DRAWABLE_IMPL_FBDATA (private)->abs_y + GDK_DRAWABLE_IMPL_FBDATA (private)->height);      y = MAX (y, GDK_DRAWABLE_IMPL_FBDATA (private)->llim_y);      GDK_DRAWABLE_IMPL_FBDATA (private)->lim_y = y;      g_assert (GDK_DRAWABLE_IMPL_FBDATA (private)->llim_x <= GDK_DRAWABLE_IMPL_FBDATA (private)->lim_x);      g_assert (GDK_DRAWABLE_IMPL_FBDATA (private)->llim_y <= GDK_DRAWABLE_IMPL_FBDATA (private)->lim_y);      for (l = private->children; l; l = l->next)	recompute_abs_positions (l->data,				 GDK_DRAWABLE_IMPL_FBDATA (private)->abs_x,				 GDK_DRAWABLE_IMPL_FBDATA (private)->abs_y,				 GDK_DRAWABLE_IMPL_FBDATA (private)->llim_x,				 GDK_DRAWABLE_IMPL_FBDATA (private)->llim_y,				 GDK_DRAWABLE_IMPL_FBDATA (private)->lim_x,				 GDK_DRAWABLE_IMPL_FBDATA (private)->lim_y);    }  else    {      GDK_DRAWABLE_IMPL_FBDATA (drawable)->abs_x = 0;      GDK_DRAWABLE_IMPL_FBDATA (drawable)->abs_y = 0;      GDK_DRAWABLE_IMPL_FBDATA (drawable)->llim_x = 0;      GDK_DRAWABLE_IMPL_FBDATA (drawable)->llim_y = 0;      GDK_DRAWABLE_IMPL_FBDATA (drawable)->lim_x = GDK_DRAWABLE_IMPL_FBDATA (drawable)->width;      GDK_DRAWABLE_IMPL_FBDATA (drawable)->lim_y = GDK_DRAWABLE_IMPL_FBDATA (drawable)->height;    }}static voidrecompute_rowstride(GdkDrawable *drawable){  GList *l;  GdkWindowObject *private;  g_return_if_fail (GDK_IS_WINDOW (drawable));  private = GDK_WINDOW_P (drawable);  GDK_DRAWABLE_IMPL_FBDATA (private)->rowstride = gdk_display->fb_stride;  for (l = private->children; l; l = l->next)    recompute_rowstride (l->data);}voidgdk_fb_recompute_all (void){  GDK_DRAWABLE_IMPL_FBDATA (_gdk_parent_root)->width = gdk_display->fb_width;  GDK_DRAWABLE_IMPL_FBDATA (_gdk_parent_root)->height = gdk_display->fb_height;    recompute_abs_positions (_gdk_parent_root,			   0, 0, 0, 0,			   gdk_display->fb_width, gdk_display->fb_height);  recompute_rowstride (_gdk_parent_root);}static voidrecompute_drawable (GdkDrawable *drawable){  if (GDK_IS_WINDOW (drawable))    {      GdkWindowObject *private = GDK_WINDOW_P (drawable);      GdkWindow *parent;      parent = (GdkWindow *)private->parent;      if (!parent)	parent = _gdk_parent_root;      recompute_abs_positions (drawable,			       GDK_DRAWABLE_IMPL_FBDATA (parent)->abs_x,			       GDK_DRAWABLE_IMPL_FBDATA (parent)->abs_y,			       GDK_DRAWABLE_IMPL_FBDATA (parent)->llim_x,			       GDK_DRAWABLE_IMPL_FBDATA (parent)->llim_y,			       GDK_DRAWABLE_IMPL_FBDATA (parent)->lim_x,			       GDK_DRAWABLE_IMPL_FBDATA (parent)->lim_y);    }  else    recompute_abs_positions (drawable, 0, 0, 0, 0, INT_MAX, INT_MAX);}voidgdk_fb_window_move_resize (GdkWindow *window,			   gint       x,			   gint       y,			   gint       width,			   gint       height,			   gboolean   send_expose_events){  GdkWindowObject *private;  gint dx, dy, dw, dh;  gint i, draw_dir;  GdkEvent *event;  GdkWindow *mousewin;  GdkRectangle root_rect;  GdkRectangle update_rect;  g_return_if_fail (window != NULL);  g_return_if_fail (GDK_IS_WINDOW (window));  if (width < 1)    width = 1;  if (height < 1)    height = 1;  private = (GdkWindowObject*) window;  if (private->parent && (private->parent->window_type != GDK_WINDOW_CHILD))    {      GdkWindowChildHandlerData *data;            data = g_object_get_data (G_OBJECT (private->parent), "gdk-window-child-handler");      if (data && (*data->changed) (window, x, y, width, height, data->user_data))	  return;    }    if (!private->destroyed)    {      GdkRegion *old_region = NULL;      if (private->input_only)	send_expose_events = FALSE;      if (GDK_WINDOW_IS_MAPPED (private) && send_expose_events)	old_region = gdk_fb_clip_region (GDK_DRAWABLE_IMPL(window), NULL, TRUE, FALSE, FALSE);      dx = x - private->x;      dy = y - private->y;      dw = width - GDK_DRAWABLE_IMPL_FBDATA (private)->width;      dh = height - GDK_DRAWABLE_IMPL_FBDATA (private)->height;      private->x = x;      private->y = y;      GDK_DRAWABLE_IMPL_FBDATA (private)->width = width;      GDK_DRAWABLE_IMPL_FBDATA (private)->height = height;      if (GDK_WINDOW_IS_MAPPED (private))	{	  recompute_drawable ((GdkDrawable *)window);	  if (send_expose_events)	    {	      GdkRegion *new_region, *region;	      gboolean handle_cursor = FALSE;	      new_region = gdk_fb_clip_region (GDK_DRAWABLE_IMPL (window), NULL, TRUE, FALSE, TRUE);	      region = gdk_region_copy (old_region);	      gdk_region_offset (region, dx, dy);	      gdk_region_intersect (region, new_region);	      if (region->numRects && ((dx != 0) || (dy != 0)))		{		  GdkFBDrawingContext fbdc;		  if (gdk_fb_cursor_region_need_hide (old_region) ||		      gdk_fb_cursor_region_need_hide (new_region))		    {		      gdk_fb_cursor_hide ();		      handle_cursor = TRUE;		    }		  gdk_fb_drawing_context_init (&fbdc, GDK_DRAWABLE_IMPL (_gdk_parent_root), NULL, FALSE, FALSE);		  		  draw_dir = 1;		  if ((dy>0) || ((dy==0) && (dx>0)))		    draw_dir = -1;			      		  for (i=(draw_dir>0)?0:region->numRects-1;i >= 0 && i < region->numRects; i+=draw_dir)		    {		      GdkRegionBox *reg = &region->rects[i];		      gdk_fb_draw_drawable_3 (GDK_DRAWABLE_IMPL(_gdk_parent_root),					      _gdk_fb_screen_gc,					      GDK_DRAWABLE_IMPL(_gdk_parent_root),					      &fbdc,					      (reg->x1 - dx),					      (reg->y1 - dy),					      (reg->x1),					      (reg->y1),					      (reg->x2 - reg->x1),					      (reg->y2 - reg->y1));		    }		  gdk_fb_drawing_context_finalize (&fbdc);		}	      gdk_shadow_fb_update (region->extents.x1, region->extents.y1, 				    region->extents.x2, region->extents.y2);	      	      gdk_region_union (new_region, old_region);	      gdk_region_subtract (new_region, region);	      gdk_region_destroy (region);	      /* Clear the root window in new_region */	      root_rect.x = 0;	      root_rect.y = 0;	      root_rect.width = gdk_screen_width();	      root_rect.height = gdk_screen_height();	      gdk_region_get_clipbox (new_region, &update_rect);	      if (gdk_rectangle_intersect (&update_rect, &root_rect, &update_rect))		gdk_window_clear_area (_gdk_parent_root,				       update_rect.x,				       update_rect.y,				       update_rect.width,				       update_rect.height);	      /* Invalidate regions in new_region */	      gdk_window_invalidate_region (_gdk_parent_root, new_region, TRUE);	      	      if (handle_cursor)		gdk_fb_cursor_unhide ();	      gdk_region_destroy (old_region);	      gdk_region_destroy (new_region);	    }	  /* Send GdkEventConfigure for toplevel windows */	  if (private->window_type != GDK_WINDOW_CHILD)	    {	      GdkWindow *event_win;	      event_win = gdk_fb_other_event_window (window, GDK_CONFIGURE);	      if (event_win)		{		  event = gdk_event_make (event_win, GDK_CONFIGURE, TRUE);		  event->configure.x = private->x;		  event->configure.y = private->y;		  event->configure.width = GDK_DRAWABLE_IMPL_FBDATA (private)->width;		  event->configure.height = GDK_DRAWABLE_IMPL_FBDATA (private)->height;		}	    }	  /* The window the pointer is in might have changed */	  mousewin = gdk_window_at_pointer (NULL, NULL);	  gdk_fb_window_send_crossing_events (NULL,					      mousewin, 					      GDK_CROSSING_NORMAL);	}    }}voidgdk_window_move_resize (GdkWindow *window,			gint       x,			gint       y,			gint       width,			gint       height)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -