diff --git a/scripts/lxdialog/msgbox.c b/scripts/lxdialog/msgbox.c
index 93692e1..76f358c 100644
--- a/scripts/lxdialog/msgbox.c
+++ b/scripts/lxdialog/msgbox.c
@@ -26,60 +26,59 @@
  * if the parameter 'pause' is non-zero.
  */
 int
-dialog_msgbox (const char *title, const char *prompt, int height, int width,
-		int pause)
+dialog_msgbox(const char *title, const char *prompt, int height, int width,
+	      int pause)
 {
-    int i, x, y, key = 0;
-    WINDOW *dialog;
+	int i, x, y, key = 0;
+	WINDOW *dialog;
 
-    /* center dialog box on screen */
-    x = (COLS - width) / 2;
-    y = (LINES - height) / 2;
+	/* center dialog box on screen */
+	x = (COLS - width) / 2;
+	y = (LINES - height) / 2;
 
-    draw_shadow (stdscr, y, x, height, width);
+	draw_shadow(stdscr, y, x, height, width);
 
-    dialog = newwin (height, width, y, x);
-    keypad (dialog, TRUE);
+	dialog = newwin(height, width, y, x);
+	keypad(dialog, TRUE);
 
-    draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
+	draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
 
-    if (title != NULL && strlen(title) >= width-2 ) {
-	/* truncate long title -- mec */
-	char * title2 = malloc(width-2+1);
-	memcpy( title2, title, width-2 );
-	title2[width-2] = '\0';
-	title = title2;
-    }
+	if (title != NULL && strlen(title) >= width - 2) {
+		/* truncate long title -- mec */
+		char *title2 = malloc(width - 2 + 1);
+		memcpy(title2, title, width - 2);
+		title2[width - 2] = '\0';
+		title = title2;
+	}
 
-    if (title != NULL) {
-	wattrset (dialog, title_attr);
-	mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
-	waddstr (dialog, (char *)title);
-	waddch (dialog, ' ');
-    }
-    wattrset (dialog, dialog_attr);
-    print_autowrap (dialog, prompt, width - 2, 1, 2);
+	if (title != NULL) {
+		wattrset(dialog, title_attr);
+		mvwaddch(dialog, 0, (width - strlen(title)) / 2 - 1, ' ');
+		waddstr(dialog, (char *)title);
+		waddch(dialog, ' ');
+	}
+	wattrset(dialog, dialog_attr);
+	print_autowrap(dialog, prompt, width - 2, 1, 2);
 
-    if (pause) {
-	wattrset (dialog, border_attr);
-	mvwaddch (dialog, height - 3, 0, ACS_LTEE);
-	for (i = 0; i < width - 2; i++)
-	    waddch (dialog, ACS_HLINE);
-	wattrset (dialog, dialog_attr);
-	waddch (dialog, ACS_RTEE);
+	if (pause) {
+		wattrset(dialog, border_attr);
+		mvwaddch(dialog, height - 3, 0, ACS_LTEE);
+		for (i = 0; i < width - 2; i++)
+			waddch(dialog, ACS_HLINE);
+		wattrset(dialog, dialog_attr);
+		waddch(dialog, ACS_RTEE);
 
-	print_button (dialog, "  Ok  ",
-		      height - 2, width / 2 - 4, TRUE);
+		print_button(dialog, "  Ok  ", height - 2, width / 2 - 4, TRUE);
 
-	wrefresh (dialog);
-	while (key != ESC && key != '\n' && key != ' ' &&
-               key != 'O' && key != 'o' && key != 'X' && key != 'x')
-	    key = wgetch (dialog);
-    } else {
-	key = '\n';
-	wrefresh (dialog);
-    }
+		wrefresh(dialog);
+		while (key != ESC && key != '\n' && key != ' ' &&
+		       key != 'O' && key != 'o' && key != 'X' && key != 'x')
+			key = wgetch(dialog);
+	} else {
+		key = '\n';
+		wrefresh(dialog);
+	}
 
-    delwin (dialog);
-    return key == ESC ? -1 : 0;
+	delwin(dialog);
+	return key == ESC ? -1 : 0;
 }
