From d13f021b8bb2a6b8e49f69a370409e79a7f02213 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sat, 4 Jan 2003 19:09:52 +0000 Subject: [PATCH] add support for wm_window_role --- otk/otk_wrap.cc | 1 + otk/property.cc | 1 + otk/property.hh | 1 + src/actions.cc | 15 +++------------ src/client.cc | 18 ++++++++++++------ src/client.hh | 6 +++++- src/openbox_wrap.cc | 23 +++++++++++++++++++++++ src/screen.cc | 10 ++++++++++ 8 files changed, 56 insertions(+), 19 deletions(-) diff --git a/otk/otk_wrap.cc b/otk/otk_wrap.cc index 0b7ee3ac..f3951d49 100644 --- a/otk/otk_wrap.cc +++ b/otk/otk_wrap.cc @@ -13577,6 +13577,7 @@ static swig_const_info swig_const_table[] = { { SWIG_PY_INT, (char *)"OBProperty_wm_name", (long) otk::OBProperty::wm_name, 0, 0, 0}, { SWIG_PY_INT, (char *)"OBProperty_wm_icon_name", (long) otk::OBProperty::wm_icon_name, 0, 0, 0}, { SWIG_PY_INT, (char *)"OBProperty_wm_class", (long) otk::OBProperty::wm_class, 0, 0, 0}, +{ SWIG_PY_INT, (char *)"OBProperty_wm_window_role", (long) otk::OBProperty::wm_window_role, 0, 0, 0}, { SWIG_PY_INT, (char *)"OBProperty_motif_wm_hints", (long) otk::OBProperty::motif_wm_hints, 0, 0, 0}, { SWIG_PY_INT, (char *)"OBProperty_blackbox_attributes", (long) otk::OBProperty::blackbox_attributes, 0, 0, 0}, { SWIG_PY_INT, (char *)"OBProperty_blackbox_change_attributes", (long) otk::OBProperty::blackbox_change_attributes, 0, 0, 0}, diff --git a/otk/property.cc b/otk/property.cc index 5ebb2f0f..f26795e4 100644 --- a/otk/property.cc +++ b/otk/property.cc @@ -40,6 +40,7 @@ OBProperty::OBProperty() _atoms[wm_name] = create("WM_NAME"); _atoms[wm_icon_name] = create("WM_ICON_NAME"); _atoms[wm_class] = create("WM_CLASS"); + _atoms[wm_window_role] = create("WM_WINDOW_ROLE"); _atoms[motif_wm_hints] = create("_MOTIF_WM_HINTS"); _atoms[blackbox_hints] = create("_BLACKBOX_HINTS"); _atoms[blackbox_attributes] = create("_BLACKBOX_ATTRIBUTES"); diff --git a/otk/property.hh b/otk/property.hh index b016cd04..e3588c04 100644 --- a/otk/property.hh +++ b/otk/property.hh @@ -45,6 +45,7 @@ public: wm_name, wm_icon_name, wm_class, + wm_window_role, motif_wm_hints, blackbox_attributes, blackbox_change_attributes, diff --git a/src/actions.cc b/src/actions.cc index fba1eaf1..dec03e80 100644 --- a/src/actions.cc +++ b/src/actions.cc @@ -213,28 +213,19 @@ void OBActions::motionHandler(const XMotionEvent &e) void OBActions::mapRequestHandler(const XMapRequestEvent &e) { OtkEventHandler::mapRequestHandler(e); - - EventData *data = new_event_data(e.window, EventNewWindow, 0); - Openbox::instance->bindings()->fireEvent(data); - Py_DECREF((PyObject*)data); + // do this in OBScreen::manageWindow } void OBActions::unmapHandler(const XUnmapEvent &e) { OtkEventHandler::unmapHandler(e); - - EventData *data = new_event_data(e.window, EventCloseWindow, 0); - Openbox::instance->bindings()->fireEvent(data); - Py_DECREF((PyObject*)data); + // do this in OBScreen::unmanageWindow } void OBActions::destroyHandler(const XDestroyWindowEvent &e) { OtkEventHandler::destroyHandler(e); - - EventData *data = new_event_data(e.window, EventCloseWindow, 0); - Openbox::instance->bindings()->fireEvent(data); - Py_DECREF((PyObject*)data); + // do this in OBScreen::unmanageWindow } } diff --git a/src/client.cc b/src/client.cc index a6990a8d..7b846729 100644 --- a/src/client.cc +++ b/src/client.cc @@ -478,17 +478,23 @@ void OBClient::updateClass() const otk::OBProperty *property = Openbox::instance->property(); // set the defaults - _app_name = _app_class = ""; + _app_name = _app_class = _role = ""; otk::OBProperty::StringVect v; unsigned long num = 2; - if (! property->get(_window, otk::OBProperty::wm_class, - otk::OBProperty::ascii, &num, &v)) - return; + if (property->get(_window, otk::OBProperty::wm_class, + otk::OBProperty::ascii, &num, &v)) { + if (num > 0) _app_name = v[0]; + if (num > 1) _app_class = v[1]; + } - if (num > 0) _app_name = v[0]; - if (num > 1) _app_class = v[1]; + v.clear(); + num = 1; + if (property->get(_window, otk::OBProperty::wm_window_role, + otk::OBProperty::ascii, &num, &v)) { + if (num > 0) _role = v[0]; + } } diff --git a/src/client.hh b/src/client.hh index 41ca3dd2..724cf518 100644 --- a/src/client.hh +++ b/src/client.hh @@ -171,6 +171,8 @@ private: std::string _app_name; //! The class of the window, can used for grouping std::string _app_class; + //! The specified role of the window, used for identification + std::string _role; //! The type of window (what its function is) WindowType _type; @@ -376,9 +378,11 @@ public: inline const std::string &appName() const { return _app_name; } //! Returns the class of the window inline const std::string &appClass() const { return _app_class; } + //! Returns the program-specified role of the window + inline const std::string &role() const { return _role; } //! Returns if the window can be focused /*! - @return true if the window can receive focusl otherwise, false + @return true if the window can receive focus; otherwise, false */ inline bool canFocus() const { return _can_focus; } //! Returns if the window has indicated that it needs urgent attention diff --git a/src/openbox_wrap.cc b/src/openbox_wrap.cc index c8e2e65d..6f269706 100644 --- a/src/openbox_wrap.cc +++ b/src/openbox_wrap.cc @@ -1976,6 +1976,28 @@ static PyObject *_wrap_OBClient_appClass(PyObject *self, PyObject *args) { } +static PyObject *_wrap_OBClient_role(PyObject *self, PyObject *args) { + PyObject *resultobj; + ob::OBClient *arg1 = (ob::OBClient *) 0 ; + std::string *result; + PyObject * obj0 = 0 ; + + if(!PyArg_ParseTuple(args,(char *)"O:OBClient_role",&obj0)) goto fail; + if ((SWIG_ConvertPtr(obj0,(void **) &arg1, SWIGTYPE_p_ob__OBClient,SWIG_POINTER_EXCEPTION | 0 )) == -1) SWIG_fail; + { + std::string const &_result_ref = ((ob::OBClient const *)arg1)->role(); + result = (std::string *) &_result_ref; + } + + { + resultobj = PyString_FromString(result->c_str()); + } + return resultobj; + fail: + return NULL; +} + + static PyObject *_wrap_OBClient_canFocus(PyObject *self, PyObject *args) { PyObject *resultobj; ob::OBClient *arg1 = (ob::OBClient *) 0 ; @@ -2764,6 +2786,7 @@ static PyMethodDef SwigMethods[] = { { (char *)"OBClient_iconTitle", _wrap_OBClient_iconTitle, METH_VARARGS }, { (char *)"OBClient_appName", _wrap_OBClient_appName, METH_VARARGS }, { (char *)"OBClient_appClass", _wrap_OBClient_appClass, METH_VARARGS }, + { (char *)"OBClient_role", _wrap_OBClient_role, METH_VARARGS }, { (char *)"OBClient_canFocus", _wrap_OBClient_canFocus, METH_VARARGS }, { (char *)"OBClient_urgent", _wrap_OBClient_urgent, METH_VARARGS }, { (char *)"OBClient_focusNotify", _wrap_OBClient_focusNotify, METH_VARARGS }, diff --git a/src/screen.cc b/src/screen.cc index d9067aa0..f44e291c 100644 --- a/src/screen.cc +++ b/src/screen.cc @@ -521,6 +521,11 @@ void OBScreen::manageWindow(Window window) // XXX: make this optional or more intelligent client->focus(); + + // call the python NEWWINDOW binding + EventData *data = new_event_data(window, EventNewWindow, 0); + Openbox::instance->bindings()->fireEvent(data); + Py_DECREF((PyObject*)data); } @@ -528,6 +533,11 @@ void OBScreen::unmanageWindow(OBClient *client) { OBFrame *frame = client->frame; + // call the python CLOSEWINDOW binding + EventData *data = new_event_data(client->window(), EventCloseWindow, 0); + Openbox::instance->bindings()->fireEvent(data); + Py_DECREF((PyObject*)data); + Openbox::instance->bindings()->grabButtons(false, client); // remove from the stacking order -- 2.39.2