Compare commits
	
		
			13 Commits
		
	
	
		
			3.34.3
			...
			wip/raresv
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | de814752d6 | ||
|   | c36f006b88 | ||
|   | bf884ae9ea | ||
|   | 7bbff9d0c0 | ||
|   | 04ad2b24d8 | ||
|   | 4ffbec5b75 | ||
|   | d35f2d375b | ||
|   | 235d4b244d | ||
|   | 9a007058ae | ||
|   | 985e53a04e | ||
|   | aed6d466cb | ||
|   | c62e3614d5 | ||
|   | 8dae0b5767 | 
| @@ -1180,14 +1180,19 @@ StScrollBar { | ||||
|  | ||||
| .list-search-result-content { | ||||
|   spacing: 12px; | ||||
|   padding: 12px; } | ||||
|   padding: 2px; } | ||||
|  | ||||
| .list-search-result-title { | ||||
|   font-size: 1.5em; | ||||
|   color: #e2e2df; } | ||||
|  | ||||
| .list-search-result-provider { | ||||
|   color: #e2e2df; | ||||
|   margin-top: 0.24em; } | ||||
|  | ||||
| .list-search-result-description { | ||||
|   color: #cacac4; } | ||||
|   color: #cacac4; | ||||
|   margin-left: 30px; } | ||||
|  | ||||
| .search-provider-icon { | ||||
|   padding: 15px; } | ||||
|   | ||||
 Submodule data/theme/gnome-shell-sass updated: 2bef9b25e2...664cd88ee6
									
								
							| @@ -1171,23 +1171,30 @@ StScrollBar { | ||||
| .list-search-results { | ||||
|   spacing: 3px; } | ||||
|  | ||||
| .list-search-provider-details { | ||||
|   spacing: 3px; | ||||
|   width: 150px; | ||||
|   margin-left: 30px; } | ||||
|  | ||||
| .search-section-separator { | ||||
|   -gradient-height: 1px; | ||||
|   -gradient-start: rgba(255, 255, 255, 0); | ||||
|   -gradient-end: rgba(255, 255, 255, 0.1); | ||||
|   -margin-horizontal: 1.5em; | ||||
|   height: 1px; } | ||||
|   height: 2px; | ||||
|   background-color: rgba(255, 255, 255, 0.2); } | ||||
|  | ||||
| .list-search-result-content { | ||||
|   spacing: 12px; | ||||
|   padding: 12px; } | ||||
|   padding: 2px; } | ||||
|  | ||||
| .list-search-result-title { | ||||
|   font-size: 1.5em; | ||||
|   color: #e2e2df; } | ||||
|  | ||||
| .list-search-result-provider { | ||||
|   color: #e2e2df; | ||||
|   margin-top: 0.24em; | ||||
|  } | ||||
|  | ||||
| .list-search-result-description { | ||||
|   color: #cacac4; } | ||||
|   color: rgba(202, 202, 196, 0.5); | ||||
|   margin-left: 30px; } | ||||
|  | ||||
| .search-provider-icon { | ||||
|   padding: 15px; } | ||||
|   | ||||
| @@ -1131,7 +1131,7 @@ const AppSearchProvider = new Lang.Class({ | ||||
|         this.getInitialResultSet(terms, callback, cancellable); | ||||
|     }, | ||||
|  | ||||
|     createResultObject: function (resultMeta) { | ||||
|     createResultObject: function (resultMeta, searchResultsView) { | ||||
|         let app = this._appSys.lookup_app(resultMeta['id']); | ||||
|         return new AppIcon(app); | ||||
|     } | ||||
|   | ||||
							
								
								
									
										175
									
								
								js/ui/search.js
									
									
									
									
									
								
							
							
						
						
									
										175
									
								
								js/ui/search.js
									
									
									
									
									
								
							| @@ -22,7 +22,7 @@ const Util = imports.misc.util; | ||||
|  | ||||
| const SEARCH_PROVIDERS_SCHEMA = 'org.gnome.desktop.search-providers'; | ||||
|  | ||||
| const MAX_LIST_SEARCH_RESULTS_ROWS = 3; | ||||
| const MAX_LIST_SEARCH_RESULTS_ROWS = 5; | ||||
| const MAX_GRID_SEARCH_RESULTS_ROWS = 1; | ||||
|  | ||||
| const MaxWidthBin = new Lang.Class({ | ||||
| @@ -48,9 +48,10 @@ const MaxWidthBin = new Lang.Class({ | ||||
| const SearchResult = new Lang.Class({ | ||||
|     Name: 'SearchResult', | ||||
|  | ||||
|     _init: function(provider, metaInfo) { | ||||
|     _init: function(provider, metaInfo, searchResultsView) { | ||||
|         this.provider = provider; | ||||
|         this.metaInfo = metaInfo; | ||||
|         this._searchResultsView = searchResultsView; | ||||
|  | ||||
|         this.actor = new St.Button({ reactive: true, | ||||
|                                      can_focus: true, | ||||
| @@ -72,10 +73,10 @@ const ListSearchResult = new Lang.Class({ | ||||
|     Name: 'ListSearchResult', | ||||
|     Extends: SearchResult, | ||||
|  | ||||
|     ICON_SIZE: 64, | ||||
|     ICON_SIZE: 24, | ||||
|  | ||||
|     _init: function(provider, metaInfo) { | ||||
|         this.parent(provider, metaInfo); | ||||
|     _init: function(provider, metaInfo, searchResultsView) { | ||||
|         this.parent(provider, metaInfo, searchResultsView); | ||||
|  | ||||
|         this.actor.style_class = 'list-search-result'; | ||||
|         this.actor.x_fill = true; | ||||
| @@ -90,7 +91,7 @@ const ListSearchResult = new Lang.Class({ | ||||
|             content.add(icon); | ||||
|         } | ||||
|  | ||||
|         let details = new St.BoxLayout({ vertical: true }); | ||||
|         let details = new St.BoxLayout({ vertical: false }); | ||||
|         content.add(details, { x_fill: true, | ||||
|                                y_fill: false, | ||||
|                                x_align: St.Align.START, | ||||
| @@ -101,17 +102,38 @@ const ListSearchResult = new Lang.Class({ | ||||
|         details.add(title, { x_fill: false, | ||||
|                              y_fill: false, | ||||
|                              x_align: St.Align.START, | ||||
|                              y_align: St.Align.START }); | ||||
|                              y_align: St.Align.MIDDLE }); | ||||
|         this.actor.label_actor = title; | ||||
|  | ||||
|         this._descriptionLabel = | ||||
|                         new St.Label({ | ||||
|                               style_class: 'list-search-result-description' }); | ||||
|  | ||||
|         if (this.metaInfo['description']) { | ||||
|             let description = new St.Label({ style_class: 'list-search-result-description' }); | ||||
|             description.clutter_text.set_markup(this.metaInfo['description']); | ||||
|             details.add(description, { x_fill: false, | ||||
|                                        y_fill: false, | ||||
|                                        x_align: St.Align.START, | ||||
|                                        y_align: St.Align.END }); | ||||
|             this._highlightTerms(); | ||||
|  | ||||
|             details.add(this._descriptionLabel, { x_fill: false, | ||||
|                                                   y_fill: false, | ||||
|                                                   x_align: St.Align.START, | ||||
|                                                   y_align: St.Align.MIDDLE }); | ||||
|         } | ||||
|  | ||||
|         this._termsChangedSignal = | ||||
|                     this._searchResultsView.connect( | ||||
|                                         'terms-changed', | ||||
|                                         Lang.bind(this, this._highlightTerms)); | ||||
|         this.actor.connect('destroy', Lang.bind(this, this._onDestroy)); | ||||
|     }, | ||||
|  | ||||
|     _highlightTerms: function() { | ||||
|         if (!this.metaInfo['description'] || !this._descriptionLabel || !this._searchResultsView) | ||||
|             return; | ||||
|  | ||||
|         this._descriptionLabel.clutter_text.set_markup(this._searchResultsView.highlightTerms(this.metaInfo['description'])); | ||||
|     }, | ||||
|  | ||||
|     _onDestroy: function() { | ||||
|         this._searchResultsView.disconnect(this._termsChangedSignal); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| @@ -119,8 +141,8 @@ const GridSearchResult = new Lang.Class({ | ||||
|     Name: 'GridSearchResult', | ||||
|     Extends: SearchResult, | ||||
|  | ||||
|     _init: function(provider, metaInfo) { | ||||
|         this.parent(provider, metaInfo); | ||||
|     _init: function(provider, metaInfo, searchResultsView) { | ||||
|         this.parent(provider, metaInfo, searchResultsView); | ||||
|  | ||||
|         this.actor.style_class = 'grid-search-result'; | ||||
|  | ||||
| @@ -135,8 +157,9 @@ const GridSearchResult = new Lang.Class({ | ||||
| const SearchResultsBase = new Lang.Class({ | ||||
|     Name: 'SearchResultsBase', | ||||
|  | ||||
|     _init: function(provider) { | ||||
|     _init: function(provider, searchResultsView) { | ||||
|         this.provider = provider; | ||||
|         this._searchResultsView = searchResultsView; | ||||
|  | ||||
|         this._terms = []; | ||||
|  | ||||
| @@ -147,8 +170,8 @@ const SearchResultsBase = new Lang.Class({ | ||||
|                                               y_fill: true }); | ||||
|         this.actor.add(this._resultDisplayBin, { expand: true }); | ||||
|  | ||||
|         let separator = new Separator.HorizontalSeparator({ style_class: 'search-section-separator' }); | ||||
|         this.actor.add(separator.actor); | ||||
|         let separator = new St.DrawingArea({ style_class: 'search-section-separator' }); | ||||
|         this.actor.add(separator); | ||||
|  | ||||
|         this._resultDisplays = {}; | ||||
|  | ||||
| @@ -164,7 +187,8 @@ const SearchResultsBase = new Lang.Class({ | ||||
|  | ||||
|     _createResultDisplay: function(meta) { | ||||
|         if (this.provider.createResultObject) | ||||
|             return this.provider.createResultObject(meta); | ||||
|             return this.provider.createResultObject(meta, | ||||
|                                                     this._searchResultsView); | ||||
|  | ||||
|         return null; | ||||
|     }, | ||||
| @@ -188,7 +212,7 @@ const SearchResultsBase = new Lang.Class({ | ||||
|         Main.overview.toggle(); | ||||
|     }, | ||||
|  | ||||
|     _setMoreIconVisible: function(visible) { | ||||
|     _setMoreLabelVisible: function(visible, moreNumber) { | ||||
|     }, | ||||
|  | ||||
|     _ensureResultActors: function(results, callback) { | ||||
| @@ -231,7 +255,6 @@ const SearchResultsBase = new Lang.Class({ | ||||
|  | ||||
|     updateSearch: function(providerResults, terms, callback) { | ||||
|         this._terms = terms; | ||||
|  | ||||
|         if (providerResults.length == 0) { | ||||
|             this._clearResultDisplay(); | ||||
|             this.actor.hide(); | ||||
| @@ -256,7 +279,8 @@ const SearchResultsBase = new Lang.Class({ | ||||
|                 results.forEach(Lang.bind(this, function(resultId) { | ||||
|                     this._addItem(this._resultDisplays[resultId]); | ||||
|                 })); | ||||
|                 this._setMoreIconVisible(hasMoreResults && this.provider.canLaunchSearch); | ||||
|                 this._setMoreLabelVisible(hasMoreResults && this.provider.canLaunchSearch, | ||||
|                                           providerResults.length - results.length); | ||||
|                 this.actor.show(); | ||||
|                 callback(); | ||||
|             })); | ||||
| @@ -268,20 +292,20 @@ const ListSearchResults = new Lang.Class({ | ||||
|     Name: 'ListSearchResults', | ||||
|     Extends: SearchResultsBase, | ||||
|  | ||||
|     _init: function(provider) { | ||||
|         this.parent(provider); | ||||
|     _init: function(provider, searchResultsView) { | ||||
|         this.parent(provider, searchResultsView); | ||||
|  | ||||
|         this._container = new St.BoxLayout({ style_class: 'search-section-content' }); | ||||
|         this.providerIcon = new ProviderIcon(provider); | ||||
|         this.providerIcon.connect('key-focus-in', Lang.bind(this, this._keyFocusIn)); | ||||
|         this.providerIcon.connect('clicked', Lang.bind(this, | ||||
|         this.providerInfo = new ProviderInfo(provider); | ||||
|         this.providerInfo.connect('key-focus-in', Lang.bind(this, this._keyFocusIn)); | ||||
|         this.providerInfo.connect('clicked', Lang.bind(this, | ||||
|             function() { | ||||
|                 this.providerIcon.animateLaunch(); | ||||
|                 this.providerInfo.animateLaunch(); | ||||
|                 provider.launchSearch(this._terms); | ||||
|                 Main.overview.toggle(); | ||||
|             })); | ||||
|  | ||||
|         this._container.add(this.providerIcon, { x_fill: false, | ||||
|         this._container.add(this.providerInfo, { x_fill: false, | ||||
|                                                  y_fill: false, | ||||
|                                                  x_align: St.Align.START, | ||||
|                                                  y_align: St.Align.START }); | ||||
| @@ -293,8 +317,8 @@ const ListSearchResults = new Lang.Class({ | ||||
|         this._resultDisplayBin.set_child(this._container); | ||||
|     }, | ||||
|  | ||||
|     _setMoreIconVisible: function(visible) { | ||||
|         this.providerIcon.moreIcon.visible = visible; | ||||
|     _setMoreLabelVisible: function(visible, moreNumber) { | ||||
|         this.providerInfo.setMoreVisible(visible, moreNumber); | ||||
|     }, | ||||
|  | ||||
|     _getMaxDisplayedResults: function() { | ||||
| @@ -306,7 +330,8 @@ const ListSearchResults = new Lang.Class({ | ||||
|     }, | ||||
|  | ||||
|     _createResultDisplay: function(meta) { | ||||
|         return this.parent(meta) || new ListSearchResult(this.provider, meta); | ||||
|         return this.parent(meta, this._searchResultsView) || | ||||
|             new ListSearchResult(this.provider, meta, this._searchResultsView); | ||||
|     }, | ||||
|  | ||||
|     _addItem: function(display) { | ||||
| @@ -326,14 +351,14 @@ const GridSearchResults = new Lang.Class({ | ||||
|     Name: 'GridSearchResults', | ||||
|     Extends: SearchResultsBase, | ||||
|  | ||||
|     _init: function(provider, parentContainer) { | ||||
|         this.parent(provider); | ||||
|     _init: function(provider, searchResultsView) { | ||||
|         this.parent(provider, searchResultsView); | ||||
|         // We need to use the parent container to know how much results we can show. | ||||
|         // None of the actors in this class can be used for that, since the main actor | ||||
|         // goes hidden when no results are displayed, and then it lost its allocation. | ||||
|         // Then on the next use of _getMaxDisplayedResults allocation is 0, en therefore | ||||
|         // it doesn't show any result although we have some. | ||||
|         this._parentContainer = parentContainer; | ||||
|         this._parentContainer = searchResultsView.actor; | ||||
|  | ||||
|         this._grid = new IconGrid.IconGrid({ rowLimit: MAX_GRID_SEARCH_RESULTS_ROWS, | ||||
|                                              xAlign: St.Align.START }); | ||||
| @@ -354,7 +379,8 @@ const GridSearchResults = new Lang.Class({ | ||||
|     }, | ||||
|  | ||||
|     _createResultDisplay: function(meta) { | ||||
|         return this.parent(meta) || new GridSearchResult(this.provider, meta); | ||||
|         return this.parent(meta, this._searchResultsView) || | ||||
|             new GridSearchResult(this.provider, meta, this._searchResultsView); | ||||
|     }, | ||||
|  | ||||
|     _addItem: function(display) { | ||||
| @@ -418,6 +444,8 @@ const SearchResults = new Lang.Class({ | ||||
|  | ||||
|         this._providers = []; | ||||
|  | ||||
|         this._searchTermRegex = null; | ||||
|  | ||||
|         this._searchSettings = new Gio.Settings({ schema_id: SEARCH_PROVIDERS_SCHEMA }); | ||||
|         this._searchSettings.connect('changed::disabled', Lang.bind(this, this._reloadRemoteProviders)); | ||||
|         this._searchSettings.connect('changed::enabled', Lang.bind(this, this._reloadRemoteProviders)); | ||||
| @@ -537,6 +565,14 @@ const SearchResults = new Lang.Class({ | ||||
|  | ||||
|         if (this._searchTimeoutId == 0) | ||||
|             this._searchTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 150, Lang.bind(this, this._onSearchTimeout)); | ||||
|  | ||||
|         let escapedSearchTerms = this._terms.map( | ||||
|                     (currentTerm, index, array) => | ||||
|                             { return Shell.util_regex_escape(currentTerm) }); | ||||
|  | ||||
|         this._searchTermRegex = | ||||
|                         new RegExp(`(${escapedSearchTerms.join('|')})`, 'gi'); | ||||
|         this.emit('terms-changed'); | ||||
|     }, | ||||
|  | ||||
|     _onPan: function(action) { | ||||
| @@ -556,9 +592,9 @@ const SearchResults = new Lang.Class({ | ||||
|  | ||||
|         let providerDisplay; | ||||
|         if (provider.appInfo) | ||||
|             providerDisplay = new ListSearchResults(provider); | ||||
|             providerDisplay = new ListSearchResults(provider, this); | ||||
|         else | ||||
|             providerDisplay = new GridSearchResults(provider, this.actor); | ||||
|             providerDisplay = new GridSearchResults(provider, this); | ||||
|  | ||||
|         providerDisplay.connect('key-focus-in', Lang.bind(this, this._keyFocusIn)); | ||||
|         providerDisplay.actor.hide(); | ||||
| @@ -675,14 +711,22 @@ const SearchResults = new Lang.Class({ | ||||
|         } else { | ||||
|             result.actor.remove_style_pseudo_class('selected'); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     highlightTerms: function(description) { | ||||
|         if (!description) | ||||
|             return ''; | ||||
|  | ||||
|         return description.replace(this._searchTermRegex, '<b>$1</b>'); | ||||
|     } | ||||
| }); | ||||
| Signals.addSignalMethods(SearchResults.prototype); | ||||
|  | ||||
| const ProviderIcon = new Lang.Class({ | ||||
|     Name: 'ProviderIcon', | ||||
| const ProviderInfo = new Lang.Class({ | ||||
|     Name: 'ProviderInfo', | ||||
|     Extends: St.Button, | ||||
|  | ||||
|     PROVIDER_ICON_SIZE: 48, | ||||
|     PROVIDER_ICON_SIZE: 32, | ||||
|  | ||||
|     _init: function(provider) { | ||||
|         this.provider = provider; | ||||
| @@ -692,22 +736,45 @@ const ProviderIcon = new Lang.Class({ | ||||
|                       accessible_name: provider.appInfo.get_name(), | ||||
|                       track_hover: true }); | ||||
|  | ||||
|         this._content = new St.Widget({ layout_manager: new Clutter.BinLayout() }); | ||||
|         this._content = new St.BoxLayout({ vertical: false }); | ||||
|         this.set_child(this._content); | ||||
|  | ||||
|         let rtl = (this.get_text_direction() == Clutter.TextDirection.RTL); | ||||
|  | ||||
|         this.moreIcon = new St.Widget({ style_class: 'search-provider-icon-more', | ||||
|                                         visible: false, | ||||
|                                         x_align: rtl ? Clutter.ActorAlign.START : Clutter.ActorAlign.END, | ||||
|                                         y_align: Clutter.ActorAlign.END, | ||||
|                                         x_expand: true, | ||||
|                                         y_expand: true }); | ||||
|  | ||||
|         let icon = new St.Icon({ icon_size: this.PROVIDER_ICON_SIZE, | ||||
|                                  gicon: provider.appInfo.get_icon() }); | ||||
|         this._content.add_actor(icon); | ||||
|         this._content.add_actor(this.moreIcon); | ||||
|  | ||||
|         this._providerDetails = new St.BoxLayout({ | ||||
|                                     style_class: 'list-search-provider-details', | ||||
|                                     vertical: true }); | ||||
|  | ||||
|         let providerNameLabel = new St.Label({ | ||||
|                                     style_class: 'list-search-result-provider', | ||||
|                                     text: provider.appInfo.get_name() }); | ||||
|  | ||||
|         this._remainingResultsLabel = new St.Label({ | ||||
|                                     style_class: 'list-search-result-title' }); | ||||
|  | ||||
|         this._providerDetails.add(providerNameLabel, | ||||
|                                   { x_fill: false, | ||||
|                                     y_fill: false, | ||||
|                                     x_align: St.Align.START, | ||||
|                                     y_align: St.Align.START }); | ||||
|         this._providerDetails.add(this._remainingResultsLabel, | ||||
|                                   { x_fill: false, | ||||
|                                     y_fill: false, | ||||
|                                     x_align: St.Align.START, | ||||
|                                     y_align: St.Align.START }); | ||||
|  | ||||
|  | ||||
|         this._content.add(icon, { x_fill: false, | ||||
|                                   y_fill: false, | ||||
|                                   x_align: St.Align.START, | ||||
|                                   y_align: St.Align.MIDDLE }); | ||||
|         this._content.add(this._providerDetails, { x_fill: false, | ||||
|                                                    y_fill: false, | ||||
|                                                    x_align: St.Align.START, | ||||
|                                                    y_align: St.Align.START }); | ||||
|     }, | ||||
|  | ||||
|     animateLaunch: function() { | ||||
| @@ -715,5 +782,11 @@ const ProviderIcon = new Lang.Class({ | ||||
|         let app = appSys.lookup_app(this.provider.appInfo.get_id()); | ||||
|         if (app.state == Shell.AppState.STOPPED) | ||||
|             IconGrid.zoomOutActor(this._content); | ||||
|     }, | ||||
|  | ||||
|     setMoreVisible: function(visible, resultsCount) { | ||||
|         this._remainingResultsLabel.visible = visible; | ||||
|         this._remainingResultsLabel.clutter_text.set_markup( | ||||
|                                             _("%d more").format(resultsCount)); | ||||
|     } | ||||
| }); | ||||
|   | ||||
| @@ -240,6 +240,21 @@ shell_util_translate_time_string (const char *str) | ||||
|   return res; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * shell_util_regex_escape: | ||||
|  * @str: a UTF-8 string to escape | ||||
|  * | ||||
|  * A wrapper around g_regex_escape_string() that takes its argument as | ||||
|  * \0-terminated string rather than a byte-array the confuses gjs. | ||||
|  * | ||||
|  * Returns: @str with all regex-special characters escaped | ||||
|  */ | ||||
| char * | ||||
| shell_util_regex_escape (const char *str) | ||||
| { | ||||
|   return g_regex_escape_string (str, -1); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * shell_write_string_to_stream: | ||||
|  * @stream: a #GOutputStream | ||||
|   | ||||
| @@ -24,6 +24,8 @@ char    *shell_util_format_date                (const char       *format, | ||||
|                                                 gint64            time_ms); | ||||
| const char *shell_util_translate_time_string   (const char *str); | ||||
|  | ||||
| char    *shell_util_regex_escape               (const char *str); | ||||
|  | ||||
| gboolean shell_write_string_to_stream          (GOutputStream    *stream, | ||||
|                                                 const char       *str, | ||||
|                                                 GError          **error); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user