Ticket #4381: 0001-OSK-im-osk-position_v8.patch
File 0001-OSK-im-osk-position_v8.patch, 24.0 KB (added by erikos, 11 years ago) |
---|
-
gtk/gtkimcontext.c
From bd18b70db320985520adb418cc5ffc8e9cb20f36 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 | 181 +++++++++++++++++++++++++++++++++++++++++++++++- gtk/gtkimmulticontext.c | 20 ++++++ gtk/gtkscrolledwindow.c | 132 +++++++++++++++++++++++++++++++---- gtk/gtkwidget.c | 66 ++++++++++++++++++ gtk/gtkwidget.h | 6 ++ 5 files changed, 390 insertions(+), 15 deletions(-) diff --git a/gtk/gtkimcontext.c b/gtk/gtkimcontext.c index f0f351f..7b84e05 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 gdk_window_get_root_coords (priv->window, 487 rect.x, rect.y, &rect.x, &rect.y); 488 489 if (gtk_widget_request_clear_area (priv->widget, &priv->clear_area, &rect)) 490 priv->need_unset = TRUE; 491 } 492 else if (!priv->focused && priv->need_unset) 493 { 494 gtk_widget_unset_clear_area (priv->widget, TRUE); 495 priv->need_unset = FALSE; 496 } 497 498 priv->last_notified_clear_area = priv->clear_area; 499 } 500 501 priv->need_position_update = FALSE; 502 priv->clear_area_idle_id = 0; 503 return FALSE; 504 } 505 506 static void 507 _gtk_im_context_check_clear_area (GtkIMContext *context) 508 { 509 GtkIMContextPrivate *priv; 510 511 priv = G_TYPE_INSTANCE_GET_PRIVATE (context, GTK_TYPE_IM_CONTEXT, 512 GtkIMContextPrivate); 513 514 if (priv->clear_area_idle_id) 515 g_source_remove (priv->clear_area_idle_id); 516 517 priv->clear_area_idle_id = 518 gdk_threads_add_idle (_gtk_im_context_clear_area_idle, context); 519 } 520 521 static void 522 _gtk_im_context_clear_area (GtkIMContext *context, 523 cairo_rectangle_int_t *clear_area, 524 cairo_rectangle_int_t *cursor_rect, 525 GtkWidget *widget) 526 { 527 GtkIMContextPrivate *priv; 528 529 priv = G_TYPE_INSTANCE_GET_PRIVATE (context, GTK_TYPE_IM_CONTEXT, GtkIMContextPrivate); 530 531 if (priv->clear_area.x != clear_area->x || 532 priv->clear_area.y != clear_area->y || 533 priv->clear_area.width != clear_area->width || 534 priv->clear_area.height != clear_area->height) 535 priv->need_position_update = TRUE; 536 537 priv->clear_area = *clear_area; 538 } 539 441 540 /** 442 541 * gtk_im_context_set_client_window: 443 542 * @context: a #GtkIMContext … … gtk_im_context_set_client_window (GtkIMContext *context, 454 553 GdkWindow *window) 455 554 { 456 555 GtkIMContextClass *klass; 457 556 GtkIMContextPrivate *priv; 557 458 558 g_return_if_fail (GTK_IS_IM_CONTEXT (context)); 459 559 460 560 klass = GTK_IM_CONTEXT_GET_CLASS (context); 461 561 if (klass->set_client_window) 462 562 klass->set_client_window (context, window); 563 564 priv = G_TYPE_INSTANCE_GET_PRIVATE (context, GTK_TYPE_IM_CONTEXT, GtkIMContextPrivate); 565 566 if (priv->clear_area_signal_id) 567 { 568 g_signal_handler_disconnect (context, priv->clear_area_signal_id); 569 priv->clear_area_signal_id = 0; 570 } 571 572 if (window) 573 { 574 gpointer window_data; 575 576 gdk_window_get_user_data (window, &window_data); 577 578 if (GTK_IS_WIDGET (window_data)) 579 { 580 priv->clear_area_signal_id = g_signal_connect (context, "clear-area", 581 G_CALLBACK (_gtk_im_context_clear_area), 582 window_data); 583 priv->window = window; 584 priv->widget = window_data; 585 } 586 } 463 587 } 464 588 465 589 /** … … void 531 655 gtk_im_context_focus_in (GtkIMContext *context) 532 656 { 533 657 GtkIMContextClass *klass; 534 658 GtkIMContextPrivate *priv; 659 535 660 g_return_if_fail (GTK_IS_IM_CONTEXT (context)); 536 661 537 662 klass = GTK_IM_CONTEXT_GET_CLASS (context); 538 663 if (klass->focus_in) 539 664 klass->focus_in (context); 665 666 priv = G_TYPE_INSTANCE_GET_PRIVATE (context, GTK_TYPE_IM_CONTEXT, GtkIMContextPrivate); 667 668 if (!priv->focused) 669 { 670 priv->focused = TRUE; 671 priv->need_position_update = TRUE; 672 } 673 674 _gtk_im_context_check_clear_area (context); 540 675 } 541 676 542 677 /** … … void 552 687 gtk_im_context_focus_out (GtkIMContext *context) 553 688 { 554 689 GtkIMContextClass *klass; 555 690 GtkIMContextPrivate *priv; 691 556 692 g_return_if_fail (GTK_IS_IM_CONTEXT (context)); 557 693 558 694 klass = GTK_IM_CONTEXT_GET_CLASS (context); 559 695 if (klass->focus_out) 560 696 klass->focus_out (context); 697 698 priv = G_TYPE_INSTANCE_GET_PRIVATE (context, GTK_TYPE_IM_CONTEXT, GtkIMContextPrivate); 699 700 if (priv->focused) 701 gtk_widget_unset_clear_area (priv->widget, TRUE); 702 703 _gtk_im_context_check_clear_area (context); 704 priv->focused = FALSE; 561 705 } 562 706 563 707 /** … … gtk_im_context_reset (GtkIMContext *context) 575 719 576 720 g_return_if_fail (GTK_IS_IM_CONTEXT (context)); 577 721 722 _gtk_im_context_check_clear_area (context); 723 578 724 klass = GTK_IM_CONTEXT_GET_CLASS (context); 579 725 if (klass->reset) 580 726 klass->reset (context); … … gtk_im_context_set_cursor_location (GtkIMContext *context, 595 741 const GdkRectangle *area) 596 742 { 597 743 GtkIMContextClass *klass; 744 GtkIMContextPrivate *priv; 598 745 599 746 g_return_if_fail (GTK_IS_IM_CONTEXT (context)); 600 747 748 priv = G_TYPE_INSTANCE_GET_PRIVATE (context, GTK_TYPE_IM_CONTEXT, 749 GtkIMContextPrivate); 750 751 if (priv->cursor_rect.x != area->x || 752 priv->cursor_rect.y != area->y || 753 priv->cursor_rect.width != area->width || 754 priv->cursor_rect.height != area->height) 755 { 756 priv->cursor_rect = *area; 757 priv->need_position_update = TRUE; 758 } 759 601 760 klass = GTK_IM_CONTEXT_GET_CLASS (context); 602 761 if (klass->set_cursor_location) 603 762 klass->set_cursor_location (context, (GdkRectangle *) area); 763 764 _gtk_im_context_check_clear_area (context); 604 765 } 605 766 606 767 /** … … gtk_im_context_set_property (GObject *obj, 798 959 break; 799 960 } 800 961 } 962 963 static void 964 gtk_im_context_finalize (GObject *obj) 965 { 966 GtkIMContextPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (obj, GTK_TYPE_IM_CONTEXT, GtkIMContextPrivate); 967 968 if (priv->clear_area_signal_id) 969 g_signal_handler_disconnect (obj, priv->clear_area_signal_id); 970 971 if (priv->clear_area_idle_id) 972 g_source_remove (priv->clear_area_idle_id); 973 974 G_OBJECT_CLASS (gtk_im_context_parent_class)->finalize (obj); 975 } -
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 7929863..6fedf0e 100644
a b struct _GtkScrolledWindowPrivate 175 175 176 176 gdouble unclamped_hadj_value; 177 177 gdouble unclamped_vadj_value; 178 gdouble clear_area_dy; 179 gdouble focus_area_dy; 178 180 }; 179 181 180 182 typedef struct … … static gboolean _gtk_scrolled_window_set_adjustment_value (GtkScrolledWindo 284 286 gboolean allow_overshooting, 285 287 gboolean snap_to_border); 286 288 289 static gboolean gtk_scrolled_window_request_clear_area (GtkWidget *widget, 290 cairo_rectangle_int_t *clear_area, 291 cairo_rectangle_int_t *cursor_area, 292 gpointer user_data); 293 static gboolean gtk_scrolled_window_unset_clear_area (GtkWidget *widget, 294 gboolean snap_back, 295 gpointer user_data); 296 287 297 static guint signals[LAST_SIGNAL] = {0}; 288 298 289 299 G_DEFINE_TYPE (GtkScrolledWindow, gtk_scrolled_window, GTK_TYPE_BIN) … … gtk_scrolled_window_init (GtkScrolledWindow *scrolled_window) 594 604 gtk_scrolled_window_update_real_placement (scrolled_window); 595 605 priv->min_content_width = -1; 596 606 priv->min_content_height = -1; 607 priv->focus_area_dy = 0; 608 priv->clear_area_dy = 0; 597 609 598 610 gtk_scrolled_window_set_kinetic_scrolling (scrolled_window, TRUE); 599 611 gtk_scrolled_window_set_capture_button_press (scrolled_window, TRUE); 612 613 g_signal_connect (scrolled_window, "request-clear-area", 614 G_CALLBACK (gtk_scrolled_window_request_clear_area), 615 NULL); 616 g_signal_connect (scrolled_window, "unset-clear-area", 617 G_CALLBACK (gtk_scrolled_window_unset_clear_area), 618 NULL); 600 619 } 601 620 602 621 /** … … _gtk_scrolled_window_get_overshoot (GtkScrolledWindow *scrolled_window, 1820 1839 1821 1840 if (priv->unclamped_vadj_value < lower) 1822 1841 y = priv->unclamped_vadj_value - lower; 1823 else if (priv->unclamped_vadj_value > upper)1824 y = priv->unclamped_vadj_value - upper ;1842 else if (priv->unclamped_vadj_value + priv->focus_area_dy > upper) 1843 y = priv->unclamped_vadj_value - upper + priv->focus_area_dy; 1825 1844 else 1826 1845 y = 0; 1827 1846 … … _gtk_scrolled_window_allocate_overshoot_window (GtkScrolledWindow *scrolled_wind 1875 1894 window_allocation.x += -overshoot_x; 1876 1895 1877 1896 if (overshoot_y < 0) 1878 window_allocation.y += -overshoot_y; 1897 { 1898 window_allocation.y -= priv->focus_area_dy; 1899 window_allocation.y += -overshoot_y; 1900 } 1879 1901 1880 1902 window_allocation.width -= ABS (overshoot_x); 1881 1903 window_allocation.height -= ABS (overshoot_y); … … gtk_scrolled_window_size_allocate (GtkWidget *widget, 2246 2268 gtk_widget_hide (priv->vscrollbar); 2247 2269 2248 2270 _gtk_scrolled_window_allocate_overshoot_window (scrolled_window); 2271 _gtk_scrolled_window_set_adjustment_value (GTK_SCROLLED_WINDOW (widget), 2272 gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar)), 2273 priv->unclamped_vadj_value, 2274 TRUE, FALSE); 2249 2275 } 2250 2276 2251 2277 static gboolean … … _gtk_scrolled_window_set_adjustment_value (GtkScrolledWindow *scrolled_window, 2349 2375 gboolean snap_to_border) 2350 2376 { 2351 2377 GtkScrolledWindowPrivate *priv = scrolled_window->priv; 2352 gdouble lower, upper, *prev_value ;2378 gdouble lower, upper, *prev_value, diff = 0; 2353 2379 2354 2380 lower = gtk_adjustment_get_lower (adjustment); 2355 2381 upper = gtk_adjustment_get_upper (adjustment) - … … _gtk_scrolled_window_set_adjustment_value (GtkScrolledWindow *scrolled_window, 2358 2384 if (adjustment == gtk_range_get_adjustment (GTK_RANGE (priv->hscrollbar))) 2359 2385 prev_value = &priv->unclamped_hadj_value; 2360 2386 else if (adjustment == gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar))) 2361 prev_value = &priv->unclamped_vadj_value; 2387 { 2388 diff = priv->focus_area_dy; 2389 upper += priv->clear_area_dy; 2390 prev_value = &priv->unclamped_vadj_value; 2391 } 2362 2392 else 2363 2393 return FALSE; 2364 2394 2395 value += diff; 2396 2365 2397 if (snap_to_border) 2366 2398 { 2367 2399 if (*prev_value < 0 && value > 0) … … _gtk_scrolled_window_set_adjustment_value (GtkScrolledWindow *scrolled_window, 2376 2408 upper += MAX_OVERSHOOT_DISTANCE; 2377 2409 } 2378 2410 2379 *prev_value = CLAMP (value, lower, upper);2380 2411 gtk_adjustment_set_value (adjustment, value); 2412 *prev_value = CLAMP (value - diff, lower, upper); 2381 2413 2382 return (*prev_value != value );2414 return (*prev_value != value - diff); 2383 2415 } 2384 2416 2385 2417 static gboolean … … scrolled_window_deceleration_cb (gpointer user_data) 2454 2486 else if (overshoot_x > 0) 2455 2487 data->x_velocity -= OVERSHOOT_INVERSE_ACCELERATION * elapsed; 2456 2488 2457 if (overshoot_y == 0)2489 if (overshoot_y >= 0 && overshoot_y <= priv->clear_area_dy) 2458 2490 { 2459 if (old_overshoot_y != 0)2491 if (old_overshoot_y < 0 || old_overshoot_y > priv->clear_area_dy) 2460 2492 { 2461 2493 /* Overshooting finished snapping back */ 2462 2494 data->y_velocity = 0; … … gtk_scrolled_window_captured_button_release (GtkWidget *widget, 2620 2652 { 2621 2653 GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW (widget); 2622 2654 GtkScrolledWindowPrivate *priv = scrolled_window->priv; 2655 gint overshoot_x, overshoot_y; 2623 2656 GtkWidget *child; 2624 2657 gboolean overshoot; 2625 2658 guint button; … … gtk_scrolled_window_captured_button_release (GtkWidget *widget, 2641 2674 priv->release_timeout_id = 0; 2642 2675 } 2643 2676 2644 overshoot = _gtk_scrolled_window_get_overshoot (scrolled_window, NULL, NULL);2677 overshoot = _gtk_scrolled_window_get_overshoot (scrolled_window, &overshoot_x, &overshoot_y); 2645 2678 2646 2679 if (priv->in_drag) 2647 2680 gdk_device_ungrab (gdk_event_get_device (event), gdk_event_get_time (event)); … … gtk_scrolled_window_captured_button_release (GtkWidget *widget, 2652 2685 */ 2653 2686 gtk_scrolled_window_release_captured_event (scrolled_window); 2654 2687 2655 if (!overshoot) 2688 if (!overshoot || 2689 (overshoot_x == 0 && overshoot_y >= 0 && 2690 overshoot_y <= priv->clear_area_dy)) 2656 2691 return FALSE; 2657 2692 } 2658 2693 priv->in_drag = FALSE; … … gtk_scrolled_window_captured_motion_notify (GtkWidget *widget, 2766 2801 vadjustment = gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar)); 2767 2802 if (vadjustment && priv->vscrollbar_visible) 2768 2803 { 2769 dy = (priv->last_motion_event_y_root - y_root) + priv->unclamped_vadj_value ;2804 dy = (priv->last_motion_event_y_root - y_root) + priv->unclamped_vadj_value + priv->focus_area_dy; 2770 2805 _gtk_scrolled_window_set_adjustment_value (scrolled_window, vadjustment, 2771 2806 dy, TRUE, FALSE); 2772 2807 } 2773 2808 2809 priv->focus_area_dy = 0; 2774 2810 _gtk_scrolled_window_get_overshoot (scrolled_window, 2775 2811 &new_overshoot_x, &new_overshoot_y); 2776 2812 … … gtk_scrolled_window_grab_notify (GtkWidget *widget, 3457 3493 } 3458 3494 } 3459 3495 3496 static gboolean 3497 gtk_scrolled_window_request_clear_area (GtkWidget *widget, 3498 cairo_rectangle_int_t *clear_area, 3499 cairo_rectangle_int_t *cursor_area, 3500 gpointer user_data) 3501 { 3502 gdouble clear_area_dy, focus_area_dy; 3503 GtkScrolledWindowPrivate *priv; 3504 GtkAdjustment *adjustment; 3505 GtkAllocation allocation; 3506 3507 priv = GTK_SCROLLED_WINDOW (widget)->priv; 3508 adjustment = gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar)); 3509 3510 gtk_widget_get_allocation (widget, &allocation); 3511 allocation.x = allocation.y = 0; 3512 3513 gdk_window_get_root_coords (gtk_widget_get_window (widget), 3514 allocation.x, allocation.y, 3515 &allocation.x, &allocation.y); 3516 3517 if (clear_area->y > allocation.y + allocation.height || 3518 clear_area->y + clear_area->height < allocation.y) 3519 return FALSE; 3520 3521 clear_area_dy = allocation.y + allocation.height - clear_area->y; 3522 focus_area_dy = cursor_area->y + cursor_area->height - clear_area->y; 3523 3524 if (focus_area_dy <= 0) 3525 return TRUE; 3526 3527 priv->clear_area_dy = clear_area_dy; 3528 priv->focus_area_dy = focus_area_dy; 3529 _gtk_scrolled_window_set_adjustment_value (GTK_SCROLLED_WINDOW (widget), 3530 adjustment, priv->unclamped_vadj_value, 3531 TRUE, FALSE); 3532 gtk_widget_queue_resize (widget); 3533 3534 return TRUE; 3535 } 3536 3537 static gboolean 3538 gtk_scrolled_window_unset_clear_area (GtkWidget *widget, 3539 gboolean snap_back, 3540 gpointer user_data) 3541 { 3542 GtkScrolledWindowPrivate *priv; 3543 3544 priv = GTK_SCROLLED_WINDOW (widget)->priv; 3545 3546 if (priv->clear_area_dy != 0 || priv->focus_area_dy != 0) 3547 { 3548 priv->clear_area_dy = 0; 3549 priv->focus_area_dy = 0; 3550 3551 if (snap_back) 3552 { 3553 GtkAdjustment *adjustment; 3554 3555 adjustment = gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar)); 3556 _gtk_scrolled_window_set_adjustment_value (GTK_SCROLLED_WINDOW (widget), 3557 adjustment, priv->unclamped_vadj_value, 3558 FALSE, FALSE); 3559 gtk_widget_queue_resize (widget); 3560 } 3561 3562 return TRUE; 3563 } 3564 3565 return FALSE; 3566 } 3567 3460 3568 /** 3461 3569 * gtk_scrolled_window_get_min_content_width: 3462 3570 * @scrolled_window: a #GtkScrolledWindow -
gtk/gtkwidget.c
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 7ff2424..5a88ae0 100644
a b enum { 484 484 DRAG_FAILED, 485 485 STYLE_UPDATED, 486 486 TOUCH_EVENT, 487 REQUEST_CLEAR_AREA, 488 UNSET_CLEAR_AREA, 487 489 LAST_SIGNAL 488 490 }; 489 491 … … gtk_widget_class_init (GtkWidgetClass *klass) 3120 3122 _gtk_marshal_BOOLEAN__UINT, 3121 3123 G_TYPE_BOOLEAN, 1, G_TYPE_UINT); 3122 3124 3125 widget_signals[REQUEST_CLEAR_AREA] = 3126 g_signal_new (I_("request-clear-area"), 3127 G_TYPE_FROM_CLASS (klass), 3128 G_SIGNAL_RUN_LAST, 0, 3129 g_signal_accumulator_true_handled, NULL, 3130 _gtk_marshal_BOOLEAN__BOXED_BOXED, 3131 G_TYPE_BOOLEAN, 2, 3132 CAIRO_GOBJECT_TYPE_RECTANGLE_INT, 3133 CAIRO_GOBJECT_TYPE_RECTANGLE_INT); 3134 widget_signals[UNSET_CLEAR_AREA] = 3135 g_signal_new (I_("unset-clear-area"), 3136 G_TYPE_FROM_CLASS (klass), 3137 G_SIGNAL_RUN_LAST, 0, 3138 g_signal_accumulator_true_handled, NULL, 3139 _gtk_marshal_BOOLEAN__BOOLEAN, 3140 G_TYPE_BOOLEAN, 1, G_TYPE_BOOLEAN); 3141 3123 3142 binding_set = gtk_binding_set_by_class (klass); 3124 3143 gtk_binding_entry_add_signal (binding_set, GDK_KEY_F10, GDK_SHIFT_MASK, 3125 3144 "popup-menu", 0); … … gtk_widget_insert_action_group (GtkWidget *widget, 14139 14158 else 14140 14159 g_action_muxer_remove (muxer, name); 14141 14160 } 14161 14162 gboolean 14163 gtk_widget_request_clear_area (GtkWidget *widget, 14164 cairo_rectangle_int_t *clear_area, 14165 cairo_rectangle_int_t *cursor_position) 14166 { 14167 gboolean handled = FALSE; 14168 GtkWidget *cur; 14169 14170 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); 14171 g_return_val_if_fail (cursor_position != NULL, FALSE); 14172 g_return_val_if_fail (clear_area != NULL, FALSE); 14173 14174 cur = widget; 14175 14176 while (!handled && cur) 14177 { 14178 g_signal_emit (cur, widget_signals[REQUEST_CLEAR_AREA], 0, 14179 clear_area, cursor_position, &handled); 14180 14181 if (!handled) 14182 cur = gtk_widget_get_parent (cur); 14183 } 14184 14185 return handled; 14186 } 14187 14188 gboolean 14189 gtk_widget_unset_clear_area (GtkWidget *widget, 14190 gboolean snap_back) 14191 { 14192 gboolean handled = FALSE; 14193 GtkWidget *cur; 14194 14195 cur = widget; 14196 14197 while (!handled && cur) 14198 { 14199 g_signal_emit (cur, widget_signals[UNSET_CLEAR_AREA], 0, 14200 snap_back, &handled); 14201 14202 if (!handled) 14203 cur = gtk_widget_get_parent (cur); 14204 } 14205 14206 return handled; 14207 } -
gtk/gtkwidget.h
diff --git a/gtk/gtkwidget.h b/gtk/gtkwidget.h index c178478..ce4f4dc 100644
a b GDK_AVAILABLE_IN_3_4 886 886 GdkModifierType gtk_widget_get_modifier_mask (GtkWidget *widget, 887 887 GdkModifierIntent intent); 888 888 889 gboolean gtk_widget_request_clear_area (GtkWidget *widget, 890 cairo_rectangle_int_t *clear_area, 891 cairo_rectangle_int_t *cursor_position); 892 gboolean gtk_widget_unset_clear_area (GtkWidget *widget, 893 gboolean snap_back); 894 889 895 GDK_AVAILABLE_IN_3_6 890 896 void gtk_widget_insert_action_group (GtkWidget *widget, 891 897 const gchar *name,