| 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); |
| 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 |