📄 gtkrange.c
字号:
xthickness = GTK_WIDGET (range)->style->klass->xthickness; gtk_range_trough_vdims (range, &top, &bottom); gdk_window_get_size (range->slider, NULL, &slider_length); bottom += slider_length; if ((x > xthickness) && (y > top)) { gdk_window_get_size (range->trough, &trough_width, &trough_height); if ((x < (trough_width - xthickness) && (y < bottom))) { if (jump_perc) { *jump_perc = ((gdouble) (y - top)) / ((gdouble) (bottom - top)); return GTK_TROUGH_JUMP; } gdk_window_get_position (range->slider, NULL, &slider_y); if (y < slider_y) return GTK_TROUGH_START; else return GTK_TROUGH_END; } } return GTK_TROUGH_NONE;}voidgtk_range_default_hmotion (GtkRange *range, gint xdelta, gint ydelta){ gdouble old_value; gint left, right; gint slider_x, slider_y; gint new_pos; g_return_if_fail (range != NULL); g_return_if_fail (GTK_IS_RANGE (range)); range = GTK_RANGE (range); gdk_window_get_position (range->slider, &slider_x, &slider_y); gtk_range_trough_hdims (range, &left, &right); if (left == right) return; new_pos = slider_x + xdelta; if (new_pos < left) new_pos = left; else if (new_pos > right) new_pos = right; old_value = range->adjustment->value; range->adjustment->value = ((range->adjustment->upper - range->adjustment->lower - range->adjustment->page_size) * (new_pos - left) / (right - left) + range->adjustment->lower); if (range->digits >= 0) { char buffer[64]; sprintf (buffer, "%0.*f", range->digits, range->adjustment->value); sscanf (buffer, "%f", &range->adjustment->value); } if (old_value != range->adjustment->value) { if (range->policy == GTK_UPDATE_CONTINUOUS) { gtk_signal_emit_by_name (GTK_OBJECT (range->adjustment), "value_changed"); } else { gtk_range_slider_update (range); gtk_range_clear_background (range); if (range->policy == GTK_UPDATE_DELAYED) { gtk_range_remove_timer (range); range->timer = gtk_timeout_add (SCROLL_DELAY_LENGTH, (GtkFunction) RANGE_CLASS (range)->timer, (gpointer) range); } } }}voidgtk_range_default_vmotion (GtkRange *range, gint xdelta, gint ydelta){ gdouble old_value; gint top, bottom; gint slider_x, slider_y; gint new_pos; g_return_if_fail (range != NULL); g_return_if_fail (GTK_IS_RANGE (range)); range = GTK_RANGE (range); gdk_window_get_position (range->slider, &slider_x, &slider_y); gtk_range_trough_vdims (range, &top, &bottom); if (bottom == top) return; new_pos = slider_y + ydelta; if (new_pos < top) new_pos = top; else if (new_pos > bottom) new_pos = bottom; old_value = range->adjustment->value; range->adjustment->value = ((range->adjustment->upper - range->adjustment->lower - range->adjustment->page_size) * (new_pos - top) / (bottom - top) + range->adjustment->lower); if (range->digits >= 0) { char buffer[64]; sprintf (buffer, "%0.*f", range->digits, range->adjustment->value); sscanf (buffer, "%f", &range->adjustment->value); } if (old_value != range->adjustment->value) { if (range->policy == GTK_UPDATE_CONTINUOUS) { gtk_signal_emit_by_name (GTK_OBJECT (range->adjustment), "value_changed"); } else { gtk_range_slider_update (range); gtk_range_clear_background (range); if (range->policy == GTK_UPDATE_DELAYED) { gtk_range_remove_timer (range); range->timer = gtk_timeout_add (SCROLL_DELAY_LENGTH, (GtkFunction) RANGE_CLASS (range)->timer, (gpointer) range); } } }}static voidgtk_range_destroy (GtkObject *object){ GtkRange *range; g_return_if_fail (object != NULL); g_return_if_fail (GTK_IS_RANGE (object)); range = GTK_RANGE (object); if (range->adjustment) gtk_signal_disconnect_by_data (GTK_OBJECT (range->adjustment), (gpointer) range); (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);}static voidgtk_range_finalize (GtkObject *object){ GtkRange *range; g_return_if_fail (object != NULL); g_return_if_fail (GTK_IS_RANGE (object)); range = GTK_RANGE (object); if (range->adjustment) gtk_object_unref (GTK_OBJECT (range->adjustment)); (* GTK_OBJECT_CLASS (parent_class)->finalize) (object);}static voidgtk_range_draw (GtkWidget *widget, GdkRectangle *area){ GtkRange *range; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_RANGE (widget)); g_return_if_fail (area != NULL); if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_MAPPED (widget)) { range = GTK_RANGE (widget); gtk_range_draw_background (range); gtk_range_draw_trough (range); gtk_range_draw_slider (range); gtk_range_draw_step_forw (range); gtk_range_draw_step_back (range); }}static voidgtk_range_draw_focus (GtkWidget *widget){ g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_RANGE (widget)); if (GTK_WIDGET_DRAWABLE (widget)) gtk_range_draw_trough (GTK_RANGE (widget));}static voidgtk_range_unrealize (GtkWidget *widget){ GtkRange *range; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_RANGE (widget)); range = GTK_RANGE (widget); if (range->slider) { gdk_window_set_user_data (range->slider, NULL); gdk_window_destroy (range->slider); range->slider = NULL; } if (range->trough) { gdk_window_set_user_data (range->trough, NULL); gdk_window_destroy (range->trough); range->trough = NULL; } if (range->step_forw) { gdk_window_set_user_data (range->step_forw, NULL); gdk_window_destroy (range->step_forw); range->step_forw = NULL; } if (range->step_back) { gdk_window_set_user_data (range->step_back, NULL); gdk_window_destroy (range->step_back); range->step_back = NULL; } if (GTK_WIDGET_CLASS (parent_class)->unrealize) (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);}static gintgtk_range_expose (GtkWidget *widget, GdkEventExpose *event){ GtkRange *range; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_RANGE (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); range = GTK_RANGE (widget); if (event->window == range->trough) { /* Don't redraw if we are only exposing the literal trough region. * this may not work correctly if someone overrides the default * trough-drawing handler. (Probably should really pass another * argument - the redrawn area to all the drawing functions) */ gint xt = widget->style->klass->xthickness; gint yt = widget->style->klass->ythickness; if (!((event->area.x >= xt) && (event->area.y >= yt) && (event->area.x + event->area.width <= widget->allocation.width - xt) && (event->area.y + event->area.height <= widget->allocation.height - yt))) gtk_range_draw_trough (range); } else if (event->window == widget->window) { gtk_range_draw_background (range); } else if (event->window == range->slider) { gtk_range_draw_slider (range); } else if (event->window == range->step_forw) { gtk_range_draw_step_forw (range); } else if (event->window == range->step_back) { gtk_range_draw_step_back (range); } return FALSE;}static gintgtk_range_button_press (GtkWidget *widget, GdkEventButton *event){ GtkRange *range; gint trough_part; gfloat jump_perc; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_RANGE (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); if (!GTK_WIDGET_HAS_FOCUS (widget)) gtk_widget_grab_focus (widget); jump_perc = -1; range = GTK_RANGE (widget); if (range->button == 0) { gtk_grab_add (widget); range->button = event->button; range->x_click_point = event->x; range->y_click_point = event->y; if (event->window == range->trough) { range->click_child = RANGE_CLASS (range)->trough; if (range->button == 2) trough_part = gtk_range_trough_click (range, event->x, event->y, &jump_perc); else trough_part = gtk_range_trough_click (range, event->x, event->y, NULL); range->scroll_type = GTK_SCROLL_NONE; if (trough_part == GTK_TROUGH_START) range->scroll_type = GTK_SCROLL_PAGE_BACKWARD; else if (trough_part == GTK_TROUGH_END) range->scroll_type = GTK_SCROLL_PAGE_FORWARD; else if (trough_part == GTK_TROUGH_JUMP && jump_perc >= 0 && jump_perc <= 1) range->scroll_type = GTK_SCROLL_JUMP; if (range->scroll_type != GTK_SCROLL_NONE) { gtk_range_scroll (range, jump_perc); gtk_range_add_timer (range); } } else if (event->window == range->slider) { range->click_child = RANGE_CLASS (range)->slider; range->scroll_type = GTK_SCROLL_NONE; } else if (event->window == range->step_forw) { range->click_child = RANGE_CLASS (range)->step_forw; range->scroll_type = GTK_SCROLL_STEP_FORWARD; gtk_range_scroll (range, -1); gtk_range_add_timer (range); gtk_range_draw_step_forw (range); } else if (event->window == range->step_back) { range->click_child = RANGE_CLASS (range)->step_back; range->scroll_type = GTK_SCROLL_STEP_BACKWARD; gtk_range_scroll (range, -1); gtk_range_add_timer (range); gtk_range_draw_step_back (range); } } return FALSE;}static gintgtk_range_button_release (GtkWidget *widget, GdkEventButton *event){ GtkRange *range; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_RANGE (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); range = GTK_RANGE (widget); if (range->button == event->button) { gtk_grab_remove (widget); range->button = 0; range->x_click_point = -1; range->y_click_point = -1; if (range->click_child == RANGE_CLASS (range)->slider) { if (range->policy == GTK_UPDATE_DELAYED) gtk_range_remove_timer (range); if ((range->policy != GTK_UPDATE_CONTINUOUS) && (range->old_value != range->adjustment->value)) gtk_signal_emit_by_name (GTK_OBJECT (range->adjustment), "value_changed"); } else if ((range->click_child == RANGE_CLASS (range)->trough) || (range->click_child == RANGE_CLASS (range)->step_forw) || (range->click_child == RANGE_CLASS (range)->step_back)) { gtk_range_remove_timer (range); if ((range->policy != GTK_UPDATE_CONTINUOUS) && (range->old_value != range->adjustment->value)) gtk_signal_emit_by_name (GTK_OBJECT (range->adjustment), "value_changed"); if (range->click_child == RANGE_CLASS (range)->step_forw) { range->click_child = 0; gtk_range_draw_step_forw (range); } else if (range->click_child == RANGE_CLASS (range)->step_back) { range->click_child = 0; gtk_range_draw_step_back (range); } } range->click_child = 0; } return FALSE;}static gintgtk_range_motion_notify (GtkWidget *widget, GdkEventMotion *event){ GtkRange *range; GdkModifierType mods; gint x, y, mask; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_RANGE (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); range = GTK_RANGE (widget); if (range->click_child == RANGE_CLASS (range)->slider) { x = event->x; y = event->y; if (event->is_hint || (event->window != range->slider)) gdk_window_get_pointer (range->slider, &x, &y, &mods); switch (range->button) { case 1: mask = GDK_BUTTON1_MASK; break; case 2: mask = GDK_BUTTON2_MASK; break; case 3: mask = GDK_BUTTON3_MASK; break; default: mask = 0; break; } if (mods & mask) { if (RANGE_CLASS (range)->motion) (* RANGE_CLASS (range)->motion) (range, x - range->x_click_point, y - range->y_click_point); } } return FALSE;}static gintgtk_range_key_press (GtkWidget *widget, GdkEventKey *event){ GtkRange *range; gint return_val; GtkScrollType scroll = GTK_SCROLL_NONE; GtkTroughType pos = GTK_TROUGH_NONE; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_RANGE (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); range = GTK_RANGE (widget); return_val = FALSE; if (RANGE_CLASS (range)->trough_keys) return_val = (* RANGE_CLASS (range)->trough_keys) (range, event, &scroll, &pos); if (return_val) { if (scroll != GTK_SCROLL_NONE) { range->scroll_type = scroll; gtk_range_scroll (range, -1); if (range->old_value != range->adjustment->value) { gtk_signal_emit_by_name (GTK_OBJECT (range->adjustment), "value_changed"); switch (range->scroll_type) { case GTK_SCROLL_STEP_BACKWARD: gtk_range_draw_step_back (range);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -