static int conf_gui(void) { int id; /* Initialize the configuration GUI. */ if ((id = gui_vstack(0))) { int sound = config_get_d(CONFIG_SOUND_VOLUME); int music = config_get_d(CONFIG_MUSIC_VOLUME); int mouse = MOUSE_RANGE_MAP(config_get_d(CONFIG_MOUSE_SENSE)); const char *player = config_get_s(CONFIG_PLAYER); const char *ball = config_get_s(CONFIG_BALL_FILE); int name_id = 0, ball_id = 0; conf_header(id, _("Options"), GUI_BACK); conf_state(id, _("Graphics"), _("Configure"), CONF_VIDEO); gui_space(id); conf_slider(id, _("Mouse Sensitivity"), CONF_MOUSE_SENSE, mouse, mouse_id, ARRAYSIZE(mouse_id)); gui_space(id); conf_slider(id, _("Sound Volume"), CONF_SOUND_VOLUME, sound, sound_id, ARRAYSIZE(sound_id)); conf_slider(id, _("Music Volume"), CONF_MUSIC_VOLUME, music, music_id, ARRAYSIZE(music_id)); gui_space(id); name_id = conf_state(id, _("Player Name"), " ", CONF_PLAYER); ball_id = conf_state(id, _("Ball Model"), " ", CONF_BALL); gui_layout(id, 0, 0); gui_set_trunc(name_id, TRUNC_TAIL); gui_set_trunc(ball_id, TRUNC_TAIL); gui_set_label(name_id, player); gui_set_label(ball_id, base_name(ball)); } return id; }
static void recv_channelDestroy(struct mwService *srvc, struct mwChannel *chan, struct mwMsgChannelDestroy *msg) { /* - find conference from channel - trigger got_closed - remove conference, dealloc */ struct mwServiceConference *srvc_conf = (struct mwServiceConference *) srvc; struct mwConference *conf = conf_find(srvc_conf, chan); struct mwConferenceHandler *h = srvc_conf->handler; /* if there's no such conference, then I guess there's nothing to worry about. Except of course for the fact that we should never receive a channel destroy for a conference that doesn't exist. */ if(! conf) return; conf->channel = NULL; conf_state(conf, msg->reason? mwConference_ERROR: mwConference_CLOSING); if(h->conf_closed) h->conf_closed(conf, msg->reason); mwConference_destroy(conf, ERR_SUCCESS, NULL); }
int mwConference_open(struct mwConference *conf) { struct mwSession *session; struct mwChannel *chan; struct mwPutBuffer *b; int ret; g_return_val_if_fail(conf != NULL, -1); g_return_val_if_fail(conf->service != NULL, -1); g_return_val_if_fail(conf->state == mwConference_NEW, -1); g_return_val_if_fail(conf->channel == NULL, -1); session = mwService_getSession(MW_SERVICE(conf->service)); g_return_val_if_fail(session != NULL, -1); if(! conf->name) { char *user = mwSession_getProperty(session, mwSession_AUTH_USER_ID); conf->name = conf_generate_name(user? user: "******"); } chan = mwChannel_newOutgoing(mwSession_getChannels(session)); mwChannel_setService(chan, MW_SERVICE(conf->service)); mwChannel_setProtoType(chan, PROTOCOL_TYPE); mwChannel_setProtoVer(chan, PROTOCOL_VER); #if 0 /* offer all known ciphers */ mwChannel_populateSupportedCipherInstances(chan); #endif b = mwPutBuffer_new(); mwString_put(b, conf->name); mwString_put(b, conf->title); guint32_put(b, 0x00); mwPutBuffer_finalize(mwChannel_getAddtlCreate(chan), b); ret = mwChannel_create(chan); if(ret) { conf_state(conf, mwConference_ERROR); } else { conf_state(conf, mwConference_PENDING); conf->channel = chan; } return ret; }
static void WELCOME_recv(struct mwServiceConference *srvc, struct mwConference *conf, struct mwGetBuffer *b) { struct mwConferenceHandler *h; guint16 tmp16; guint32 tmp32; guint32 count; GList *l = NULL; /* re-read name and title */ g_free(conf->name); g_free(conf->title); conf->name = NULL; conf->title = NULL; mwString_get(b, &conf->name); mwString_get(b, &conf->title); /* some numbers we don't care about, then a count of members */ guint16_get(b, &tmp16); guint32_get(b, &tmp32); guint32_get(b, &count); if(mwGetBuffer_error(b)) { g_warning("error parsing welcome message for conference"); mwConference_destroy(conf, ERR_FAILURE, NULL); return; } while(count--) { guint16 member_id; struct mwLoginInfo *member = g_new0(struct mwLoginInfo, 1); guint16_get(b, &member_id); mwLoginInfo_get(b, member); if(mwGetBuffer_error(b)) { login_free(member); break; } MEMBER_ADD(conf, member_id, member); l = g_list_append(l, member); } conf_state(conf, mwConference_OPEN); h = srvc->handler; if(h->conf_opened) h->conf_opened(conf, l); /* get rid of the GList, but not its contents */ g_list_free(l); }
static int conf_video_gui(void) { static const struct option multisample_opts[] = { { N_("Off"), 0 }, { N_("2x"), 2 }, { N_("4x"), 4 }, { N_("8x"), 8 }, }; int id; if ((id = gui_vstack(0))) { char resolution[sizeof ("12345678 x 12345678")]; sprintf(resolution, "%d x %d", config_get_d(CONFIG_WIDTH), config_get_d(CONFIG_HEIGHT)); conf_header(id, _("Graphics"), GUI_BACK); conf_state (id, _("Resolution"), resolution, CONF_VIDEO_RESOLUTION); conf_toggle(id, _("Fullscreen"), CONF_VIDEO_FULLSCREEN, config_get_d(CONFIG_FULLSCREEN), _("On"), 1, _("Off"), 0); #ifdef ENABLE_HMD conf_toggle(id, _("HMD"), CONF_VIDEO_HMD, config_get_d(CONFIG_HMD), _("On"), 1, _("Off"), 0); #endif gui_space(id); conf_toggle(id, _("V-Sync"), CONF_VIDEO_VSYNC, config_get_d(CONFIG_VSYNC), _("On"), 1, _("Off"), 0); conf_select(id, _("Antialiasing"), CONF_VIDEO_MULTISAMPLE, config_get_d(CONFIG_MULTISAMPLE), multisample_opts, ARRAYSIZE(multisample_opts)); gui_space(id); conf_toggle(id, _("Reflection"), CONF_VIDEO_REFLECTION, config_get_d(CONFIG_REFLECTION), _("On"), 1, _("Off"), 0); conf_toggle(id, _("Background"), CONF_VIDEO_BACKGROUND, config_get_d(CONFIG_BACKGROUND), _("On"), 1, _("Off"), 0); conf_toggle(id, _("Shadow"), CONF_VIDEO_SHADOW, config_get_d(CONFIG_SHADOW), _("On"), 1, _("Off"), 0); gui_layout(id, 0, 0); } return id; }
static void recv_channelCreate(struct mwService *srvc, struct mwChannel *chan, struct mwMsgChannelCreate *msg) { /* - this is how we really receive invitations - create a conference and associate it with the channel - obtain the invite data from the msg addtl info - mark the conference as INVITED - trigger the got_invite event */ struct mwServiceConference *srvc_conf = (struct mwServiceConference *) srvc; struct mwConference *conf; struct mwGetBuffer *b; char *invite = NULL; guint tmp; conf = conf_new(srvc_conf); conf->channel = chan; b = mwGetBuffer_wrap(&msg->addtl); guint32_get(b, &tmp); mwString_get(b, &conf->name); mwString_get(b, &conf->title); guint32_get(b, &tmp); mwLoginInfo_get(b, &conf->owner); guint32_get(b, &tmp); mwString_get(b, &invite); if(mwGetBuffer_error(b)) { g_warning("failure parsing addtl for conference invite"); mwConference_destroy(conf, ERR_FAILURE, NULL); } else { struct mwConferenceHandler *h = srvc_conf->handler; conf_state(conf, mwConference_INVITED); if(h->on_invited) h->on_invited(conf, &conf->owner, invite); } mwGetBuffer_free(b); g_free(invite); }
static int video_gui(void) { static const struct conf_option multisample_opts[] = { { N_("Off"), 0 }, { N_("2x"), 2 }, { N_("4x"), 4 }, { N_("8x"), 8 }, }; int id, jd; if ((id = gui_vstack(0))) { char resolution[sizeof ("12345678 x 12345678")]; const char *display; int dpy = config_get_d(CONFIG_DISPLAY); sprintf(resolution, "%d x %d", config_get_d(CONFIG_WIDTH), config_get_d(CONFIG_HEIGHT)); if (!(display = SDL_GetDisplayName(dpy))) display = _("Unknown Display"); conf_header(id, _("Graphics"), GUI_BACK); if ((jd = conf_state(id, _("Display"), "Longest Name", VIDEO_DISPLAY))) { gui_set_trunc(jd, TRUNC_TAIL); gui_set_label(jd, display); } conf_toggle(id, _("Fullscreen"), VIDEO_FULLSCREEN, config_get_d(CONFIG_FULLSCREEN), _("On"), 1, _("Off"), 0); if ((jd = conf_state (id, _("Resolution"), resolution, VIDEO_RESOLUTION))) { /* * Because we always use the desktop display mode, disable * display mode switching in fullscreen. */ if (config_get_d(CONFIG_FULLSCREEN)) { gui_set_state(jd, GUI_NONE, 0); gui_set_color(jd, gui_gry, gui_gry); } } #if ENABLE_HMD conf_toggle(id, _("HMD"), VIDEO_HMD, config_get_d(CONFIG_HMD), _("On"), 1, _("Off"), 0); #endif gui_space(id); conf_toggle(id, _("V-Sync"), VIDEO_VSYNC, config_get_d(CONFIG_VSYNC), _("On"), 1, _("Off"), 0); conf_select(id, _("Antialiasing"), VIDEO_MULTISAMPLE, config_get_d(CONFIG_MULTISAMPLE), multisample_opts, ARRAYSIZE(multisample_opts)); gui_space(id); conf_toggle(id, _("Reflection"), VIDEO_REFLECTION, config_get_d(CONFIG_REFLECTION), _("On"), 1, _("Off"), 0); conf_toggle(id, _("Background"), VIDEO_BACKGROUND, config_get_d(CONFIG_BACKGROUND), _("On"), 1, _("Off"), 0); conf_toggle(id, _("Shadow"), VIDEO_SHADOW, config_get_d(CONFIG_SHADOW), _("On"), 1, _("Off"), 0); gui_layout(id, 0, 0); } return id; }