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

📄 z875.html

📁 gtk 开发手册和参考文档。 包括gtk glib gdk等
💻 HTML
📖 第 1 页 / 共 3 页
字号:
  /* Hide all windows */  if (GTK_WIDGET_MAPPED (widget))    gtk_widget_unmap (widget);    GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);  /* Destroy our child window */  if (ev->event_window)    {      gdk_window_set_user_data(ev->event_window, NULL);      gdk_window_destroy(ev->event_window);      ev->event_window = NULL;    }  /* This destroys widget->window and unsets the realized flag   */  if (GTK_WIDGET_CLASS(parent_class)->unrealize)    (* GTK_WIDGET_CLASS(parent_class)->unrealize) (widget);}static void gtk_ev_size_request   (GtkWidget        *widget,                       GtkRequisition   *requisition){  g_return_if_fail(widget != NULL);  g_return_if_fail(GTK_IS_EV(widget));  /*    * GtkEv always wants to be the same fixed size.   */    requisition->width  = 450;  requisition->height = 300;}static void gtk_ev_size_allocate  (GtkWidget        *widget,                       GtkAllocation    *allocation){  static const gint spacing = 10;   GtkEv* ev;  g_return_if_fail(widget != NULL);  g_return_if_fail(GTK_IS_EV(widget));    ev = GTK_EV(widget);  widget->allocation = *allocation;  ev->event_window_rect.width =     MAX(allocation->width - spacing*2, 0);  ev->event_window_rect.height =     MAX(allocation->height / 5 - spacing / 2, 0);  ev->event_window_rect.x =     (allocation->width - ev->event_window_rect.width)/2;  ev->event_window_rect.y =     MIN(spacing, allocation->height);  ev->description_rect.x = ev->event_window_rect.x;  ev->description_rect.y =     ev->event_window_rect.y + ev->event_window_rect.height + spacing;  ev->description_rect.width =     ev->event_window_rect.width;  ev->description_rect.height =     MAX((allocation->height - ev->event_window_rect.height - spacing*3), 0);  if (GTK_WIDGET_REALIZED (widget))    {      gdk_window_move_resize (widget->window,                              allocation->x,                               allocation->y,                              allocation->width,                               allocation->height);      gdk_window_move_resize (ev->event_window,                              ev->event_window_rect.x,                               ev->event_window_rect.y,                              ev->event_window_rect.width,                              ev->event_window_rect.height);          }}static void gtk_ev_draw           (GtkWidget        *widget,                       GdkRectangle     *area){  GdkRectangle event_window_area;  GdkRectangle intersection;  GtkEv* ev;  g_return_if_fail(widget != NULL);  g_return_if_fail(GTK_IS_EV(widget));  ev = GTK_EV(widget);  gtk_ev_paint(ev, area);  event_window_area = *area;  if (gdk_rectangle_intersect(area, &ev->event_window_rect, &intersection))    {      /* Make the intersection relative to the event window */      intersection.x -= ev->event_window_rect.x;      intersection.y -= ev->event_window_rect.y;            gtk_ev_paint_event_window(ev, &intersection);    }}static void gtk_ev_draw_focus     (GtkWidget        *widget){  GdkRectangle rect;  GtkEv* ev;  g_return_if_fail(widget != NULL);  g_return_if_fail(GTK_IS_EV(widget));  ev = GTK_EV(widget);  rect.x = 0;  rect.y = 0;  rect.width = widget->allocation.width;  rect.height = widget->allocation.height;  if (GTK_WIDGET_DRAWABLE (ev))    gtk_ev_paint(ev, &rect);}static gint gtk_ev_expose         (GtkWidget        *widget,                       GdkEventExpose   *event){    if (event->window == widget->window)    gtk_ev_paint(GTK_EV(widget), &event->area);  else if (event->window == GTK_EV(widget)->event_window)    gtk_ev_paint_event_window(GTK_EV(widget), &event->area);  else    g_assert_not_reached();  return TRUE;}static gint gtk_ev_focus_in       (GtkWidget        *widget,                       GdkEventFocus    *event){  g_return_val_if_fail(widget != NULL, FALSE);  g_return_val_if_fail(GTK_IS_EV(widget), FALSE);  GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS);  gtk_widget_draw_focus (widget);  return FALSE;}static gint gtk_ev_focus_out      (GtkWidget        *widget,                       GdkEventFocus    *event){  g_return_val_if_fail(widget != NULL, FALSE);  g_return_val_if_fail(GTK_IS_EV(widget), FALSE);  GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS);  gtk_widget_draw_focus (widget);  return FALSE;}/* GtkEv-specific functions */static void gtk_ev_paint          (GtkEv            *ev,                       GdkRectangle     *area){  GtkWidget* widget;  g_return_if_fail(ev != NULL);  g_return_if_fail(GTK_IS_EV(ev));  widget = GTK_WIDGET(ev);  if (!GTK_WIDGET_DRAWABLE (widget))    return;  gdk_window_clear_area (widget->window,                         area->x,                          area->y,                         area->width,                          area->height);  gdk_gc_set_clip_rectangle(widget->style->black_gc, area);  /* Draw a black rectangle around the event window */  gdk_draw_rectangle(widget->window,                     widget->style->black_gc,                     FALSE,                     ev->event_window_rect.x - 1,                      ev->event_window_rect.y - 1,                     ev->event_window_rect.width + 2,                     ev->event_window_rect.height + 2);  gdk_gc_set_clip_rectangle(widget->style->black_gc, NULL);  /* Draw text in the description area, if applicable */  if (ev->buffer)    {      GdkRectangle intersection;      if (gdk_rectangle_intersect(area,                                  &ev->description_rect,                                  &intersection))        {          static const gint space = 2;          gint line;          gint step;          gint first_baseline;                    GList* tmp;                step  = widget->style->font->ascent +             widget->style->font->descent + space;                first_baseline = ev->description_rect.y +             widget->style->font->ascent + space;                line = 0;                tmp = ev->buffer;                while (tmp != NULL)            {              gchar** this_event = tmp->data;              gint i = 0;              while (this_event[i])                {                  gtk_paint_string (widget->style,                                     widget->window,                                     widget->state,                                    &intersection, widget, "ev",                                     ev->description_rect.x,                                    first_baseline + line*step,                                    this_event[i]);                  ++i;                  ++line;                }                        /* Bail out if we're off the bottom; the "- 2*step" is               *  needed because the next baseline may be outside the               *  redraw area but we are interested in the whole row of                *  text, not the baseline. The 2* is because line is one                *  larger than we've actually drawn.               */              if ((first_baseline + line*step - 2*step) >                   (intersection.y + intersection.height))                break;                        tmp = g_list_next(tmp);            }        }    }  if (GTK_WIDGET_HAS_FOCUS (widget))    {      gtk_paint_focus (widget->style, widget->window,                       area, widget, "ev",                       widget->allocation.x, widget->allocation.y,                        widget->allocation.width-1, widget->allocation.height-1);    }}static void gtk_ev_paint_event_window  (GtkEv            *ev,                            GdkRectangle     *area){  GtkWidget* widget;  gint width;  gint x, y;  const char* title;  g_return_if_fail(ev != NULL);  g_return_if_fail(GTK_IS_EV(ev));  widget = GTK_WIDGET(ev);  if (!GTK_WIDGET_DRAWABLE (widget))    return;  title = _("Event Window");  gdk_window_clear_area (ev->event_window,                         area->x,                          area->y,                         area->width,                          area->height);  gdk_gc_set_clip_rectangle(widget->style->black_gc, area);  /* Clearly it would be better to cache this */  width = gdk_string_width(widget->style->font,                           title);  x = (ev->event_window_rect.width - width)/2;  y = widget->style->font->ascent + 2;  gdk_draw_string(ev->event_window,                  widget->style->font,                  widget->style->black_gc,                  x, y,                   title);  gdk_gc_set_clip_rectangle(widget->style->black_gc, NULL);}static void gtk_ev_push_text (GtkEv            *ev,                  const gchar*     text){    if (text)    {      gchar** event;       event = g_strsplit(text, "\n", 10);      ev->buffer = g_list_prepend(ev->buffer, event);      ev->buffer_size += 1;      /* See if this was the first one we added */      if (ev->buffer_end == NULL)        {          ev->buffer_end = ev->buffer;        }            /* See if we have too many to possibly fit on-screen */      if (ev->buffer_size > 100)        {          GList* prev = ev->buffer_end->prev;                    prev->next = NULL;                    g_strfreev(ev->buffer_end->data);          g_list_free_1(ev->buffer_end);          ev->buffer_end = prev;          ev->buffer_size -= 1;        }    }  if (GTK_WIDGET_DRAWABLE (ev))    gtk_widget_queue_draw_area(GTK_WIDGET(ev),                                ev->description_rect.x,                               ev->description_rect.y,                               ev->description_rect.width,                               ev->description_rect.height);}static gchar*event_name_line(GdkEvent* event){  switch (event->type)    {    case GDK_NOTHING:      return g_strdup(_("Invalid event!\n"));      break;          case GDK_DELETE:      return g_strdup(_("Delete\n"));      break;                   case GDK_DESTROY:      return g_strdup(_("Destroy\n"));      break;                   case GDK_EXPOSE:      return g_strdup(_("Expose\n"));      break;                   case GDK_MOTION_NOTIFY:      return g_strdup(_("Motion Notify\n"));      break;        case GDK_BUTTON_PRESS:      return g_strdup(_("Button Press\n"));      break;    case GDK_2BUTTON_PRESS:      return g_strdup(_("2 Button Press\n"));      break;        case GDK_3BUTTON_PRESS:      return g_strdup(_("3 Button Press\n"));      break;        case GDK_BUTTON_RELEASE:      return g_strdup(_("Button Release\n"));      break;       case GDK_KEY_PRESS:      return g_strdup(_("Key Press\n"));      break;                   case GDK_KEY_RELEASE:      return g_strdup(_("Key Release\n"));      break;          case GDK_ENTER_NOTIFY:      return g_strdup(_("Enter Notify\n"));      break;     

⌨️ 快捷键说明

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