📄 gtklist.c
字号:
if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (list)) { gtk_list_end_drag_selection (list); if (list->anchor != -1 && list->selection_mode == GTK_SELECTION_EXTENDED) gtk_list_end_selection (list); } gdk_window_hide (widget->window);}static gintgtk_list_motion_notify (GtkWidget *widget, GdkEventMotion *event){ GtkList *list; GtkWidget *item = NULL; GtkAdjustment *adj; GtkContainer *container; GList *work; gint x; gint y; gint row = -1; gint focus_row = 0; gint length = 0; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_LIST (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); list = GTK_LIST (widget); if (!list->drag_selection || !list->children) return FALSE; container = GTK_CONTAINER (widget); if (event->is_hint || event->window != widget->window) gdk_window_get_pointer (widget->window, &x, &y, NULL); adj = gtk_object_get_data_by_id (GTK_OBJECT (list), hadjustment_key_id); /* horizontal autoscrolling */ if (adj && widget->allocation.width > adj->page_size && (x < adj->value || x >= adj->value + adj->page_size)) { if (list->htimer == 0) { list->htimer = gtk_timeout_add (SCROLL_TIME, (GtkFunction) gtk_list_horizontal_timeout, widget); if (!((x < adj->value && adj->value <= 0) || (x > adj->value + adj->page_size && adj->value >= adj->upper - adj->page_size))) { gfloat value; if (x < adj->value) value = adj->value + (x - adj->value) / 2 - 1; else value = adj->value + 1 + (x - adj->value - adj->page_size) / 2; gtk_adjustment_set_value (adj, CLAMP (value, 0.0, adj->upper - adj->page_size)); } } else return FALSE; } /* vertical autoscrolling */ for (work = list->children; work; length++, work = work->next) { if (row < 0) { item = GTK_WIDGET (work->data); if (item->allocation.y > y || (item->allocation.y <= y && item->allocation.y + item->allocation.height > y)) row = length; } if (work->data == container->focus_child) focus_row = length; } if (row < 0) row = length - 1; if (list->vtimer != 0) return FALSE; if (!((y < 0 && focus_row == 0) || (y > widget->allocation.height && focus_row >= length - 1))) list->vtimer = gtk_timeout_add (SCROLL_TIME, (GtkFunction) gtk_list_vertical_timeout, list); if (row != focus_row) gtk_widget_grab_focus (item); switch (list->selection_mode) { case GTK_SELECTION_BROWSE: gtk_list_select_child (list, item); break; case GTK_SELECTION_EXTENDED: gtk_list_update_extended_selection (list, row); break; default: break; } return FALSE;}static gintgtk_list_button_press (GtkWidget *widget, GdkEventButton *event){ GtkList *list; GtkWidget *item; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_LIST (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); if (event->button != 1) return FALSE; list = GTK_LIST (widget); item = gtk_get_event_widget ((GdkEvent*) event); while (item && !GTK_IS_LIST_ITEM (item)) item = item->parent; if (item && (item->parent == widget)) { gint last_focus_row; gint focus_row; if (event->type == GDK_BUTTON_PRESS) { if (gdk_pointer_grab (widget->window, TRUE, GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, NULL, NULL, event->time)) return FALSE; gtk_grab_add (widget); list->drag_selection = TRUE; } else if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (list)) gtk_list_end_drag_selection (list); if (!GTK_WIDGET_HAS_FOCUS(item)) gtk_widget_grab_focus (item); if (list->add_mode) { list->add_mode = FALSE; gtk_widget_queue_draw (item); } switch (list->selection_mode) { case GTK_SELECTION_SINGLE: case GTK_SELECTION_MULTIPLE: if (event->type != GDK_BUTTON_PRESS) gtk_list_select_child (list, item); else list->undo_focus_child = item; break; case GTK_SELECTION_BROWSE: break; case GTK_SELECTION_EXTENDED: focus_row = g_list_index (list->children, item); if (list->last_focus_child) last_focus_row = g_list_index (list->children, list->last_focus_child); else { last_focus_row = focus_row; list->last_focus_child = item; } if (event->type != GDK_BUTTON_PRESS) { if (list->anchor >= 0) { gtk_list_update_extended_selection (list, focus_row); gtk_list_end_selection (list); } gtk_list_select_child (list, item); break; } if (event->state & GDK_CONTROL_MASK) { if (event->state & GDK_SHIFT_MASK) { if (list->anchor < 0) { g_list_free (list->undo_selection); g_list_free (list->undo_unselection); list->undo_selection = NULL; list->undo_unselection = NULL; list->anchor = last_focus_row; list->drag_pos = last_focus_row; list->undo_focus_child = list->last_focus_child; } gtk_list_update_extended_selection (list, focus_row); } else { if (list->anchor < 0) gtk_list_set_anchor (list, TRUE, focus_row, list->last_focus_child); else gtk_list_update_extended_selection (list, focus_row); } break; } if (event->state & GDK_SHIFT_MASK) { gtk_list_set_anchor (list, FALSE, last_focus_row, list->last_focus_child); gtk_list_update_extended_selection (list, focus_row); break; } if (list->anchor < 0) gtk_list_set_anchor (list, FALSE, focus_row, list->last_focus_child); else gtk_list_update_extended_selection (list, focus_row); break; default: break; } } return FALSE;}static gintgtk_list_button_release (GtkWidget *widget, GdkEventButton *event){ GtkList *list; GtkWidget *item; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_LIST (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); list = GTK_LIST (widget); /* we don't handle button 2 and 3 */ if (event->button != 1) return FALSE; if (list->drag_selection) { gtk_list_end_drag_selection (list); switch (list->selection_mode) { case GTK_SELECTION_EXTENDED: if (!(event->state & GDK_SHIFT_MASK)) gtk_list_end_selection (list); break; case GTK_SELECTION_SINGLE: case GTK_SELECTION_MULTIPLE: item = gtk_get_event_widget ((GdkEvent*) event); while (item && !GTK_IS_LIST_ITEM (item)) item = item->parent; if (item && item->parent == widget) { if (list->undo_focus_child == item) gtk_list_toggle_row (list, item); } list->undo_focus_child = NULL; break; default: break; } } return FALSE;}static voidgtk_list_draw (GtkWidget *widget, GdkRectangle *area){ GtkList *list; GtkWidget *child; GdkRectangle child_area; GList *children; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_LIST (widget)); g_return_if_fail (area != NULL); if (GTK_WIDGET_DRAWABLE (widget)) { list = GTK_LIST (widget); children = list->children; while (children) { child = children->data; children = children->next; if (gtk_widget_intersect (child, area, &child_area)) gtk_widget_draw (child, &child_area); } }}static gintgtk_list_expose (GtkWidget *widget, GdkEventExpose *event){ GtkList *list; GtkWidget *child; GdkEventExpose child_event; GList *children; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_LIST (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); if (GTK_WIDGET_DRAWABLE (widget)) { list = GTK_LIST (widget); child_event = *event; children = list->children; while (children) { child = children->data; children = children->next; if (GTK_WIDGET_NO_WINDOW (child) && gtk_widget_intersect (child, &event->area, &child_event.area)) gtk_widget_event (child, (GdkEvent*) &child_event); } } return FALSE;}static void gtk_list_style_set (GtkWidget *widget, GtkStyle *previous_style){ g_return_if_fail (widget != NULL); if (previous_style && GTK_WIDGET_REALIZED (widget)) gdk_window_set_background (widget->window, &widget->style->base[GTK_WIDGET_STATE (widget)]);}/* GtkContainer Methods : * gtk_list_add * gtk_list_remove * gtk_list_forall * gtk_list_child_type * gtk_list_set_focus_child * gtk_list_focus */static voidgtk_list_add (GtkContainer *container, GtkWidget *widget){ GList *item_list; g_return_if_fail (container != NULL); g_return_if_fail (GTK_IS_LIST (container)); g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_LIST_ITEM (widget)); item_list = g_list_alloc (); item_list->data = widget; gtk_list_append_items (GTK_LIST (container), item_list);}static voidgtk_list_remove (GtkContainer *container, GtkWidget *widget){ GList *item_list; g_return_if_fail (container != NULL); g_return_if_fail (GTK_IS_LIST (container)); g_return_if_fail (widget != NULL); g_return_if_fail (container == GTK_CONTAINER (widget->parent)); item_list = g_list_alloc (); item_list->data = widget; gtk_list_remove_items (GTK_LIST (container), item_list); g_list_free (item_list);}static voidgtk_list_forall (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data){ GtkList *list; GtkWidget *child; GList *children; g_return_if_fail (container != NULL); g_return_if_fail (GTK_IS_LIST (container)); g_return_if_fail (callback != NULL); list = GTK_LIST (container); children = list->children; while (children) { child = children->data; children = children->next; (* callback) (child, callback_data); }}static GtkTypegtk_list_child_type (GtkContainer *container){ return GTK_TYPE_LIST_ITEM;}static voidgtk_list_set_focus_child (GtkContainer *container, GtkWidget *child){ GtkList *list; g_return_if_fail (container != NULL); g_return_if_fail (GTK_IS_LIST (container)); if (child) g_return_if_fail (GTK_IS_WIDGET (child)); list = GTK_LIST (container); if (child != container->focus_child) { if (container->focus_child) { list->last_focus_child = container->focus_child; gtk_widget_unref (container->focus_child); } container->focus_child = child; if (container->focus_child) gtk_widget_ref (container->focus_child); } /* check for v adjustment */ if (container->focus_child) { GtkAdjustment *adjustment; adjustment = gtk_object_get_data_by_id (GTK_OBJECT (container), vadjustment_key_id); if (adjustment) gtk_adjustment_clamp_page (adjustment, container->focus_child->allocation.y, (container->focus_child->allocation.y + container->focus_child->allocation.height)); switch (list->selection_mode) { case GTK_SELECTION_BROWSE: gtk_list_select_child (list, child); break; case GTK_SELECTION_EXTENDED: if (!list->last_focus_child && !list->add_mode) { list->undo_focus_child = list->last_focus_child; gtk_list_unselect_all (list); gtk_list_select_child (list, child); } break; default: break; } }}static gintgtk_list_focus (GtkContainer *container, GtkDirectionType direction){ gint return_val = FALSE; g_return_val_if_fail (container != NULL, FALSE); g_return_val_if_fail (GTK_IS_LIST (container), FALSE); if (container->focus_child == NULL || !GTK_WIDGET_HAS_FOCUS (container->focus_child)) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -