Since very few things have hardcoded positions in main halls, it's not hard to add support for main halls of any resolution and aspect ratio; in fact, the patch below does just that. Just keep in mind that the size of text changes with the resolution, so think twice before you use any 4K main halls! (Maybe I should add support for definable fonts in main halls...)
(And don't forget to change the value of +Tooltip Y appropriately!)
This patch also does the same thing with the preload screen.
Index: code/freespace2/freespace.cpp
===================================================================
--- code/freespace2/freespace.cpp	(revision 10550)
+++ code/freespace2/freespace.cpp	(working copy)
@@ -8692,16 +8692,20 @@
 			int width, height;
 			bm_get_info(Game_title_bitmap, &width, &height);
 
+			gr_set_screen_scale(width, height);
+
 			// draw it in the center of the screen
-			gr_bitmap((gr_screen.max_w_unscaled - width)/2, (gr_screen.max_h_unscaled - height)/2, GR_RESIZE_MENU);
-		}
+			gr_bitmap(0, 0, GR_RESIZE_MENU);
 
-		if (Game_title_logo != -1)
-		{
-			gr_set_bitmap(Game_title_logo);
+			if (Game_title_logo != -1)
+			{
+				gr_set_bitmap(Game_title_logo);
 
-			gr_bitmap(0, 0, GR_RESIZE_MENU);
+				gr_bitmap(0, 0, GR_RESIZE_MENU);
 
+			}
+
+			gr_reset_screen_scale();
 		}
 	}
 
Index: code/graphics/2d.cpp
===================================================================
--- code/graphics/2d.cpp	(revision 10550)
+++ code/graphics/2d.cpp	(working copy)
@@ -88,35 +88,39 @@
 static int GL_cursor_nframes = 0;
 
 // Pre-computed screen resize vars
-static float Gr_full_resize_X = 1.0f, Gr_full_resize_Y = 1.0f;
-static float Gr_resize_X = 1.0f, Gr_resize_Y = 1.0f;
-static float Gr_menu_offset_X = 0.0f, Gr_menu_offset_Y = 0.0f;
+static screen_scale Gr_resize;
+screen_scale Gr_save_resize;
 
-float Gr_save_full_resize_X = 1.0f, Gr_save_full_resize_Y = 1.0f;
-float Gr_save_resize_X = 1.0f, Gr_save_resize_Y = 1.0f;
-float Gr_save_menu_offset_X = 0.0f, Gr_save_menu_offset_Y = 0.0f;
-
 bool Save_custom_screen_size;
 
