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

📄 gtkoptionmenu.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 2 页
字号:
		     OPTION_INDICATOR_WIDTH - OPTION_INDICATOR_SPACING * 4,		     button_area.y + (button_area.height - OPTION_INDICATOR_HEIGHT) / 2,		     OPTION_INDICATOR_WIDTH, OPTION_INDICATOR_HEIGHT);            if (GTK_WIDGET_HAS_FOCUS (widget))	gtk_paint_focus (widget->style, widget->window,			 area, widget, "button",			 button_area.x - 1, 			 button_area.y - 1, 			 button_area.width + 1,			 button_area.height + 1);    }}static voidgtk_option_menu_draw (GtkWidget    *widget,		      GdkRectangle *area){  GtkWidget *child;  GdkRectangle child_area;  g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_OPTION_MENU (widget));  g_return_if_fail (area != NULL);  if (GTK_WIDGET_DRAWABLE (widget))    {      gtk_option_menu_paint (widget, area);      child = GTK_BIN (widget)->child;      if (child && gtk_widget_intersect (child, area, &child_area))	gtk_widget_draw (child, &child_area);    }}static gintgtk_option_menu_expose (GtkWidget      *widget,			GdkEventExpose *event){  GtkWidget *child;  GdkEventExpose child_event;  gint remove_child;  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_OPTION_MENU (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  if (GTK_WIDGET_DRAWABLE (widget))    {      gtk_option_menu_paint (widget, &event->area);      /* The following code tries to draw the child in two places at       * once. It fails miserably for several reasons       *       * - If the child is not no-window, removing generates       *   more expose events. Bad, bad, bad.       *        * - Even if the child is no-window, removing it now (properly)       *   clears the space where it was, so it does no good       */      #if 0      remove_child = FALSE;      child = GTK_BUTTON (widget)->child;      if (!child)	{	  if (!GTK_OPTION_MENU (widget)->menu)	    return FALSE;	  gtk_option_menu_update_contents (GTK_OPTION_MENU (widget));	  child = GTK_BUTTON (widget)->child;	  if (!child)	    return FALSE;	  remove_child = TRUE;	}      child_event = *event;      if (GTK_WIDGET_NO_WINDOW (child) &&	  gtk_widget_intersect (child, &event->area, &child_event.area))	gtk_widget_event (child, (GdkEvent*) &child_event);      if (remove_child)	gtk_option_menu_remove_contents (GTK_OPTION_MENU (widget));#else      remove_child = FALSE;      child = GTK_BIN (widget)->child;      child_event = *event;      if (child && GTK_WIDGET_NO_WINDOW (child) &&	  gtk_widget_intersect (child, &event->area, &child_event.area))	gtk_widget_event (child, (GdkEvent*) &child_event);#endif /* 0 */    }  return FALSE;}static gintgtk_option_menu_button_press (GtkWidget      *widget,			      GdkEventButton *event){  GtkOptionMenu *option_menu;  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_OPTION_MENU (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  option_menu = GTK_OPTION_MENU (widget);  if ((event->type == GDK_BUTTON_PRESS) &&      (event->button == 1))    {      gtk_option_menu_remove_contents (option_menu);      gtk_menu_popup (GTK_MENU (option_menu->menu), NULL, NULL,		      gtk_option_menu_position, option_menu,		      event->button, event->time);      return TRUE;    }  return FALSE;}static gintgtk_option_menu_key_press (GtkWidget   *widget,			   GdkEventKey *event){  GtkOptionMenu *option_menu;  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_OPTION_MENU (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  option_menu = GTK_OPTION_MENU (widget);  switch (event->keyval)    {    case GDK_space:      gtk_option_menu_remove_contents (option_menu);      gtk_menu_popup (GTK_MENU (option_menu->menu), NULL, NULL,		      gtk_option_menu_position, option_menu,		      0, event->time);      return TRUE;    }    return FALSE;}static voidgtk_option_menu_deactivate (GtkMenuShell  *menu_shell,			    GtkOptionMenu *option_menu){  g_return_if_fail (menu_shell != NULL);  g_return_if_fail (option_menu != NULL);  g_return_if_fail (GTK_IS_OPTION_MENU (option_menu));  gtk_option_menu_update_contents (option_menu);}static voidgtk_option_menu_update_contents (GtkOptionMenu *option_menu){  GtkWidget *child;  GtkRequisition child_requisition;  g_return_if_fail (option_menu != NULL);  g_return_if_fail (GTK_IS_OPTION_MENU (option_menu));  if (option_menu->menu)    {      gtk_option_menu_remove_contents (option_menu);      option_menu->menu_item = gtk_menu_get_active (GTK_MENU (option_menu->menu));      if (option_menu->menu_item)	{	  gtk_widget_ref (option_menu->menu_item);	  child = GTK_BIN (option_menu->menu_item)->child;	  if (child)	    {	      if (GTK_BIN (option_menu)->child)		gtk_container_remove (GTK_CONTAINER (option_menu),				      GTK_BIN (option_menu)->child);	      if (GTK_WIDGET (option_menu)->state != child->state)		gtk_widget_set_state (child, GTK_WIDGET (option_menu)->state);	      gtk_widget_reparent (child, GTK_WIDGET (option_menu));	    }	  gtk_widget_size_request (child, &child_requisition);	  gtk_widget_size_allocate (GTK_WIDGET (option_menu),				    &(GTK_WIDGET (option_menu)->allocation));	  if (GTK_WIDGET_DRAWABLE (option_menu))	    gtk_widget_queue_draw (GTK_WIDGET (option_menu));	}    }}static voidgtk_option_menu_remove_contents (GtkOptionMenu *option_menu){  g_return_if_fail (option_menu != NULL);  g_return_if_fail (GTK_IS_OPTION_MENU (option_menu));  if (GTK_BIN (option_menu)->child)    {      if (GTK_WIDGET (option_menu->menu_item)->state != GTK_BIN (option_menu)->child->state)	gtk_widget_set_state (GTK_BIN (option_menu)->child,			      GTK_WIDGET (option_menu->menu_item)->state);      gtk_widget_reparent (GTK_BIN (option_menu)->child, option_menu->menu_item);      gtk_widget_unref (option_menu->menu_item);      option_menu->menu_item = NULL;    }}static voidgtk_option_menu_calc_size (GtkOptionMenu *option_menu){  GtkWidget *child;  GList *children;  GtkRequisition child_requisition;  g_return_if_fail (option_menu != NULL);  g_return_if_fail (GTK_IS_OPTION_MENU (option_menu));  option_menu->width = 0;  option_menu->height = 0;  if (option_menu->menu)    {      children = GTK_MENU_SHELL (option_menu->menu)->children;      while (children)	{	  child = children->data;	  children = children->next;	  if (GTK_WIDGET_VISIBLE (child))	    {	      gtk_widget_size_request (child, &child_requisition);	      option_menu->width = MAX (option_menu->width, child_requisition.width);	      option_menu->height = MAX (option_menu->height, child_requisition.height);	    }	}    }}static voidgtk_option_menu_position (GtkMenu  *menu,			  gint     *x,			  gint     *y,			  gpointer  user_data){  GtkOptionMenu *option_menu;  GtkWidget *active;  GtkWidget *child;  GList *children;  gint shift_menu;  gint screen_width;  gint screen_height;  gint menu_xpos;  gint menu_ypos;  gint width;  gint height;  g_return_if_fail (user_data != NULL);  g_return_if_fail (GTK_IS_OPTION_MENU (user_data));  option_menu = GTK_OPTION_MENU (user_data);  width = GTK_WIDGET (menu)->allocation.width;  height = GTK_WIDGET (menu)->allocation.height;  active = gtk_menu_get_active (GTK_MENU (option_menu->menu));  children = GTK_MENU_SHELL (option_menu->menu)->children;  gdk_window_get_origin (GTK_WIDGET (option_menu)->window, &menu_xpos, &menu_ypos);  menu_ypos += GTK_WIDGET (option_menu)->allocation.height / 2 - 2;  if (active != NULL)    menu_ypos -= active->requisition.height / 2;  while (children)    {      child = children->data;      if (active == child)	break;      if (GTK_WIDGET_VISIBLE (child))	menu_ypos -= child->allocation.height;      children = children->next;    }  screen_width = gdk_screen_width ();  screen_height = gdk_screen_height ();  shift_menu = FALSE;  if (menu_ypos < 0)    {      menu_ypos = 0;      shift_menu = TRUE;    }  else if ((menu_ypos + height) > screen_height)    {      menu_ypos -= ((menu_ypos + height) - screen_height);      shift_menu = TRUE;    }  if (shift_menu)    {      if ((menu_xpos + GTK_WIDGET (option_menu)->allocation.width + width) <= screen_width)	menu_xpos += GTK_WIDGET (option_menu)->allocation.width;      else	menu_xpos -= width;    }  if (menu_xpos < 0)    menu_xpos = 0;  else if ((menu_xpos + width) > screen_width)    menu_xpos -= ((menu_xpos + width) - screen_width);  *x = menu_xpos;  *y = menu_ypos;}static voidgtk_option_menu_show_all (GtkWidget *widget){  GtkContainer *container;  GtkOptionMenu *option_menu;    g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_OPTION_MENU (widget));  container = GTK_CONTAINER (widget);  option_menu = GTK_OPTION_MENU (widget);  gtk_widget_show (widget);  gtk_container_foreach (container, (GtkCallback) gtk_widget_show_all, NULL);  if (option_menu->menu)    gtk_widget_show_all (option_menu->menu);  if (option_menu->menu_item)    gtk_widget_show_all (option_menu->menu_item);}static voidgtk_option_menu_hide_all (GtkWidget *widget){  GtkContainer *container;  g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_OPTION_MENU (widget));  container = GTK_CONTAINER (widget);  gtk_widget_hide (widget);  gtk_container_foreach (container, (GtkCallback) gtk_widget_hide_all, NULL);}

⌨️ 快捷键说明

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