void x_client_name::update_wm_class(void) { m_class_name.clear(); m_instance_name.clear(); xcb_generic_error_t * error; xcb_get_property_cookie_t c = xcb_icccm_get_wm_class(m_c(), m_x_client.window()); xcb_get_property_reply_t * r = xcb_get_property_reply(m_c(), c, &error); if (error) { delete error; } else { xcb_icccm_get_wm_class_reply_t wm_class; if (xcb_icccm_get_wm_class_from_reply(&wm_class, r)) { m_class_name = wm_class.class_name; m_instance_name = wm_class.instance_name; xcb_icccm_get_wm_class_reply_wipe(&wm_class); r = NULL; } } if (r) delete r; }
x_client_icon::~x_client_icon(void) { m_c.detach(XCB_PROPERTY_NOTIFY, this); xcb_free_pixmap(m_c(), m_net_wm_icon); xcb_free_pixmap(m_c(), m_wm_hints_icon); xcb_free_pixmap(m_c(), m_default_icon); }
void x_client_name::update_wm_name(void) { m_wm_name.clear(); xcb_generic_error_t * error; xcb_icccm_get_text_property_reply_t wm_name; xcb_get_property_cookie_t c = xcb_icccm_get_wm_name(m_c(), m_x_client.window()); xcb_icccm_get_wm_name_reply(m_c(), c, &wm_name, &error); // TODO: cause clang to crash, FILE A BUG REPORT #if defined __GNUC__ if (error) { delete error; } else { m_wm_name = std::string(wm_name.name, wm_name.name_len); xcb_icccm_get_text_property_reply_wipe(&wm_name); } #else #error "Fix compilation with anything else but GNUC" #endif }
void x_client_icon::update_default_icon(void) { xcb_free_pixmap(m_c(), m_default_icon); m_default_icon = XCB_NONE; const uint32_t width = default_application_icon.width; const uint32_t height = default_application_icon.width; m_icon_geometry.first = width; m_icon_geometry.second = height; m_default_icon = xcb_generate_id(m_c()); xcb_create_pixmap( m_c(), 32, m_default_icon, m_c.root_window(), width, height); xcb_image_t * image = xcb_image_create_native( m_c(), width, height, XCB_IMAGE_FORMAT_Z_PIXMAP, 32, NULL, 0, NULL); image->data = (uint8_t *)default_application_icon.pixel_data;; xcb_gcontext_t gc = xcb_generate_id(m_c()); xcb_create_gc(m_c(), gc, m_default_icon, 0, NULL); xcb_image_put(m_c(), m_default_icon, gc, image, 0, 0, 0); xcb_image_destroy(image); xcb_free_gc(m_c(), gc); }
void x_client_icon::update_net_wm_icon(void) { xcb_free_pixmap(m_c(), m_net_wm_icon); m_net_wm_icon = XCB_NONE; xcb_generic_error_t * error; xcb_get_property_cookie_t c = xcb_ewmh_get_wm_icon(m_c.ewmh(), m_x_client.window()); xcb_ewmh_get_wm_icon_reply_t wm_icon; std::memset(&wm_icon, 0, sizeof(xcb_ewmh_get_wm_icon_reply_t)); xcb_ewmh_get_wm_icon_reply(m_c.ewmh(), c, &wm_icon, &error); if (error) { std::free(error); } else if (0 < xcb_ewmh_get_wm_icon_length(&wm_icon)) { uint32_t width = 0; uint32_t height = 0; uint32_t * data = NULL; xcb_ewmh_wm_icon_iterator_t iter = xcb_ewmh_get_wm_icon_iterator(&wm_icon); for (; iter.rem; xcb_ewmh_get_wm_icon_next(&iter)) { if (iter.width > width) { width = iter.width; height = iter.height; data = iter.data; } } m_icon_geometry.first = width; m_icon_geometry.second = height; m_net_wm_icon = xcb_generate_id(m_c()); xcb_create_pixmap( m_c(), 32, m_net_wm_icon, m_c.root_window(), width, height); xcb_image_t * image = xcb_image_create_native( m_c(), width, height, XCB_IMAGE_FORMAT_Z_PIXMAP, 32, NULL, 0, NULL); image->data = (uint8_t *)data; alpha_transform(image->data, width, height); xcb_gcontext_t gc = xcb_generate_id(m_c()); xcb_create_gc(m_c(), gc, m_net_wm_icon, 0, NULL); xcb_image_put(m_c(), m_net_wm_icon, gc, image, 0, 0, 0); xcb_image_destroy(image); xcb_free_gc(m_c(), gc); xcb_ewmh_get_wm_icon_reply_wipe(&wm_icon); } }
x_ewmh::x_ewmh(x_connection & c) : m_c(c) { m_c.attach(10, XCB_PROPERTY_NOTIFY, this); update_net_active_window(); xcb_intern_atom_cookie_t * cookie = xcb_ewmh_init_atoms(m_c(), &m_ewmh); xcb_ewmh_init_atoms_replies(&m_ewmh, cookie, NULL); }
void x_ewmh::update_net_active_window(void) { xcb_atom_t atom = m_c.intern_atom("_NET_ACTIVE_WINDOW"); if (atom == XCB_ATOM_NONE) { m_net_active_window = XCB_NONE; return; } xcb_get_property_cookie_t property_cookie = xcb_get_property(m_c(), false, m_c.root_window(), atom, XCB_ATOM_WINDOW, 0, 32); xcb_generic_error_t * error = NULL; xcb_get_property_reply_t * property_reply = xcb_get_property_reply(m_c(), property_cookie, &error); if (error || property_reply->value_len == 0) { delete error; m_net_active_window = XCB_NONE; } else { m_net_active_window = *(xcb_window_t *)xcb_get_property_value(property_reply); } delete property_reply; }
void x_client_name::update_net_wm_name(void) { m_net_wm_name.clear(); xcb_generic_error_t * error; xcb_get_property_cookie_t c = xcb_ewmh_get_wm_name(m_c.ewmh(), m_x_client.window()); xcb_get_property_reply_t * r = xcb_get_property_reply(m_c(), c, &error); if (error) { delete error; } else { xcb_ewmh_get_utf8_strings_reply_t net_wm_name; if (xcb_ewmh_get_wm_name_from_reply(m_c.ewmh(), &net_wm_name, r)) { m_net_wm_name = std::string(net_wm_name.strings, net_wm_name.strings_len); xcb_ewmh_get_utf8_strings_reply_wipe(&net_wm_name); r = NULL; } } if (r) delete r; }
VariantValue ConstructorImpl::call(const ::std::vector<VariantValue>& args) const { return m_c(args); }
void x_client_icon::update_wm_hints_icon(void) { xcb_free_pixmap(m_c(), m_wm_hints_icon); m_wm_hints_icon = XCB_NONE; xcb_generic_error_t * error; xcb_get_property_cookie_t c = xcb_icccm_get_wm_hints(m_c(), m_x_client.window()); xcb_get_property_reply_t * r = xcb_get_property_reply(m_c(), c, &error); if (error) { std::free(error); } else { xcb_icccm_wm_hints_t wm_hints; xcb_icccm_get_wm_hints_from_reply(&wm_hints, r); if (wm_hints.flags & XCB_ICCCM_WM_HINT_ICON_PIXMAP) { unsigned int width, height; { Window root; int x, y; unsigned int border_width, depth; XGetGeometry(m_c.dpy(), wm_hints.icon_pixmap, &root, &x, &y, &width, &height, &border_width, &depth); m_icon_geometry.first = width; m_icon_geometry.second = height; } xcb_image_t * icon_rgb = xcb_image_get(m_c(), wm_hints.icon_pixmap, 0, 0, width, height, 0xffffffff, XCB_IMAGE_FORMAT_XY_PIXMAP); xcb_image_t * icon_mask; if (wm_hints.flags & XCB_ICCCM_WM_HINT_ICON_MASK) { icon_mask = xcb_image_get(m_c(), wm_hints.icon_mask, 0, 0, width, height, 0xffffffff, XCB_IMAGE_FORMAT_XY_PIXMAP); } else { icon_mask = xcb_image_create_native( m_c(), width, height, XCB_IMAGE_FORMAT_Z_PIXMAP, 32, NULL, 0, NULL); std::memset(icon_mask->data, 0xff, width * height * (icon_mask->bpp / icon_mask->stride)); } xcb_image_t * icon_rgba = xcb_image_create_native( m_c(), width, height, XCB_IMAGE_FORMAT_Z_PIXMAP, 32, NULL, 0, NULL); for (std::size_t x = 0; x < width; ++x) { for (std::size_t y = 0; y < height; ++y) { uint32_t rgba = 0; if (xcb_image_get_pixel(icon_mask, x, y)) { uint32_t rgb = xcb_image_get_pixel(icon_rgb, x, y); uint8_t * s = (uint8_t *)&rgb; uint8_t * d = (uint8_t *)&rgba; d[0] = s[0]; d[1] = s[1]; d[2] = s[2]; d[3] = 0xff; } xcb_image_put_pixel(icon_rgba, x, y, rgba); } } m_wm_hints_icon = xcb_generate_id(m_c()); xcb_create_pixmap( m_c(), 32, m_wm_hints_icon, m_c.root_window(), width, height); xcb_gcontext_t gc = xcb_generate_id(m_c()); xcb_create_gc(m_c(), gc, m_wm_hints_icon, 0, NULL); xcb_image_put(m_c(), m_wm_hints_icon, gc, icon_rgba, 0, 0, 0); xcb_image_destroy(icon_rgb); xcb_image_destroy(icon_mask); xcb_image_destroy(icon_rgba); xcb_free_gc(m_c(), gc); } } if (r) std::free(r); }
void CubicSplineInterpolation::calCubicSplineCoeffs( std::vector<double> &input_x, std::vector<double> &input_y, CubicSplineCoeffs *&cubicCoeffs, CubicSplineMode splineMode /* = CUBIC_NATURAL */, SplineFilterMode filterMode /*= CUBIC_MEDIAN_FILTER*/ ) { int sizeOfx = input_x.size(); int sizeOfy = input_y.size(); if ( sizeOfx != sizeOfy ) { std::cout << "Data input error!" << std::endl << "Location: CubicSplineInterpolation.cpp" << " -> calCubicSplineCoeffs()" << std::endl; return; } /* hi*mi + 2*(hi + hi+1)*mi+1 + hi+1*mi+2 = 6{ (yi+2 - yi+1)/hi+1 - (yi+1 - yi)/hi } so, ignore the both ends: | - - - 0 ... 0 | |m0 | | h0 2(h0+h1) h1 0 ... 0 | |m1 | | 0 h1 2(h1+h2) h2 0 ... | |m2 | | ... ... 0 | |...| | 0 ... 0 h(n-2) 2(h(n-2)+h(n-1)) h(n-1) | | | | 0 ... ... - | |mn | */ std::vector<double> copy_y = input_y; if ( filterMode == CUBIC_MEDIAN_FILTER ) { cubicMedianFilter(copy_y, 5); } const int count = sizeOfx; const int count1 = sizeOfx - 1; const int count2 = sizeOfx - 2; const int count3 = sizeOfx - 3; cubicCoeffs = new CubicSplineCoeffs( count1 ); std::vector<double> step_h( count1, 0.0 ); // for m matrix cv::Mat_<double> m_a(1, count2, 0.0); cv::Mat_<double> m_b(1, count2, 0.0); cv::Mat_<double> m_c(1, count2, 0.0); cv::Mat_<double> m_d(1, count2, 0.0); cv::Mat_<double> m_part(1, count2, 0.0); cv::Mat_<double> m_all(1, count, 0.0); // initial step hi for ( int idx=0; idx < count1; idx ++ ) { step_h[idx] = input_x[idx+1] - input_x[idx]; } // initial coefficients for ( int idx=0; idx < count3; idx ++ ) { m_a(idx) = step_h[idx]; m_b(idx) = 2 * (step_h[idx] + step_h[idx+1]); m_c(idx) = step_h[idx+1]; } // initial d for ( int idx =0; idx < count3; idx ++ ) { m_d(idx) = 6 * ( (copy_y[idx+2] - copy_y[idx+1]) / step_h[idx+1] - (copy_y[idx+1] - copy_y[idx]) / step_h[idx] ); } //cv::Mat_<double> matOfm( count2, ) bool isSucceed = caltridiagonalMatrices(m_a, m_b, m_c, m_d, m_part); if ( !isSucceed ) { std::cout<<"Calculate tridiagonal matrices failed!"<<std::endl<< "Location: CubicSplineInterpolation.cpp -> " << "caltridiagonalMatrices()"<<std::endl; return; } if ( splineMode == CUBIC_NATURAL ) { m_all(0) = 0.0; m_all(count1) = 0.0; for ( int i=1; i<count1; i++ ) { m_all(i) = m_part(i-1); } for ( int i=0; i<count1; i++ ) { cubicCoeffs->a[i] = copy_y[i]; cubicCoeffs->b[i] = ( copy_y[i+1] - copy_y[i] ) / step_h[i] - step_h[i]*( 2*m_all(i) + m_all(i+1) ) / 6; cubicCoeffs->c[i] = m_all(i) / 2.0; cubicCoeffs->d[i] = ( m_all(i+1) - m_all(i) ) / ( 6.0 * step_h[i] ); } } else { std::cout<<"Not define the interpolation mode!"<<std::endl; } }