mssh-pref.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. #define GETTEXT_PACKAGE "mssh"
  2. #include <glib/gi18n-lib.h>
  3. #include "mssh-gconf.h"
  4. #include "mssh-pref.h"
  5. GSettings *settings;
  6. static void mssh_pref_init(MSSHPref* pref);
  7. static void mssh_pref_class_init(MSSHPrefClass *klass);
  8. G_DEFINE_TYPE(MSSHPref, mssh_pref, GTK_TYPE_WINDOW)
  9. GtkWidget* mssh_pref_new(GSettings *window_settings)
  10. {
  11. settings = window_settings;
  12. return g_object_new(MSSH_TYPE_PREF, NULL);
  13. }
  14. static void mssh_pref_close(GtkWidget *widget, gpointer data)
  15. {
  16. MSSHPref *pref = MSSH_PREF(data);
  17. gtk_widget_destroy(GTK_WIDGET(pref));
  18. }
  19. static void mssh_pref_font_select(GtkWidget *widget, gpointer data)
  20. {
  21. const gchar *font;
  22. font = gtk_font_chooser_get_font (GTK_FONT_CHOOSER(widget));
  23. g_settings_set_string(settings, MSSH_GCONF_KEY_FONT, font);
  24. }
  25. static void mssh_pref_fg_colour_select(GtkWidget *widget, gpointer data)
  26. {
  27. GdkRGBA colour;
  28. const gchar *colour_s;
  29. gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(widget), &colour);
  30. colour_s = gdk_rgba_to_string(&colour);
  31. g_settings_set_string(settings, MSSH_GCONF_KEY_FG_COLOUR, colour_s);
  32. }
  33. static void mssh_pref_bg_colour_select(GtkWidget *widget, gpointer data)
  34. {
  35. GdkRGBA colour;
  36. const gchar *colour_s;
  37. gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(widget), &colour);
  38. colour_s = gdk_rgba_to_string(&colour);
  39. g_settings_set_string(settings, MSSH_GCONF_KEY_BG_COLOUR, colour_s);
  40. }
  41. static void mssh_pref_fg_colour_select_focus(GtkWidget *widget, gpointer data)
  42. {
  43. GdkRGBA colour;
  44. const gchar *colour_s;
  45. gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(widget), &colour);
  46. colour_s = gdk_rgba_to_string(&colour);
  47. g_settings_set_string(settings, MSSH_GCONF_KEY_FG_COLOUR_FOCUS, colour_s);
  48. }
  49. static void mssh_pref_bg_colour_select_focus(GtkWidget *widget, gpointer data)
  50. {
  51. GdkRGBA colour;
  52. const gchar *colour_s;
  53. gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(widget), &colour);
  54. colour_s = gdk_rgba_to_string(&colour);
  55. g_settings_set_string(settings, MSSH_GCONF_KEY_BG_COLOUR_FOCUS, colour_s);
  56. }
  57. static void mssh_pref_columns_select(GtkWidget *widget, gpointer data)
  58. {
  59. int columns;
  60. columns = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
  61. g_settings_set_int(settings, MSSH_GCONF_KEY_COLUMNS, columns);
  62. }
  63. static void mssh_pref_backscroll_buffer_size_select(GtkWidget *widget, gpointer data)
  64. {
  65. gint backscroll_buffer_size;
  66. backscroll_buffer_size = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
  67. g_settings_set_int(settings, MSSH_GCONF_KEY_BACKSCROLL_BUFFER_SIZE, backscroll_buffer_size);
  68. }
  69. static void mssh_pref_timeout_select(GtkWidget *widget, gpointer data)
  70. {
  71. int timeout;
  72. timeout = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
  73. g_settings_set_int(settings, MSSH_GCONF_KEY_TIMEOUT, timeout);
  74. }
  75. static void mssh_pref_close_check(GtkWidget *widget, gpointer data)
  76. {
  77. gboolean close;
  78. close = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
  79. g_settings_set_boolean(settings, MSSH_GCONF_KEY_CLOSE_ENDED, close);
  80. }
  81. static void mssh_pref_recolor_focused_check(GtkWidget *widget, gpointer data)
  82. {
  83. gboolean recolor_focused;
  84. recolor_focused = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
  85. g_settings_set_boolean(settings, MSSH_GCONF_KEY_RECOLOR_FOCUSED, recolor_focused);
  86. }
  87. static void mssh_pref_exit_check(GtkWidget *widget, gpointer data)
  88. {
  89. gboolean close;
  90. close = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
  91. g_settings_set_boolean(settings, MSSH_GCONF_KEY_QUIT_ALL_ENDED, close);
  92. }
  93. static void mssh_pref_dir_focus_check(GtkWidget *widget, gpointer data)
  94. {
  95. gboolean focus;
  96. focus = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
  97. g_settings_set_boolean(settings, MSSH_GCONF_KEY_DIR_FOCUS, focus);
  98. }
  99. static void mssh_pref_modifier_check(GtkWidget *widget, gpointer data)
  100. {
  101. gboolean ctrl, alt, shift, super;
  102. gint val;
  103. MSSHPref * pref = MSSH_PREF(data);
  104. ctrl = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pref->ctrl));
  105. shift = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pref->shift));
  106. alt = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pref->alt));
  107. super = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pref->super));
  108. val = (shift << 0) | (ctrl << 2) | (alt << 3) | (super << 26);
  109. g_settings_set_int(settings, MSSH_GCONF_KEY_MODIFIER, val);
  110. }
  111. static void mssh_pref_init(MSSHPref* pref)
  112. {
  113. GVariant *value;
  114. GdkRGBA colour;
  115. const gchar *colour_s;
  116. GtkWidget *frame = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
  117. GtkWidget *notebook = gtk_notebook_new();
  118. GtkWidget *content = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
  119. GtkWidget *font_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10);
  120. GtkWidget *font_label = gtk_label_new(_("Font:"));
  121. GtkWidget *font_select = gtk_font_button_new();
  122. GtkWidget *colour_table = gtk_grid_new();
  123. GtkWidget *bg_colour_label = gtk_label_new(_("Background:"));
  124. GtkWidget *bg_colour_select = gtk_color_button_new();
  125. GtkWidget *fg_colour_label = gtk_label_new(_("Foreground:"));
  126. GtkWidget *fg_colour_select = gtk_color_button_new();
  127. GtkWidget *recolor_focused_check = gtk_check_button_new_with_label(
  128. _("Use different color for focused window"));
  129. GtkWidget *colour_table_focus = gtk_grid_new();
  130. GtkWidget *bg_colour_label_focus = gtk_label_new(_("Background for focused window:"));
  131. GtkWidget *bg_colour_select_focus = gtk_color_button_new();
  132. GtkWidget *fg_colour_label_focus = gtk_label_new(_("Foreground for focused window:"));
  133. GtkWidget *fg_colour_select_focus = gtk_color_button_new();
  134. GtkWidget *exit_check = gtk_check_button_new_with_label(
  135. _("Quit after all sessions have ended"));
  136. GtkWidget *close_check = gtk_check_button_new_with_label(
  137. _("Close ended sessions"));
  138. GtkWidget *timeout_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10);
  139. GtkWidget *timeout_label1 = gtk_label_new(
  140. _("Closed ended sessions after"));
  141. GtkAdjustment *timeout_adj = gtk_adjustment_new(3, 0, 100, 1, 10, 0);
  142. GtkWidget *timeout_select = gtk_spin_button_new(
  143. GTK_ADJUSTMENT(timeout_adj), 1, 0);
  144. GtkWidget *timeout_label2 = gtk_label_new(_("seconds"));
  145. GtkWidget *columns_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10);
  146. GtkWidget *columns_label = gtk_label_new(_("Columns:"));
  147. GtkAdjustment *columns_adj = gtk_adjustment_new(2, 1, 10, 1, 10, 0);
  148. GtkWidget *columns_select = gtk_spin_button_new(
  149. GTK_ADJUSTMENT(columns_adj), 1, 0);
  150. GtkWidget *backscroll_buffer_size_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10);
  151. GtkWidget *backscroll_buffer_size_label = gtk_label_new(_("Scrollback Lines:"));
  152. GtkAdjustment *backscroll_buffer_size_adj = gtk_adjustment_new(5000, -1, 65535, 1, 100, 0);
  153. GtkWidget *backscroll_buffer_size_select = gtk_spin_button_new(
  154. GTK_ADJUSTMENT(backscroll_buffer_size_adj), 1, 0);
  155. GtkWidget *mod_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10);
  156. GtkWidget *mod_label = gtk_label_new(_("Modifier:"));
  157. GtkWidget *mod_ctrl_check = gtk_check_button_new_with_label("Ctrl");
  158. GtkWidget *mod_alt_check = gtk_check_button_new_with_label("Alt");
  159. GtkWidget *mod_shift_check = gtk_check_button_new_with_label("Shift");
  160. GtkWidget *mod_super_check = gtk_check_button_new_with_label("Super");
  161. GtkWidget *close_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
  162. GtkWidget *close_button = gtk_button_new_with_label("Close");
  163. GtkWidget *dir_focus_check = gtk_check_button_new_with_label(
  164. _("Use directional focus"));
  165. pref->ctrl = mod_ctrl_check;
  166. pref->shift = mod_shift_check;
  167. pref->alt = mod_alt_check;
  168. pref->super = mod_super_check;
  169. gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), FALSE);
  170. gtk_notebook_append_page(GTK_NOTEBOOK(notebook), content, NULL);
  171. gtk_box_pack_start(GTK_BOX(font_hbox), font_label, FALSE, TRUE, 0);
  172. gtk_box_pack_start(GTK_BOX(font_hbox), font_select, FALSE, TRUE, 0);
  173. gtk_box_pack_start(GTK_BOX(content), font_hbox, FALSE, TRUE, 0);
  174. gtk_grid_attach(GTK_GRID(colour_table), bg_colour_label,
  175. 0, 0, 1, 1);
  176. gtk_grid_attach(GTK_GRID(colour_table), bg_colour_select,
  177. 1, 0, 1, 1);
  178. gtk_grid_attach(GTK_GRID(colour_table), fg_colour_label,
  179. 0, 1, 1, 1);
  180. gtk_grid_attach(GTK_GRID(colour_table), fg_colour_select,
  181. 1, 1, 1, 1);
  182. gtk_box_pack_start(GTK_BOX(content), colour_table, FALSE, TRUE, 0);
  183. gtk_box_pack_start(GTK_BOX(content), recolor_focused_check, FALSE, TRUE, 0);
  184. gtk_grid_attach(GTK_GRID(colour_table_focus), bg_colour_label_focus,
  185. 0, 0, 1, 1);
  186. gtk_grid_attach(GTK_GRID(colour_table_focus), bg_colour_select_focus,
  187. 1, 0, 1, 1);
  188. gtk_grid_attach(GTK_GRID(colour_table_focus), fg_colour_label_focus,
  189. 0, 1, 1, 1);
  190. gtk_grid_attach(GTK_GRID(colour_table_focus), fg_colour_select_focus,
  191. 1, 1, 1, 1);
  192. gtk_box_pack_start(GTK_BOX(content), colour_table_focus, FALSE, TRUE, 0);
  193. gtk_box_pack_start(GTK_BOX(content), exit_check, FALSE, TRUE, 0);
  194. gtk_box_pack_start(GTK_BOX(content), close_check, FALSE, TRUE, 0);
  195. gtk_box_pack_start(GTK_BOX(content), dir_focus_check, FALSE, TRUE, 0);
  196. gtk_box_pack_start(GTK_BOX(timeout_hbox), timeout_label1, FALSE,
  197. TRUE, 0);
  198. gtk_box_pack_start(GTK_BOX(timeout_hbox), timeout_select, FALSE,
  199. TRUE, 0);
  200. gtk_box_pack_start(GTK_BOX(timeout_hbox), timeout_label2, FALSE,
  201. TRUE, 0);
  202. gtk_box_pack_start(GTK_BOX(content), timeout_hbox, FALSE, TRUE, 0);
  203. gtk_box_pack_start(GTK_BOX(columns_hbox), columns_label, FALSE,
  204. TRUE, 0);
  205. gtk_box_pack_start(GTK_BOX(columns_hbox), columns_select, FALSE,
  206. TRUE, 0);
  207. gtk_box_pack_start(GTK_BOX(content), columns_hbox, FALSE, TRUE, 0);
  208. gtk_box_pack_start(GTK_BOX(backscroll_buffer_size_hbox), backscroll_buffer_size_label, FALSE,
  209. TRUE, 0);
  210. gtk_box_pack_start(GTK_BOX(backscroll_buffer_size_hbox), backscroll_buffer_size_select, FALSE,
  211. TRUE, 0);
  212. gtk_box_pack_start(GTK_BOX(content), backscroll_buffer_size_hbox, FALSE, TRUE, 0);
  213. gtk_box_pack_start(GTK_BOX(mod_hbox), mod_label, FALSE, TRUE, 0);
  214. gtk_box_pack_start(GTK_BOX(mod_hbox), mod_ctrl_check, FALSE, TRUE, 0);
  215. gtk_box_pack_start(GTK_BOX(mod_hbox), mod_alt_check, FALSE, TRUE, 0);
  216. gtk_box_pack_start(GTK_BOX(mod_hbox), mod_shift_check, FALSE, TRUE, 0);
  217. gtk_box_pack_start(GTK_BOX(mod_hbox), mod_super_check, FALSE, TRUE, 0);
  218. gtk_box_pack_start(GTK_BOX(content), mod_hbox, FALSE, TRUE, 0);
  219. gtk_box_pack_end(GTK_BOX(close_hbox), close_button, FALSE, TRUE, 0);
  220. gtk_box_pack_start(GTK_BOX(frame), notebook, TRUE, TRUE, 0);
  221. gtk_box_pack_start(GTK_BOX(frame), close_hbox, FALSE, TRUE, 0);
  222. gtk_container_add(GTK_CONTAINER(pref), frame);
  223. g_signal_connect(G_OBJECT(close_button), "clicked",
  224. G_CALLBACK(mssh_pref_close), pref);
  225. gtk_container_set_border_width(GTK_CONTAINER(content), 6);
  226. gtk_container_set_border_width(GTK_CONTAINER(pref), 15);
  227. gtk_window_set_title(GTK_WINDOW(pref), _("Preferences"));
  228. gtk_window_set_resizable(GTK_WINDOW(pref), FALSE);
  229. g_signal_connect(G_OBJECT(font_select), "font-set",
  230. G_CALLBACK(mssh_pref_font_select), NULL);
  231. g_signal_connect(G_OBJECT(fg_colour_select), "color-set",
  232. G_CALLBACK(mssh_pref_fg_colour_select), NULL);
  233. g_signal_connect(G_OBJECT(bg_colour_select), "color-set",
  234. G_CALLBACK(mssh_pref_bg_colour_select), NULL);
  235. g_signal_connect(G_OBJECT(fg_colour_select_focus), "color-set",
  236. G_CALLBACK(mssh_pref_fg_colour_select_focus), NULL);
  237. g_signal_connect(G_OBJECT(bg_colour_select_focus), "color-set",
  238. G_CALLBACK(mssh_pref_bg_colour_select_focus), NULL);
  239. g_signal_connect(G_OBJECT(columns_select), "value-changed",
  240. G_CALLBACK(mssh_pref_columns_select), NULL);
  241. g_signal_connect(G_OBJECT(backscroll_buffer_size_select), "value-changed",
  242. G_CALLBACK(mssh_pref_backscroll_buffer_size_select), NULL);
  243. g_signal_connect(G_OBJECT(timeout_select), "value-changed",
  244. G_CALLBACK(mssh_pref_timeout_select), NULL);
  245. g_signal_connect(G_OBJECT(close_check), "toggled",
  246. G_CALLBACK(mssh_pref_close_check), NULL);
  247. g_signal_connect(G_OBJECT(recolor_focused_check), "toggled",
  248. G_CALLBACK(mssh_pref_recolor_focused_check), NULL);
  249. g_signal_connect(G_OBJECT(exit_check), "toggled",
  250. G_CALLBACK(mssh_pref_exit_check), NULL);
  251. g_signal_connect(G_OBJECT(dir_focus_check), "toggled",
  252. G_CALLBACK(mssh_pref_dir_focus_check), NULL);
  253. g_signal_connect(G_OBJECT(mod_ctrl_check), "toggled",
  254. G_CALLBACK(mssh_pref_modifier_check), pref);
  255. g_signal_connect(G_OBJECT(mod_alt_check), "toggled",
  256. G_CALLBACK(mssh_pref_modifier_check), pref);
  257. g_signal_connect(G_OBJECT(mod_shift_check), "toggled",
  258. G_CALLBACK(mssh_pref_modifier_check), pref);
  259. g_signal_connect(G_OBJECT(mod_super_check), "toggled",
  260. G_CALLBACK(mssh_pref_modifier_check), pref);
  261. value = g_settings_get_value(settings, MSSH_GCONF_KEY_FONT);
  262. gtk_font_chooser_set_font(GTK_FONT_CHOOSER(font_select),
  263. g_variant_get_string(value, NULL));
  264. g_variant_unref(value);
  265. value = g_settings_get_value(settings, MSSH_GCONF_KEY_FG_COLOUR);
  266. colour_s = g_variant_get_string(value, NULL);
  267. gdk_rgba_parse(&colour, colour_s);
  268. gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(fg_colour_select),
  269. &colour);
  270. g_variant_unref(value);
  271. value = g_settings_get_value(settings, MSSH_GCONF_KEY_BG_COLOUR);
  272. colour_s = g_variant_get_string(value, NULL);
  273. gdk_rgba_parse(&colour, colour_s);
  274. gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(bg_colour_select),
  275. &colour);
  276. g_variant_unref(value);
  277. value = g_settings_get_value(settings, MSSH_GCONF_KEY_FG_COLOUR_FOCUS);
  278. colour_s = g_variant_get_string(value, NULL);
  279. gdk_rgba_parse(&colour, colour_s);
  280. gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(fg_colour_select_focus),
  281. &colour);
  282. g_variant_unref(value);
  283. value = g_settings_get_value(settings, MSSH_GCONF_KEY_BG_COLOUR_FOCUS);
  284. colour_s = g_variant_get_string(value, NULL);
  285. gdk_rgba_parse(&colour, colour_s);
  286. gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(bg_colour_select_focus),
  287. &colour);
  288. g_variant_unref(value);
  289. value = g_settings_get_value(settings, MSSH_GCONF_KEY_COLUMNS);
  290. gtk_spin_button_set_value(GTK_SPIN_BUTTON(columns_select),
  291. g_variant_get_int32(value));
  292. g_variant_unref(value);
  293. value = g_settings_get_value(settings, MSSH_GCONF_KEY_BACKSCROLL_BUFFER_SIZE);
  294. gtk_spin_button_set_value(GTK_SPIN_BUTTON(backscroll_buffer_size_select),
  295. g_variant_get_int32(value));
  296. g_variant_unref(value);
  297. value = g_settings_get_value(settings, MSSH_GCONF_KEY_TIMEOUT);
  298. gtk_spin_button_set_value(GTK_SPIN_BUTTON(timeout_select),
  299. g_variant_get_int32(value));
  300. g_variant_unref(value);
  301. value = g_settings_get_value(settings, MSSH_GCONF_KEY_CLOSE_ENDED);
  302. gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(close_check),
  303. g_variant_get_boolean(value));
  304. g_variant_unref(value);
  305. value = g_settings_get_value(settings, MSSH_GCONF_KEY_RECOLOR_FOCUSED);
  306. gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(recolor_focused_check),
  307. g_variant_get_boolean(value));
  308. g_variant_unref(value);
  309. value = g_settings_get_value(settings, MSSH_GCONF_KEY_QUIT_ALL_ENDED);
  310. gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(exit_check),
  311. g_variant_get_boolean(value));
  312. g_variant_unref(value);
  313. value = g_settings_get_value(settings, MSSH_GCONF_KEY_DIR_FOCUS);
  314. gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dir_focus_check),
  315. g_variant_get_boolean(value));
  316. g_variant_unref(value);
  317. value = g_settings_get_value(settings, MSSH_GCONF_KEY_MODIFIER);
  318. gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mod_ctrl_check),
  319. (g_variant_get_int32(value) & GDK_CONTROL_MASK) ? 1 : 0);
  320. gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mod_shift_check),
  321. (g_variant_get_int32(value) & GDK_SHIFT_MASK) ? 1 : 0);
  322. gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mod_alt_check),
  323. (g_variant_get_int32(value) & GDK_MOD1_MASK) ? 1 : 0);
  324. gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mod_super_check),
  325. (g_variant_get_int32(value) & GDK_SUPER_MASK) ? 1 : 0);
  326. g_variant_unref(value);
  327. }
  328. static void mssh_pref_class_init(MSSHPrefClass *klass)
  329. {
  330. }