-
-
Notifications
You must be signed in to change notification settings - Fork 56
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Initial support for Gnome Search (doesn't work yet)
- Loading branch information
Showing
3 changed files
with
99 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
[Shell Search Provider] | ||
DesktopId=@[email protected] | ||
BusName=@[email protected] | ||
ObjectPath=/com/jeffser/Alpaca/SearchProvider | ||
Version=2 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
[D-BUS Service] | ||
Name=@[email protected] | ||
Exec=@libexecdir@/alpaca_search_provider |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
#!@PYTHON@ | ||
|
||
import sys | ||
from gi.repository import Gio, GLib | ||
|
||
DBUS_NAME = "com.jeffser.Alpaca.SearchProvider" | ||
DBUS_OBJECT_PATH = "/com/jeffser/Alpaca/SearchProvider" | ||
DBUS_INTERFACE = "org.gnome.Shell.SearchProvider2" | ||
|
||
class SearchProvider: | ||
def __init__(self): | ||
print("ALPACA __init__") | ||
self.connection = Gio.bus_get_sync(Gio.BusType.SESSION, None) | ||
self.connection.register_object(DBUS_OBJECT_PATH, self.get_interface_info(), None, self.handle_method_call, None) | ||
|
||
def get_interface_info(self): | ||
print("ALPACA get_interface_info") | ||
xml = """ | ||
<node> | ||
<interface name='org.gnome.Shell.SearchProvider2'> | ||
<method name='GetInitialResultSet'> | ||
<arg type='as' name='terms' direction='in'/> | ||
<arg type='as' name='results' direction='out'/> | ||
</method> | ||
<method name='GetSubsearchResultSet'> | ||
<arg type='as' name='previous_results' direction='in'/> | ||
<arg type='as' name='terms' direction='in'/> | ||
<arg type='as' name='results' direction='out'/> | ||
</method> | ||
<method name='GetResultMetas'> | ||
<arg type='as' name='identifiers' direction='in'/> | ||
<arg type='a{sv}' name='metas' direction='out'/> | ||
</method> | ||
<method name='ActivateResult'> | ||
<arg type='s' name='identifier' direction='in'/> | ||
<arg type='as' name='terms' direction='in'/> | ||
<arg type='i' name='timestamp' direction='in'/> | ||
</method> | ||
</interface> | ||
</node> | ||
""" | ||
return Gio.DBusNodeInfo.new_for_xml(xml).interfaces[0] | ||
|
||
def handle_method_call(self, connection, sender, object_path, interface_name, method_name, parameters, invocation): | ||
print("ALPACA handle_method_call") | ||
if method_name == "GetInitialResultSet": | ||
self.handle_get_initial_result_set(invocation, parameters) | ||
elif method_name == "GetSubsearchResultSet": | ||
self.handle_get_subsearch_result_set(invocation, parameters) | ||
elif method_name == "GetResultMetas": | ||
self.handle_get_result_metas(invocation, parameters) | ||
elif method_name == "ActivateResult": | ||
self.handle_activate_result(invocation, parameters) | ||
|
||
def handle_get_initial_result_set(self, invocation, parameters): | ||
print("ALPACA handle_get_initial_result_set") | ||
terms = parameters.unpack()[0] | ||
print(f"Initial search terms: {terms}") | ||
results = ["result1", "result2"] | ||
invocation.return_value(GLib.Variant("(as)", [results])) | ||
|
||
def handle_get_subsearch_result_set(self, invocation, parameters): | ||
print("ALPACA handle_get_subsearch_result_set") | ||
previous_results, terms = parameters.unpack() | ||
print(f"Subsearch terms: {terms}, previous results: {previous_results}") | ||
results = ["result3", "result4"] | ||
invocation.return_value(GLib.Variant("(as)", [results])) | ||
|
||
def handle_get_result_metas(self, invocation, parameters): | ||
print("ALPACA handle_get_result_metas") | ||
identifiers = parameters.unpack()[0] #LINE 66 | ||
print(f"Result metas for identifiers: {identifiers}") | ||
metas = [] | ||
for identifier in identifiers: | ||
meta = {"name": GLib.Variant("s", identifier)} | ||
metas.append(GLib.Variant("a{sv}", meta)) | ||
invocation.return_value(GLib.Variant("(a{sv})", [metas])) | ||
|
||
|
||
def handle_activate_result(self, invocation, parameters): | ||
print("ALPACA handle_activate_result") | ||
identifier, terms, timestamp = parameters.unpack() | ||
print(f"Activated result: {identifier}, terms: {terms}, timestamp: {timestamp}") | ||
invocation.return_value(None) | ||
|
||
if __name__ == "__main__": | ||
provider = SearchProvider() | ||
loop = GLib.MainLoop() | ||
loop.run() | ||
|