/************************************************************************** Callback from city name dialog for new city. **************************************************************************/ static void name_new_city_popup_callback(gpointer data, gint response, const char *input) { int idx = GPOINTER_TO_INT(data); switch (response) { case GTK_RESPONSE_OK: finish_city(index_to_tile(idx), input); break; case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_DELETE_EVENT: cancel_city(index_to_tile(idx)); break; } }
/************************************************************************** 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; }