+void gr_set_screen_scale(screen_scale ss)
+{
+	Gr_resize = ss;
+
+	Save_custom_screen_size = gr_screen.custom_size;
+
+	gr_screen.custom_size = true;
+}
+
 void gr_set_screen_scale(int w, int h)
 {
-	Gr_full_resize_X = (float)gr_screen.max_w / (float)w;
-	Gr_full_resize_Y = (float)gr_screen.max_h / (float)h;
+	Gr_resize.full_resize_X = (float)gr_screen.max_w / (float)w;
+	Gr_resize.full_resize_Y = (float)gr_screen.max_h / (float)h;
 
 	if (!Cmdline_stretch_menu) {
 		float aspect_quotient = ((float)gr_screen.max_w / (float)gr_screen.max_h) / ((float)w / (float)h);
 
-		Gr_resize_X = Gr_full_resize_X / ((aspect_quotient > 1.0f) ? aspect_quotient : 1.0f);
-		Gr_resize_Y = Gr_full_resize_Y * ((aspect_quotient < 1.0f) ? aspect_quotient : 1.0f);
+		Gr_resize.resize_X = Gr_resize.full_resize_X / ((aspect_quotient > 1.0f) ? aspect_quotient : 1.0f);
+		Gr_resize.resize_Y = Gr_resize.full_resize_Y * ((aspect_quotient < 1.0f) ? aspect_quotient : 1.0f);
 
-		Gr_menu_offset_X = (aspect_quotient > 1.0f) ? ((gr_screen.max_w - gr_screen.max_w / aspect_quotient) / 2.0f) : 0.0f;
-		Gr_menu_offset_Y = (aspect_quotient < 1.0f) ? ((gr_screen.max_h - gr_screen.max_h * aspect_quotient) / 2.0f) : 0.0f;
+		Gr_resize.menu_offset_X = (aspect_quotient > 1.0f) ? ((gr_screen.max_w - gr_screen.max_w / aspect_quotient) / 2.0f) : 0.0f;
+		Gr_resize.menu_offset_Y = (aspect_quotient < 1.0f) ? ((gr_screen.max_h - gr_screen.max_h * aspect_quotient) / 2.0f) : 0.0f;
 	} else {
-		Gr_resize_X = Gr_full_resize_X;
-		Gr_resize_Y = Gr_full_resize_Y;
+		Gr_resize.resize_X = Gr_resize.full_resize_X;
+		Gr_resize.resize_Y = Gr_resize.full_resize_Y;
 
-		Gr_menu_offset_X = 0.0f;
-		Gr_menu_offset_Y = 0.0f;
+		Gr_resize.menu_offset_X = 0.0f;
+		Gr_resize.menu_offset_Y = 0.0f;
 	}
 
 	Save_custom_screen_size = gr_screen.custom_size;
@@ -126,11 +130,11 @@
 
 void gr_set_screen_scale(int w, int h, int max_w, int max_h)
 {
-	Gr_resize_X = Gr_full_resize_X = (float)max_w / (float)w;
-	Gr_resize_Y = Gr_full_resize_Y = (float)max_h / (float)h;
+	Gr_resize.resize_X = Gr_resize.full_resize_X = (float)max_w / (float)w;
+	Gr_resize.resize_Y = Gr_resize.full_resize_Y = (float)max_h / (float)h;
 
-	Gr_menu_offset_X = 0.0f;
-	Gr_menu_offset_Y = 0.0f;
+	Gr_resize.menu_offset_X = 0.0f;
+	Gr_resize.menu_offset_Y = 0.0f;
 
 	Save_custom_screen_size = gr_screen.custom_size;
 
@@ -137,16 +141,21 @@
 	gr_screen.custom_size = true;
 }
 
+screen_scale gr_get_screen_scale()
+{
+	return Gr_resize;
+}
+
 void gr_reset_screen_scale()
 {
-	Gr_full_resize_X = Gr_save_full_resize_X;
-	Gr_full_resize_Y = Gr_save_full_resize_Y;
+	Gr_resize.full_resize_X = Gr_save_resize.full_resize_X;
+	Gr_resize.full_resize_Y = Gr_save_resize.full_resize_Y;
 
-	Gr_resize_X = Gr_save_resize_X;
-	Gr_resize_Y = Gr_save_resize_Y;
+	Gr_resize.resize_X = Gr_save_resize.resize_X;
+	Gr_resize.resize_Y = Gr_save_resize.resize_Y;
 
-	Gr_menu_offset_X = Gr_save_menu_offset_X;
-	Gr_menu_offset_Y = Gr_save_menu_offset_Y;
+	Gr_resize.menu_offset_X = Gr_save_resize.menu_offset_X;
+	Gr_resize.menu_offset_Y = Gr_save_resize.menu_offset_Y;
 
 	gr_screen.custom_size = Save_custom_screen_size;
 }
@@ -171,22 +180,22 @@
 	float xy_tmp = 0.0f;
 
 	if ( x ) {
-		xy_tmp = (*x) * ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_X : Gr_resize_X) + ((resize_mode == GR_RESIZE_MENU) ? Gr_menu_offset_X : 0.0f);
+		xy_tmp = (*x) * ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_X : Gr_resize.resize_X) + ((resize_mode == GR_RESIZE_MENU) ? Gr_resize.menu_offset_X : 0.0f);
 		(*x) = fl2i(xy_tmp);
 	}
 
 	if ( y ) {
-		xy_tmp = (*y) * ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_Y : Gr_resize_Y) + ((resize_mode == GR_RESIZE_MENU) ? Gr_menu_offset_Y : 0.0f);
+		xy_tmp = (*y) * ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_Y : Gr_resize.resize_Y) + ((resize_mode == GR_RESIZE_MENU) ? Gr_resize.menu_offset_Y : 0.0f);
 		(*y) = fl2i(xy_tmp);
 	}
 
 	if ( w ) {
-		xy_tmp = (*w) * ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_X : Gr_resize_X);
+		xy_tmp = (*w) * ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_X : Gr_resize.resize_X);
 		(*w) = fl2i(xy_tmp);
 	}
 
 	if ( h ) {
-		xy_tmp = (*h) * ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_Y : Gr_resize_Y);
+		xy_tmp = (*h) * ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_Y : Gr_resize.resize_Y);
 		(*h) = fl2i(xy_tmp);
 	}
 
