Skip to content

Commit

Permalink
Initial support for Gnome Search (doesn't work yet)
Browse files Browse the repository at this point in the history
  • Loading branch information
Jeffser committed May 30, 2024
1 parent 91651b9 commit 7b8f40e
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 0 deletions.
6 changes: 6 additions & 0 deletions data/com.jeffser.Alpaca.SearchProvider.ini.in
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

3 changes: 3 additions & 0 deletions data/com.jeffser.Alpaca.SearchProvider.service.in
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
90 changes: 90 additions & 0 deletions src/alpaca_search_provider.in
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()

0 comments on commit 7b8f40e

Please sign in to comment.