Skip to content

Commit f77ac6b

Browse files
committed
Add NemoSelectionProvider Python bindings
Bridge the new NemoSelectionProvider interface to Python, allowing extensions to implement selection_changed(window, files) to be notified when the file selection changes in Nemo.
1 parent 6e1376f commit f77ac6b

3 files changed

Lines changed: 57 additions & 1 deletion

File tree

nemo-python/src/nemo-python-object.c

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include <libnemo-extension/nemo-menu-provider.h>
3737
#include <libnemo-extension/nemo-property-page-provider.h>
3838
#include <libnemo-extension/nemo-name-and-desc-provider.h>
39+
#include <libnemo-extension/nemo-selection-provider.h>
3940

4041
#include <string.h>
4142

@@ -550,6 +551,42 @@ nemo_python_object_class_init (NemoPythonObjectClass *class,
550551
G_OBJECT_CLASS (class)->finalize = nemo_python_object_finalize;
551552
}
552553

554+
#define METHOD_NAME "selection_changed"
555+
static void
556+
nemo_python_object_selection_changed (NemoSelectionProvider *provider,
557+
GtkWidget *window,
558+
GList *files)
559+
{
560+
NemoPythonObject *object = (NemoPythonObject *) provider;
561+
PyObject *py_files = NULL, *py_ret = NULL;
562+
PyGILState_STATE state = pyg_gil_state_ensure ();
563+
564+
debug_enter ();
565+
566+
CHECK_OBJECT (object);
567+
CHECK_METHOD_NAME (object->instance);
568+
569+
CONVERT_LIST (py_files, files);
570+
571+
py_ret = PyObject_CallMethod (object->instance,
572+
METHOD_PREFIX METHOD_NAME,
573+
"(NN)",
574+
pygobject_new ((GObject *) window),
575+
py_files);
576+
HANDLE_RETVAL (py_ret);
577+
578+
beach:
579+
Py_XDECREF (py_ret);
580+
pyg_gil_state_release (state);
581+
}
582+
#undef METHOD_NAME
583+
584+
static void
585+
nemo_python_object_selection_provider_iface_init (NemoSelectionProviderInterface *iface)
586+
{
587+
iface->selection_changed = nemo_python_object_selection_changed;
588+
}
589+
553590
GType
554591
nemo_python_object_get_type (GTypeModule *module,
555592
PyObject *type)
@@ -595,6 +632,12 @@ nemo_python_object_get_type (GTypeModule *module,
595632
NULL
596633
};
597634

635+
static const GInterfaceInfo selection_provider_iface_info = {
636+
(GInterfaceInitFunc) nemo_python_object_selection_provider_iface_init,
637+
NULL,
638+
NULL
639+
};
640+
598641
name_str = PyObject_GetAttrString(type, "__name__");
599642

600643
debug_enter_args("type=%s", PyUnicode_AsUTF8(name_str));
@@ -663,5 +706,12 @@ nemo_python_object_get_type (GTypeModule *module,
663706
&nd_provider_iface_info);
664707
}
665708

709+
if (PyObject_IsSubclass (type, (PyObject *) &PyNemoSelectionProvider_Type))
710+
{
711+
g_type_module_add_interface (module, gtype,
712+
NEMO_TYPE_SELECTION_PROVIDER,
713+
&selection_provider_iface_info);
714+
}
715+
666716
return gtype;
667717
}

nemo-python/src/nemo-python.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ PyTypeObject *_PyNemoMenuProvider_Type;
4141
PyTypeObject *_PyNemoPropertyPage_Type;
4242
PyTypeObject *_PyNemoPropertyPageProvider_Type;
4343
PyTypeObject *_PyNemoOperationHandle_Type;
44+
PyTypeObject *_PyNemoSelectionProvider_Type;
4445

4546
static const GDebugKey nemo_python_debug_keys[] = {
4647
{"misc", NEMO_PYTHON_DEBUG_MISC},
@@ -103,7 +104,8 @@ nemo_python_load_file(GTypeModule *type_module,
103104
PyObject_IsSubclass(value, (PyObject*)&PyNemoInfoProvider_Type) ||
104105
PyObject_IsSubclass(value, (PyObject*)&PyNemoLocationWidgetProvider_Type) ||
105106
PyObject_IsSubclass(value, (PyObject*)&PyNemoMenuProvider_Type) ||
106-
PyObject_IsSubclass(value, (PyObject*)&PyNemoPropertyPageProvider_Type))
107+
PyObject_IsSubclass(value, (PyObject*)&PyNemoPropertyPageProvider_Type) ||
108+
PyObject_IsSubclass(value, (PyObject*)&PyNemoSelectionProvider_Type))
107109
{
108110
gtype = nemo_python_object_get_type(type_module, value);
109111
g_array_append_val(all_types, gtype);
@@ -244,6 +246,7 @@ nemo_python_init_python (void)
244246
IMPORT(PropertyPageProvider, "PropertyPageProvider");
245247
IMPORT(NameAndDescProvider, "NameAndDescProvider");
246248
IMPORT(OperationHandle, "OperationHandle");
249+
IMPORT(SelectionProvider, "SelectionProvider");
247250

248251
#undef IMPORT
249252

nemo-python/src/nemo-python.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,7 @@ extern PyTypeObject *_PyNemoPropertyPageProvider_Type;
7373
extern PyTypeObject *_PyNemoOperationHandle_Type;
7474
#define PyNemoOperationHandle_Type (*_PyNemoOperationHandle_Type)
7575

76+
extern PyTypeObject *_PyNemoSelectionProvider_Type;
77+
#define PyNemoSelectionProvider_Type (*_PyNemoSelectionProvider_Type)
78+
7679
#endif /* NEMO_PYTHON_H */

0 commit comments

Comments
 (0)