@@ -211,22 +220,22 @@
 	float xy_tmp = 0.0f;
 
 	if ( x ) {
-		xy_tmp = ((*x) - ((resize_mode == GR_RESIZE_MENU) ? Gr_menu_offset_X : 0.0f)) / ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_X : Gr_resize_X);
+		xy_tmp = ((*x) - ((resize_mode == GR_RESIZE_MENU) ? Gr_resize.menu_offset_X : 0.0f)) / ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_X : Gr_resize.resize_X);
 		(*x) = fl2i(xy_tmp);
 	}
 
 	if ( y ) {
-		xy_tmp = ((*y) - ((resize_mode == GR_RESIZE_MENU) ? Gr_menu_offset_Y : 0.0f)) / ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_Y : Gr_resize_Y);
+		xy_tmp = ((*y) - ((resize_mode == GR_RESIZE_MENU) ? Gr_resize.menu_offset_Y : 0.0f)) / ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_Y : Gr_resize.resize_Y);
 		(*y) = fl2i(xy_tmp);
 	}
 
 	if ( w ) {
-		xy_tmp = (*w) / ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_X : Gr_resize_X);
+		xy_tmp = (*w) / ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_X : Gr_resize.resize_X);
 		(*w) = fl2i(xy_tmp);
 	}
 
 	if ( h ) {
-		xy_tmp = (*h) / ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_Y : Gr_resize_Y);
+		xy_tmp = (*h) / ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_Y : Gr_resize.resize_Y);
 		(*h) = fl2i(xy_tmp);
 	}
 
@@ -253,22 +262,22 @@
 	float xy_tmp = 0.0f;
 
 	if ( x ) {
-		xy_tmp = (*x) * ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_X : Gr_resize_X) + ((resize_mode == GR_RESIZE_MENU) ? Gr_menu_offset_X : 0.0f);
+		xy_tmp = (*x) * ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_X : Gr_resize.resize_X) + ((resize_mode == GR_RESIZE_MENU) ? Gr_resize.menu_offset_X : 0.0f);
 		(*x) = xy_tmp;
 	}
 
 	if ( y ) {
-		xy_tmp = (*y) * ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_Y : Gr_resize_Y) + ((resize_mode == GR_RESIZE_MENU) ? Gr_menu_offset_Y : 0.0f);
+		xy_tmp = (*y) * ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_Y : Gr_resize.resize_Y) + ((resize_mode == GR_RESIZE_MENU) ? Gr_resize.menu_offset_Y : 0.0f);
 		(*y) = xy_tmp;
 	}
 
 	if ( w ) {
-		xy_tmp = (*w) * ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_X : Gr_resize_X);
+		xy_tmp = (*w) * ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_X : Gr_resize.resize_X);
 		(*w) = xy_tmp;
 	}
 
 	if ( h ) {
-		xy_tmp = (*h) * ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_Y : Gr_resize_Y);
+		xy_tmp = (*h) * ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_Y : Gr_resize.resize_Y);
 		(*h) = xy_tmp;
 	}
 
