mssh-window.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. #include <string.h>
  2. #include <stdlib.h>
  3. #include <gdk/gdkkeysyms.h>
  4. #include "mssh-window.h"
  5. G_DEFINE_TYPE(MSSHWindow, mssh_window, GTK_TYPE_WINDOW)
  6. static void mssh_window_destroy(GtkWidget *widget, gpointer data)
  7. {
  8. gtk_main_quit();
  9. }
  10. GtkWidget* mssh_window_new(void)
  11. {
  12. return g_object_new(MSSH_TYPE_WINDOW, NULL);
  13. }
  14. gboolean key_press(GtkWidget *widget, GdkEventKey *event,
  15. gpointer user_data)
  16. {
  17. int i;
  18. gboolean dummy;
  19. MSSHWindow *window = MSSH_WINDOW(user_data);
  20. for(i = 0; i < window->num_servers; i++)
  21. {
  22. if(window->terms[i] != NULL)
  23. {
  24. if(gtk_check_menu_item_get_active(
  25. GTK_CHECK_MENU_ITEM(window->items[i])))
  26. {
  27. g_signal_emit_by_name(window->terms[i], "key-press-event",
  28. event, &dummy);
  29. }
  30. }
  31. }
  32. return TRUE;
  33. }
  34. void vte_child_exited(VteTerminal *vte, gpointer user_data)
  35. {
  36. int i;
  37. char data[] = "\n[Child Exited]";
  38. MSSHWindow *window = MSSH_WINDOW(user_data);
  39. vte_terminal_feed(vte, data, strlen(data));
  40. for(i = 0; i < window->num_servers; i++)
  41. {
  42. if(window->terms[i] == GTK_WIDGET(vte))
  43. {
  44. window->terms[i] = NULL;
  45. break;
  46. }
  47. }
  48. }
  49. static void mssh_window_init(MSSHWindow* window)
  50. {
  51. GtkAccelGroup *accel_group;
  52. accel_group = gtk_accel_group_new();
  53. window->vbox = gtk_vbox_new(FALSE, 0);
  54. window->entry = gtk_entry_new();
  55. window->menu_bar = gtk_menu_bar_new();
  56. window->server_menu = gtk_menu_new();
  57. window->file_menu = gtk_menu_new();
  58. window->server_item = gtk_menu_item_new_with_label("Servers");
  59. window->file_item = gtk_menu_item_new_with_label("File");
  60. window->file_quit = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT,
  61. NULL);
  62. gtk_menu_item_set_submenu(GTK_MENU_ITEM(window->file_item),
  63. window->file_menu);
  64. gtk_menu_item_set_submenu(GTK_MENU_ITEM(window->server_item),
  65. window->server_menu);
  66. gtk_menu_shell_append(GTK_MENU_SHELL(window->file_menu),
  67. window->file_quit);
  68. g_signal_connect(G_OBJECT(window->file_quit), "activate",
  69. G_CALLBACK(mssh_window_destroy), NULL);
  70. gtk_widget_add_accelerator(window->file_quit, "activate", accel_group,
  71. GDK_W, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
  72. gtk_window_add_accel_group(GTK_WINDOW(window), accel_group);
  73. gtk_menu_bar_append(GTK_MENU_BAR(window->menu_bar),
  74. window->file_item);
  75. gtk_menu_bar_append(GTK_MENU_BAR(window->menu_bar),
  76. window->server_item);
  77. g_signal_connect(G_OBJECT(window->entry), "key-press-event",
  78. G_CALLBACK(key_press), window);
  79. gtk_box_pack_start(GTK_BOX(window->vbox), window->menu_bar,
  80. FALSE, TRUE, 0);
  81. gtk_box_pack_start(GTK_BOX(window->vbox), window->entry,
  82. FALSE, TRUE, 2);
  83. gtk_container_add(GTK_CONTAINER(window), window->vbox);
  84. gtk_widget_set_size_request(GTK_WIDGET(window), 1024, 768);
  85. gtk_window_set_title(GTK_WINDOW(window), "MSSH");
  86. }
  87. void mssh_window_new_session(MSSHWindow* window, char **env,
  88. int num_servers, char **servers)
  89. {
  90. char *args[3] = { NULL, NULL, NULL };
  91. int i, j, k;
  92. int rows = num_servers/2 + num_servers%2;
  93. window->env = env;
  94. window->num_servers = num_servers;
  95. window->servers = servers;
  96. args[0] = strdup("ssh");
  97. window->table = gtk_table_new(rows, num_servers > 1 ? 2 : 1, TRUE);
  98. gtk_box_pack_start(GTK_BOX(window->vbox), window->table,
  99. TRUE, TRUE, 0);
  100. for(i = 0; i < rows; i++)
  101. {
  102. for(j = 0; j < (num_servers > 1 ? 2 : 1); j++)
  103. {
  104. k = j + i*2;
  105. args[1] = window->servers[k];
  106. window->terms[k] = vte_terminal_new();
  107. g_signal_connect(G_OBJECT(window->terms[k]), "child-exited",
  108. G_CALLBACK(vte_child_exited), window);
  109. vte_terminal_fork_command(VTE_TERMINAL(window->terms[k]),
  110. "ssh", args, window->env, NULL, FALSE, FALSE,
  111. FALSE);
  112. gtk_table_attach(GTK_TABLE(window->table), window->terms[k],
  113. j, j+1, i, i+1, GTK_FILL | GTK_EXPAND,
  114. GTK_FILL | GTK_EXPAND, 2, 2);
  115. window->items[k] = gtk_check_menu_item_new_with_label(
  116. window->servers[k]);
  117. gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(
  118. window->items[k]), TRUE);
  119. gtk_menu_shell_append(GTK_MENU_SHELL(window->server_menu),
  120. window->items[k]);
  121. }
  122. }
  123. free(args[0]);
  124. }
  125. static void mssh_window_class_init(MSSHWindowClass *klass)
  126. {
  127. }