diff --git a/xpinstall/wizard/unix/src2/nsComponentsDlg.cpp b/xpinstall/wizard/unix/src2/nsComponentsDlg.cpp index fc7dab1f124d..de4e5419070a 100644 --- a/xpinstall/wizard/unix/src2/nsComponentsDlg.cpp +++ b/xpinstall/wizard/unix/src2/nsComponentsDlg.cpp @@ -26,9 +26,11 @@ #include "nsXInstaller.h" #include "check_on.xpm" #include "check_off.xpm" +#include static nsSetupType *sCustomST; // cache a pointer to the custom setup type static GtkWidget *sDescLong; +static gint sCurrRowSelected; nsComponentsDlg::nsComponentsDlg() : mMsg0(NULL), @@ -348,8 +350,13 @@ nsComponentsDlg::Show(int aDirection) currComp = currComp->GetNext(); } + // by default, first row selected upon Show() + sCurrRowSelected = 0; + gtk_signal_connect(GTK_OBJECT(list), "select_row", GTK_SIGNAL_FUNC(RowSelected), NULL); + gtk_signal_connect(GTK_OBJECT(list), "key_press_event", + GTK_SIGNAL_FUNC(KeyPressed), NULL); gtk_container_add(GTK_CONTAINER(scrollwin), list); gtk_widget_show(list); gtk_widget_show(scrollwin); @@ -468,6 +475,28 @@ nsComponentsDlg::RowSelected(GtkWidget *aWidget, gint aRow, gint aColumn, { DUMP("RowSelected"); + sCurrRowSelected = aRow; + + // only toggle row selection state for clicks on the row + if (aColumn == -1 && !aEvent) + return; + + ToggleRowSelection(aWidget, aRow); +} + +void +nsComponentsDlg::KeyPressed(GtkWidget *aWidget, GdkEventKey *aEvent, + gpointer aData) +{ + DUMP("KeyPressed"); + + if (aEvent->keyval == GDK_space) + ToggleRowSelection(aWidget, sCurrRowSelected); +} + +void +nsComponentsDlg::ToggleRowSelection(GtkWidget *aWidget, gint aRow) +{ int numRows = 0, currRow = 0; GtkStyle *style = NULL; GdkBitmap *ch_mask = NULL; diff --git a/xpinstall/wizard/unix/src2/nsComponentsDlg.h b/xpinstall/wizard/unix/src2/nsComponentsDlg.h index 077b37653fa9..fcd76d6bd626 100644 --- a/xpinstall/wizard/unix/src2/nsComponentsDlg.h +++ b/xpinstall/wizard/unix/src2/nsComponentsDlg.h @@ -50,6 +50,9 @@ public: static void RowSelected(GtkWidget *aWidget, gint aRow, gint aColumn, GdkEventButton *aEvent, gpointer aData); + static void KeyPressed(GtkWidget *aWidget, GdkEventKey *aEvent, + gpointer aData); + static void ToggleRowSelection(GtkWidget *aEvent, gint aRow); /*--------------------------------------------------------------------* * INI Properties diff --git a/xpinstall/wizard/unix/src2/nsWelcomeDlg.cpp b/xpinstall/wizard/unix/src2/nsWelcomeDlg.cpp index 8519ada15384..69b15ba4c763 100644 --- a/xpinstall/wizard/unix/src2/nsWelcomeDlg.cpp +++ b/xpinstall/wizard/unix/src2/nsWelcomeDlg.cpp @@ -176,6 +176,9 @@ nsWelcomeDlg::Show(int aDirection) if (gCtx->back) gtk_widget_hide(gCtx->back); + GTK_WIDGET_SET_FLAGS(gCtx->next, GTK_CAN_DEFAULT); + gtk_widget_grab_default(gCtx->next); + if (aDirection == nsXInstallerDlg::BACKWARD_MOVE) { // change the button titles back to Back/Next diff --git a/xpinstall/wizard/unix/src2/nsXInstaller.cpp b/xpinstall/wizard/unix/src2/nsXInstaller.cpp index f5aa13eacf1e..a3e5a6eeb2ce 100644 --- a/xpinstall/wizard/unix/src2/nsXInstaller.cpp +++ b/xpinstall/wizard/unix/src2/nsXInstaller.cpp @@ -312,6 +312,8 @@ nsXInstaller::DrawNavButtons() gtk_container_add(GTK_CONTAINER(gCtx->back), gCtx->backLabel); gtk_widget_show(gCtx->nextLabel); gtk_widget_show(gCtx->backLabel); + GTK_WIDGET_SET_FLAGS(gCtx->next, GTK_CAN_DEFAULT); + gtk_widget_grab_default(gCtx->next); navbtnhbox = gtk_hbox_new(TRUE, 10); canvasvbox = gtk_vbox_new(TRUE, 10); @@ -324,11 +326,11 @@ nsXInstaller::DrawNavButtons() gtk_table_attach(GTK_TABLE(navbtntable), gCtx->back, 2, 3, 0, 1, static_cast(GTK_FILL | GTK_EXPAND), - static_cast(GTK_FILL | GTK_EXPAND), + static_cast(GTK_SHRINK), 5, 5); gtk_table_attach(GTK_TABLE(navbtntable), gCtx->next, 3, 4, 0, 1, static_cast(GTK_FILL | GTK_EXPAND), - static_cast(GTK_FILL | GTK_EXPAND), + static_cast(GTK_SHRINK), 5, 5); gtk_widget_show(navbtntable); @@ -446,6 +448,8 @@ ErrorHandler(int aErr, const char* aErrMsg) gtk_container_add(GTK_CONTAINER(GTK_DIALOG(sErrDlg)->vbox), label); + GTK_WIDGET_SET_FLAGS(okButton, GTK_CAN_DEFAULT); + gtk_widget_grab_default(okButton); gtk_widget_show_all(sErrDlg); return aErr;