@@ -293,22 +302,22 @@
 	float xy_tmp = 0.0f;
 
 	if ( x ) {
-		xy_tmp = ((*x) - ((resize_mode == GR_RESIZE_MENU) ? Gr_menu_offset_X : 0.0f)) / ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_X : Gr_resize_X);
+		xy_tmp = ((*x) - ((resize_mode == GR_RESIZE_MENU) ? Gr_resize.menu_offset_X : 0.0f)) / ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_X : Gr_resize.resize_X);
 		(*x) = xy_tmp;
 	}
 
 	if ( y ) {
-		xy_tmp = ((*y) - ((resize_mode == GR_RESIZE_MENU) ? Gr_menu_offset_Y : 0.0f)) / ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_Y : Gr_resize_Y);
+		xy_tmp = ((*y) - ((resize_mode == GR_RESIZE_MENU) ? Gr_resize.menu_offset_Y : 0.0f)) / ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_Y : Gr_resize.resize_Y);
 		(*y) = xy_tmp;
 	}
 
 	if ( w ) {
-		xy_tmp = (*w) / ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_X : Gr_resize_X);
+		xy_tmp = (*w) / ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_X : Gr_resize.resize_X);
 		(*w) = xy_tmp;
 	}
 
 	if ( h ) {
-		xy_tmp = (*h) / ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_Y : Gr_resize_Y);
+		xy_tmp = (*h) / ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_Y : Gr_resize.resize_Y);
 		(*h) = xy_tmp;
 	}
 
@@ -476,23 +485,23 @@
 		mode = GR_OPENGL;
 	}
 
-	Gr_save_full_resize_X = Gr_full_resize_X = (float)width / ((res == GR_1024) ? 1024.0f : 640.0f);
-	Gr_save_full_resize_Y = Gr_full_resize_Y = (float)height / ((res == GR_1024) ?  768.0f : 480.0f);
+	Gr_save_resize.full_resize_X = Gr_resize.full_resize_X = (float)width / ((res == GR_1024) ? 1024.0f : 640.0f);
+	Gr_save_resize.full_resize_Y = Gr_resize.full_resize_Y = (float)height / ((res == GR_1024) ?  768.0f : 480.0f);
 
 	if (gr_screen.custom_size && !Cmdline_stretch_menu) {
 		float aspect_quotient = ((float)width / (float)height) / (4.0f / 3.0f);
 
-		Gr_save_resize_X = Gr_resize_X = Gr_full_resize_X / ((aspect_quotient > 1.0f) ? aspect_quotient : 1.0f);
-		Gr_save_resize_Y = Gr_resize_Y = Gr_full_resize_Y * ((aspect_quotient < 1.0f) ? aspect_quotient : 1.0f);
+		Gr_save_resize.resize_X = Gr_resize.resize_X = Gr_resize.full_resize_X / ((aspect_quotient > 1.0f) ? aspect_quotient : 1.0f);
+		Gr_save_resize.resize_Y = Gr_resize.resize_Y = Gr_resize.full_resize_Y * ((aspect_quotient < 1.0f) ? aspect_quotient : 1.0f);
 
-		Gr_save_menu_offset_X = Gr_menu_offset_X = (aspect_quotient > 1.0f) ? ((width - width / aspect_quotient) / 2.0f) : 0.0f;
-		Gr_save_menu_offset_Y = Gr_menu_offset_Y = (aspect_quotient < 1.0f) ? ((height - height * aspect_quotient) / 2.0f) : 0.0f;
+		Gr_save_resize.menu_offset_X = Gr_resize.menu_offset_X = (aspect_quotient > 1.0f) ? ((width - width / aspect_quotient) / 2.0f) : 0.0f;
+		Gr_save_resize.menu_offset_Y = Gr_resize.menu_offset_Y = (aspect_quotient < 1.0f) ? ((height - height * aspect_quotient) / 2.0f) : 0.0f;
 	} else {
-		Gr_save_resize_X = Gr_resize_X = Gr_full_resize_X;
-		Gr_save_resize_Y = Gr_resize_Y = Gr_full_resize_Y;
+		Gr_save_resize.resize_X = Gr_resize.resize_X = Gr_resize.full_resize_X;
+		Gr_save_resize.resize_Y = Gr_resize.resize_Y = Gr_resize.full_resize_Y;
 
-		Gr_save_menu_offset_X = Gr_menu_offset_X = 0.0f;
-		Gr_save_menu_offset_Y = Gr_menu_offset_Y = 0.0f;
+		Gr_save_resize.menu_offset_X = Gr_resize.menu_offset_X = 0.0f;
+		Gr_save_resize.menu_offset_Y = Gr_resize.menu_offset_Y = 0.0f;
 	}
 	
 
