xcb_window_t LinuxWindowCapture::FindWindow( const QString& instanceName, const QString& windowClass ) { xcb_window_t window = static_cast< xcb_window_t > ( 0 ); xcb_connection_t* dpy = xcb_connect( NULL, NULL ); if ( xcb_connection_has_error( dpy ) ) { qDebug() << "Can't open display"; } xcb_screen_t* screen = xcb_setup_roots_iterator( xcb_get_setup( dpy ) ).data; if( !screen ) { qDebug() << "Can't acquire screen"; } xcb_window_t root = screen->root; QList< xcb_window_t > windows = listWindowsRecursive( dpy, root ); foreach( const xcb_window_t& win, windows ) { xcb_icccm_get_wm_class_reply_t wmNameR; xcb_get_property_cookie_t wmClassC = xcb_icccm_get_wm_class( dpy, win ); if ( xcb_icccm_get_wm_class_reply( dpy, wmClassC, &wmNameR, NULL ) ) { if( !qstrcmp( wmNameR.class_name, windowClass.toStdString().c_str() ) || !qstrcmp( wmNameR.instance_name, instanceName.toStdString().c_str() ) ) { qDebug() << wmNameR.instance_name; qDebug() << wmNameR.class_name; window = win; break; } } }
QList< xcb_window_t > LinuxWindowCapture::listWindowsRecursive( const xcb_window_t& window ) { QList< xcb_window_t > windows; xcb_connection_t* xcbConn = QX11Info::connection(); xcb_query_tree_cookie_t queryC = xcb_query_tree( xcbConn, window ); CScopedPointer< xcb_query_tree_reply_t > queryR( xcb_query_tree_reply( xcbConn, queryC, nullptr ) ); if ( queryR ) { xcb_window_t* children = xcb_query_tree_children( queryR.data() ); for( auto c = 0; c < xcb_query_tree_children_length( queryR.data() ); ++c ) { windows << children[ c ]; windows << listWindowsRecursive( children[ c ] ); } } return windows; }
QList< xcb_window_t > LinuxWindowCapture::listWindowsRecursive( xcb_connection_t* dpy, xcb_window_t& window ) { QList< xcb_window_t > windows; xcb_query_tree_reply_t* queryR; xcb_query_tree_cookie_t queryC = xcb_query_tree( dpy, window ); if( ( queryR = xcb_query_tree_reply( dpy, queryC, NULL ) ) ) { xcb_window_t* children = xcb_query_tree_children( queryR ); for( int c = 0; c < xcb_query_tree_children_length( queryR ); ++c ) { windows << children[ c ]; windows << listWindowsRecursive( dpy, children[ c ]); } free( queryR ); } return windows; }
xcb_window_t LinuxWindowCapture::FindWindow( const QString& instanceName, const QString& windowClass ) { xcb_window_t winID = XCB_WINDOW_NONE; QList< xcb_window_t > windows = listWindowsRecursive( QX11Info::appRootWindow() ); xcb_connection_t* xcbConn = QX11Info::connection(); foreach( const xcb_window_t& win, windows ) { xcb_icccm_get_wm_class_reply_t wmNameR; xcb_get_property_cookie_t wmClassC = xcb_icccm_get_wm_class( xcbConn, win ); if ( xcb_icccm_get_wm_class_reply( xcbConn, wmClassC, &wmNameR, nullptr ) ) { if( !qstricmp( wmNameR.class_name, qt2cstr( windowClass ) ) || !qstricmp( wmNameR.instance_name, qt2cstr ( instanceName ) ) ) { winID = win; break; } } }