Example #1
0
static int
widget_update (struct widget *widget, xcb_ewmh_connection_t *ewmh, int screen_nbr) {
	unsigned short i;
	uint32_t desktop_curr, desktop_len, client_desktop;
	char desktop_name[COPY_PROP_BUFSIZ];
	xcb_ewmh_get_utf8_strings_reply_t desktop_names;
	xcb_ewmh_get_windows_reply_t clients;
	xcb_icccm_wm_hints_t window_hints;
	struct desktop *desktops;

	/* get current desktop */
	int desktop_curr_success = xcb_ewmh_get_current_desktop_reply(ewmh, xcb_ewmh_get_current_desktop_unchecked(ewmh, screen_nbr), &desktop_curr, NULL);
	if (!desktop_curr_success) {
		LOG_DEBUG("ewmh: could not get current desktop");

		return 1;
	}

	/* get desktop count */
	int desktop_len_success = xcb_ewmh_get_number_of_desktops_reply(ewmh, xcb_ewmh_get_number_of_desktops_unchecked(ewmh, screen_nbr), &desktop_len, NULL);
	if (!desktop_len_success) {
		LOG_DEBUG("ewmh: could not get desktop count");

		return 2;
	}

	desktops = calloc(desktop_len, sizeof(struct desktop));

	int desktop_names_success = xcb_ewmh_get_desktop_names_reply(ewmh, xcb_ewmh_get_desktop_names_unchecked(ewmh, screen_nbr), &desktop_names, NULL);
	if (!desktop_names_success) {
		LOG_DEBUG("ewmh: could not get desktop names");
	}

	for (i = 0; i < desktop_len; i++) {
		desktops[i].is_selected = i == desktop_curr;
		desktops[i].is_urgent = false;
		desktops[i].clients_len = 0;

		if (desktop_names_success && desktop_names.strings) {
			copy_prop(desktop_name, desktop_names.strings, desktop_names.strings_len, i, desktop_len);
		}
		else {
			snprintf(desktop_name, COPY_PROP_BUFSIZ - 1, "%i", i + 1);
		}
		desktops[i].name = strndup(desktop_name, strlen(desktop_name));
	}

	/* get clients */
	int clients_success = xcb_ewmh_get_client_list_reply(ewmh, xcb_ewmh_get_client_list_unchecked(ewmh, screen_nbr), &clients, NULL);
	if (!clients_success) {
		LOG_DEBUG("ewmh: could not get client list");
	}
	else {
		for (i = 0; i < clients.windows_len; i++) {
			if (!xcb_ewmh_get_wm_desktop_reply(ewmh, xcb_ewmh_get_wm_desktop_unchecked(ewmh, clients.windows[i]), &client_desktop, NULL)) {
				/* window isn't associated with a desktop */
				continue;
			}
			desktops[client_desktop].clients_len++;

			/* check icccm urgency hint on client */
			if (!xcb_icccm_get_wm_hints_reply(ewmh->connection, xcb_icccm_get_wm_hints_unchecked(ewmh->connection, clients.windows[i]), &window_hints, NULL)) {
				LOG_DEBUG("icccm: could not get window hints");
			}
			if (window_hints.flags & XCB_ICCCM_WM_HINT_X_URGENCY) {
				desktops[client_desktop].is_urgent = true;
			}
		}
	}

	json_t *json_data_object = json_object();
	json_t *json_desktops_array = json_array();
	json_object_set_new(json_data_object, "desktops", json_desktops_array);

	for (i = 0; i < desktop_len; i++) {
		json_t *json_desktop = json_object();
		json_object_set_new(json_desktop, "name", json_string(desktops[i].name));
		json_object_set_new(json_desktop, "clients_len", json_integer(desktops[i].clients_len));
		json_object_set_new(json_desktop, "is_urgent", json_boolean(desktops[i].is_urgent));
		json_array_append_new(json_desktops_array, json_desktop);

		if (desktops[i].is_selected) {
			json_object_set_new(json_data_object, "current_desktop", json_integer(i));
		}
	}

	char *json_str = strdup(json_dumps(json_data_object, 0));
	widget_data_callback(widget, widget_data_arg_string(json_str));

	json_decref(json_data_object);
	free(json_str);

	/* cleanup */
	if (desktop_names_success) {
		xcb_ewmh_get_utf8_strings_reply_wipe(&desktop_names);
	}
	if (clients_success) {
		xcb_ewmh_get_windows_reply_wipe(&clients);
	}
	for (i = 0; i < desktop_len; i++) {
		free(desktops[i].name);
	}
	free(desktops);

	return 0;
}
Example #2
0
dbref
create_player(dbref creator, const char *name, const char *password)
{
    char buf[BUFFER_LEN];

    struct object *newp;

    dbref player;

    if (!ok_player_name(name) || !ok_password(password) || tp_db_readonly)
        return NOTHING;

    /* remove any existing alias with this name */
    clear_alias(0, name);

    /* else he doesn't already exist, create him */
    player = new_object(creator);
    newp = DBFETCH(player);

    /* initialize everything */
    NAME(player) = alloc_string(name);
    FLAGS(player) = TYPE_PLAYER;

    if (OkObj(tp_player_prototype)
        && (Typeof(tp_player_prototype) == TYPE_PLAYER)) {
        FLAGS(player) = FLAGS(tp_player_prototype);
        FLAG2(player) = FLAG2(tp_player_prototype);

        if (tp_pcreate_copy_props) {
            newp->properties = copy_prop(tp_player_prototype);
#ifdef DISKBASE
            newp->propsfpos = 0;
            newp->propsmode = PROPS_UNLOADED;
            newp->propstime = 0;
            newp->nextold = NOTHING;
            newp->prevold = NOTHING;
            dirtyprops(player);
#endif
        }
    }

    if (OkObj(tp_player_start)) {
        DBFETCH(player)->location = tp_player_start;
        DBFETCH(player)->sp.player.home = tp_player_start;
    } else {
        DBFETCH(player)->location = GLOBAL_ENVIRONMENT;
        DBFETCH(player)->sp.player.home = GLOBAL_ENVIRONMENT;
    }

    OWNER(player) = player;
    newp->exits = NOTHING;
    newp->sp.player.pennies = tp_start_pennies;
    newp->sp.player.password = NULL; /* this has to stay here. -hinoserm */
    newp->sp.player.curr_prog = NOTHING;
    newp->sp.player.insert_mode = 0;
#ifdef IGNORE_SUPPORT
    newp->sp.player.ignoretime = 0;
#endif /* IGNORE_SUPPORT */

    /* set password */
    set_password(player, password);

    /* link him to tp_player_start */
    PUSH(player, DBFETCH(tp_player_start)->contents);
    add_player(player);
    DBDIRTY(player);
    DBDIRTY(tp_player_start);

    sprintf(buf, CNOTE "%s is born!", NAME(player));
    anotify_except(DBFETCH(tp_player_start)->contents, NOTHING, buf, player);

    return player;
}
Example #3
0
#include "externs.h"

extern struct inst *oper1, *oper2, *oper3, *oper4;
extern struct inst temp1, temp2, temp3;
extern int tmp, result;
extern dbref ref;
extern char buf[BUFFER_LEN];


void 
copyobj(dbref player, dbref old, dbref new)
{
    struct object *newp = DBFETCH(new);

    NAME(new) = alloc_string(NAME(old));
    newp->properties = copy_prop(old);
    newp->exits = NOTHING;
    newp->contents = NOTHING;
    newp->next = NOTHING;
    newp->location = NOTHING;
    moveto(new, player);

#ifdef DISKBASE
    newp->propsfpos = 0;
    newp->propsmode = PROPS_UNLOADED;
    newp->propstime = 0;
    newp->nextold = NOTHING;
    newp->prevold = NOTHING;
    dirtyprops(new);
#endif