Index: code/graphics/2d.h
===================================================================
--- code/graphics/2d.h	(revision 10550)
+++ code/graphics/2d.h	(working copy)
@@ -59,6 +59,12 @@
 	ubyte	lookup[256];
 } shader;
 
+typedef struct screen_scale {
+	float full_resize_X = 1.0f, full_resize_Y = 1.0f;
+	float resize_X = 1.0f, resize_Y = 1.0f;
+	float menu_offset_X = 0.0f, menu_offset_Y = 0.0f;
+} screen_scale;
+
 #define AC_TYPE_NONE		0		// Not an alphacolor
 #define AC_TYPE_HUD		1		// Doesn't change hue depending on background.  Used for HUD stuff.
 #define AC_TYPE_BLEND	2		// Changes hue depending on background.  Used for stars, etc.
@@ -575,8 +581,10 @@
 #define GR_RESIZE_MENU				2
 #define GR_RESIZE_MENU_NO_OFFSET	3
 
+void gr_set_screen_scale(screen_scale ss);
 void gr_set_screen_scale(int x, int y);
 void gr_set_screen_scale(int x, int y, int max_x, int max_y);
+screen_scale gr_get_screen_scale();
 void gr_reset_screen_scale();
 bool gr_unsize_screen_pos(int *x, int *y, int *w = NULL, int *h = NULL, int resize_mode = GR_RESIZE_FULL);
 bool gr_resize_screen_pos(int *x, int *y, int *w = NULL, int *h = NULL, int resize_mode = GR_RESIZE_FULL);
Index: code/menuui/mainhallmenu.cpp
===================================================================
--- code/menuui/mainhallmenu.cpp	(revision 10550)
+++ code/menuui/mainhallmenu.cpp	(working copy)
@@ -74,6 +74,10 @@
 // background bitmap handle
 int Main_hall_bitmap;
 
+// background bitmap dimensions
+int Main_hall_bitmap_w;
+int Main_hall_bitmap_h;
+
 // background bitmap mask handle
 int Main_hall_mask;
 
@@ -350,6 +354,7 @@
 // blit some small color indicators to show whether ships.tbl and weapons.tbl are valid
 // green == valid, red == invalid.
 // ships.tbl will be on the left, weapons.tbl on the right
