Ticket #4134: 0001-OSK-im-osk-position.4.patch
File 0001-OSK-im-osk-position.4.patch, 24.0 KB (added by garnacho, 11 years ago) |
---|
-
gtk/gtkimcontext.c
From ca79fd0bc8ee12b61b644a5ff8e262f34955b67e Mon Sep 17 00:00:00 2001 From: Carlos Garnacho <carlos@lanedo.com> Date: Wed, 19 Sep 2012 15:37:01 +0200 Subject: [PATCH] OSK: im-osk-position Patch based on: http://git.gnome.org/browse/gtk+/log/?h=wip/im-osk-position --- gtk/gtkimcontext.c | 185 +++++++++++++++++++++++++++++++++++++++++++++++- gtk/gtkimmulticontext.c | 20 ++++++ gtk/gtkscrolledwindow.c | 128 ++++++++++++++++++++++++++++++--- gtk/gtkwidget.c | 66 +++++++++++++++++ gtk/gtkwidget.h | 6 ++ 5 files changed, 391 insertions(+), 14 deletions(-) diff --git a/gtk/gtkimcontext.c b/gtk/gtkimcontext.c index f0f351f..7a03d3e 100644
a b enum { 105 105 COMMIT, 106 106 RETRIEVE_SURROUNDING, 107 107 DELETE_SURROUNDING, 108 CLEAR_AREA, 108 109 LAST_SIGNAL 109 110 }; 110 111 … … typedef struct _GtkIMContextPrivate GtkIMContextPrivate; 121 122 struct _GtkIMContextPrivate { 122 123 GtkInputPurpose purpose; 123 124 GtkInputHints hints; 125 GdkWindow *window; 126 GtkWidget *widget; 127 128 cairo_rectangle_int_t clear_area; 129 cairo_rectangle_int_t cursor_rect; 130 cairo_rectangle_int_t last_notified_clear_area; 131 guint clear_area_signal_id; 132 guint clear_area_idle_id; 133 guint focused : 1; 134 guint need_unset : 1; 135 guint need_position_update : 1; 124 136 }; 125 137 126 138 static void gtk_im_context_real_get_preedit_string (GtkIMContext *context, … … static void gtk_im_context_set_property (GObject *obj, 145 157 guint property_id, 146 158 const GValue *value, 147 159 GParamSpec *pspec); 160 static void gtk_im_context_finalize (GObject *obj); 148 161 149 162 150 163 G_DEFINE_ABSTRACT_TYPE (GtkIMContext, gtk_im_context, G_TYPE_OBJECT) … … gtk_im_context_class_init (GtkIMContextClass *klass) 213 226 214 227 object_class->get_property = gtk_im_context_get_property; 215 228 object_class->set_property = gtk_im_context_set_property; 229 object_class->finalize = gtk_im_context_finalize; 216 230 217 231 klass->get_preedit_string = gtk_im_context_real_get_preedit_string; 218 232 klass->filter_keypress = gtk_im_context_real_filter_keypress; … … gtk_im_context_class_init (GtkIMContextClass *klass) 327 341 G_TYPE_INT, 328 342 G_TYPE_INT); 329 343 344 im_context_signals[CLEAR_AREA] = 345 g_signal_new (I_("clear-area"), 346 G_TYPE_FROM_CLASS (klass), 347 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, 348 0, NULL, NULL, 349 _gtk_marshal_VOID__BOXED_BOXED, 350 G_TYPE_NONE, 2, 351 GDK_TYPE_RECTANGLE, GDK_TYPE_RECTANGLE); 352 330 353 properties[PROP_INPUT_PURPOSE] = 331 354 g_param_spec_enum ("input-purpose", 332 355 P_("Purpose"), … … gtk_im_context_real_get_surrounding (GtkIMContext *context, 438 461 return result; 439 462 } 440 463 464 static gboolean 465 _gtk_im_context_clear_area_idle (gpointer user_data) 466 { 467 GtkIMContext *context = user_data; 468 GtkIMContextPrivate *priv; 469 470 priv = G_TYPE_INSTANCE_GET_PRIVATE (context, GTK_TYPE_IM_CONTEXT, 471 GtkIMContextPrivate); 472 473 if (priv->need_position_update && 474 (priv->clear_area.x != priv->last_notified_clear_area.x || 475 priv->clear_area.y != priv->last_notified_clear_area.y || 476 priv->clear_area.width != priv->last_notified_clear_area.width || 477 priv->clear_area.height != priv->last_notified_clear_area.height)) 478 { 479 if (priv->focused && 480 priv->clear_area.width != 0 && priv->clear_area.height != 0) 481 { 482 cairo_rectangle_int_t rect; 483 GtkAllocation allocation; 484 485 rect = priv->cursor_rect; 486 487 gtk_widget_get_allocation (priv->widget, &allocation); 488 rect.x += allocation.x; 489 rect.y += allocation.y; 490 gdk_window_get_root_coords (priv->window, 491 rect.x, rect.y, &rect.x, &rect.y); 492 493 if (gtk_widget_request_clear_area (priv->widget, &priv->clear_area, &rect)) 494 priv->need_unset = TRUE; 495 } 496 else if (!priv->focused && priv->need_unset) 497 { 498 gtk_widget_unset_clear_area (priv->widget, TRUE); 499 priv->need_unset = FALSE; 500 } 501 502 priv->last_notified_clear_area = priv->clear_area; 503 } 504 505 priv->need_position_update = FALSE; 506 priv->clear_area_idle_id = 0; 507 return FALSE; 508 } 509 510 static void 511 _gtk_im_context_check_clear_area (GtkIMContext *context) 512 { 513 GtkIMContextPrivate *priv; 514 515 priv = G_TYPE_INSTANCE_GET_PRIVATE (context, GTK_TYPE_IM_CONTEXT, 516 GtkIMContextPrivate); 517 518 if (priv->clear_area_idle_id) 519 g_source_remove (priv->clear_area_idle_id); 520 521 priv->clear_area_idle_id = 522 g_idle_add (_gtk_im_context_clear_area_idle, context); 523 } 524 525 static void 526 _gtk_im_context_clear_area (GtkIMContext *context, 527 cairo_rectangle_int_t *clear_area, 528 cairo_rectangle_int_t *cursor_rect, 529 GtkWidget *widget) 530 { 531 GtkIMContextPrivate *priv; 532 533 priv = G_TYPE_INSTANCE_GET_PRIVATE (context, GTK_TYPE_IM_CONTEXT, GtkIMContextPrivate); 534 535 if (priv->clear_area.x != clear_area->x || 536 priv->clear_area.y != clear_area->y || 537 priv->clear_area.width != clear_area->width || 538 priv->clear_area.height != clear_area->height) 539 priv->need_position_update = TRUE; 540 541 priv->clear_area = *clear_area; 542 } 543 441 544 /** 442 545 * gtk_im_context_set_client_window: 443 546 * @context: a #GtkIMContext … … gtk_im_context_set_client_window (GtkIMContext *context, 454 557 GdkWindow *window) 455 558 { 456 559 GtkIMContextClass *klass; 457 560 GtkIMContextPrivate *priv; 561 458 562 g_return_if_fail (GTK_IS_IM_CONTEXT (context)); 459 563 460 564 klass = GTK_IM_CONTEXT_GET_CLASS (context); 461 565 if (klass->set_client_window) 462 566 klass->set_client_window (context, window); 567 568 priv = G_TYPE_INSTANCE_GET_PRIVATE (context, GTK_TYPE_IM_CONTEXT, GtkIMContextPrivate); 569 570 if (priv->clear_area_signal_id) 571 { 572 g_signal_handler_disconnect (context, priv->clear_area_signal_id); 573 priv->clear_area_signal_id = 0; 574 } 575 576 if (window) 577 { 578 gpointer window_data; 579 580 gdk_window_get_user_data (window, &window_data); 581 582 if (GTK_IS_WIDGET (window_data)) 583 { 584 priv->clear_area_signal_id = g_signal_connect (context, "clear-area", 585 G_CALLBACK (_gtk_im_context_clear_area), 586 window_data); 587 priv->window = window; 588 priv->widget = window_data; 589 } 590 } 463 591 } 464 592 465 593 /** … … void 531 659 gtk_im_context_focus_in (GtkIMContext *context) 532 660 { 533 661 GtkIMContextClass *klass; 534 662 GtkIMContextPrivate *priv; 663 535 664 g_return_if_fail (GTK_IS_IM_CONTEXT (context)); 536 665 537 666 klass = GTK_IM_CONTEXT_GET_CLASS (context); 538 667 if (klass->focus_in) 539 668 klass->focus_in (context); 669 670 priv = G_TYPE_INSTANCE_GET_PRIVATE (context, GTK_TYPE_IM_CONTEXT, GtkIMContextPrivate); 671 672 if (!priv->focused) 673 { 674 priv->focused = TRUE; 675 priv->need_position_update = TRUE; 676 } 677 678 _gtk_im_context_check_clear_area (context); 540 679 } 541 680 542 681 /** … … void 552 691 gtk_im_context_focus_out (GtkIMContext *context) 553 692 { 554 693 GtkIMContextClass *klass; 555 694 GtkIMContextPrivate *priv; 695 556 696 g_return_if_fail (GTK_IS_IM_CONTEXT (context)); 557 697 558 698 klass = GTK_IM_CONTEXT_GET_CLASS (context); 559 699 if (klass->focus_out) 560 700 klass->focus_out (context); 701 702 priv = G_TYPE_INSTANCE_GET_PRIVATE (context, GTK_TYPE_IM_CONTEXT, GtkIMContextPrivate); 703 704 if (priv->focused) 705 gtk_widget_unset_clear_area (priv->widget, TRUE); 706 707 _gtk_im_context_check_clear_area (context); 708 priv->focused = FALSE; 561 709 } 562 710 563 711 /** … … gtk_im_context_reset (GtkIMContext *context) 575 723 576 724 g_return_if_fail (GTK_IS_IM_CONTEXT (context)); 577 725 726 _gtk_im_context_check_clear_area (context); 727 578 728 klass = GTK_IM_CONTEXT_GET_CLASS (context); 579 729 if (klass->reset) 580 730 klass->reset (context); … … gtk_im_context_set_cursor_location (GtkIMContext *context, 595 745 const GdkRectangle *area) 596 746 { 597 747 GtkIMContextClass *klass; 748 GtkIMContextPrivate *priv; 598 749 599 750 g_return_if_fail (GTK_IS_IM_CONTEXT (context)); 600 751 752 priv = G_TYPE_INSTANCE_GET_PRIVATE (context, GTK_TYPE_IM_CONTEXT, 753 GtkIMContextPrivate); 754 755 if (priv->cursor_rect.x != area->x || 756 priv->cursor_rect.y != area->y || 757 priv->cursor_rect.width != area->width || 758 priv->cursor_rect.height != area->height) 759 { 760 priv->cursor_rect = *area; 761 priv->need_position_update = TRUE; 762 } 763 601 764 klass = GTK_IM_CONTEXT_GET_CLASS (context); 602 765 if (klass->set_cursor_location) 603 766 klass->set_cursor_location (context, (GdkRectangle *) area); 767 768 _gtk_im_context_check_clear_area (context); 604 769 } 605 770 606 771 /** … … gtk_im_context_set_property (GObject *obj, 798 963 break; 799 964 } 800 965 } 966 967 static void 968 gtk_im_context_finalize (GObject *obj) 969 { 970 GtkIMContextPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (obj, GTK_TYPE_IM_CONTEXT, GtkIMContextPrivate); 971 972 if (priv->clear_area_signal_id) 973 g_signal_handler_disconnect (obj, priv->clear_area_signal_id); 974 975 if (priv->clear_area_idle_id) 976 g_source_remove (priv->clear_area_idle_id); 977 978 G_OBJECT_CLASS (gtk_im_context_parent_class)->finalize (obj); 979 } -
gtk/gtkimmulticontext.c
diff --git a/gtk/gtkimmulticontext.c b/gtk/gtkimmulticontext.c index 712d5ca..69fba46 100644
a b static gboolean gtk_im_multicontext_delete_surrounding_cb (GtkIMContext * 102 102 gint n_chars, 103 103 GtkIMMulticontext *multicontext); 104 104 105 static void gtk_im_multicontext_clear_area_cb (GtkIMContext *slave, 106 GdkRectangle *osk_rect, 107 GdkRectangle *cursor_rect, 108 GtkIMMulticontext *multicontext); 109 105 110 static void propagate_purpose (GtkIMMulticontext *context); 106 111 107 112 static const gchar *global_context_id = NULL; … … gtk_im_multicontext_set_slave (GtkIMMulticontext *multicontext, 197 202 g_signal_handlers_disconnect_by_func (priv->slave, 198 203 gtk_im_multicontext_commit_cb, 199 204 multicontext); 205 g_signal_handlers_disconnect_by_func (priv->slave, 206 gtk_im_multicontext_clear_area_cb, 207 multicontext); 200 208 201 209 g_object_unref (priv->slave); 202 210 priv->slave = NULL; … … gtk_im_multicontext_set_slave (GtkIMMulticontext *multicontext, 231 239 g_signal_connect (priv->slave, "delete-surrounding", 232 240 G_CALLBACK (gtk_im_multicontext_delete_surrounding_cb), 233 241 multicontext); 242 g_signal_connect (priv->slave, "clear-area", 243 G_CALLBACK (gtk_im_multicontext_clear_area_cb), 244 multicontext); 234 245 235 246 if (!priv->use_preedit) /* Default is TRUE */ 236 247 gtk_im_context_set_use_preedit (slave, FALSE); … … gtk_im_multicontext_delete_surrounding_cb (GtkIMContext *slave, 553 564 } 554 565 555 566 static void 567 gtk_im_multicontext_clear_area_cb (GtkIMContext *slave, 568 GdkRectangle *osk_rect, 569 GdkRectangle *cursor_rect, 570 GtkIMMulticontext *multicontext) 571 { 572 g_signal_emit_by_name (multicontext, "clear-area", osk_rect, cursor_rect); 573 } 574 575 static void 556 576 activate_cb (GtkWidget *menuitem, 557 577 GtkIMMulticontext *context) 558 578 { -
gtk/gtkscrolledwindow.c
diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c index 08a286c..45fe909 100644
a b struct _GtkScrolledWindowPrivate 176 176 177 177 gdouble unclamped_hadj_value; 178 178 gdouble unclamped_vadj_value; 179 gdouble clear_area_dy; 180 gdouble focus_area_dy; 179 181 }; 180 182 181 183 typedef struct … … static gboolean _gtk_scrolled_window_set_adjustment_value (GtkScrolledWindo 287 289 gboolean allow_overshooting, 288 290 gboolean snap_to_border); 289 291 292 static gboolean gtk_scrolled_window_request_clear_area (GtkWidget *widget, 293 cairo_rectangle_int_t *clear_area, 294 cairo_rectangle_int_t *cursor_area, 295 gpointer user_data); 296 static gboolean gtk_scrolled_window_unset_clear_area (GtkWidget *widget, 297 gboolean snap_back, 298 gpointer user_data); 299 290 300 static guint signals[LAST_SIGNAL] = {0}; 291 301 292 302 G_DEFINE_TYPE (GtkScrolledWindow, gtk_scrolled_window, GTK_TYPE_BIN) … … gtk_scrolled_window_init (GtkScrolledWindow *scrolled_window) 597 607 gtk_scrolled_window_update_real_placement (scrolled_window); 598 608 priv->min_content_width = -1; 599 609 priv->min_content_height = -1; 610 priv->focus_area_dy = 0; 611 priv->clear_area_dy = 0; 600 612 601 613 gtk_scrolled_window_set_kinetic_scrolling (scrolled_window, TRUE); 602 614 gtk_scrolled_window_set_capture_button_press (scrolled_window, TRUE); 615 616 g_signal_connect (scrolled_window, "request-clear-area", 617 G_CALLBACK (gtk_scrolled_window_request_clear_area), 618 NULL); 619 g_signal_connect (scrolled_window, "unset-clear-area", 620 G_CALLBACK (gtk_scrolled_window_unset_clear_area), 621 NULL); 603 622 } 604 623 605 624 /** … … _gtk_scrolled_window_get_overshoot (GtkScrolledWindow *scrolled_window, 1823 1842 1824 1843 if (priv->unclamped_vadj_value < lower) 1825 1844 y = priv->unclamped_vadj_value - lower; 1826 else if (priv->unclamped_vadj_value > upper)1827 y = priv->unclamped_vadj_value - upper ;1845 else if (priv->unclamped_vadj_value + priv->focus_area_dy > upper) 1846 y = priv->unclamped_vadj_value - upper + priv->focus_area_dy; 1828 1847 else 1829 1848 y = 0; 1830 1849 … … _gtk_scrolled_window_allocate_overshoot_window (GtkScrolledWindow *scrolled_wind 1878 1897 window_allocation.x += -overshoot_x; 1879 1898 1880 1899 if (overshoot_y < 0) 1900 { 1901 window_allocation.y -= priv->focus_area_dy; 1881 1902 window_allocation.y += -overshoot_y; 1903 } 1882 1904 1883 1905 window_allocation.width -= ABS (overshoot_x); 1884 1906 window_allocation.height -= ABS (overshoot_y); … … gtk_scrolled_window_size_allocate (GtkWidget *widget, 2249 2271 gtk_widget_hide (priv->vscrollbar); 2250 2272 2251 2273 _gtk_scrolled_window_allocate_overshoot_window (scrolled_window); 2274 _gtk_scrolled_window_set_adjustment_value (GTK_SCROLLED_WINDOW (widget), 2275 gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar)), 2276 priv->unclamped_vadj_value, 2277 TRUE, FALSE); 2252 2278 } 2253 2279 2254 2280 static gboolean … … _gtk_scrolled_window_set_adjustment_value (GtkScrolledWindow *scrolled_window, 2352 2378 gboolean snap_to_border) 2353 2379 { 2354 2380 GtkScrolledWindowPrivate *priv = scrolled_window->priv; 2355 gdouble lower, upper, *prev_value ;2381 gdouble lower, upper, *prev_value, diff = 0; 2356 2382 2357 2383 lower = gtk_adjustment_get_lower (adjustment); 2358 2384 upper = gtk_adjustment_get_upper (adjustment) - … … _gtk_scrolled_window_set_adjustment_value (GtkScrolledWindow *scrolled_window, 2361 2387 if (adjustment == gtk_range_get_adjustment (GTK_RANGE (priv->hscrollbar))) 2362 2388 prev_value = &priv->unclamped_hadj_value; 2363 2389 else if (adjustment == gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar))) 2364 prev_value = &priv->unclamped_vadj_value; 2390 { 2391 diff = priv->focus_area_dy; 2392 upper += priv->clear_area_dy; 2393 prev_value = &priv->unclamped_vadj_value; 2394 } 2365 2395 else 2366 2396 return FALSE; 2367 2397 2398 value += diff; 2399 2368 2400 if (snap_to_border) 2369 2401 { 2370 2402 if (*prev_value < 0 && value > 0) … … _gtk_scrolled_window_set_adjustment_value (GtkScrolledWindow *scrolled_window, 2379 2411 upper += MAX_OVERSHOOT_DISTANCE; 2380 2412 } 2381 2413 2382 *prev_value = CLAMP (value, lower, upper);2383 2414 gtk_adjustment_set_value (adjustment, value); 2415 *prev_value = CLAMP (value - diff, lower, upper); 2384 2416 2385 return (*prev_value != value );2417 return (*prev_value != value - diff); 2386 2418 } 2387 2419 2388 2420 static gboolean … … scrolled_window_deceleration_cb (gpointer user_data) 2457 2489 else if (overshoot_x > 0) 2458 2490 data->x_velocity -= OVERSHOOT_INVERSE_ACCELERATION * elapsed; 2459 2491 2460 if (overshoot_y == 0)2492 if (overshoot_y >= 0 && overshoot_y <= priv->clear_area_dy) 2461 2493 { 2462 if (old_overshoot_y != 0)2494 if (old_overshoot_y < 0 || old_overshoot_y > priv->clear_area_dy) 2463 2495 { 2464 2496 /* Overshooting finished snapping back */ 2465 2497 data->y_velocity = 0; … … gtk_scrolled_window_captured_button_release (GtkWidget *widget, 2623 2655 { 2624 2656 GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW (widget); 2625 2657 GtkScrolledWindowPrivate *priv = scrolled_window->priv; 2658 gint overshoot_x, overshoot_y; 2626 2659 GtkWidget *child; 2627 2660 gboolean overshoot; 2628 2661 guint button; … … gtk_scrolled_window_captured_button_release (GtkWidget *widget, 2644 2677 priv->release_timeout_id = 0; 2645 2678 } 2646 2679 2647 overshoot = _gtk_scrolled_window_get_overshoot (scrolled_window, NULL, NULL);2680 overshoot = _gtk_scrolled_window_get_overshoot (scrolled_window, &overshoot_x, &overshoot_y); 2648 2681 2649 2682 if (priv->in_drag) 2650 2683 gdk_device_ungrab (gdk_event_get_device (event), gdk_event_get_time (event)); … … gtk_scrolled_window_captured_button_release (GtkWidget *widget, 2655 2688 */ 2656 2689 gtk_scrolled_window_release_captured_event (scrolled_window); 2657 2690 2658 if (!overshoot) 2691 if (!overshoot || 2692 (overshoot_x == 0 && overshoot_y >= 0 && 2693 overshoot_y <= priv->clear_area_dy)) 2659 2694 return FALSE; 2660 2695 } 2661 2696 priv->in_drag = FALSE; … … gtk_scrolled_window_captured_motion_notify (GtkWidget *widget, 2763 2798 vadjustment = gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar)); 2764 2799 if (vadjustment && priv->vscrollbar_visible) 2765 2800 { 2766 dy = (priv->last_motion_event_y_root - y_root) + priv->unclamped_vadj_value ;2801 dy = (priv->last_motion_event_y_root - y_root) + priv->unclamped_vadj_value + priv->focus_area_dy; 2767 2802 _gtk_scrolled_window_set_adjustment_value (scrolled_window, vadjustment, 2768 2803 dy, TRUE, FALSE); 2769 2804 } 2770 2805 2806 priv->focus_area_dy = 0; 2771 2807 _gtk_scrolled_window_get_overshoot (scrolled_window, 2772 2808 &new_overshoot_x, &new_overshoot_y); 2773 2809 … … gtk_scrolled_window_grab_notify (GtkWidget *widget, 3500 3536 } 3501 3537 } 3502 3538 3539 static gboolean 3540 gtk_scrolled_window_request_clear_area (GtkWidget *widget, 3541 cairo_rectangle_int_t *clear_area, 3542 cairo_rectangle_int_t *cursor_area, 3543 gpointer user_data) 3544 { 3545 gdouble clear_area_dy, focus_area_dy; 3546 GtkScrolledWindowPrivate *priv; 3547 GtkAdjustment *adjustment; 3548 GtkAllocation allocation; 3549 3550 priv = GTK_SCROLLED_WINDOW (widget)->priv; 3551 adjustment = gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar)); 3552 3553 gtk_widget_get_allocation (widget, &allocation); 3554 gdk_window_get_root_coords (gtk_widget_get_window (widget), 3555 allocation.x, allocation.y, 3556 &allocation.x, &allocation.y); 3557 3558 if (clear_area->y > allocation.y + allocation.height || 3559 clear_area->y + clear_area->height < allocation.y) 3560 return FALSE; 3561 3562 clear_area_dy = allocation.y + allocation.height - clear_area->y; 3563 focus_area_dy = cursor_area->y + cursor_area->height - clear_area->y; 3564 3565 if (focus_area_dy <= 0) 3566 return TRUE; 3567 3568 priv->clear_area_dy = clear_area_dy; 3569 priv->focus_area_dy = focus_area_dy; 3570 _gtk_scrolled_window_set_adjustment_value (GTK_SCROLLED_WINDOW (widget), 3571 adjustment, priv->unclamped_vadj_value, 3572 TRUE, FALSE); 3573 gtk_widget_queue_resize (widget); 3574 3575 return TRUE; 3576 } 3577 3578 static gboolean 3579 gtk_scrolled_window_unset_clear_area (GtkWidget *widget, 3580 gboolean snap_back, 3581 gpointer user_data) 3582 { 3583 GtkScrolledWindowPrivate *priv; 3584 3585 priv = GTK_SCROLLED_WINDOW (widget)->priv; 3586 3587 if (priv->clear_area_dy != 0 || priv->focus_area_dy != 0) 3588 { 3589 priv->clear_area_dy = 0; 3590 priv->focus_area_dy = 0; 3591 3592 if (snap_back) 3593 { 3594 GtkAdjustment *adjustment; 3595 3596 adjustment = gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar)); 3597 _gtk_scrolled_window_set_adjustment_value (GTK_SCROLLED_WINDOW (widget), 3598 adjustment, priv->unclamped_vadj_value, 3599 FALSE, FALSE); 3600 gtk_widget_queue_resize (widget); 3601 } 3602 3603 return TRUE; 3604 } 3605 3606 return FALSE; 3607 } 3608 3503 3609 /** 3504 3610 * gtk_scrolled_window_get_min_content_width: 3505 3611 * @scrolled_window: a #GtkScrolledWindow -
gtk/gtkwidget.c
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index eb82eb8..45df799 100644
a b enum { 482 482 DRAG_FAILED, 483 483 STYLE_UPDATED, 484 484 TOUCH_EVENT, 485 REQUEST_CLEAR_AREA, 486 UNSET_CLEAR_AREA, 485 487 LAST_SIGNAL 486 488 }; 487 489 … … gtk_widget_class_init (GtkWidgetClass *klass) 3116 3118 _gtk_marshal_BOOLEAN__UINT, 3117 3119 G_TYPE_BOOLEAN, 1, G_TYPE_UINT); 3118 3120 3121 widget_signals[REQUEST_CLEAR_AREA] = 3122 g_signal_new (I_("request-clear-area"), 3123 G_TYPE_FROM_CLASS (klass), 3124 G_SIGNAL_RUN_LAST, 0, 3125 g_signal_accumulator_true_handled, NULL, 3126 _gtk_marshal_BOOLEAN__BOXED_BOXED, 3127 G_TYPE_BOOLEAN, 2, 3128 CAIRO_GOBJECT_TYPE_RECTANGLE_INT, 3129 CAIRO_GOBJECT_TYPE_RECTANGLE_INT); 3130 widget_signals[UNSET_CLEAR_AREA] = 3131 g_signal_new (I_("unset-clear-area"), 3132 G_TYPE_FROM_CLASS (klass), 3133 G_SIGNAL_RUN_LAST, 0, 3134 g_signal_accumulator_true_handled, NULL, 3135 _gtk_marshal_BOOLEAN__BOOLEAN, 3136 G_TYPE_BOOLEAN, 1, G_TYPE_BOOLEAN); 3137 3119 3138 binding_set = gtk_binding_set_by_class (klass); 3120 3139 gtk_binding_entry_add_signal (binding_set, GDK_KEY_F10, GDK_SHIFT_MASK, 3121 3140 "popup-menu", 0); … … gtk_widget_insert_action_group (GtkWidget *widget, 14144 14163 else 14145 14164 g_action_muxer_remove (muxer, name); 14146 14165 } 14166 14167 gboolean 14168 gtk_widget_request_clear_area (GtkWidget *widget, 14169 cairo_rectangle_int_t *clear_area, 14170 cairo_rectangle_int_t *cursor_position) 14171 { 14172 gboolean handled = FALSE; 14173 GtkWidget *cur; 14174 14175 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); 14176 g_return_val_if_fail (cursor_position != NULL, FALSE); 14177 g_return_val_if_fail (clear_area != NULL, FALSE); 14178 14179 cur = widget; 14180 14181 while (!handled && cur) 14182 { 14183 g_signal_emit (cur, widget_signals[REQUEST_CLEAR_AREA], 0, 14184 clear_area, cursor_position, &handled); 14185 14186 if (!handled) 14187 cur = gtk_widget_get_parent (cur); 14188 } 14189 14190 return handled; 14191 } 14192 14193 gboolean 14194 gtk_widget_unset_clear_area (GtkWidget *widget, 14195 gboolean snap_back) 14196 { 14197 gboolean handled = FALSE; 14198 GtkWidget *cur; 14199 14200 cur = widget; 14201 14202 while (!handled && cur) 14203 { 14204 g_signal_emit (cur, widget_signals[UNSET_CLEAR_AREA], 0, 14205 snap_back, &handled); 14206 14207 if (!handled) 14208 cur = gtk_widget_get_parent (cur); 14209 } 14210 14211 return handled; 14212 } -
gtk/gtkwidget.h
diff --git a/gtk/gtkwidget.h b/gtk/gtkwidget.h index 2cdc7f3..4db2c99 100644
a b GDK_AVAILABLE_IN_3_4 887 887 GdkModifierType gtk_widget_get_modifier_mask (GtkWidget *widget, 888 888 GdkModifierIntent intent); 889 889 890 gboolean gtk_widget_request_clear_area (GtkWidget *widget, 891 cairo_rectangle_int_t *clear_area, 892 cairo_rectangle_int_t *cursor_position); 893 gboolean gtk_widget_unset_clear_area (GtkWidget *widget, 894 gboolean snap_back); 895 890 896 GDK_AVAILABLE_IN_3_6 891 897 void gtk_widget_insert_action_group (GtkWidget *widget, 892 898 const gchar *name,