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; }
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; }
#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