+/*
 int Mh_ship_table_status[GR_NUM_RESOLUTIONS][2] = {
 	{ 1, 479 },
 	{ 1, 767 }
@@ -358,15 +363,16 @@
 	{ 3, 479 },
 	{ 3, 767 }
 };
+*/
 void main_hall_blit_table_status()
 {
 	// blit ship table status
 	gr_set_color_fast(Game_ships_tbl_valid ? &Color_bright_green : &Color_bright_red);
-	gr_line(Mh_ship_table_status[gr_screen.res][0], Mh_ship_table_status[gr_screen.res][1], Mh_ship_table_status[gr_screen.res][0], Mh_ship_table_status[gr_screen.res][1], GR_RESIZE_MENU);
+	gr_line(1, Main_hall_bitmap_h - 1, 1, Main_hall_bitmap_h - 1, GR_RESIZE_MENU);
 
 	// blit weapon table status
 	gr_set_color_fast(Game_weapons_tbl_valid ? &Color_bright_green : &Color_bright_red);
-	gr_line(Mh_weapon_table_status[gr_screen.res][0], Mh_weapon_table_status[gr_screen.res][1], Mh_weapon_table_status[gr_screen.res][0], Mh_ship_table_status[gr_screen.res][1], GR_RESIZE_MENU);
+	gr_line(3, Main_hall_bitmap_h - 1, 3, Main_hall_bitmap_h - 1, GR_RESIZE_MENU);
 }
 
 /**
@@ -468,10 +474,15 @@
 		}
 	}
 
+	Main_hall_bitmap_w = -1;
+	Main_hall_bitmap_h = -1;
+
 	// load the background bitmap
 	Main_hall_bitmap = bm_load(Main_hall->bitmap);
 	if (Main_hall_bitmap < 0) {
 		nprintf(("General","WARNING! Couldn't load main hall background bitmap %s\n", Main_hall->bitmap.c_str()));
+	} else {
+		bm_get_info(Main_hall_bitmap, &Main_hall_bitmap_w, &Main_hall_bitmap_h);
 	}
 	bg_type = bm_get_type(Main_hall_bitmap);
 
@@ -620,6 +631,8 @@
 {
 	int code, key, snazzy_action;
 
+	gr_set_screen_scale(Main_hall_bitmap_w, Main_hall_bitmap_h);
+
 	// need to ensure ambient is playing, since it may be stopped by a playing movie
 	main_hall_start_ambient();
 
@@ -834,6 +847,7 @@
 #endif
 
 	gr_flip();
+	gr_reset_screen_scale();
 
 	// see if we have a missing campaign and force the player to select a new campaign if so
 	extern bool Campaign_room_no_campaigns;
@@ -1458,7 +1472,7 @@
 			gr_set_color_fast(&Color_bright);
 
 			gr_get_string_size(&w,&h,Main_hall_notify_text);
-			gr_printf_menu((gr_screen.max_w_unscaled - w)/2, gr_screen.max_h_unscaled - 40, Main_hall_notify_text);
+			gr_printf_menu((Main_hall_bitmap_w - w)/2, Main_hall_bitmap_h - 40, Main_hall_notify_text);
 		}
 	}
 }
@@ -1526,7 +1540,7 @@
 
 	// print the string near the lower left corner
 	gr_set_color_fast(&Color_bright_white);
-	gr_string(5, gr_screen.max_h_unscaled - 24, version_string, GR_RESIZE_MENU);
+	gr_string(5, Main_hall_bitmap_h - 24, version_string, GR_RESIZE_MENU);
 }
 
 /**
@@ -1563,7 +1577,7 @@
 		gr_shade(0, shader_y, gr_screen.clip_width_unscaled, (gr_screen.clip_height_unscaled - shader_y), GR_RESIZE_MENU);
 
 		gr_set_color_fast(&Color_bright_white);
-		gr_string((gr_screen.max_w_unscaled - w)/2, Main_hall->region_yval, Main_hall->region_descript.at(text_index), GR_RESIZE_MENU);
+		gr_string((Main_hall_bitmap_w - w)/2, Main_hall->region_yval, Main_hall->region_descript.at(text_index), GR_RESIZE_MENU);
 	}
 }
 
@@ -1603,7 +1617,7 @@
 	gr_set_color_fast(&Color_bright_white);
 	gr_set_shader(&Main_hall_tooltip_shader);
 	gr_shade(0, 0, gr_screen.max_w_unscaled, (2*Main_hall_tooltip_padding[gr_screen.res]) + h - y_anim_offset, GR_RESIZE_MENU);
-	gr_string((gr_screen.max_w_unscaled - w)/2, Main_hall_tooltip_padding[gr_screen.res] /*- y_anim_offset*/, str, GR_RESIZE_MENU);
+	gr_string((Main_hall_bitmap_w - w)/2, Main_hall_tooltip_padding[gr_screen.res] /*- y_anim_offset*/, str, GR_RESIZE_MENU);
 }
 
 /**
Index: code/popup/popup.cpp
===================================================================
--- code/popup/popup.cpp	(revision 10550)
+++ code/popup/popup.cpp	(working copy)
@@ -820,6 +820,9 @@
 
 	screen_id = gr_save_screen();
 
+	screen_scale old_scale = gr_get_screen_scale();
+	gr_reset_screen_scale();
+
 	while(!done) {
 		int k;
 
@@ -871,6 +874,8 @@
 		gr_flip();
 	}
 
+	gr_set_screen_scale(old_scale);
+
 	popup_close(pi,screen_id);
 	return choice;
 }