Changeset 262415 in webkit


Ignore:
Timestamp:
Jun 2, 2020, 6:06:35 AM (5 years ago)
Author:
Carlos Garcia Campos
Message:

[GTK4] Implement data list drop down menu
https://bugs.webkit.org/show_bug.cgi?id=212333

Reviewed by Adrian Perez de Castro.

Use a GtkPopover for GTK4 instead of a GtkMenu.

  • UIProcess/API/gtk/PageClientImpl.cpp:

(WebKit::PageClientImpl::createDataListSuggestionsDropdown):

  • UIProcess/gtk/WebDataListSuggestionsDropdownGtk.cpp:

(WebKit::WebDataListSuggestionsDropdownGtk::WebDataListSuggestionsDropdownGtk):
(WebKit::WebDataListSuggestionsDropdownGtk::~WebDataListSuggestionsDropdownGtk):
(WebKit::WebDataListSuggestionsDropdownGtk::show):

  • UIProcess/gtk/WebDataListSuggestionsDropdownGtk.h:
Location:
trunk/Source/WebKit
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r262414 r262415  
     12020-06-02  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK4] Implement data list drop down menu
     4        https://bugs.webkit.org/show_bug.cgi?id=212333
     5
     6        Reviewed by Adrian Perez de Castro.
     7
     8        Use a GtkPopover for GTK4 instead of a GtkMenu.
     9
     10        * UIProcess/API/gtk/PageClientImpl.cpp:
     11        (WebKit::PageClientImpl::createDataListSuggestionsDropdown):
     12        * UIProcess/gtk/WebDataListSuggestionsDropdownGtk.cpp:
     13        (WebKit::WebDataListSuggestionsDropdownGtk::WebDataListSuggestionsDropdownGtk):
     14        (WebKit::WebDataListSuggestionsDropdownGtk::~WebDataListSuggestionsDropdownGtk):
     15        (WebKit::WebDataListSuggestionsDropdownGtk::show):
     16        * UIProcess/gtk/WebDataListSuggestionsDropdownGtk.h:
     17
    1182020-06-02  Carlos Garcia Campos  <cgarcia@igalia.com>
    219
  • trunk/Source/WebKit/UIProcess/API/gtk/PageClientImpl.cpp

    r262414 r262415  
    274274RefPtr<WebDataListSuggestionsDropdown> PageClientImpl::createDataListSuggestionsDropdown(WebPageProxy& page)
    275275{
    276 #if USE(GTK4)
    277     return nullptr;
    278 #else
    279276    return WebDataListSuggestionsDropdownGtk::create(m_viewWidget, page);
    280 #endif
    281277}
    282278#endif
  • trunk/Source/WebKit/UIProcess/gtk/WebDataListSuggestionsDropdownGtk.cpp

    r260752 r262415  
    2727#include "WebDataListSuggestionsDropdownGtk.h"
    2828
    29 #if ENABLE(DATALIST_ELEMENT) && !USE(GTK4)
     29#if ENABLE(DATALIST_ELEMENT)
    3030
    3131#include "WebPageProxy.h"
     
    6666    auto* swindow = gtk_scrolled_window_new(nullptr, nullptr);
    6767    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
     68#if USE(GTK4)
     69    gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(swindow), m_treeView);
     70#else
    6871    gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(swindow), GTK_SHADOW_ETCHED_IN);
    6972    gtk_container_add(GTK_CONTAINER(swindow), m_treeView);
    7073    gtk_widget_show(m_treeView);
    71 
     74#endif
     75
     76#if USE(GTK4)
     77    m_popup = gtk_popover_new();
     78    gtk_popover_set_has_arrow(GTK_POPOVER(m_popup), FALSE);
     79    gtk_popover_set_autohide(GTK_POPOVER(m_popup), FALSE);
     80    gtk_popover_set_position(GTK_POPOVER(m_popup), GTK_POS_BOTTOM);
     81    gtk_popover_set_child(GTK_POPOVER(m_popup), swindow);
     82    gtk_widget_set_parent(m_popup, m_webView);
     83#else
    7284    m_popup = gtk_window_new(GTK_WINDOW_POPUP);
    7385    gtk_window_set_type_hint(GTK_WINDOW(m_popup), GDK_WINDOW_TYPE_HINT_COMBO);
     
    7890    g_signal_connect_object(m_webView, "focus-out-event", G_CALLBACK(gtk_widget_hide), m_popup, G_CONNECT_SWAPPED);
    7991    g_signal_connect_object(m_webView, "unmap-event", G_CALLBACK(gtk_widget_hide), m_popup, G_CONNECT_SWAPPED);
     92#endif
    8093
    8194#if ENABLE(DEVELOPER_MODE)
     
    8699WebDataListSuggestionsDropdownGtk::~WebDataListSuggestionsDropdownGtk()
    87100{
     101#if !USE(GTK4)
    88102    gtk_window_set_transient_for(GTK_WINDOW(m_popup), nullptr);
    89103    gtk_window_set_attached_to(GTK_WINDOW(m_popup), nullptr);
     104#endif
     105
    90106#if ENABLE(DEVELOPER_MODE)
    91107    g_object_set_data(G_OBJECT(m_webView), "wk-datalist-popup", nullptr);
    92108#endif
     109
     110#if USE(GTK4)
     111    g_clear_pointer(&m_popup, gtk_widget_unparent);
     112#else
    93113    gtk_widget_destroy(m_popup);
     114#endif
    94115}
    95116
     
    129150    gint itemHeight;
    130151    gtk_tree_view_column_cell_get_size(column, nullptr, nullptr, nullptr, nullptr, &itemHeight);
     152#if !USE(GTK4)
    131153    gint verticalSeparator;
    132154    gtk_widget_style_get(m_treeView, "vertical-separator", &verticalSeparator, nullptr);
    133155    itemHeight += verticalSeparator;
     156#endif
    134157    if (!itemHeight)
    135158        return;
    136159
    137160    auto* display = gtk_widget_get_display(m_webView);
     161#if USE(GTK4)
     162    auto* monitor = gdk_display_get_monitor_at_surface(display, gtk_native_get_surface(gtk_widget_get_native(m_webView)));
     163#else
    138164    auto* monitor = gdk_display_get_monitor_at_window(display, gtk_widget_get_window(m_webView));
     165#endif
    139166    GdkRectangle area;
    140167    gdk_monitor_get_workarea(monitor, &area);
     
    142169    size_t itemCount = std::min<size_t>(information.suggestions.size(), (area.height / 3) / itemHeight);
    143170
     171#if USE(GTK4)
     172    auto* swindow = GTK_SCROLLED_WINDOW(gtk_popover_get_child(GTK_POPOVER(m_popup)));
     173#else
    144174    auto* swindow = GTK_SCROLLED_WINDOW(gtk_bin_get_child(GTK_BIN(m_popup)));
     175#endif
    145176    // Disable scrollbars when there's only one item to ensure the scrolled window doesn't take them into account when calculating its minimum size.
    146177    gtk_scrolled_window_set_policy(swindow, GTK_POLICY_NEVER, itemCount > 1 ? GTK_POLICY_AUTOMATIC : GTK_POLICY_NEVER);
     
    151182    gtk_scrolled_window_set_min_content_height(swindow, itemCount * itemHeight);
    152183
     184#if USE(GTK4)
     185    GdkRectangle windowRect(information.elementRect);
     186    gtk_popover_set_pointing_to(GTK_POPOVER(m_popup), &windowRect);
     187#else
    153188    GtkRequisition menuRequisition;
    154189    gtk_widget_get_preferred_size(m_popup, &menuRequisition, nullptr);
     
    174209    gtk_window_set_attached_to(GTK_WINDOW(m_popup), m_webView);
    175210    gtk_window_set_screen(GTK_WINDOW(m_popup), gtk_widget_get_screen(m_webView));
     211#endif
    176212
    177213    gtk_widget_show(m_popup);
  • trunk/Source/WebKit/UIProcess/gtk/WebDataListSuggestionsDropdownGtk.h

    r260752 r262415  
    2626#pragma once
    2727
    28 #if ENABLE(DATALIST_ELEMENT) && !USE(GTK4)
     28#if ENABLE(DATALIST_ELEMENT)
    2929
    3030#include "WebDataListSuggestionsDropdown.h"
Note: See TracChangeset for help on using the changeset viewer.