aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libLumina/LuminaX11.cpp96
-rw-r--r--libLumina/LuminaX11.h39
2 files changed, 128 insertions, 7 deletions
diff --git a/libLumina/LuminaX11.cpp b/libLumina/LuminaX11.cpp
index cecadc99..0bdea55e 100644
--- a/libLumina/LuminaX11.cpp
+++ b/libLumina/LuminaX11.cpp
@@ -1867,13 +1867,50 @@ QIcon LXCB::WM_Get_Icon(WId win){
}
// _NET_WM_PID
-
+unsigned int LXCB::WM_Get_Pid(WId win){
+ xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_pid_unchecked(&EWMH, win);
+ uint32_t pid = 0;
+ xcb_ewmh_get_wm_pid_reply(&EWMH, cookie, &pid, NULL);
+ return pid;
+}
+
// _NET_WM_HANDLED_ICONS
-
+bool LXCB::WM_Get_Handled_Icons(WId win){
+ xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_handled_icons_unchecked(&EWMH, win);
+ uint32_t num = 0;
+ xcb_ewmh_get_wm_handled_icons_reply(&EWMH, cookie, &num, NULL);
+ return (num!=0); //This flag is set on the window
+}
+
+void LXCB::WM_Set_Handled_Icons(WId win, bool set){
+ xcb_ewmh_set_wm_handled_icons(&EWMH, win, (set ? 1 : 0));
+}
+
// _NET_WM_USER_TIME
-
+unsigned int LXCB::WM_Get_User_Time(WId win){
+ xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_user_time_unchecked(&EWMH, win);
+ uint32_t out = 0;
+ xcb_ewmh_get_wm_user_time_reply(&EWMH, cookie, &out, NULL);
+ return out;
+}
+
+void LXCB::WM_Set_User_Time(WId win, unsigned int xtime){
+ xcb_ewmh_set_wm_user_time(&EWMH, win, xtime);
+}
+
// _NET_WM_USER_TIME_WINDOW
-
+/*
+WId LXCB::WM_Get_User_Time_WIndow(WId win){
+ xcb_get_property_cookie_t cookie = xcb_ewmh_get_user_time_window_unchecked(&EWMH, win);
+ xcb_window_t out;
+ xcb_ewmh_get_user_time_window_reply(&EWMH, cookie, &out, NULL);
+ return out;
+}
+
+void LXCB::WM_Set_User_Time_Window(WId win, WId utwin){
+ xcb_ewmh_set_wm_user_time_window(&EWMH, win, utwin);
+}*/
+
// _NET_FRAME_EXTENTS
QList<unsigned int> LXCB::WM_Get_Frame_Extents(WId win){
//Returns: [left,right,top,bottom] margins in pixels (always length 4)
@@ -1894,7 +1931,56 @@ void LXCB::WM_Set_Frame_Extents(WId win, QList<unsigned int> margins){
while(margins.length()<4){ margins << 0; }
xcb_ewmh_set_frame_extents(&EWMH, win, margins[0], margins[1], margins[2], margins[3]);
}
+
// _NET_WM_OPAQUE_REGION
// _NET_WM_BYPASS_COMPOSITOR
- \ No newline at end of file
+
+// === SPECIAL WM PROTOCOLS (EWMH) ===
+// _NET_WM_PING
+void LXCB::WM_Send_Ping(WId win){
+ xcb_ewmh_send_wm_ping(&EWMH, win, XCB_TIME_CURRENT_TIME);
+}
+
+// _NET_WM_SYNC_REQUEST
+uint64_t LXCB::WM_Get_Sync_Request_Counter(WId win){
+ xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_sync_request_counter_unchecked(&EWMH, win);
+ uint64_t count = 0;
+ xcb_ewmh_get_wm_sync_request_counter_reply(&EWMH, cookie, &count, NULL);
+ return count;
+}
+
+/*void LXCB::WM_Set_Sync_Request_Counter(WId win, uint64_t count){
+
+}*/
+
+// _NET_WM_FULLSCREEN_MONITORS
+QList<unsigned int> LXCB::WM_Get_Fullscreen_Monitors(WId win){
+ //Returns: [top,bottom,left,right] monitor numbers for window to use when fullscreen
+ QList<unsigned int> out; out << 0 << 0 << 0 << 0; //init the output array
+ xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_fullscreen_monitors_unchecked(&EWMH, win);
+ xcb_ewmh_get_wm_fullscreen_monitors_reply_t reply;
+ if(1==xcb_ewmh_get_wm_fullscreen_monitors_reply(&EWMH, cookie, &reply, NULL) ){
+ out[0] = reply.top; out[1] = reply.bottom;
+ out[2] = reply.left; out[3] = reply.right;
+ }
+ return out;
+}
+
+void LXCB::WM_Set_Fullscreen_Montors(WId win, QList<unsigned int> list){
+ //Input: [top,bottom,left,right] monitor numbers
+ while(list.length()<4){ list << 0; }
+ xcb_ewmh_set_wm_fullscreen_monitors(&EWMH, win, list[0], list[1], list[2], list[3]);
+}
+
+// _NET_WM_CM_S(n)
+WId LXCB::WM_Get_CM_Owner(){
+ xcb_get_selection_owner_cookie_t cookie = xcb_ewmh_get_wm_cm_owner_unchecked(&EWMH, QX11Info::appScreen());
+ xcb_window_t owner = 0;
+ xcb_ewmh_get_wm_cm_owner_reply(&EWMH, cookie, &owner, NULL);
+ return owner;
+}
+
+void LXCB::WM_Set_CM_Owner(WId win){
+ xcb_ewmh_set_wm_cm_owner(&EWMH, QX11Info::appScreen(), win, XCB_TIME_CURRENT_TIME,0,0);
+} \ No newline at end of file
diff --git a/libLumina/LuminaX11.h b/libLumina/LuminaX11.h
index a66a0c3a..0106515d 100644
--- a/libLumina/LuminaX11.h
+++ b/libLumina/LuminaX11.h
@@ -300,25 +300,60 @@ public:
void WM_Set_Icon_Geometry(WId win, QRect geom);
// _NET_WM_ICON
- // Note: Don't write a "Set" routine for this - that is handled on the client side and not the WM/DE side
+ // Note: Don't write a "Set" routine for this - is handled on the client side and not the WM/DE side
QIcon WM_Get_Icon(WId win);
// _NET_WM_PID
+ // Note: Don't write a "Set" routine for this - is handled on the client side and not the WM/DE side
+ unsigned int WM_Get_Pid(WId win);
// _NET_WM_HANDLED_ICONS
+ // Note: Probably not going to need this - is used by pagers exclusively to tell the WM
+ // not to provide task manager icons (not needed for an integrated WM/DE combination)
+ bool WM_Get_Handled_Icons(WId win);
+ void WM_Set_Handled_Icons(WId win, bool set);
// _NET_WM_USER_TIME
+ // Note: The user time property on a client window is supposed to be updated on user activity,
+ // allowing the WM to be able to distinguish user activity from automated window actions
+ unsigned int WM_Get_User_Time(WId win);
+ void WM_Set_User_Time(WId win, unsigned int xtime);
// _NET_WM_USER_TIME_WINDOW
+ // This returns the window to watch for time update events,
+ // instead of constantly polling all the (toplevel?) windows for the app
+ // IGNORED - xcb_ewmh library does not appear to have valid support for this property yet (11/13/15)
+ //WId WM_Get_User_Time_WIndow(WId win);
+ //void WM_Set_User_Time_Window(WId win, WId utwin);
// _NET_FRAME_EXTENTS
QList<unsigned int> WM_Get_Frame_Extents(WId win); //Returns: [left,right,top,bottom] margins in pixels (always length 4)
void WM_Set_Frame_Extents(WId win, QList<unsigned int> margins); //Input: [left, right, top, bottom] - must be length 4
// _NET_WM_OPAQUE_REGION
+ // NOT SUPPORTED - missing in xcb_ewmh library (11/13/15)
// _NET_WM_BYPASS_COMPOSITOR
-
+ // NOT SUPPORTED - missing in xcb_ewmh library (11/13/15)
+
+ // === SPECIAL WM PROTOCOLS (EWMH) ===
+ // _NET_WM_PING
+ // Note: Used to determine if a window/app is hung before killing the process (with PID)
+ // The client window should respond instantly if it is still active (waiting on user input for instance)
+ void WM_Send_Ping(WId win);
+
+ // _NET_WM_SYNC_REQUEST
+ uint64_t WM_Get_Sync_Request_Counter(WId win);
+ //void WM_Set_Sync_Request_Counter(WId win, uint64_t count);
+
+ // _NET_WM_FULLSCREEN_MONITORS
+ QList<unsigned int> WM_Get_Fullscreen_Monitors(WId win); //Returns: [top,bottom,left,right] monitor numbers for window to use when fullscreen
+ void WM_Set_Fullscreen_Montors(WId win, QList<unsigned int> list); //Input: [top,bottom,left,right] monitor numbers
+
+ // _NET_WM_CM_S(n)
+ // Note: This is used to check/register the compositing manager for the current X screen (#n)
+ WId WM_Get_CM_Owner();
+ void WM_Set_CM_Owner(WId win);
private:
QList<xcb_atom_t> ATOMS;
bgstack15