To: vim_dev@googlegroups.com Subject: Patch 8.0.0521 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.0.0521 Problem: GtkForm handling is outdated. Solution: Get rid of event filter functions. Get rid of GtkForm.width and .height. Eliminate gtk_widget_size_request() calls. (Kazunobu Kuriyama) Files: src/gui_gtk_f.c, src/gui_gtk_f.h *** ../vim-8.0.0520/src/gui_gtk_f.c 2016-09-09 22:00:25.000000000 +0200 --- src/gui_gtk_f.c 2017-03-29 17:34:14.302763381 +0200 *************** *** 92,105 **** gboolean force_allocate); static void gtk_form_position_children(GtkForm *form); - #if !GTK_CHECK_VERSION(3,0,0) - static GdkFilterReturn gtk_form_filter(GdkXEvent *gdk_xevent, - GdkEvent *event, - gpointer data); - static GdkFilterReturn gtk_form_main_filter(GdkXEvent *gdk_xevent, - GdkEvent *event, - gpointer data); - #endif #if !GTK_CHECK_VERSION(3,16,0) static void gtk_form_set_static_gravity(GdkWindow *window, gboolean use_static); --- 92,97 ---- *************** *** 171,179 **** gtk_form_attach_child_window(form, child); gtk_widget_set_parent(child_widget, GTK_WIDGET(form)); - #if !GTK_CHECK_VERSION(3,0,0) - gtk_widget_size_request(child->widget, NULL); - #endif #if GTK_CHECK_VERSION(3,0,0) if (gtk_widget_get_realized(GTK_WIDGET(form)) --- 163,168 ---- *************** *** 301,319 **** gtk_widget_set_has_window(GTK_WIDGET(form), TRUE); #endif form->children = NULL; - - #if !GTK_CHECK_VERSION(3,0,0) - form->width = 1; - form->height = 1; - #endif - form->bin_window = NULL; - - #if !GTK_CHECK_VERSION(3,0,0) - form->configure_serial = 0; - form->visibility = GDK_VISIBILITY_PARTIAL; - #endif - form->freeze_count = 0; } --- 290,296 ---- *************** *** 414,424 **** gtk_style_set_background(widget->style, form->bin_window, GTK_STATE_NORMAL); #endif - #if !GTK_CHECK_VERSION(3,0,0) - gdk_window_add_filter(widget->window, gtk_form_main_filter, form); - gdk_window_add_filter(form->bin_window, gtk_form_filter, form); - #endif - for (tmp_list = form->children; tmp_list; tmp_list = tmp_list->next) { GtkFormChild *child = tmp_list->data; --- 391,396 ---- *************** *** 540,572 **** static void gtk_form_size_request(GtkWidget *widget, GtkRequisition *requisition) { - #if !GTK_CHECK_VERSION(3,0,0) - GList *tmp_list; - GtkForm *form; - #endif - g_return_if_fail(GTK_IS_FORM(widget)); - #if !GTK_CHECK_VERSION(3,0,0) - form = GTK_FORM(widget); - #endif - - #if GTK_CHECK_VERSION(3,0,0) requisition->width = 1; requisition->height = 1; - #else - requisition->width = form->width; - requisition->height = form->height; - - tmp_list = form->children; - - while (tmp_list) - { - GtkFormChild *child = tmp_list->data; - gtk_widget_size_request(child->widget, NULL); - tmp_list = tmp_list->next; - } - #endif } #if GTK_CHECK_VERSION(3,0,0) --- 512,522 ---- static void gtk_form_size_request(GtkWidget *widget, GtkRequisition *requisition) { g_return_if_fail(GTK_IS_FORM(widget)); + g_return_if_fail(requisition != NULL); requisition->width = 1; requisition->height = 1; } #if GTK_CHECK_VERSION(3,0,0) *************** *** 735,762 **** return FALSE; for (tmp_list = form->children; tmp_list; tmp_list = tmp_list->next) ! { ! GtkFormChild *formchild = tmp_list->data; ! GtkWidget *child = formchild->widget; ! /* ! * The following chunk of code is taken from gtkcontainer.c. The ! * gtk1.x code synthesized expose events directly on the child widgets, ! * which can't be done in gtk2 ! */ ! if (GTK_WIDGET_DRAWABLE(child) && GTK_WIDGET_NO_WINDOW(child) ! && child->window == event->window) ! { ! GdkEventExpose child_event; ! child_event = *event; ! ! child_event.region = gtk_widget_region_intersect(child, event->region); ! if (!gdk_region_empty(child_event.region)) ! { ! gdk_region_get_clipbox(child_event.region, &child_event.area); ! gtk_widget_send_expose(child, (GdkEvent *)&child_event); ! } ! } ! } return FALSE; } --- 685,693 ---- return FALSE; for (tmp_list = form->children; tmp_list; tmp_list = tmp_list->next) ! gtk_container_propagate_expose(GTK_CONTAINER(widget), ! GTK_WIDGET(((GtkFormChild *)tmp_list->data)->widget), ! event); return FALSE; } *************** *** 1068,1153 **** gtk_form_position_child(form, tmp_list->data, FALSE); } - /* Callbacks */ - - /* The main event filter. Actually, we probably don't really need - * to install this as a filter at all, since we are calling it - * directly above in the expose-handling hack. - * - * This routine identifies expose events that are generated when - * we've temporarily moved the bin_window_origin, and translates - * them or discards them, depending on whether we are obscured - * or not. - */ - #if !GTK_CHECK_VERSION(3,0,0) - static GdkFilterReturn - gtk_form_filter(GdkXEvent *gdk_xevent, GdkEvent *event UNUSED, gpointer data) - { - XEvent *xevent; - GtkForm *form; - - xevent = (XEvent *) gdk_xevent; - form = GTK_FORM(data); - - switch (xevent->type) - { - case Expose: - if (xevent->xexpose.serial == form->configure_serial) - { - if (form->visibility == GDK_VISIBILITY_UNOBSCURED) - return GDK_FILTER_REMOVE; - else - break; - } - break; - - case ConfigureNotify: - if ((xevent->xconfigure.x != 0) || (xevent->xconfigure.y != 0)) - form->configure_serial = xevent->xconfigure.serial; - break; - } - - return GDK_FILTER_CONTINUE; - } - - /* Although GDK does have a GDK_VISIBILITY_NOTIFY event, - * there is no corresponding event in GTK, so we have - * to get the events from a filter - */ - static GdkFilterReturn - gtk_form_main_filter(GdkXEvent *gdk_xevent, - GdkEvent *event UNUSED, - gpointer data) - { - XEvent *xevent; - GtkForm *form; - - xevent = (XEvent *) gdk_xevent; - form = GTK_FORM(data); - - if (xevent->type == VisibilityNotify) - { - switch (xevent->xvisibility.state) - { - case VisibilityFullyObscured: - form->visibility = GDK_VISIBILITY_FULLY_OBSCURED; - break; - - case VisibilityPartiallyObscured: - form->visibility = GDK_VISIBILITY_PARTIAL; - break; - - case VisibilityUnobscured: - form->visibility = GDK_VISIBILITY_UNOBSCURED; - break; - } - - return GDK_FILTER_REMOVE; - } - return GDK_FILTER_CONTINUE; - } - #endif /* !GTK_CHECK_VERSION(3,0,0) */ - #if !GTK_CHECK_VERSION(3,16,0) static void gtk_form_set_static_gravity(GdkWindow *window, gboolean use_static) --- 999,1004 ---- *** ../vim-8.0.0520/src/gui_gtk_f.h 2016-08-29 22:42:20.000000000 +0200 --- src/gui_gtk_f.h 2017-03-29 17:34:14.302763381 +0200 *************** *** 43,61 **** GtkContainer container; GList *children; - - #ifndef USE_GTK3 - guint width; - guint height; - #endif - GdkWindow *bin_window; - - #ifndef USE_GTK3 - GdkVisibilityState visibility; - gulong configure_serial; - #endif - gint freeze_count; }; --- 43,49 ---- *** ../vim-8.0.0520/src/version.c 2017-03-29 17:30:23.168136866 +0200 --- src/version.c 2017-03-29 17:34:00.734844036 +0200 *************** *** 766,767 **** --- 766,769 ---- { /* Add new patch number below this line */ + /**/ + 521, /**/ -- The term "free software" is defined by Richard M. Stallman as being software that isn't necessarily for free. Confusing? Let's call it "Stallman software" then! -- Bram Moolenaar /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///