📄 z875.html
字号:
/* 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 + -