📄 z875.html
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html> <head> <title> The GtkEv Widget </title> <meta name="GENERATOR" content= "Modular DocBook HTML Stylesheet Version 1.45"> <link rel="HOME" title="GTK+ / Gnome Application Development" href="ggad.html"> <link rel="UP" title="Code Listings" href="listing.html"> <link rel="PREVIOUS" title="Code Listings" href="listing.html"> </head> <body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink= "#840084" alink="#0000FF"> <div class="NAVHEADER"> <table width="100%" border="0" bgcolor="#ffffff" cellpadding= "1" cellspacing="0"> <tr> <th colspan="4" align="center"> <font color="#000000" size="2">GTK+ / Gnome Application Development</font> </th> </tr> <tr> <td width="25%" bgcolor="#ffffff" align="left"> <a href="listing.html"><font color="#0000ff" size="2"> <b><<< Previous</b></font></a> </td> <td width="25%" colspan="2" bgcolor="#ffffff" align= "center"> <font color="#0000ff" size="2"><b><a href="ggad.html"> <font color="#0000ff" size="2"><b> Home</b></font></a></b></font> </td> <td width="25%" bgcolor="#ffffff" align="right"> </td> </tr> </table> </div> <div class="SECT1"> <h1 class="SECT1"> <a name="Z875">The <tt class="CLASSNAME">GtkEv</tt> Widget</a> </h1> <p> <tt class="CLASSNAME">GtkEv</tt> is a widget that reports events on a subwindow, similar to the <tt class= "APPLICATION">xev</tt> client that comes with X. </p> <div class="SECT2"> <h2 class="SECT2"> <a name="Z876"><tt class="FILENAME">gtkev.h</tt></a> </h2> <table border="0" bgcolor="#E0E0E0" width="100%"> <tr> <td><pre class="PROGRAMLISTING"> #ifndef INC_GTK_EV_H#define INC_GTK_EV_H#include <gtk/gtkwidget.h>#ifdef __cplusplusextern "C" {#endif /* __cplusplus */#define GTK_EV(obj) GTK_CHECK_CAST (obj, gtk_ev_get_type (), GtkEv)#define GTK_EV_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, gtk_ev_get_type (), GtkEvClass)#define GTK_IS_EV(obj) GTK_CHECK_TYPE (obj, gtk_ev_get_type ())typedef struct _GtkEv GtkEv;typedef struct _GtkEvClass GtkEvClass;struct _GtkEv{ GtkWidget widget; GdkWindow* event_window; GdkRectangle event_window_rect; GdkRectangle description_rect; GList* buffer; GList* buffer_end; gint buffer_size;};struct _GtkEvClass{ GtkWidgetClass parent_class;};guint gtk_ev_get_type (void);GtkWidget* gtk_ev_new (void);#ifdef __cplusplus}#endif /* __cplusplus */#endif /* __GTK_EV_H__ */ </pre> </td> </tr> </table> </div> <div class="SECT2"> <h2 class="SECT2"> <a name="Z877"><tt class="FILENAME">gtkev.c</tt></a> </h2> <table border="0" bgcolor="#E0E0E0" width="100%"> <tr> <td><pre class="PROGRAMLISTING"> #include "gtkev.h"static void gtk_ev_class_init (GtkEvClass *klass);static void gtk_ev_init (GtkEv *ev);/* GtkObject functions */static void gtk_ev_destroy (GtkObject *object);/* GtkWidget functions */static gint gtk_ev_event (GtkWidget *widget, GdkEvent *event);static void gtk_ev_realize (GtkWidget *widget);static void gtk_ev_unrealize (GtkWidget *widget);static void gtk_ev_size_request (GtkWidget *widget, GtkRequisition *requisition);static void gtk_ev_size_allocate (GtkWidget *widget, GtkAllocation *allocation);static void gtk_ev_draw (GtkWidget *widget, GdkRectangle *area);static void gtk_ev_draw_focus (GtkWidget *widget);static gint gtk_ev_expose (GtkWidget *widget, GdkEventExpose *event);static gint gtk_ev_focus_in (GtkWidget *widget, GdkEventFocus *event);static gint gtk_ev_focus_out (GtkWidget *widget, GdkEventFocus *event);/* GtkEv-specific functions */static void gtk_ev_paint (GtkEv *ev, GdkRectangle *area);static void gtk_ev_paint_event_window (GtkEv *ev, GdkRectangle *area);static void gtk_ev_push_text (GtkEv *ev, const gchar* text);/* Utility Functions */static gchar* event_to_text (GdkEvent* event);static GtkWidgetClass *parent_class = NULL;guintgtk_ev_get_type (void){ static guint ev_type = 0; if (!ev_type) { static const GtkTypeInfo ev_info = { "GtkEv", sizeof (GtkEv), sizeof (GtkEvClass), (GtkClassInitFunc) gtk_ev_class_init, (GtkObjectInitFunc) gtk_ev_init, /* reserved_1 */ NULL, /* reserved_2 */ NULL, (GtkClassInitFunc) NULL, }; ev_type = gtk_type_unique (gtk_widget_get_type (), &ev_info); } return ev_type;}static voidgtk_ev_class_init (GtkEvClass *klass){ GtkObjectClass *object_class; GtkWidgetClass *widget_class; object_class = (GtkObjectClass*) klass; widget_class = (GtkWidgetClass*) klass; parent_class = gtk_type_class (gtk_widget_get_type ()); object_class->destroy = gtk_ev_destroy; widget_class->realize = gtk_ev_realize; widget_class->unrealize = gtk_ev_unrealize; widget_class->size_request = gtk_ev_size_request; widget_class->size_allocate = gtk_ev_size_allocate; widget_class->draw = gtk_ev_draw; widget_class->event = gtk_ev_event; widget_class->draw_focus = gtk_ev_draw_focus; widget_class->expose_event = gtk_ev_expose; widget_class->focus_in_event = gtk_ev_focus_in; widget_class->focus_out_event = gtk_ev_focus_out;}static voidgtk_ev_init (GtkEv *ev){ GTK_WIDGET_SET_FLAGS (GTK_WIDGET(ev), GTK_CAN_FOCUS); ev->event_window = NULL; ev->buffer = NULL; ev->buffer_end = NULL; ev->buffer_size = 0; ev->event_window_rect.x = ev->event_window_rect.y = 0; ev->event_window_rect.width = ev->event_window_rect.height = 0; ev->description_rect.x = ev->description_rect.y = 0; ev->description_rect.width = ev->description_rect.height = 0;}GtkWidget*gtk_ev_new (void){ GtkEv *ev; ev = gtk_type_new (gtk_ev_get_type ()); return GTK_WIDGET (ev);}/* GtkObject functions */static void gtk_ev_destroy (GtkObject *object){ GtkEv* ev; GList* tmp; g_return_if_fail(object != NULL); g_return_if_fail(GTK_IS_EV(object)); ev = GTK_EV(object); tmp = ev->buffer; while (tmp != NULL) { g_strfreev((gchar**)tmp->data); tmp = g_list_next(tmp); } g_list_free(ev->buffer); ev->buffer = NULL; ev->buffer_end = NULL; ev->buffer_size = 0; /* Chain up */ if (GTK_OBJECT_CLASS(parent_class)->destroy) (* GTK_OBJECT_CLASS(parent_class)->destroy) (object);}/* GtkWidget functions */static gint gtk_ev_event (GtkWidget *widget, GdkEvent *event){ GtkEv* ev; g_return_val_if_fail(widget != NULL, FALSE); g_return_val_if_fail(GTK_IS_EV(widget), FALSE); ev = GTK_EV(widget); if (event->any.window == widget->window) { if (GTK_WIDGET_CLASS(parent_class)->event) return (* GTK_WIDGET_CLASS(parent_class)->event) (widget, event); else return FALSE; } else { gchar* text; /* The event is either on ev->event_window, or it is a key event * passed down to us from the toplevel GtkWindow */ text = event_to_text(event); gtk_ev_push_text(ev, text); g_free(text); /* If it was a motion event, make sure we get more */ if (event->type == GDK_MOTION_NOTIFY) { gdk_window_get_pointer(ev->event_window, NULL, NULL, NULL); } /* We didn't "handle" the event, just listened in on it. */ return FALSE; }}static void gtk_ev_realize (GtkWidget *widget){ GdkWindowAttr attributes; gint attributes_mask; GtkEv* ev; GdkCursor* cursor; g_return_if_fail(widget != NULL); g_return_if_fail(GTK_IS_EV(widget)); ev = GTK_EV(widget); /* Set realized flag */ GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); /* Main widget window */ attributes.window_type = GDK_WINDOW_CHILD; attributes.x = widget->allocation.x; attributes.y = widget->allocation.y; attributes.width = widget->allocation.width; attributes.height = widget->allocation.height; attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual (widget); attributes.colormap = gtk_widget_get_colormap (widget); attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK; attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask); gdk_window_set_user_data (widget->window, widget); /* Event window */ cursor = gdk_cursor_new(GDK_CROSSHAIR); attributes.window_type = GDK_WINDOW_CHILD; attributes.x = ev->event_window_rect.x; attributes.y = ev->event_window_rect.y; attributes.width = ev->event_window_rect.width; attributes.height = ev->event_window_rect.height; attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual (widget); attributes.colormap = gtk_widget_get_colormap (widget); attributes.event_mask = GDK_ALL_EVENTS_MASK; attributes.cursor = cursor; attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP | GDK_WA_CURSOR; ev->event_window = gdk_window_new (widget->window, &attributes, attributes_mask); gdk_window_set_user_data (ev->event_window, widget); gdk_window_show(ev->event_window); gdk_cursor_destroy(cursor); /* Style */ widget->style = gtk_style_attach (widget->style, widget->window); gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); gdk_window_set_background (ev->event_window, &widget->style->base[GTK_STATE_NORMAL]);}static void gtk_ev_unrealize (GtkWidget *widget){ GtkEv* ev; g_return_if_fail(widget != NULL); g_return_if_fail(GTK_IS_EV(widget)); ev = GTK_EV(widget);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -