static void notify_goto_command_callback(Widget w, XtPointer client_data, XtPointer call_data) { struct tile *ptile = notify_goto_find_widget(w); center_tile_mapcanvas(ptile); notify_goto_widget_remove(w); XtDestroyWidget(XtParent(XtParent(w))); XtSetSensitive(toplevel, TRUE); }
/************************************************************************** ... **************************************************************************/ void find_center_command_callback(Widget w, XtPointer client_data, XtPointer call_data) { struct city *pcity; XawListReturnStruct *ret; ret=XawListShowCurrent(find_list); if(ret->list_index!=XAW_LIST_NONE) if((pcity=game_find_city_by_name(ret->string))) center_tile_mapcanvas(pcity->x, pcity->y); popdown_find_dialog(); }
/************************************************************************** ... **************************************************************************/ static void overview_mouse_press_callback(struct sw_widget *widget, const struct ct_point *pos, enum be_mouse_button button, int state, void *data) { int xtile, ytile; freelog(LOG_DEBUG, "press (%d,%d)", pos->x, pos->y); overview_to_map_pos(&xtile,&ytile,pos->x,pos->y); freelog(LOG_DEBUG, " --> (%d,%d)", xtile, ytile); if (can_client_change_view() && button == 3) { center_tile_mapcanvas(map_pos_to_tile(xtile, ytile)); } /* FIXME else if (can_client_issue_orders() && ev->button == 1) { do_unit_goto(xtile, ytile); } */ }
/************************************************************************** Button pressed at overview **************************************************************************/ gboolean butt_down_overviewcanvas(GtkWidget *w, GdkEventButton *ev, gpointer data) { int xtile, ytile; if (ev->type != GDK_BUTTON_PRESS) return TRUE; /* Double-clicks? Triple-clicks? No thanks! */ overview_to_map_pos(&xtile, &ytile, ev->x, ev->y); if (can_client_change_view() && (ev->button == 3)) { center_tile_mapcanvas(map_pos_to_tile(xtile, ytile)); } else if (can_client_issue_orders() && (ev->button == 1)) { do_map_click(map_pos_to_tile(xtile, ytile), (ev->state & GDK_SHIFT_MASK) ? SELECT_APPEND : SELECT_POPUP); } return TRUE; }
/************************************************************************** ... **************************************************************************/ void mapctrl_btn_overviewcanvas(XEvent *event) { int map_x, map_y; struct tile *ptile; XButtonEvent *ev = &event->xbutton; if (!can_client_change_view()) { return; } overview_to_map_pos(&map_x, &map_y, event->xbutton.x, event->xbutton.y); ptile = map_pos_to_tile(map_x, map_y); if (!ptile) { return; } if(ev->button==Button1) do_map_click(ptile, SELECT_POPUP); else if(ev->button==Button3) center_tile_mapcanvas(ptile); }
/************************************************************************** ... **************************************************************************/ void handle_game_state(struct packet_generic_integer *packet) { if(client_state==CLIENT_SELECT_RACE_STATE && packet->value==CLIENT_GAME_RUNNING_STATE) { popdown_races_dialog(); } client_state=packet->value; if(client_state==CLIENT_GAME_RUNNING_STATE) { refresh_overview_canvas(); refresh_overview_viewrect(); player_set_unit_focus_status(game.player_ptr); update_unit_focus(); update_unit_info_label(get_unit_in_focus()); if(get_unit_in_focus()) center_tile_mapcanvas(get_unit_in_focus()->x, get_unit_in_focus()->y); } }
/************************************************************************** User has responded to goto dialog **************************************************************************/ static void goto_cmd_callback(GtkWidget *dlg, gint arg) { switch (arg) { case GTK_RESPONSE_CANCEL: center_tile_mapcanvas(original_tile); break; case CMD_AIRLIFT: { struct city *pdestcity = get_selected_city(); if (pdestcity) { unit_list_iterate(get_units_in_focus(), punit) { if (unit_can_airlift_to(punit, pdestcity)) { request_unit_airlift(punit, pdestcity); } } unit_list_iterate_end; } } break; case CMD_GOTO: { struct city *pdestcity = get_selected_city(); if (pdestcity) { unit_list_iterate(get_units_in_focus(), punit) { send_goto_tile(punit, pdestcity->tile); } unit_list_iterate_end; } } break; default: break; }
void recenter_at_tile_int(long tile) { if(tile == 0) errlog("recenter_at_tile_int: tile == 0\n"); center_tile_mapcanvas((struct tile*)tile); }
/************************************************************************** Click a link. **************************************************************************/ static gboolean event_after(GtkWidget *text_view, GdkEventButton *event) { GtkTextIter start, end, iter; GtkTextBuffer *buffer; GSList *tags, *tagp; gint x, y; struct tile *ptile = NULL; if (event->type != GDK_BUTTON_RELEASE || event->button != 1) { return FALSE; } buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view)); /* We shouldn't follow a link if the user has selected something. */ gtk_text_buffer_get_selection_bounds(buffer, &start, &end); if (gtk_text_iter_get_offset(&start) != gtk_text_iter_get_offset(&end)) { return FALSE; } gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW (text_view), GTK_TEXT_WINDOW_WIDGET, event->x, event->y, &x, &y); gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(text_view), &iter, x, y); if ((tags = gtk_text_iter_get_tags(&iter))) { for (tagp = tags; tagp; tagp = tagp->next) { GtkTextTag *tag = tagp->data; enum text_link_type type = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(tag), "type")); if (type != 0) { /* This is a link. */ int id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(tag), "id")); ptile = NULL; /* Real type is type - 1. * See comment in apply_text_tag() for g_object_set_data(). */ type--; switch (type) { case TLT_CITY: { struct city *pcity = game_city_by_number(id); if (pcity) { ptile = client_city_tile(pcity); } else { output_window_append(ftc_client, _("This city isn't known!")); } } break; case TLT_TILE: ptile = index_to_tile(id); if (!ptile) { output_window_append(ftc_client, _("This tile doesn't exist in this game!")); } break; case TLT_UNIT: { struct unit *punit = game_unit_by_number(id); if (punit) { ptile = unit_tile(punit); } else { output_window_append(ftc_client, _("This unit isn't known!")); } } break; } if (ptile) { center_tile_mapcanvas(ptile); link_mark_restore(type, id); gtk_widget_grab_focus(GTK_WIDGET(map_canvas)); } } } g_slist_free(tags); } return FALSE; }