CINXE.COM

Move away from `GtkContainer` APIs (!1632) 路 Merge requests 路 World / Phosh / phosh 路 GitLab

<!DOCTYPE html> <html class="gl-light ui-gray with-top-bar with-header " lang="en"> <head prefix="og: http://ogp.me/ns#"> <meta charset="utf-8"> <meta content="IE=edge" http-equiv="X-UA-Compatible"> <meta content="width=device-width, initial-scale=1" name="viewport"> <title>Move away from `GtkContainer` APIs (!1632) 路 Merge requests 路 World / Phosh / phosh 路 GitLab</title> <script> //<![CDATA[ window.gon={};gon.math_rendering_limits_enabled=true;gon.features={"glqlIntegration":false,"continueIndentedText":false,"mrExperienceSurvey":false,"mrPipelinesGraphql":false,"notificationsTodosButtons":false,"mrShowReportsImmediately":false}; //]]> </script> <script> //<![CDATA[ var gl = window.gl || {}; gl.startup_calls = {"/World/Phosh/phosh/-/merge_requests/1632/diffs_metadata.json?diff_head=true\u0026view=inline\u0026w=1":{},"/World/Phosh/phosh/-/merge_requests/1632/discussions.json?per_page=20":{},"/World/Phosh/phosh/-/merge_requests/1632/widget.json":{},"/World/Phosh/phosh/-/merge_requests/1632/cached_widget.json":{},"/World/Phosh/phosh/-/merge_requests/1632.json?serializer=sidebar_extras":{}}; gl.startup_graphql_calls = null; if (gl.startup_calls && window.fetch) { Object.keys(gl.startup_calls).forEach(apiCall => { gl.startup_calls[apiCall] = { fetchCall: fetch(apiCall, { // Emulate XHR for Rails AJAX request checks headers: { 'X-Requested-With': 'XMLHttpRequest' }, // fetch won鈥檛 send cookies in older browsers, unless you set the credentials init option. // We set to `same-origin` which is default value in modern browsers. // See https://github.com/whatwg/fetch/pull/585 for more information. credentials: 'same-origin' }) }; }); } if (gl.startup_graphql_calls && window.fetch) { const headers = {"X-CSRF-Token":"Ds3M0R9m7B6K4HY5JyAs_7QYdCf0VwERcB1t3HM7sIuUIrFXuSJh99520zpffIAm_9m5R1bZ3hFiZlaGdTi-0A","x-gitlab-feature-category":"code_review_workflow"}; const url = `https://gitlab.gnome.org/api/graphql` const opts = { method: "POST", headers: { "Content-Type": "application/json", ...headers, } }; gl.startup_graphql_calls = gl.startup_graphql_calls.map(call => ({ ...call, fetchCall: fetch(url, { ...opts, credentials: 'same-origin', body: JSON.stringify(call) }) })) } //]]> </script> <link rel="stylesheet" href="/assets/application-182846f5d03243644eeff8074a2e7a731654615c4445f6d1134b9d422825e3ce.css" /> <link rel="stylesheet" href="/assets/page_bundles/merge_request-c54f44c201beff6e8e2b10fd9f738ddbc0a95445cd3bb32a318929833c0f8821.css" /><link rel="stylesheet" href="/assets/page_bundles/issuable-e25480d2326300d5c49ad31dbd847a53e39fc33a5fd595a961dd7238e411b558.css" /><link rel="stylesheet" href="/assets/page_bundles/notes_shared-30de79203a0836dddd3a4cf7364d63afb16a0f2deb0bbc654b00692872696739.css" /><link rel="stylesheet" href="/assets/page_bundles/design_management-b67fb0c469f6b41e7909fd0a2e77308b626a07ce8d0cb89fde4855f4419925d3.css" /><link rel="stylesheet" href="/assets/page_bundles/merge_requests-b811e14aee311adcd5e3f13457409b2b52b2a4c87cea7190d0679d406b355b68.css" /><link rel="stylesheet" href="/assets/page_bundles/pipelines-7b671da23266674fc2f00dbd090c32d7d74383461bd7847cc0b4e0355d9cb35a.css" /><link rel="stylesheet" href="/assets/page_bundles/reports-c30ff8da5d467581779c96962f0dfda74e09f1bb59b4f62a2a45979e3001e274.css" /><link rel="stylesheet" href="/assets/page_bundles/ci_status-03a1526d5d59d53e23437e9d6d2187df404745e4de53b9767362223455318ca8.css" /><link rel="stylesheet" href="/assets/page_bundles/labels-3508460b8d6f839e9d60de1f2065fdaf7f057efab04cf71966acef6a86fe9b41.css" /><link rel="stylesheet" href="/assets/page_bundles/commit_description-1e2cba4dda3c7b30dd84924809020c569f1308dea51520fe1dd5d4ce31403195.css" /><link rel="stylesheet" href="/assets/page_bundles/work_items-22a76cdd1fe2ae5431b7ff603f86212acaf81b49c4a932f19e3b3222dc1881ee.css" /> <link rel="stylesheet" href="/assets/application_utilities-58bec0f2dc46133fc9e8548af9854688398e9d7263cc0fd95ec5739f2a069dec.css" /> <link rel="stylesheet" href="/assets/tailwind-469e8cf29ca81e21f824ad683201a6a63c135a4ef89f152be2954d9af0217517.css" /> <link rel="stylesheet" href="/assets/fonts-fae5d3f79948bd85f18b6513a025f863b19636e85b09a1492907eb4b1bb0557b.css" /> <link rel="stylesheet" href="/assets/highlight/themes/white-99cce4f4b362f6840d7134d4129668929fde49c4da11d6ebf17f99768adbd868.css" /> <link rel="preload" href="/assets/application_utilities-58bec0f2dc46133fc9e8548af9854688398e9d7263cc0fd95ec5739f2a069dec.css" as="style" type="text/css"> <link rel="preload" href="/assets/application-182846f5d03243644eeff8074a2e7a731654615c4445f6d1134b9d422825e3ce.css" as="style" type="text/css"> <link rel="preload" href="/assets/highlight/themes/white-99cce4f4b362f6840d7134d4129668929fde49c4da11d6ebf17f99768adbd868.css" as="style" type="text/css"> <script src="/assets/webpack/runtime.8d32a8b8.bundle.js" defer="defer"></script> <script src="/assets/webpack/main.fc49e848.chunk.js" defer="defer"></script> <script src="/assets/webpack/commons-pages.groups.new-pages.import.gitlab_projects.new-pages.import.manifest.new-pages.projects.n-a0973272.5fca6f92.chunk.js" defer="defer"></script> <script src="/assets/webpack/commons-pages.groups.new-pages.import.gitlab_projects.new-pages.import.manifest.new-pages.projects.n-44c6c18e.977bfa43.chunk.js" defer="defer"></script> <script src="/assets/webpack/commons-pages.search.show-super_sidebar.be008869.chunk.js" defer="defer"></script> <script src="/assets/webpack/super_sidebar.8f4462d8.chunk.js" defer="defer"></script> <script src="/assets/webpack/commons-pages.projects-pages.projects.activity-pages.projects.alert_management.details-pages.project-2e472f70.08214ed0.chunk.js" defer="defer"></script> <script src="/assets/webpack/commons-pages.admin.abuse_reports.show-pages.admin.topics.edit-pages.admin.topics.new-pages.groups.i-46287364.7e94df4b.chunk.js" defer="defer"></script> <script src="/assets/webpack/5.aa9d0901.chunk.js" defer="defer"></script> <script src="/assets/webpack/commons-pages.admin.abuse_reports.show-pages.admin.topics.edit-pages.admin.topics.new-pages.groups.i-2970ef53.e51fc747.chunk.js" defer="defer"></script> <script src="/assets/webpack/8.d6166704.chunk.js" defer="defer"></script> <script src="/assets/webpack/commons-pages.admin.abuse_reports.show-pages.admin.topics.edit-pages.admin.topics.new-pages.groups.i-90fa9e6d.c451e504.chunk.js" defer="defer"></script> <script src="/assets/webpack/commons-pages.admin.topics.edit-pages.admin.topics.new-pages.groups.milestones.edit-pages.groups.mil-e23dc6ac.e1b0eab4.chunk.js" defer="defer"></script> <script src="/assets/webpack/commons-pages.admin.abuse_reports.show-pages.dashboard.milestones.show-pages.groups.merge_requests-p-f5246592.637cebc3.chunk.js" defer="defer"></script> <script src="/assets/webpack/commons-pages.dashboard.milestones.show-pages.groups.merge_requests-pages.groups.milestones.edit-pag-81f616df.821e6dea.chunk.js" defer="defer"></script> <script src="/assets/webpack/16.f52d58f1.chunk.js" defer="defer"></script> <script src="/assets/webpack/commons-pages.dashboard.issues-pages.groups.issues-pages.groups.merge_requests-pages.groups.work_ite-3367b885.38440273.chunk.js" defer="defer"></script> <script src="/assets/webpack/commons-pages.groups.issues-pages.groups.merge_requests-pages.groups.work_items-pages.groups.work_it-10f07c56.f526e0ee.chunk.js" defer="defer"></script> <script src="/assets/webpack/commons-pages.groups.milestones.edit-pages.groups.milestones.new-pages.groups.milestones.show-pages.-8da769b3.b7cdd186.chunk.js" defer="defer"></script> <script src="/assets/webpack/commons-pages.groups.merge_requests-pages.groups.work_items-pages.groups.work_items.show-pages.proje-9c83bcc8.ba09e72b.chunk.js" defer="defer"></script> <script src="/assets/webpack/commons-pages.dashboard.milestones.show-pages.groups.merge_requests-pages.groups.milestones.edit-pag-a289cf7b.be2b3d83.chunk.js" defer="defer"></script> <script src="/assets/webpack/commons-pages.projects.incidents.show-pages.projects.issues.designs-pages.projects.issues.edit-pages-9291bb26.6aed6603.chunk.js" defer="defer"></script> <script src="/assets/webpack/commons-pages.groups.merge_requests-pages.projects.incidents.show-pages.projects.issues.designs-page-14493b0a.7aaf7f6e.chunk.js" defer="defer"></script> <script src="/assets/webpack/26.38b772e8.chunk.js" defer="defer"></script> <script src="/assets/webpack/pages.projects.merge_requests.show.b25b3d11.chunk.js" defer="defer"></script> <meta content="object" property="og:type"> <meta content="GitLab" property="og:site_name"> <meta content="Move away from `GtkContainer` APIs (!1632) 路 Merge requests 路 World / Phosh / phosh 路 GitLab" property="og:title"> <meta content="In GTK 4, there is no GtkContainer. Instead, the widgets with children are grouped into two categories. Single-child widgets like GtkButton, " property="og:description"> <meta content="https://gitlab.gnome.org/uploads/-/system/project/avatar/16747/phosh.png" property="og:image"> <meta content="64" property="og:image:width"> <meta content="64" property="og:image:height"> <meta content="https://gitlab.gnome.org/World/Phosh/phosh/-/merge_requests/1632" property="og:url"> <meta content="summary" property="twitter:card"> <meta content="Move away from `GtkContainer` APIs (!1632) 路 Merge requests 路 World / Phosh / phosh 路 GitLab" property="twitter:title"> <meta content="In GTK 4, there is no GtkContainer. Instead, the widgets with children are grouped into two categories. Single-child widgets like GtkButton, " property="twitter:description"> <meta content="https://gitlab.gnome.org/uploads/-/system/project/avatar/16747/phosh.png" property="twitter:image"> <meta property="twitter:label1" content="Author"><meta property="twitter:data1" content="Arun Mani J"><meta property="twitter:label2" content="Assignee"><meta property="twitter:data2" content="Marge Bot"> <meta name="csrf-param" content="authenticity_token" /> <meta name="csrf-token" content="LQxNz4dM5cuJAXjexcz8rcRLw3rHKioYSa3keDDqH1e34zBJIQhoIt2X3d29kFB0j4oOGmWk9Rhb1t8iNukRDA" /> <meta name="csp-nonce" /> <meta name="action-cable-url" content="/-/cable" /> <link href="/-/manifest.json" rel="manifest"> <link rel="icon" type="image/png" href="/uploads/-/system/appearance/favicon/1/GnomeLogoVertical.svg.png" id="favicon" data-original-href="/uploads/-/system/appearance/favicon/1/GnomeLogoVertical.svg.png" /> <link rel="apple-touch-icon" type="image/x-icon" href="/assets/apple-touch-icon-b049d4bc0dd9626f31db825d61880737befc7835982586d015bded10b4435460.png" /> <link href="/search/opensearch.xml" rel="search" title="Search GitLab" type="application/opensearchdescription+xml"> <meta content="In GTK 4, there is no GtkContainer. Instead, the widgets with children are grouped into two categories. Single-child widgets like GtkButton, " name="description"> <meta content="#28272d" name="theme-color"> </head> <body class="tab-width-8 gl-browser-ie gl-platform-windows" data-group="Phosh" data-group-full-path="World/Phosh" data-namespace-id="61154" data-page="projects:merge_requests:show" data-page-type-id="1632" data-project="phosh" data-project-full-path="World/Phosh/phosh" data-project-id="16747"> <script> //<![CDATA[ gl = window.gl || {}; gl.GfmAutoComplete = gl.GfmAutoComplete || {}; gl.GfmAutoComplete.dataSources = {"members":"/World/Phosh/phosh/-/autocomplete_sources/members?type=MergeRequest\u0026type_id=1632","issues":"/World/Phosh/phosh/-/autocomplete_sources/issues","mergeRequests":"/World/Phosh/phosh/-/autocomplete_sources/merge_requests","labels":"/World/Phosh/phosh/-/autocomplete_sources/labels?type=MergeRequest\u0026type_id=1632","milestones":"/World/Phosh/phosh/-/autocomplete_sources/milestones","commands":"/World/Phosh/phosh/-/autocomplete_sources/commands?type=MergeRequest\u0026type_id=1632","snippets":"/World/Phosh/phosh/-/autocomplete_sources/snippets","contacts":"/World/Phosh/phosh/-/autocomplete_sources/contacts?type=MergeRequest\u0026type_id=1632","wikis":"/World/Phosh/phosh/-/autocomplete_sources/wikis"}; //]]> </script> <script> //<![CDATA[ gl = window.gl || {}; gl.client = {"isIe":true,"isWindows":true}; //]]> </script> <header class="header-logged-out" data-testid="navbar"> <a class="gl-sr-only gl-accessibility" href="#content-body">Skip to content</a> <div class="container-fluid"> <nav aria-label="Explore GitLab" class="header-logged-out-nav gl-flex gl-gap-3 gl-justify-between"> <div class="gl-flex gl-items-center gl-gap-1"> <span class="gl-sr-only">GitLab</span> <a title="Homepage" id="logo" class="header-logged-out-logo has-tooltip" aria-label="Homepage" href="/"><img class="brand-header-logo lazy" alt="" data-src="/uploads/-/system/appearance/header_logo/1/GnomeLogoHorizontal.svg" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" /> </a></div> <ul class="gl-list-none gl-p-0 gl-m-0 gl-flex gl-gap-3 gl-items-center gl-grow"> <li class="header-logged-out-nav-item"> <a class="" href="/explore">Explore</a> </li> </ul> <ul class="gl-list-none gl-p-0 gl-m-0 gl-flex gl-gap-3 gl-items-center gl-justify-end"> <li class="header-logged-out-nav-item"> <a href="/users/sign_in?redirect_to_referer=yes">Sign in</a> </li> </ul> </nav> </div> </header> <div class="layout-page page-gutter page-with-super-sidebar"> <aside class="js-super-sidebar super-sidebar super-sidebar-loading" data-command-palette="{&quot;project_files_url&quot;:&quot;/World/Phosh/phosh/-/files/main?format=json&quot;,&quot;project_blob_url&quot;:&quot;/World/Phosh/phosh/-/blob/main&quot;}" data-force-desktop-expanded-sidebar="" data-is-saas="false" data-root-path="/" data-sidebar="{&quot;is_logged_in&quot;:false,&quot;context_switcher_links&quot;:[{&quot;title&quot;:&quot;Explore&quot;,&quot;link&quot;:&quot;/explore&quot;,&quot;icon&quot;:&quot;compass&quot;}],&quot;current_menu_items&quot;:[{&quot;id&quot;:&quot;project_overview&quot;,&quot;title&quot;:&quot;phosh&quot;,&quot;avatar&quot;:&quot;/uploads/-/system/project/avatar/16747/phosh.png&quot;,&quot;entity_id&quot;:16747,&quot;link&quot;:&quot;/World/Phosh/phosh&quot;,&quot;link_classes&quot;:&quot;shortcuts-project&quot;,&quot;is_active&quot;:false},{&quot;id&quot;:&quot;manage_menu&quot;,&quot;title&quot;:&quot;Manage&quot;,&quot;icon&quot;:&quot;users&quot;,&quot;avatar_shape&quot;:&quot;rect&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/activity&quot;,&quot;is_active&quot;:false,&quot;items&quot;:[{&quot;id&quot;:&quot;activity&quot;,&quot;title&quot;:&quot;Activity&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/activity&quot;,&quot;link_classes&quot;:&quot;shortcuts-project-activity&quot;,&quot;is_active&quot;:false},{&quot;id&quot;:&quot;members&quot;,&quot;title&quot;:&quot;Members&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/project_members&quot;,&quot;is_active&quot;:false},{&quot;id&quot;:&quot;labels&quot;,&quot;title&quot;:&quot;Labels&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/labels&quot;,&quot;is_active&quot;:false}],&quot;separated&quot;:false},{&quot;id&quot;:&quot;plan_menu&quot;,&quot;title&quot;:&quot;Plan&quot;,&quot;icon&quot;:&quot;planning&quot;,&quot;avatar_shape&quot;:&quot;rect&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/issues&quot;,&quot;is_active&quot;:false,&quot;items&quot;:[{&quot;id&quot;:&quot;project_issue_list&quot;,&quot;title&quot;:&quot;Issues&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/issues&quot;,&quot;pill_count_field&quot;:&quot;openIssuesCount&quot;,&quot;link_classes&quot;:&quot;shortcuts-issues has-sub-items&quot;,&quot;is_active&quot;:false},{&quot;id&quot;:&quot;boards&quot;,&quot;title&quot;:&quot;Issue boards&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/boards&quot;,&quot;link_classes&quot;:&quot;shortcuts-issue-boards&quot;,&quot;is_active&quot;:false},{&quot;id&quot;:&quot;milestones&quot;,&quot;title&quot;:&quot;Milestones&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/milestones&quot;,&quot;is_active&quot;:false},{&quot;id&quot;:&quot;project_wiki&quot;,&quot;title&quot;:&quot;Wiki&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/wikis/home&quot;,&quot;link_classes&quot;:&quot;shortcuts-wiki&quot;,&quot;is_active&quot;:false}],&quot;separated&quot;:false},{&quot;id&quot;:&quot;code_menu&quot;,&quot;title&quot;:&quot;Code&quot;,&quot;icon&quot;:&quot;code&quot;,&quot;avatar_shape&quot;:&quot;rect&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/merge_requests&quot;,&quot;is_active&quot;:true,&quot;items&quot;:[{&quot;id&quot;:&quot;project_merge_request_list&quot;,&quot;title&quot;:&quot;Merge requests&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/merge_requests&quot;,&quot;pill_count_field&quot;:&quot;openMergeRequestsCount&quot;,&quot;link_classes&quot;:&quot;shortcuts-merge_requests&quot;,&quot;is_active&quot;:true},{&quot;id&quot;:&quot;files&quot;,&quot;title&quot;:&quot;Repository&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/tree/main&quot;,&quot;link_classes&quot;:&quot;shortcuts-tree&quot;,&quot;is_active&quot;:false},{&quot;id&quot;:&quot;branches&quot;,&quot;title&quot;:&quot;Branches&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/branches&quot;,&quot;is_active&quot;:false},{&quot;id&quot;:&quot;commits&quot;,&quot;title&quot;:&quot;Commits&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/commits/main?ref_type=heads&quot;,&quot;link_classes&quot;:&quot;shortcuts-commits&quot;,&quot;is_active&quot;:false},{&quot;id&quot;:&quot;tags&quot;,&quot;title&quot;:&quot;Tags&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/tags&quot;,&quot;is_active&quot;:false},{&quot;id&quot;:&quot;graphs&quot;,&quot;title&quot;:&quot;Repository graph&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/network/main?ref_type=heads&quot;,&quot;link_classes&quot;:&quot;shortcuts-network&quot;,&quot;is_active&quot;:false},{&quot;id&quot;:&quot;compare&quot;,&quot;title&quot;:&quot;Compare revisions&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/compare?from=main\u0026to=main&quot;,&quot;is_active&quot;:false}],&quot;separated&quot;:false},{&quot;id&quot;:&quot;build_menu&quot;,&quot;title&quot;:&quot;Build&quot;,&quot;icon&quot;:&quot;rocket&quot;,&quot;avatar_shape&quot;:&quot;rect&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/pipelines&quot;,&quot;is_active&quot;:false,&quot;items&quot;:[{&quot;id&quot;:&quot;pipelines&quot;,&quot;title&quot;:&quot;Pipelines&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/pipelines&quot;,&quot;link_classes&quot;:&quot;shortcuts-pipelines&quot;,&quot;is_active&quot;:false},{&quot;id&quot;:&quot;jobs&quot;,&quot;title&quot;:&quot;Jobs&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/jobs&quot;,&quot;link_classes&quot;:&quot;shortcuts-builds&quot;,&quot;is_active&quot;:false},{&quot;id&quot;:&quot;pipeline_schedules&quot;,&quot;title&quot;:&quot;Pipeline schedules&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/pipeline_schedules&quot;,&quot;link_classes&quot;:&quot;shortcuts-builds&quot;,&quot;is_active&quot;:false},{&quot;id&quot;:&quot;artifacts&quot;,&quot;title&quot;:&quot;Artifacts&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/artifacts&quot;,&quot;link_classes&quot;:&quot;shortcuts-builds&quot;,&quot;is_active&quot;:false}],&quot;separated&quot;:false},{&quot;id&quot;:&quot;deploy_menu&quot;,&quot;title&quot;:&quot;Deploy&quot;,&quot;icon&quot;:&quot;deployments&quot;,&quot;avatar_shape&quot;:&quot;rect&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/releases&quot;,&quot;is_active&quot;:false,&quot;items&quot;:[{&quot;id&quot;:&quot;releases&quot;,&quot;title&quot;:&quot;Releases&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/releases&quot;,&quot;link_classes&quot;:&quot;shortcuts-deployments-releases&quot;,&quot;is_active&quot;:false},{&quot;id&quot;:&quot;container_registry&quot;,&quot;title&quot;:&quot;Container Registry&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/container_registry&quot;,&quot;is_active&quot;:false},{&quot;id&quot;:&quot;model_registry&quot;,&quot;title&quot;:&quot;Model registry&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/ml/models&quot;,&quot;is_active&quot;:false}],&quot;separated&quot;:false},{&quot;id&quot;:&quot;analyze_menu&quot;,&quot;title&quot;:&quot;Analyze&quot;,&quot;icon&quot;:&quot;chart&quot;,&quot;avatar_shape&quot;:&quot;rect&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/value_stream_analytics&quot;,&quot;is_active&quot;:false,&quot;items&quot;:[{&quot;id&quot;:&quot;cycle_analytics&quot;,&quot;title&quot;:&quot;Value stream analytics&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/value_stream_analytics&quot;,&quot;link_classes&quot;:&quot;shortcuts-project-cycle-analytics&quot;,&quot;is_active&quot;:false},{&quot;id&quot;:&quot;contributors&quot;,&quot;title&quot;:&quot;Contributor analytics&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/graphs/main?ref_type=heads&quot;,&quot;is_active&quot;:false},{&quot;id&quot;:&quot;ci_cd_analytics&quot;,&quot;title&quot;:&quot;CI/CD analytics&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/pipelines/charts&quot;,&quot;is_active&quot;:false},{&quot;id&quot;:&quot;repository_analytics&quot;,&quot;title&quot;:&quot;Repository analytics&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/graphs/main/charts&quot;,&quot;link_classes&quot;:&quot;shortcuts-repository-charts&quot;,&quot;is_active&quot;:false},{&quot;id&quot;:&quot;model_experiments&quot;,&quot;title&quot;:&quot;Model experiments&quot;,&quot;link&quot;:&quot;/World/Phosh/phosh/-/ml/experiments&quot;,&quot;is_active&quot;:false}],&quot;separated&quot;:false}],&quot;current_context_header&quot;:&quot;Project&quot;,&quot;support_path&quot;:&quot;https://about.gitlab.com/get-help/&quot;,&quot;docs_path&quot;:&quot;/help/docs&quot;,&quot;display_whats_new&quot;:false,&quot;show_version_check&quot;:null,&quot;search&quot;:{&quot;search_path&quot;:&quot;/search&quot;,&quot;issues_path&quot;:&quot;/dashboard/issues&quot;,&quot;mr_path&quot;:&quot;/dashboard/merge_requests&quot;,&quot;autocomplete_path&quot;:&quot;/search/autocomplete&quot;,&quot;settings_path&quot;:&quot;/search/settings&quot;,&quot;search_context&quot;:{&quot;group&quot;:{&quot;id&quot;:61154,&quot;name&quot;:&quot;Phosh&quot;,&quot;full_name&quot;:&quot;World / Phosh&quot;},&quot;group_metadata&quot;:{&quot;issues_path&quot;:&quot;/groups/World/Phosh/-/issues&quot;,&quot;mr_path&quot;:&quot;/groups/World/Phosh/-/merge_requests&quot;},&quot;project&quot;:{&quot;id&quot;:16747,&quot;name&quot;:&quot;phosh&quot;},&quot;project_metadata&quot;:{&quot;mr_path&quot;:&quot;/World/Phosh/phosh/-/merge_requests&quot;,&quot;issues_path&quot;:&quot;/World/Phosh/phosh/-/issues&quot;},&quot;code_search&quot;:false,&quot;scope&quot;:&quot;merge_requests&quot;,&quot;for_snippets&quot;:null}},&quot;panel_type&quot;:&quot;project&quot;,&quot;shortcut_links&quot;:[{&quot;title&quot;:&quot;Snippets&quot;,&quot;href&quot;:&quot;/explore/snippets&quot;,&quot;css_class&quot;:&quot;dashboard-shortcuts-snippets&quot;},{&quot;title&quot;:&quot;Groups&quot;,&quot;href&quot;:&quot;/explore/groups&quot;,&quot;css_class&quot;:&quot;dashboard-shortcuts-groups&quot;},{&quot;title&quot;:&quot;Projects&quot;,&quot;href&quot;:&quot;/explore/projects/starred&quot;,&quot;css_class&quot;:&quot;dashboard-shortcuts-projects&quot;}],&quot;terms&quot;:&quot;/-/users/terms&quot;}"></aside> <div class="content-wrapper"> <div class="broadcast-wrapper"> </div> <div class="alert-wrapper alert-wrapper-top-space gl-flex gl-flex-col gl-gap-3 container-fluid container-limited"> <div class="gl-alert gl-alert-danger gl-alert-not-dismissible" role="alert"> <div class="gl-alert-icon-container"> <svg class="s16 gl-alert-icon gl-alert-icon-no-title" data-testid="error-icon"><use href="/assets/icons-aa2c8ddf99d22b77153ca2bb092a23889c12c597fc8b8de94b0f730eb53513f6.svg#error"></use></svg> </div> <div class="gl-alert-content" role="alert"> <div class="gl-alert-body"> GitLab may not work properly, because you are using an outdated web browser. <br> Please install a <a target="_blank" rel="noopener noreferrer" href="/help/install/requirements.md#supported-web-browsers">supported web browser</a> for a better experience. </div> </div> </div> </div> <div class="top-bar-fixed container-fluid" data-testid="top-bar"> <div class="top-bar-container gl-flex gl-items-center gl-gap-2"> <div class="gl-grow gl-basis-0 gl-flex gl-items-center gl-justify-start gl-gap-3"> <button class="gl-button btn btn-icon btn-md btn-default btn-default-tertiary js-super-sidebar-toggle-expand super-sidebar-toggle -gl-ml-3" aria-controls="super-sidebar" aria-expanded="false" aria-label="Primary navigation sidebar" type="button"><svg class="s16 gl-icon gl-button-icon " data-testid="sidebar-icon"><use href="/assets/icons-aa2c8ddf99d22b77153ca2bb092a23889c12c597fc8b8de94b0f730eb53513f6.svg#sidebar"></use></svg> </button> <script type="application/ld+json"> {"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"World","item":"https://gitlab.gnome.org/World"},{"@type":"ListItem","position":2,"name":"Phosh","item":"https://gitlab.gnome.org/World/Phosh"},{"@type":"ListItem","position":3,"name":"phosh","item":"https://gitlab.gnome.org/World/Phosh/phosh"},{"@type":"ListItem","position":4,"name":"Merge requests","item":"https://gitlab.gnome.org/World/Phosh/phosh/-/merge_requests"},{"@type":"ListItem","position":5,"name":"!1632","item":"https://gitlab.gnome.org/World/Phosh/phosh/-/merge_requests/1632"}]} </script> <div data-testid="breadcrumb-links" id="js-vue-page-breadcrumbs-wrapper"> <div data-breadcrumbs-json="[{&quot;text&quot;:&quot;World&quot;,&quot;href&quot;:&quot;/World&quot;,&quot;avatarPath&quot;:null},{&quot;text&quot;:&quot;Phosh&quot;,&quot;href&quot;:&quot;/World/Phosh&quot;,&quot;avatarPath&quot;:&quot;/uploads/-/system/group/avatar/61154/phosh-emoji.png&quot;},{&quot;text&quot;:&quot;phosh&quot;,&quot;href&quot;:&quot;/World/Phosh/phosh&quot;,&quot;avatarPath&quot;:&quot;/uploads/-/system/project/avatar/16747/phosh.png&quot;},{&quot;text&quot;:&quot;Merge requests&quot;,&quot;href&quot;:&quot;/World/Phosh/phosh/-/merge_requests&quot;,&quot;avatarPath&quot;:null},{&quot;text&quot;:&quot;!1632&quot;,&quot;href&quot;:&quot;/World/Phosh/phosh/-/merge_requests/1632&quot;,&quot;avatarPath&quot;:null}]" id="js-vue-page-breadcrumbs"></div> <div id="js-injected-page-breadcrumbs"></div> </div> </div> <div class="gl-flex-none gl-flex gl-items-center gl-justify-center"> <div id="js-advanced-search-modal"></div> </div> <div class="gl-grow gl-basis-0 gl-flex gl-items-center gl-justify-end"> <div id="js-work-item-feedback"></div> </div> </div> </div> <div class="container-fluid container-limited project-highlight-puc"> <main class="content" id="content-body" itemscope itemtype="http://schema.org/SoftwareSourceCode"> <div class="flash-container flash-container-page sticky" data-testid="flash-container"> <div id="js-global-alerts"></div> </div> <div class="merge-request" data-lock-version="1" data-mr-action="show" data-project-path="/World/Phosh/phosh" data-url="/World/Phosh/phosh/-/merge_requests/1632.json"> <div class="detail-page-header border-bottom-0 gl-block gl-pt-5 gl-gap-4 sm:!gl-flex is-merge-request"> <div class="detail-page-header-body"> <h1 class="title gl-heading-1 gl-block gl-grow gl-break-anywhere !gl-m-0" data-testid="title-content"> Move away from `GtkContainer` APIs </h1> <div> <button class="gl-button btn btn-icon btn-md btn-default btn-icon gl-float-right gl-block gutter-toggle issuable-gutter-toggle js-sidebar-toggle sm:!gl-hidden" type="button"><svg class="s16 gl-icon gl-button-icon " data-testid="chevron-double-lg-left-icon"><use href="/assets/icons-aa2c8ddf99d22b77153ca2bb092a23889c12c597fc8b8de94b0f730eb53513f6.svg#chevron-double-lg-left"></use></svg> </button> </div> </div> <div class="detail-page-header-actions gl-self-start is-merge-request js-issuable-actions gl-flex gl-mt-1"> <div class="gl-flex gl-flex-col sm:gl-flex-row gl-gap-3 gl-w-full sm:gl-w-auto gl-mt-2 sm:gl-mt-0"> <div class="sm:gl-ml-3 dropdown gl-dropdown"> <div data-can-merge="false" data-is-fork="true" data-reviewing-docs-path="/help/user/project/merge_requests/merge_request_troubleshooting.md#check-out-merge-requests-locally-through-the-head-ref" data-source-branch="decontainer" data-source-project-default-url="https://gitlab.gnome.org/arun-mani-j/phosh.git" data-source-project-full-path="arun-mani-j/phosh" data-source-project-path="phosh" data-target-branch="main" id="js-check-out-modal"></div> <button class="gl-button btn btn-md btn-confirm gl-flex gl-self-start gl-w-full sm:gl-w-auto !gl-pr-3" data-toggle="dropdown" data-testid="mr-code-dropdown" type="button"><span class="gl-button-text gl-inline-flex gl-justify-between gl-w-full"> Code <svg class="s16 gl-icon gl-ml-2 !gl-mr-0" data-testid="chevron-down-icon"><use href="/assets/icons-aa2c8ddf99d22b77153ca2bb092a23889c12c597fc8b8de94b0f730eb53513f6.svg#chevron-down"></use></svg> </span> </button><div class="dropdown-menu dropdown-menu-right"> <div class="gl-dropdown-inner"> <div class="gl-dropdown-contents"> <ul> <li class="gl-dropdown-section-header"> <header class="dropdown-header"> Review changes </header> </li> <li class="gl-dropdown-item"> <button class="dropdown-item js-check-out-modal-trigger" type="button"> <div class="gl-dropdown-item-text-wrapper"> Check out branch </div> </button> </li> <li class="gl-dropdown-divider"> <hr class="dropdown-divider"> </li> <li class="gl-dropdown-section-header"> <header class="dropdown-header"> Download </header> </li> <li class="gl-dropdown-item"> <a class="dropdown-item" download="" data-testid="download-email-patches-menu-item" href="/World/Phosh/phosh/-/merge_requests/1632.patch"><div class="gl-dropdown-item-text-wrapper"> Patches </div> </a></li> <li class="gl-dropdown-item"> <a class="dropdown-item" download="" data-testid="download-plain-diff-menu-item" href="/World/Phosh/phosh/-/merge_requests/1632.diff"><div class="gl-dropdown-item-text-wrapper"> Plain diff </div> </a></li> </ul> </div> </div> </div> </div> </div> </div> </div> <div data-data="{&quot;iid&quot;:1632,&quot;defaultBranchName&quot;:&quot;main&quot;,&quot;projectPath&quot;:&quot;World/Phosh/phosh&quot;,&quot;sourceProjectPath&quot;:&quot;arun-mani-j/phosh&quot;,&quot;title&quot;:&quot;Move away from `GtkContainer` APIs&quot;,&quot;isFluidLayout&quot;:&quot;&quot;,&quot;blocksMerge&quot;:&quot;false&quot;,&quot;imported&quot;:&quot;false&quot;,&quot;tabs&quot;:[[&quot;show&quot;,&quot;Overview&quot;,&quot;/World/Phosh/phosh/-/merge_requests/1632&quot;,40],[&quot;commits&quot;,&quot;Commits&quot;,&quot;/World/Phosh/phosh/-/merge_requests/1632/commits&quot;,16],[&quot;pipelines&quot;,&quot;Pipelines&quot;,&quot;/World/Phosh/phosh/-/merge_requests/1632/pipelines&quot;,20],[&quot;diffs&quot;,&quot;Changes&quot;,&quot;/World/Phosh/phosh/-/merge_requests/1632/diffs&quot;,&quot;33&quot;]]}" id="js-merge-sticky-header"></div> <div class="merge-request-details issuable-details" data-id="16747"> <div class="detail-page-description gl-pt-2 gl-pb-4 gl-flex gl-items-baseline gl-flex-wrap gl-text-subtle is-merge-request"> <div class="js-mr-header" data-hidden="false" data-iid="1632" data-imported="false" data-project-path="World/Phosh/phosh" data-state="merged"></div> <a class="author-link gl-font-bold gl-mr-2 js-user-link" data-user-id="122379" data-username="arun-mani-j" data-name="Arun Mani J" data-testid="author-link" href="/arun-mani-j"><span class="author">Arun Mani J</span></a> requested to merge <a title="arun-mani-j/phosh:decontainer" class="ref-container gl-inline-block gl-truncate gl-max-w-26 gl-ml-2" href="/arun-mani-j/phosh/-/tree/decontainer"><span class="gl-align-middle -gl-mr-2 has-tooltip" title="The source project is a fork"><svg class="s12 gl-ml-1 has-tooltip" data-testid="fork-icon"><use href="/assets/icons-aa2c8ddf99d22b77153ca2bb092a23889c12c597fc8b8de94b0f730eb53513f6.svg#fork"></use></svg></span> arun-mani-j/phosh:decontainer</a> <button class="gl-button btn btn-icon btn-sm btn-default btn-default-tertiary !gl-hidden md:!gl-inline-block gl-mx-1 js-source-branch-copy" title="Copy branch name &lt;kbd class=&#39;flat ml-1&#39; aria-hidden=true&gt;b&lt;/kbd&gt;" aria-keyshortcuts="b" aria-label="Copy branch name" aria-live="polite" data-toggle="tooltip" data-placement="bottom" data-container="body" data-html="true" data-clipboard-text="decontainer" type="button"><svg class="s16 gl-icon gl-button-icon " data-testid="copy-to-clipboard-icon"><use href="/assets/icons-aa2c8ddf99d22b77153ca2bb092a23889c12c597fc8b8de94b0f730eb53513f6.svg#copy-to-clipboard"></use></svg> </button> into <a title="main" class="ref-container gl-inline-block gl-truncate gl-max-w-26 gl-mx-2" href="/World/Phosh/phosh/-/tree/main">main</a> <time class="js-timeago gl-inline-block" title="Feb 5, 2025 11:28am" datetime="2025-02-05T11:28:53Z" tabindex="0" aria-label="Feb 5, 2025 11:28am" data-toggle="tooltip" data-placement="top" data-container="body">Feb 05, 2025</time> </div> <div class="gl-static merge-request-tabs-holder js-tabs-affix"> <div class="merge-request-tabs-container gl-flex gl-justify-between is-merge-request"> <ul class="merge-request-tabs nav-tabs nav nav-links gl-flex gl-flex-nowrap gl-m-0 gl-p-0 gl-w-full lg:gl-w-auto"> <li class="notes-tab active" data-testid="notes-tab"> <a data-action="show" data-target="#notes" data-toggle="tabvue" href="/World/Phosh/phosh/-/merge_requests/1632">Overview <span class="gl-badge badge badge-pill badge-muted js-discussions-count"><span class="gl-badge-content">40</span></span> </a> </li> <li class="commits-tab" data-testid="commits-tab"> <a data-action="commits" data-target="#commits" data-toggle="tabvue" href="/World/Phosh/phosh/-/merge_requests/1632/commits">Commits <span class="gl-badge badge badge-pill badge-muted js-commits-count"><span class="gl-badge-content">16</span></span> </a> </li> <li class="pipelines-tab"> <a data-action="pipelines" data-target="#pipelines" data-toggle="tabvue" href="/World/Phosh/phosh/-/merge_requests/1632/pipelines">Pipelines <span class="gl-badge badge badge-pill badge-muted js-pipelines-mr-count"><span class="gl-badge-content">20</span></span> </a> </li> <li class="diffs-tab js-diffs-tab" data-testid="diffs-tab" id="diffs-tab"> <a data-action="diffs" data-target="#diffs" data-toggle="tabvue" href="/World/Phosh/phosh/-/merge_requests/1632/diffs">Changes <span class="gl-badge badge badge-pill badge-muted js-changes-tab-count" data-gid="gid://gitlab/MergeRequest/105274"><span class="gl-badge-content">33</span></span> </a> </li> </ul> <div class="gl-flex gl-flex-wrap gl-items-center justify-content-lg-end"> <div data-blocks-merge="false" id="js-vue-discussion-counter"></div> <div class="gl-ml-auto gl-items-center gl-hidden sm:gl-flex lg:gl-hidden gl-ml-3 js-expand-sidebar gl-absolute gl-right-5"> <button class="gl-button btn btn-md btn-default js-sidebar-toggle" type="button"><svg class="s16 gl-icon gl-button-icon " data-testid="chevron-double-lg-left-icon"><use href="/assets/icons-aa2c8ddf99d22b77153ca2bb092a23889c12c597fc8b8de94b0f730eb53513f6.svg#chevron-double-lg-left"></use></svg> <span class="gl-button-text"> Expand </span> </button></div> </div> </div> </div> <div class="tab-content" id="diff-notes-app"> <div id="js-diff-file-finder"> <div id="js-code-navigation"></div> </div> <div class="tab-pane notes voting_notes" id="notes" style="display: block"> <div class="merge-request-overview"> <section> <div class="issuable-discussion js-vue-notes-event"> <div class="detail-page-description gl-pb-0"> <div> <div class="description !gl-mt-4 " data-testid="description-content"> <div class="md"> <p data-sourcepos="1:1-1:105" dir="auto">In GTK 4, there is no <code data-sourcepos="1:24-1:35">GtkContainer</code>. Instead, the widgets with children are grouped into two categories.</p>&#x000A;<ol data-sourcepos="2:1-4:0" dir="auto">&#x000A;<li data-sourcepos="2:1-2:58">Single-child widgets like <code data-sourcepos="2:31-2:39">GtkButton</code>, <code data-sourcepos="2:44-2:56">AdwStatusPage</code>.</li>&#x000A;<li data-sourcepos="3:1-4:0">Multi-children widgets like <code data-sourcepos="3:33-3:38">GtkBox</code>.</li>&#x000A;</ol>&#x000A;<p data-sourcepos="5:1-5:149" dir="auto">For the first case, GTK has moved to the style of exposing the child as properties. This way, they are now put inside <code data-sourcepos="5:120-5:129">&lt;property&gt;</code> slots of UI files.</p>&#x000A;<p data-sourcepos="7:1-7:180" dir="auto">For the second case, the widgets are expected to provide methods to add and remove children. To add them through UI files, the widget has to implement the <code data-sourcepos="7:157-7:168">GtkBuildable</code> interface.</p>&#x000A;<p data-sourcepos="9:1-9:405" dir="auto">Since there is no <code data-sourcepos="9:20-9:31">GtkContainer</code>, we have to provide methods to add and remove children anyway. This is the first goal of this MR. If A is a container and is used by Xs widgets, then we want all of those Xs to use A's method to add and remove children. This way, when we are doing the actual GTK 4 move, we need to touch only A's code and all other Xs will be left untouched. Thus easy to review and test.</p>&#x000A;<p data-sourcepos="11:1-11:494" dir="auto">In Phosh, most of the parent widgets belong to single-child widgets. So to stay in consistency with GTK 4 style and be future-proof, I think it's good we adapt this style too. Propertifying child widgets also reduces the code complexity (of now and edge-cases we are yet to see in GTK 4), as we longer no need to hijack base class's add and remove methods to separate internal children and public child. Also with GTK now moving towards composition over inheritance, I think this is a safe bet.</p>&#x000A;<p data-sourcepos="13:1-13:128" dir="auto">This MR initially migrates the quick-settings section. Based on feedback and suggestions, I will expand it to other widgets too.</p>&#x000A;<p data-sourcepos="15:1-15:22" dir="auto">CC: <a href="/guidog" data-reference-type="user" data-user="1029" data-container="body" data-placement="top" class="gfm gfm-project_member js-user-link" title="Guido G眉nther">@guidog</a> <a href="/gautham_x" data-reference-type="user" data-user="81123" data-container="body" data-placement="top" class="gfm gfm-project_member js-user-link" title="Gotam Gorabh">@gautham_x</a></p> </div> <textarea class="hidden js-task-list-field" data-value="In GTK 4, there is no `GtkContainer`. Instead, the widgets with children are grouped into two categories. 1. Single-child widgets like `GtkButton`, `AdwStatusPage`. 2. Multi-children widgets like `GtkBox`. For the first case, GTK has moved to the style of exposing the child as properties. This way, they are now put inside `&lt;property&gt;` slots of UI files. For the second case, the widgets are expected to provide methods to add and remove children. To add them through UI files, the widget has to implement the `GtkBuildable` interface. Since there is no `GtkContainer`, we have to provide methods to add and remove children anyway. This is the first goal of this MR. If A is a container and is used by Xs widgets, then we want all of those Xs to use A&#39;s method to add and remove children. This way, when we are doing the actual GTK 4 move, we need to touch only A&#39;s code and all other Xs will be left untouched. Thus easy to review and test. In Phosh, most of the parent widgets belong to single-child widgets. So to stay in consistency with GTK 4 style and be future-proof, I think it&#39;s good we adapt this style too. Propertifying child widgets also reduces the code complexity (of now and edge-cases we are yet to see in GTK 4), as we longer no need to hijack base class&#39;s add and remove methods to separate internal children and public child. Also with GTK now moving towards composition over inheritance, I think this is a safe bet. This MR initially migrates the quick-settings section. Based on feedback and suggestions, I will expand it to other widgets too. CC: @guidog @gautham_x"></textarea> </div> </div> </div> <div class="emoji-block emoji-list-container js-noteable-awards"> <div class="gl-flex gl-flex-wrap gl-justify-between gl-pt-3"> <div data-can-award-emoji="false" data-path="/api/v4/projects/16747/merge_requests/1632/award_emoji" data-show-default-award-emojis="true" id="js-vue-awards-block"></div> </div> </div> <div class="js-verification-alert" data-identity-verification-required="false"></div> <script> //<![CDATA[ window.gl = window.gl || {}; window.gl.mrWidgetData = {"id":105274,"iid":1632,"source_project_full_path":"arun-mani-j/phosh","target_project_full_path":"World/Phosh/phosh","can_create_pipeline_in_target_project":false,"email_patches_path":"/World/Phosh/phosh/-/merge_requests/1632.patch","plain_diff_path":"/World/Phosh/phosh/-/merge_requests/1632.diff","merge_request_basic_path":"/World/Phosh/phosh/-/merge_requests/1632.json?serializer=basic","merge_request_widget_path":"/World/Phosh/phosh/-/merge_requests/1632/widget.json","merge_request_cached_widget_path":"/World/Phosh/phosh/-/merge_requests/1632/cached_widget.json","commit_change_content_path":"/World/Phosh/phosh/-/merge_requests/1632/commit_change_content","conflicts_docs_path":"/help/user/project/merge_requests/conflicts.md","reviewing_and_managing_merge_requests_docs_path":"/help/user/project/merge_requests/merge_request_troubleshooting.md#check-out-merge-requests-locally-through-the-head-ref","merge_request_pipelines_docs_path":"/help/ci/pipelines/merge_request_pipelines.md","ci_environments_status_path":"/World/Phosh/phosh/-/merge_requests/1632/ci_environments_status","user_callouts_path":"/-/users/callouts","suggest_pipeline_feature_id":"suggest_pipeline","migrate_jenkins_feature_id":"migrate_from_jenkins_banner","is_dismissed_suggest_pipeline":true,"is_dismissed_jenkins_migration":true,"human_access":null,"new_project_pipeline_path":"/World/Phosh/phosh/-/pipelines/new","source_project_default_url":"https://gitlab.gnome.org/arun-mani-j/phosh.git","issues_links":{"assign_to_closing":"/World/Phosh/phosh/-/merge_requests/1632/assign_related_issues","assign_to_closing_count":0,"closing":"","closing_count":0,"mentioned_but_not_closing":"","mentioned_count":0},"security_reports_docs_path":"/help/user/application_security/detect/security_scan_results.md#merge-request","enabled_reports":{"sast":false,"secret_detection":false},"show_gitpod_button":false,"gitpod_url":null,"gitpod_enabled":false} window.gl.mrWidgetData.artifacts_endpoint = '/World/Phosh/phosh/-/pipelines/:pipeline_artifacts_id/downloadable_artifacts.json'; window.gl.mrWidgetData.artifacts_endpoint_placeholder = ':pipeline_artifacts_id'; window.gl.mrWidgetData.pipeline_etag = '/api/graphql:pipelines/sha/199649381e32f01af441f70af8fd713d71abf8f4'; window.gl.mrWidgetData.squash_before_merge_help_path = '/help/user/project/merge_requests/squash_and_merge.md'; window.gl.mrWidgetData.ci_troubleshooting_docs_path = '/help/ci/debugging.md'; window.gl.mrWidgetData.mr_troubleshooting_docs_path = '/help/user/project/merge_requests/reviews/_index.md#troubleshooting'; window.gl.mrWidgetData.pipeline_must_succeed_docs_path = '/help/user/project/merge_requests/merge_when_pipeline_succeeds.md#require-a-successful-pipeline-for-merge'; window.gl.mrWidgetData.code_coverage_check_help_page_path = '/help/ci/testing/code_coverage/_index.md#add-a-coverage-check-approval-rule'; window.gl.mrWidgetData.security_configuration_path = '/World/Phosh/phosh/-/security/configuration'; window.gl.mrWidgetData.license_compliance_docs_path = '/help/user/compliance/license_scanning_of_cyclonedx_files/_index.md'; window.gl.mrWidgetData.eligible_approvers_docs_path = '/help/user/project/merge_requests/approvals/rules.md#eligible-approvers'; window.gl.mrWidgetData.approvals_help_path = '/help/user/project/merge_requests/approvals/_index.md'; window.gl.mrWidgetData.codequality_help_path = '/help/ci/testing/code_quality.md#code-quality-reports'; window.gl.mrWidgetData.false_positive_doc_url = '/help/user/application_security/vulnerabilities/_index.md'; window.gl.mrWidgetData.can_view_false_positive = 'false'; window.gl.mrWidgetData.user_preferences_gitpod_path = '/-/profile/preferences#user_gitpod_enabled'; window.gl.mrWidgetData.user_profile_enable_gitpod_path = '/-/user_settings/profile?user%5Bgitpod_enabled%5D=true'; window.gl.mrWidgetData.saml_approval_path = window.gl.mrWidgetData.saml_approval_path //]]> </script><h2 class="gl-sr-only" id="merge-request-widgets-heading"> Merge request reports </h2> <div aria-labelledby="merge-request-widgets-heading" class="mr-widget" id="js-vue-mr-widget" role="region"></div> <div data-current-user-data="null" data-endpoint-metadata="/World/Phosh/phosh/-/merge_requests/1632/diffs_metadata.json?diff_head=true&amp;view=inline&amp;w=1" data-help-page-path="/help/user/project/merge_requests/reviews/suggestions.md" data-is-locked="" data-new-comment-template-paths="[{&quot;text&quot;:&quot;Your comment templates&quot;,&quot;href&quot;:&quot;/-/profile/comment_templates&quot;}]" data-noteable-data="{&quot;id&quot;:105274,&quot;iid&quot;:1632,&quot;description&quot;:&quot;In GTK 4, there is no `GtkContainer`. Instead, the widgets with children are grouped into two categories.\n1. Single-child widgets like `GtkButton`, `AdwStatusPage`.\n2. Multi-children widgets like `GtkBox`.\n\nFor the first case, GTK has moved to the style of exposing the child as properties. This way, they are now put inside `\u003cproperty\u003e` slots of UI files.\n\nFor the second case, the widgets are expected to provide methods to add and remove children. To add them through UI files, the widget has to implement the `GtkBuildable` interface.\n\nSince there is no `GtkContainer`, we have to provide methods to add and remove children anyway. This is the first goal of this MR. If A is a container and is used by Xs widgets, then we want all of those Xs to use A&#39;s method to add and remove children. This way, when we are doing the actual GTK 4 move, we need to touch only A&#39;s code and all other Xs will be left untouched. Thus easy to review and test.\n\nIn Phosh, most of the parent widgets belong to single-child widgets. So to stay in consistency with GTK 4 style and be future-proof, I think it&#39;s good we adapt this style too. Propertifying child widgets also reduces the code complexity (of now and edge-cases we are yet to see in GTK 4), as we longer no need to hijack base class&#39;s add and remove methods to separate internal children and public child. Also with GTK now moving towards composition over inheritance, I think this is a safe bet.\n\nThis MR initially migrates the quick-settings section. Based on feedback and suggestions, I will expand it to other widgets too.\n\nCC: @guidog @gautham_x&quot;,&quot;title&quot;:&quot;Move away from `GtkContainer` APIs&quot;,&quot;merge_params&quot;:{&quot;force_remove_source_branch&quot;:&quot;1&quot;},&quot;state&quot;:&quot;merged&quot;,&quot;source_branch&quot;:&quot;decontainer&quot;,&quot;target_branch&quot;:&quot;main&quot;,&quot;source_branch_path&quot;:&quot;/arun-mani-j/phosh/-/tree/decontainer&quot;,&quot;target_branch_path&quot;:&quot;/World/Phosh/phosh/-/tree/main&quot;,&quot;diff_head_sha&quot;:&quot;199649381e32f01af441f70af8fd713d71abf8f4&quot;,&quot;create_note_path&quot;:&quot;/World/Phosh/phosh/notes?target_id=105274\u0026target_type=merge_request&quot;,&quot;preview_note_path&quot;:&quot;/World/Phosh/phosh/-/preview_markdown?target_id=1632\u0026target_type=MergeRequest&quot;,&quot;can_receive_suggestion&quot;:true,&quot;create_issue_to_resolve_discussions_path&quot;:null,&quot;new_blob_path&quot;:null,&quot;current_user&quot;:{&quot;can_create_note&quot;:false,&quot;can_update&quot;:false,&quot;can_create_confidential_note&quot;:false},&quot;is_project_archived&quot;:false,&quot;project_id&quot;:16747}" data-noteable-type="MergeRequest" data-notes-data="{&quot;noteableType&quot;:&quot;merge_request&quot;,&quot;noteableId&quot;:105274,&quot;projectId&quot;:16747,&quot;groupId&quot;:null,&quot;discussionsPath&quot;:&quot;/World/Phosh/phosh/-/merge_requests/1632/discussions.json&quot;,&quot;registerPath&quot;:&quot;/users/sign_up?redirect_to_referer=yes&quot;,&quot;newSessionPath&quot;:&quot;/users/sign_in?redirect_to_referer=yes&quot;,&quot;markdownDocsPath&quot;:&quot;/help/user/markdown.md&quot;,&quot;quickActionsDocsPath&quot;:&quot;/help/user/project/quick_actions.md&quot;,&quot;closePath&quot;:&quot;/World/Phosh/phosh/-/merge_requests/1632?merge_request%5Bstate_event%5D=close&quot;,&quot;reopenPath&quot;:&quot;/World/Phosh/phosh/-/merge_requests/1632?merge_request%5Bstate_event%5D=reopen&quot;,&quot;notesPath&quot;:&quot;/World/Phosh/phosh/noteable/merge_request/105274/notes&quot;,&quot;prerenderedNotesCount&quot;:10,&quot;lastFetchedAt&quot;:1743281206000000,&quot;notesFilter&quot;:null,&quot;draftsPath&quot;:&quot;/World/Phosh/phosh/-/merge_requests/1632/drafts&quot;,&quot;draftsPublishPath&quot;:&quot;/World/Phosh/phosh/-/merge_requests/1632/drafts/publish&quot;,&quot;draftsDiscardPath&quot;:&quot;/World/Phosh/phosh/-/merge_requests/1632/drafts/discard&quot;}" data-notes-filters="{&quot;Show all activity&quot;:0,&quot;Show comments only&quot;:1,&quot;Show history only&quot;:2}" data-report-abuse-path="/-/abuse_reports/add_category" data-target-type="merge_request" id="js-vue-mr-discussions"></div> </div> </section> <aside aria-label="merge_request" aria-live="polite" class="right-sidebar js-right-sidebar js-issuable-sidebar right-sidebar-expanded right-sidebar-merge-requests right-sidebar-collapsed" data-always-show-toggle data-auto-collapse data-issuable-type="merge_request"> <div class="issuable-sidebar is-merge-request"> <div class="issuable-sidebar-header md:gl-flex lg:!gl-hidden gl-justify-end"> <button class="gl-button btn btn-md btn-default gutter-toggle gl-float-right js-sidebar-toggle has-tooltip !gl-border-0" type="button" aria-label="Toggle sidebar" title="Collapse sidebar" data-container="body" data-placement="left" data-boundary="viewport" type="button"><span class="gl-button-text"> <span class="js-sidebar-toggle-container gl-button-text" data-is-expanded="true"><svg class="s16 js-sidebar-expand hidden" data-testid="chevron-double-lg-left-icon"><use href="/assets/icons-aa2c8ddf99d22b77153ca2bb092a23889c12c597fc8b8de94b0f730eb53513f6.svg#chevron-double-lg-left"></use></svg><svg class="s16 js-sidebar-collapse " data-testid="chevron-double-lg-right-icon"><use href="/assets/icons-aa2c8ddf99d22b77153ca2bb092a23889c12c597fc8b8de94b0f730eb53513f6.svg#chevron-double-lg-right"></use></svg></span> </span> </button></div> <form class="issuable-context-form inline-update js-issuable-update !gl-pr-2" action="/World/Phosh/phosh/-/merge_requests/1632.json" accept-charset="UTF-8" data-remote="true" method="post"><div class="block assignee gl-mt-3" data-testid="assignee-block-container"> <div class="js-sidebar-assignees-root" data-field="merge_request" data-max-assignees="1"> <div class="title hide-collapsed gl-flex gl-justify-between gl-items-center !gl-mb-0"> <span class="gl-font-bold">Assignee</span> <span class="gl-spinner-container" role="status"><span aria-hidden class="gl-spinner gl-spinner-sm gl-spinner-dark !gl-align-text-bottom"></span><span class="gl-sr-only !gl-absolute">Loading</span> </span> </div> </div> </div> <div class="block reviewer" data-testid="reviewers-block-container"> <div class="js-sidebar-reviewers-root" data-field="merge_request"> <div class="title hide-collapsed gl-flex gl-justify-between gl-items-center !gl-mb-0"> <span class="gl-font-bold">Reviewers</span> <span class="gl-spinner-container" role="status"><span aria-hidden class="gl-spinner gl-spinner-sm gl-spinner-dark !gl-align-text-bottom"></span><span class="gl-sr-only !gl-absolute">Loading</span> </span> </div> </div> <div class="selectbox hide-collapsed"> <div class="js-reviewers-inputs"></div> <div class="dropdown "><button class="dropdown-menu-toggle js-reviewer-search js-author-search js-multiselect js-save-user-data" type="button" data-current-user="true" data-iid="1632" data-issuable-type="merge_request" data-project-id="16747" data-author-id="122379" data-field-name="merge_request[reviewer_ids][]" data-issue-update="/World/Phosh/phosh/-/merge_requests/1632.json" data-ability-name="merge_request" data-null-user="true" data-display="static" data-multi-select="true" data-dropdown-title="Request review from" data-dropdown-header="Reviewer" data-max-select="1" data-toggle="dropdown"><span class="dropdown-toggle-text ">Request review from</span><svg class="s16 dropdown-menu-toggle-icon" data-testid="chevron-down-icon"><use href="/assets/icons-aa2c8ddf99d22b77153ca2bb092a23889c12c597fc8b8de94b0f730eb53513f6.svg#chevron-down"></use></svg></button><div class="dropdown-menu dropdown-select dropdown-menu-user dropdown-menu-selectable dropdown-menu-author"><div class="dropdown-title gl-flex"><span class="gl-ml-auto">Request review from</span><button class="dropdown-title-button dropdown-menu-close gl-ml-auto" aria-label="Close" type="button"><svg class="s16 dropdown-menu-close-icon" data-testid="close-icon"><use href="/assets/icons-aa2c8ddf99d22b77153ca2bb092a23889c12c597fc8b8de94b0f730eb53513f6.svg#close"></use></svg></button></div><div class="dropdown-input"><input type="search" data-testid="dropdown-input-field" class="dropdown-input-field" placeholder="Search users" autocomplete="off" /><svg class="s16 dropdown-input-search" data-testid="search-icon"><use href="/assets/icons-aa2c8ddf99d22b77153ca2bb092a23889c12c597fc8b8de94b0f730eb53513f6.svg#search"></use></svg><svg class="s16 dropdown-input-clear js-dropdown-input-clear" data-testid="close-icon"><use href="/assets/icons-aa2c8ddf99d22b77153ca2bb092a23889c12c597fc8b8de94b0f730eb53513f6.svg#close"></use></svg></div><div data-testid="dropdown-list-content" class="dropdown-content "></div><div class="dropdown-loading"><div class="gl-spinner-container gl-mt-7" role="status"><span aria-hidden class="gl-spinner gl-spinner-md gl-spinner-dark !gl-align-text-bottom"></span><span class="gl-sr-only !gl-absolute">Loading</span> </div></div></div></div> </div> </div> <div class="js-sidebar-labels-widget-root" data-allow-label-create="" data-allow-scoped-labels="" data-can-edit="" data-iid="1632" data-issuable-type="merge_request" data-labels-fetch-path="/World/Phosh/phosh/-/labels.json?include_ancestor_groups=true" data-labels-manage-path="/World/Phosh/phosh/-/labels" data-project-issues-path="/World/Phosh/phosh/-/merge_requests" data-project-path="World/Phosh/phosh" data-selected-labels="[]"></div> <div class="block milestone" data-testid="sidebar-milestones"> <div class="js-sidebar-milestone-widget-root" data-can-edit="" data-issue-iid="1632" data-project-path="World/Phosh/phosh"></div> </div> <div class="js-sidebar-time-tracking-root block"> <!-- / Fallback while content is loading --> <div class="title hide-collapsed gl-flex gl-justify-between gl-items-center !gl-mb-0"> <span class="gl-font-bold">Time tracking</span> <span class="gl-spinner-container" role="status"><span aria-hidden class="gl-spinner gl-spinner-sm gl-spinner-dark !gl-align-text-bottom"></span><span class="gl-sr-only !gl-absolute">Loading</span> </span> </div> </div> <div class="js-sidebar-participants-widget-root"></div> </form><script class="js-sidebar-options" type="application/json">{"endpoint":"/World/Phosh/phosh/-/merge_requests/1632.json?serializer=sidebar_extras","toggleSubscriptionEndpoint":"/World/Phosh/phosh/-/merge_requests/1632/toggle_subscription","moveIssueEndpoint":"/World/Phosh/phosh/-/issues/1632/move","projectsAutocompleteEndpoint":"/-/autocomplete/projects?project_id=16747","editable":"","currentUser":null,"rootPath":"/","fullPath":"World/Phosh/phosh","iid":1632,"id":105274,"severity":null,"timeTrackingLimitToHours":false,"canCreateTimelogs":null,"createNoteEmail":null,"issuableType":"merge_request","directlyInviteMembers":"false"}</script> </div> </aside> </div> </div> <div class="tab-pane commits" id="commits" style=""> </div> <div class="tab-pane pipelines" id="pipelines" style=""> <div data-artifacts-endpoint="/World/Phosh/phosh/-/pipelines/:pipeline_artifacts_id/downloadable_artifacts.json" data-artifacts-endpoint-placeholder=":pipeline_artifacts_id" data-disable-initialization data-empty-state-svg-path="/assets/illustrations/empty-state/empty-pipeline-md-bf6f4296b1bdb1dae0fdd02ec5177a7c24f0e18f531569cf50d06015b3984d96.svg" data-endpoint="/World/Phosh/phosh/-/merge_requests/1632/pipelines" data-error-state-svg-path="/assets/illustrations/empty-state/empty-job-failed-md-b4806d6a3ab9210aa16b8d78e1c3624e4921fb8f6eaf18ca82398565c84ce7a4.svg" data-full-path="World/Phosh/phosh" data-graphql-path="/api/graphql" data-project-id="16747" id="commit-pipeline-table-view"></div> </div> <div class="tab-pane diffs" data-changes-empty-state-illustration="/assets/illustrations/empty-state/empty-commit-md-4a0bda76f4e3ae630bb48b58a8c2a0c914cc78809b5dc51f206744496bc0f70a.svg" data-current-user-data="null" data-default-suggestion-commit-message="Apply %{suggestions_count} suggestion(s) to %{files_count} file(s) %{co_authored_by}" data-dismiss-endpoint="/-/users/callouts" data-endpoint="/World/Phosh/phosh/-/merge_requests/1632/diffs.json?diff_head=true" data-endpoint-batch="/World/Phosh/phosh/-/merge_requests/1632/diffs_batch.json?diff_head=true" data-endpoint-diff-for-path="/World/Phosh/phosh/-/merge_requests/1632/diff_for_path.json" data-endpoint-metadata="/World/Phosh/phosh/-/merge_requests/1632/diffs_metadata.json?diff_head=true&amp;view=inline&amp;w=1" data-file-by-file-default="" data-help-page-path="/help/user/project/merge_requests/reviews/suggestions.md" data-iid="1632" data-is-fluid-layout="" data-is-forked="false" data-new-comment-template-paths="[{&quot;text&quot;:&quot;Your comment templates&quot;,&quot;href&quot;:&quot;/-/profile/comment_templates&quot;}]" data-per-page="5" data-project-path="/World/Phosh/phosh" data-show-suggest-popover="true" data-show-whitespace-default="true" data-source-project-default-url="https://gitlab.gnome.org/arun-mani-j/phosh.git" data-source-project-full-path="arun-mani-j/phosh" data-update-current-user-path="/api/v4/user/preferences" id="js-diffs-app" style=""> </div> </div> <div class="mr-loading-status"> <div class="loading hide"> <div class="gl-spinner-container" role="status"><span aria-hidden class="gl-spinner gl-spinner-lg gl-spinner-dark !gl-align-text-bottom"></span><span class="gl-sr-only !gl-absolute">Loading</span> </div> </div> </div> </div> </div> <div class="js-revert-commit-modal" data-branch="main" data-branch-collaboration="false" data-branches-endpoint="/World/Phosh/phosh/-/branches" data-endpoint="/World/Phosh/phosh/-/commit/5e1911196e1cb712b221f9a8ad6bf7fa9b6e98e3/revert" data-existing-branch="" data-push-code="false" data-title="Revert this merge request"></div> <div class="js-cherry-pick-commit-modal" data-branch="main" data-branch-collaboration="false" data-branches-endpoint="/World/Phosh/phosh/refs" data-endpoint="/World/Phosh/phosh/-/commit/5e1911196e1cb712b221f9a8ad6bf7fa9b6e98e3/cherry_pick" data-existing-branch="" data-projects="[{&quot;id&quot;:&quot;16747&quot;,&quot;name&quot;:&quot;World/Phosh/phosh&quot;,&quot;refsUrl&quot;:&quot;/World/Phosh/phosh/refs&quot;}]" data-push-code="false" data-target-project-id="16747" data-target-project-name="World/Phosh/phosh" data-title="Cherry-pick this merge request"></div> <div data-new-comment-template-paths="[{&quot;text&quot;:&quot;Your comment templates&quot;,&quot;href&quot;:&quot;/-/profile/comment_templates&quot;}]" id="js-review-bar"></div> <div id="js-reviewer-drawer-portal"></div> <script> //<![CDATA[ window.gl = window.gl || {}; window.gl.webIDEPath = '/-/ide/project/World/Phosh/phosh/edit/' //]]> </script> </main> </div> </div> </div> <script> //<![CDATA[ if ('loading' in HTMLImageElement.prototype) { document.querySelectorAll('img.lazy').forEach(img => { img.loading = 'lazy'; let imgUrl = img.dataset.src; // Only adding width + height for avatars for now if (imgUrl.indexOf('/avatar/') > -1 && imgUrl.indexOf('?') === -1) { const targetWidth = img.getAttribute('width') || img.width; imgUrl += `?width=${targetWidth}`; } img.src = imgUrl; img.removeAttribute('data-src'); img.classList.remove('lazy'); img.classList.add('js-lazy-loaded'); img.dataset.testid = 'js-lazy-loaded-content'; }); } //]]> </script> <script> //<![CDATA[ gl = window.gl || {}; gl.experiments = {}; //]]> </script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10