Exemple #1
0
// find the dimensions of the monitor displaying point x,y
void monitor_dimensions ( int x, int y, workarea *mon )
{
    xcb_generic_error_t *error = NULL;
    memset ( mon, 0, sizeof ( workarea ) );
    mon->w = xcb->screen->width_in_pixels;
    mon->h = xcb->screen->height_in_pixels;

    if ( !xcb->has_xinerama ) {
        return;
    }

    xcb_xinerama_query_screens_cookie_t cookie_screen;
    cookie_screen = xcb_xinerama_query_screens ( xcb->connection );
    xcb_xinerama_query_screens_reply_t  *query_screens;
    query_screens = xcb_xinerama_query_screens_reply ( xcb->connection, cookie_screen, &error );
    if ( error ) {
        fprintf ( stderr, "Error getting screen info\n" );
        return;
    }
    xcb_xinerama_screen_info_t *screens = xcb_xinerama_query_screens_screen_info ( query_screens );
    int                        len      = xcb_xinerama_query_screens_screen_info_length ( query_screens );
    for ( int i = 0; i < len; i++ ) {
        xcb_xinerama_screen_info_t *info = &screens[i];
        if ( INTERSECT ( x, y, 1, 1, info->x_org, info->y_org, info->width, info->height ) ) {
            mon->w = info->width;
            mon->h = info->height;
            mon->x = info->x_org;
            mon->y = info->y_org;
            break;
        }
    }
    free ( query_screens );
}
Exemple #2
0
int monitor_get_dimension ( int monitor, workarea *mon )
{
    xcb_generic_error_t *error = NULL;
    memset ( mon, 0, sizeof ( workarea ) );
    mon->w = xcb->screen->width_in_pixels;
    mon->h = xcb->screen->height_in_pixels;

    if ( !xcb->has_xinerama ) {
        return FALSE;
    }

    xcb_xinerama_query_screens_cookie_t cookie_screen;
    cookie_screen = xcb_xinerama_query_screens ( xcb->connection );
    xcb_xinerama_query_screens_reply_t  *query_screens;
    query_screens = xcb_xinerama_query_screens_reply ( xcb->connection, cookie_screen, &error );
    if ( error ) {
        fprintf ( stderr, "Error getting screen info\n" );
        return FALSE;
    }
    xcb_xinerama_screen_info_t *screens = xcb_xinerama_query_screens_screen_info ( query_screens );
    int                        len      = xcb_xinerama_query_screens_screen_info_length ( query_screens );
    if ( monitor < len ) {
        xcb_xinerama_screen_info_t *info = &screens[monitor];
        mon->w = info->width;
        mon->h = info->height;
        mon->x = info->x_org;
        mon->y = info->y_org;
        free ( query_screens );
        return TRUE;
    }
    free ( query_screens );

    return FALSE;
}
Exemple #3
0
int monitor_get_smallest_size ( void )
{
    xcb_generic_error_t *error;
    int                 size = MIN ( xcb->screen->width_in_pixels, xcb->screen->height_in_pixels );

    if ( !xcb->has_xinerama ) {
        return size;
    }

    xcb_xinerama_query_screens_cookie_t cookie_screen;

    cookie_screen = xcb_xinerama_query_screens ( xcb->connection );
    xcb_xinerama_query_screens_reply_t *query_screens;
    query_screens = xcb_xinerama_query_screens_reply ( xcb->connection, cookie_screen, &error );
    if ( error ) {
        fprintf ( stderr, "Error getting screen info\n" );
        return size;
    }
    xcb_xinerama_screen_info_t *screens = xcb_xinerama_query_screens_screen_info ( query_screens );
    int                        len      = xcb_xinerama_query_screens_screen_info_length ( query_screens );
    for ( int i = 0; i < len; i++ ) {
        xcb_xinerama_screen_info_t *info = &screens[i];
        size = MIN ( info->width, size );
        size = MIN ( info->height, size );
    }
    free ( query_screens );

    return size;
}
Exemple #4
0
bool ScreenManager::scanXinerama(xcb_connection_t *conn)
{
    xcb_generic_error_t *err;
    xcb_xinerama_screen_info_t *screen;

    xcb_xinerama_query_screens_cookie_t cookie =
        xcb_xinerama_query_screens(conn);
    const xcb_xinerama_query_screens_reply_t *reply =
        xcb_xinerama_query_screens_reply(conn, cookie, &err);
    if (err) {
        LOG_ERROR("Error %d while querying xinerama.", err->error_code);
        return false;
    }

    int length = xcb_xinerama_query_screens_screen_info_length(reply);
    xcb_xinerama_screen_info_iterator_t iter =
        xcb_xinerama_query_screens_screen_info_iterator(reply);

    int id = 0;
    char idbuf[5];
    if (!length) {
        LOG_ERROR("No screen found using xinerama.");
        return false;
    } else {
        while (length--) {
            screen = iter.data;
            Screen s;
            sprintf(idbuf, "%d", id);
            s.setName(std::string("Xinerama-") + idbuf);
            s.setX(screen->x_org);
            s.setY(screen->y_org);
            s.setWidth(screen->width);
            s.setHeight(screen->height);
            updateScreen(s);
            xcb_xinerama_screen_info_next(&iter);
        }
    }
    return true;
}
Exemple #5
0
int main(int argc, char **argv) {
    int just_first = 0;
    int print_offset = 1;
    int i;

    for (i = 1; i < argc; i++) {
        int hyphens = 0;
        for (; *argv[i] == '-'; (argv[i])++) hyphens++;

        int error = 0;
        if (!hyphens) {
            error = 1;
        } else if (!strcmp(argv[i], "first")) {
            just_first = 1;
        } else if (!strcmp(argv[i], "all")) {
            just_first = 0;
        } else if (!strcmp(argv[i], "dim")) {
            print_offset = 0;
        } else {
            error = 1;
        }

        if (error) {
            fprintf(stdout, "Usage: %s [ --first | --all ] [ --dim ]\n", argv[0]);
            return 1;
        }
    }

    int screen_default;
    xcb_connection_t *conn = xcb_connect(NULL, &screen_default);
    if (xcb_connection_has_error(conn)) {
        fprintf(stderr,"NOK\n");
        return 1;
    }

    xcb_generic_error_t *error;

    xcb_xinerama_is_active_cookie_t is_active_req = xcb_xinerama_is_active(conn);
    xcb_xinerama_is_active_reply_t *is_active = xcb_xinerama_is_active_reply(conn, is_active_req, &error);
    if (error) {
        fprintf(stderr, "Couldn't query Xinerama\n");
        return 1;
    }
    if (!is_active->state) {
        fprintf(stderr, "Xinerama inactive\n");
        return 1;
    }
    xcb_xinerama_query_screens_cookie_t cookie_screen;
    cookie_screen = xcb_xinerama_query_screens(conn);
    xcb_xinerama_query_screens_reply_t *query_screens;
    query_screens = xcb_xinerama_query_screens_reply(conn, cookie_screen, &error);
    if (error) {
        fprintf(stderr, "Error getting screen info\n");
        return 1;
    }
    /* iterator
    xcb_xinerama_screen_info_iterator_t screens;
    screens = xcb_xinerama_query_screens_screen_info_iterator(query_screens);
    for (; screens.rem; xcb_xinerama_screen_info_next(&screens)) {
    	xcb_xinerama_screen_info_t info = *screens.data;
    	fprintf(stdout, "%ux%u@%d,%d\n", info.width, info.height, info.x_org, info.y_org);
    }
    */
    int len;
    xcb_xinerama_screen_info_t *screens = xcb_xinerama_query_screens_screen_info(query_screens);
    len = xcb_xinerama_query_screens_screen_info_length(query_screens);
    for (i = 0; i < len; i++) {
        xcb_xinerama_screen_info_t info = screens[i];
        fprintf(stdout, "%ux%u", info.width, info.height);
        if (print_offset) fprintf(stdout, "+%d+%d", info.x_org, info.y_org);
        fprintf(stdout, "\n");
        if (just_first) break;
    }
    xcb_disconnect(conn);
    return 0;
}
Exemple #6
0
void setup(void)
{
    ewmh_init();
    screen = xcb_setup_roots_iterator(xcb_get_setup(dpy)).data;
    if (!screen)
        err("error: cannot aquire screen\n");

    screen_width = screen->width_in_pixels;
    screen_height = screen->height_in_pixels;
    root_depth = screen->root_depth;

    xcb_atom_t net_atoms[] = {ewmh->_NET_SUPPORTED,
                              ewmh->_NET_DESKTOP_NAMES,
                              ewmh->_NET_NUMBER_OF_DESKTOPS,
                              ewmh->_NET_CURRENT_DESKTOP,
                              ewmh->_NET_CLIENT_LIST,
                              ewmh->_NET_ACTIVE_WINDOW,
                              ewmh->_NET_WM_DESKTOP,
                              ewmh->_NET_WM_STATE,
                              ewmh->_NET_WM_STATE_FULLSCREEN,
                              ewmh->_NET_WM_WINDOW_TYPE,
                              ewmh->_NET_WM_WINDOW_TYPE_DOCK,
                              ewmh->_NET_WM_WINDOW_TYPE_NOTIFICATION,
                              ewmh->_NET_WM_WINDOW_TYPE_DIALOG,
                              ewmh->_NET_WM_WINDOW_TYPE_UTILITY,
                              ewmh->_NET_WM_WINDOW_TYPE_TOOLBAR};

    xcb_ewmh_set_supported(ewmh, default_screen, LENGTH(net_atoms), net_atoms);

    monitor_uid = desktop_uid = client_uid = 0;
    mon = last_mon = mon_head = mon_tail = NULL;

    bool xinerama_is_active = false;

    if (xcb_get_extension_data(dpy, &xcb_xinerama_id)->present) {
        xcb_xinerama_is_active_reply_t *xia = xcb_xinerama_is_active_reply(dpy, xcb_xinerama_is_active(dpy), NULL);
        if (xia != NULL) {
            xinerama_is_active = xia->state;
            free(xia);
        }
    }

    if (xinerama_is_active) {
        xcb_xinerama_query_screens_reply_t *xsq = xcb_xinerama_query_screens_reply(dpy, xcb_xinerama_query_screens(dpy), NULL);
        xcb_xinerama_screen_info_t *xsi = xcb_xinerama_query_screens_screen_info(xsq);
        int n = xcb_xinerama_query_screens_screen_info_length(xsq);
        PRINTF("number of monitors: %d\n", n);
        for (int i = 0; i < n; i++) {
            xcb_xinerama_screen_info_t info = xsi[i];
            xcb_rectangle_t rect = (xcb_rectangle_t) {info.x_org, info.y_org, info.width, info.height};
            add_monitor(&rect);
        }
        free(xsq);
    } else {
        warn("Xinerama is inactive");
        xcb_rectangle_t rect = (xcb_rectangle_t) {0, 0, screen_width, screen_height};
        add_monitor(&rect);
    }

    for (monitor_t *m = mon_head; m != NULL; m = m->next)
        add_desktop(m, NULL);

    ewmh_update_number_of_desktops();
    ewmh_update_desktop_names();
    rule_head = make_rule();
    frozen_pointer = make_pointer_state();
    get_pointer_position(&pointer_position);
    split_mode = MODE_AUTOMATIC;
}