pidgin/gtkconv.c

changeset 18855
e36a7e191d39
parent 18777
3872ae99716a
child 18856
36d59574f7c8
equal deleted inserted replaced
18854:fbff95933f39 18855:e36a7e191d39
165 165
166 static gboolean update_send_to_selection(PidginWindow *win); 166 static gboolean update_send_to_selection(PidginWindow *win);
167 static void generate_send_to_items(PidginWindow *win); 167 static void generate_send_to_items(PidginWindow *win);
168 168
169 /* Prototypes. <-- because Paco-Paco hates this comment. */ 169 /* Prototypes. <-- because Paco-Paco hates this comment. */
170 static gboolean tabby_alias_entry(PidginConversation *gtkconv);
170 static void got_typing_keypress(PidginConversation *gtkconv, gboolean first); 171 static void got_typing_keypress(PidginConversation *gtkconv, gboolean first);
171 static void gray_stuff_out(PidginConversation *gtkconv); 172 static void gray_stuff_out(PidginConversation *gtkconv);
172 static GList *generate_invite_user_names(PurpleConnection *gc); 173 static GList *generate_invite_user_names(PurpleConnection *gc);
173 static void add_chat_buddy_common(PurpleConversation *conv, PurpleConvChatBuddy *cb, const char *old_name); 174 static void add_chat_buddy_common(PurpleConversation *conv, PurpleConvChatBuddy *cb, const char *old_name);
174 static gboolean tab_complete(PurpleConversation *conv); 175 static gboolean tab_complete(PurpleConversation *conv);
1803 if (most_active != NULL && most_active != gtkconv) 1804 if (most_active != NULL && most_active != gtkconv)
1804 pidgin_conv_window_switch_gtkconv(win, most_active); 1805 pidgin_conv_window_switch_gtkconv(win, most_active);
1805 } 1806 }
1806 1807
1807 static gboolean 1808 static gboolean
1809 conv_keypress_common(PidginConversation *gtkconv, GdkEventKey *event)
1810 {
1811 PidginWindow *win;
1812 PurpleConversation *conv;
1813 int curconv;
1814
1815 conv = gtkconv->active_conv;
1816 win = gtkconv->win;
1817 curconv = gtk_notebook_get_current_page(GTK_NOTEBOOK(win->notebook));
1818
1819 /* If CTRL was held down... */
1820 if (event->state & GDK_CONTROL_MASK) {
1821 switch (event->keyval) {
1822 case GDK_Page_Down:
1823 case ']':
1824 if (!pidgin_conv_window_get_gtkconv_at_index(win, curconv + 1))
1825 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), 0);
1826 else
1827 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), curconv + 1);
1828 return TRUE;
1829 break;
1830
1831 case GDK_Page_Up:
1832 case '[':
1833 if (!pidgin_conv_window_get_gtkconv_at_index(win, curconv - 1))
1834 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), -1);
1835 else
1836 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), curconv - 1);
1837 return TRUE;
1838 break;
1839
1840 case GDK_Tab:
1841 case GDK_ISO_Left_Tab:
1842 if (event->state & GDK_SHIFT_MASK) {
1843 move_to_next_unread_tab(gtkconv, FALSE);
1844 } else {
1845 move_to_next_unread_tab(gtkconv, TRUE);
1846 }
1847
1848 return TRUE;
1849 break;
1850
1851 case GDK_comma:
1852 gtk_notebook_reorder_child(GTK_NOTEBOOK(win->notebook),
1853 gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), curconv),
1854 curconv - 1);
1855 break;
1856
1857 case GDK_period:
1858 gtk_notebook_reorder_child(GTK_NOTEBOOK(win->notebook),
1859 gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), curconv),
1860 #if GTK_CHECK_VERSION(2,2,0)
1861 (curconv + 1) % gtk_notebook_get_n_pages(GTK_NOTEBOOK(win->notebook)));
1862 #else
1863 (curconv + 1) % g_list_length(GTK_NOTEBOOK(win->notebook)->children));
1864 #endif
1865 break;
1866
1867 } /* End of switch */
1868 }
1869
1870 /* If ALT (or whatever) was held down... */
1871 else if (event->state & GDK_MOD1_MASK)
1872 {
1873 if (event->keyval > '0' && event->keyval <= '9')
1874 {
1875 guint switchto = event->keyval - '1';
1876 if (switchto < pidgin_conv_window_get_gtkconv_count(win))
1877 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), switchto);
1878
1879 return TRUE;
1880 }
1881 }
1882
1883 /* If neither CTRL nor ALT were held down... */
1884 else
1885 {
1886 switch (event->keyval) {
1887 case GDK_F2:
1888 if (gtk_widget_is_focus(GTK_WIDGET(win->notebook))) {
1889 tabby_alias_entry(gtkconv);
1890 return TRUE;
1891 }
1892 break;
1893 }
1894 }
1895 return FALSE;
1896 }
1897
1898 static gboolean
1808 entry_key_press_cb(GtkWidget *entry, GdkEventKey *event, gpointer data) 1899 entry_key_press_cb(GtkWidget *entry, GdkEventKey *event, gpointer data)
1809 { 1900 {
1810 PidginWindow *win; 1901 PidginWindow *win;
1811 PurpleConversation *conv; 1902 PurpleConversation *conv;
1812 PidginConversation *gtkconv; 1903 PidginConversation *gtkconv;
1813 int curconv;
1814 1904
1815 gtkconv = (PidginConversation *)data; 1905 gtkconv = (PidginConversation *)data;
1816 conv = gtkconv->active_conv; 1906 conv = gtkconv->active_conv;
1817 win = gtkconv->win; 1907 win = gtkconv->win;
1818 curconv = gtk_notebook_get_current_page(GTK_NOTEBOOK(win->notebook)); 1908
1909 if (conv_keypress_common(gtkconv, event))
1910 return TRUE;
1819 1911
1820 /* If CTRL was held down... */ 1912 /* If CTRL was held down... */
1821 if (event->state & GDK_CONTROL_MASK) { 1913 if (event->state & GDK_CONTROL_MASK) {
1822 switch (event->keyval) { 1914 switch (event->keyval) {
1823 case GDK_Up: 1915 case GDK_Up:
1911 } 2003 }
1912 } 2004 }
1913 2005
1914 return TRUE; 2006 return TRUE;
1915 break; 2007 break;
1916 2008 } /* End of switch */
1917 case GDK_Page_Down: 2009 }
1918 case ']': 2010
1919 if (!pidgin_conv_window_get_gtkconv_at_index(win, curconv + 1)) 2011 /* If ALT (or whatever) was held down... */
1920 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), 0); 2012 else if (event->state & GDK_MOD1_MASK) {
1921 else 2013
1922 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), curconv + 1); 2014 }
1923 return TRUE; 2015
2016 /* If neither CTRL nor ALT were held down... */
2017 else {
2018 switch (event->keyval) {
2019 case GDK_Tab:
2020 if (gtkconv->entry != entry)
1924 break; 2021 break;
1925 2022 return tab_complete(conv);
1926 case GDK_Page_Up: 2023 break;
1927 case '[': 2024
1928 if (!pidgin_conv_window_get_gtkconv_at_index(win, curconv - 1)) 2025 case GDK_Page_Up:
1929 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), -1); 2026 gtk_imhtml_page_up(GTK_IMHTML(gtkconv->imhtml));
1930 else
1931 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), curconv - 1);
1932 return TRUE;
1933 break;
1934
1935 case GDK_Tab:
1936 case GDK_ISO_Left_Tab:
1937 if (event->state & GDK_SHIFT_MASK) {
1938 move_to_next_unread_tab(gtkconv, FALSE);
1939 } else {
1940 move_to_next_unread_tab(gtkconv, TRUE);
1941 }
1942
1943 return TRUE;
1944 break;
1945
1946 case GDK_comma:
1947 gtk_notebook_reorder_child(GTK_NOTEBOOK(win->notebook),
1948 gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), curconv),
1949 curconv - 1);
1950 break;
1951
1952 case GDK_period:
1953 gtk_notebook_reorder_child(GTK_NOTEBOOK(win->notebook),
1954 gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), curconv),
1955 #if GTK_CHECK_VERSION(2,2,0)
1956 (curconv + 1) % gtk_notebook_get_n_pages(GTK_NOTEBOOK(win->notebook)));
1957 #else
1958 (curconv + 1) % g_list_length(GTK_NOTEBOOK(win->notebook)->children));
1959 #endif
1960 break;
1961
1962 } /* End of switch */
1963 }
1964
1965 /* If ALT (or whatever) was held down... */
1966 else if (event->state & GDK_MOD1_MASK)
1967 {
1968 if (event->keyval > '0' && event->keyval <= '9')
1969 {
1970 guint switchto = event->keyval - '1';
1971 if (switchto < pidgin_conv_window_get_gtkconv_count(win))
1972 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), switchto);
1973
1974 return TRUE; 2027 return TRUE;
1975 } 2028 break;
1976 } 2029
1977 2030 case GDK_Page_Down:
1978 /* If neither CTRL nor ALT were held down... */ 2031 gtk_imhtml_page_down(GTK_IMHTML(gtkconv->imhtml));
1979 else 2032 return TRUE;
1980 { 2033 break;
1981 switch (event->keyval)
1982 {
1983 case GDK_Tab:
1984 if (gtkconv->entry != entry)
1985 break;
1986 return tab_complete(conv);
1987 break;
1988
1989 case GDK_Page_Up:
1990 gtk_imhtml_page_up(GTK_IMHTML(gtkconv->imhtml));
1991 return TRUE;
1992 break;
1993
1994 case GDK_Page_Down:
1995 gtk_imhtml_page_down(GTK_IMHTML(gtkconv->imhtml));
1996 return TRUE;
1997 break;
1998 2034
1999 } 2035 }
2000 } 2036 }
2001 return FALSE; 2037 return FALSE;
2002 } 2038 }
2033 { 2069 {
2034 PidginConversation *gtkconv = data; 2070 PidginConversation *gtkconv = data;
2035 2071
2036 /* If we have a valid key for the conversation display, then exit */ 2072 /* If we have a valid key for the conversation display, then exit */
2037 if ((event->state & GDK_CONTROL_MASK) || 2073 if ((event->state & GDK_CONTROL_MASK) ||
2074 (event->keyval == GDK_F6) ||
2038 (event->keyval == GDK_F10) || 2075 (event->keyval == GDK_F10) ||
2039 (event->keyval == GDK_Shift_L) || 2076 (event->keyval == GDK_Shift_L) ||
2040 (event->keyval == GDK_Shift_R) || 2077 (event->keyval == GDK_Shift_R) ||
2041 (event->keyval == GDK_Control_L) || 2078 (event->keyval == GDK_Control_L) ||
2042 (event->keyval == GDK_Control_R) || 2079 (event->keyval == GDK_Control_R) ||
2043 (event->keyval == GDK_Escape) || 2080 (event->keyval == GDK_Escape) ||
2044 (event->keyval == GDK_Up) || 2081 (event->keyval == GDK_Up) ||
2045 (event->keyval == GDK_Down) || 2082 (event->keyval == GDK_Down) ||
2046 (event->keyval == GDK_Left) || 2083 (event->keyval == GDK_Left) ||
2047 (event->keyval == GDK_Right) || 2084 (event->keyval == GDK_Right) ||
2085 (event->keyval == GDK_Page_Up) ||
2086 (event->keyval == GDK_Page_Down) ||
2048 (event->keyval == GDK_Home) || 2087 (event->keyval == GDK_Home) ||
2049 (event->keyval == GDK_End) || 2088 (event->keyval == GDK_End) ||
2050 (event->keyval == GDK_Tab) || 2089 (event->keyval == GDK_Tab) ||
2051 (event->keyval == GDK_ISO_Left_Tab)) 2090 (event->keyval == GDK_ISO_Left_Tab))
2052 return FALSE; 2091 {
2092 if (event->type == GDK_KEY_PRESS)
2093 return conv_keypress_common(gtkconv, event);
2094 return FALSE;
2095 }
2053 2096
2054 if (event->type == GDK_KEY_RELEASE) 2097 if (event->type == GDK_KEY_RELEASE)
2055 gtk_widget_grab_focus(gtkconv->entry); 2098 gtk_widget_grab_focus(gtkconv->entry);
2056 2099
2057 gtk_widget_event(gtkconv->entry, (GdkEvent *)event); 2100 gtk_widget_event(gtkconv->entry, (GdkEvent *)event);
8066 } 8109 }
8067 remove_edit_entry(user_data, GTK_WIDGET(entry)); 8110 remove_edit_entry(user_data, GTK_WIDGET(entry));
8068 } 8111 }
8069 8112
8070 static gboolean 8113 static gboolean
8071 alias_double_click_cb(GtkNotebook *notebook, GdkEventButton *event, PidginConversation *gtkconv) 8114 tabby_alias_entry(PidginConversation *gtkconv)
8072 { 8115 {
8073 GtkWidget *entry = NULL; 8116 GtkWidget *entry = NULL;
8074
8075 if (event->button != 1 || event->type != GDK_2BUTTON_PRESS) {
8076 return FALSE;
8077 }
8078 8117
8079 if (!GTK_WIDGET_VISIBLE(gtkconv->tab_label)) { 8118 if (!GTK_WIDGET_VISIBLE(gtkconv->tab_label)) {
8080 /* There's already an entry for alias. Let's not create another one. */ 8119 /* There's already an entry for alias. Let's not create another one. */
8081 return FALSE; 8120 return FALSE;
8082 } 8121 }
8105 gtk_label_get_text(GTK_LABEL(gtkconv->tab_label))); 8144 gtk_label_get_text(GTK_LABEL(gtkconv->tab_label)));
8106 gtk_widget_show(entry); 8145 gtk_widget_show(entry);
8107 gtk_widget_hide(gtkconv->tab_label); 8146 gtk_widget_hide(gtkconv->tab_label);
8108 gtk_widget_grab_focus(entry); 8147 gtk_widget_grab_focus(entry);
8109 8148
8149 return TRUE;
8150 }
8151
8152 static gboolean
8153 alias_double_click_cb(GtkNotebook *notebook, GdkEventButton *event, PidginConversation *gtkconv)
8154 {
8155 if (event->button != 1 || event->type != GDK_2BUTTON_PRESS) {
8156 return FALSE;
8157 }
8158
8159 tabby_alias_entry(gtkconv);
8110 return FALSE; 8160 return FALSE;
8161 }
8162
8163 static gboolean
8164 window_keypress_cb(GtkWidget *widget, GdkEventKey *event, PidginWindow *win)
8165 {
8166 PidginConversation *gtkconv = pidgin_conv_window_get_active_gtkconv(win);
8167
8168 return conv_keypress_common(gtkconv, event);
8111 } 8169 }
8112 8170
8113 static void 8171 static void
8114 switch_conv_cb(GtkNotebook *notebook, GtkWidget *page, gint page_num, 8172 switch_conv_cb(GtkNotebook *notebook, GtkWidget *page, gint page_num,
8115 gpointer user_data) 8173 gpointer user_data)
8278 g_signal_connect(G_OBJECT(win->window), "configure_event", 8336 g_signal_connect(G_OBJECT(win->window), "configure_event",
8279 G_CALLBACK(gtk_conv_configure_cb), NULL); 8337 G_CALLBACK(gtk_conv_configure_cb), NULL);
8280 g_signal_connect(G_OBJECT(win->window), "focus_in_event", 8338 g_signal_connect(G_OBJECT(win->window), "focus_in_event",
8281 G_CALLBACK(focus_win_cb), win); 8339 G_CALLBACK(focus_win_cb), win);
8282 8340
8341 /* Intercept keystrokes from the menu items */
8342 g_signal_connect(G_OBJECT(win->window), "key_press_event",
8343 G_CALLBACK(window_keypress_cb), win);
8344
8345
8283 /* Create the notebook. */ 8346 /* Create the notebook. */
8284 win->notebook = gtk_notebook_new(); 8347 win->notebook = gtk_notebook_new();
8285 8348
8286 pos = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side"); 8349 pos = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side");
8287 8350

mercurial