| 77 #include "pidginstock.h" |
77 #include "pidginstock.h" |
| 78 #include "pidgintooltip.h" |
78 #include "pidgintooltip.h" |
| 79 #include "smileyparser.h" |
79 #include "smileyparser.h" |
| 80 |
80 |
| 81 #include "gtknickcolors.h" |
81 #include "gtknickcolors.h" |
| 82 |
|
| 83 #if !GTK_CHECK_VERSION(2,20,0) |
|
| 84 #define gtk_widget_get_realized(x) GTK_WIDGET_REALIZED(x) |
|
| 85 |
|
| 86 #if !GTK_CHECK_VERSION(2,18,0) |
|
| 87 #define gtk_widget_get_visible(x) GTK_WIDGET_VISIBLE(x) |
|
| 88 #define gtk_widget_is_drawable(x) GTK_WIDGET_DRAWABLE(x) |
|
| 89 #endif |
|
| 90 #endif |
|
| 91 |
82 |
| 92 /** |
83 /** |
| 93 * A GTK+ Instant Message pane. |
84 * A GTK+ Instant Message pane. |
| 94 */ |
85 */ |
| 95 struct _PidginImPane |
86 struct _PidginImPane |
| 849 GtkSelectionData *sd, guint inf, guint t, gpointer data) |
840 GtkSelectionData *sd, guint inf, guint t, gpointer data) |
| 850 { |
841 { |
| 851 InviteBuddyInfo *info = (InviteBuddyInfo *)data; |
842 InviteBuddyInfo *info = (InviteBuddyInfo *)data; |
| 852 const char *convprotocol; |
843 const char *convprotocol; |
| 853 gboolean success = TRUE; |
844 gboolean success = TRUE; |
| |
845 GdkAtom target = gtk_selection_data_get_target(sd); |
| 854 |
846 |
| 855 convprotocol = purple_account_get_protocol_id(purple_conversation_get_account(info->conv)); |
847 convprotocol = purple_account_get_protocol_id(purple_conversation_get_account(info->conv)); |
| 856 |
848 |
| 857 if (sd->target == gdk_atom_intern("PURPLE_BLIST_NODE", FALSE)) |
849 if (target == gdk_atom_intern("PURPLE_BLIST_NODE", FALSE)) |
| 858 { |
850 { |
| 859 PurpleBlistNode *node = NULL; |
851 PurpleBlistNode *node = NULL; |
| 860 PurpleBuddy *buddy; |
852 PurpleBuddy *buddy; |
| 861 |
853 const guchar *data = gtk_selection_data_get_data(sd); |
| 862 memcpy(&node, sd->data, sizeof(node)); |
854 |
| |
855 memcpy(&node, data, sizeof(node)); |
| 863 |
856 |
| 864 if (PURPLE_BLIST_NODE_IS_CONTACT(node)) |
857 if (PURPLE_BLIST_NODE_IS_CONTACT(node)) |
| 865 buddy = purple_contact_get_priority_buddy((PurpleContact *)node); |
858 buddy = purple_contact_get_priority_buddy((PurpleContact *)node); |
| 866 else if (PURPLE_BLIST_NODE_IS_BUDDY(node)) |
859 else if (PURPLE_BLIST_NODE_IS_BUDDY(node)) |
| 867 buddy = (PurpleBuddy *)node; |
860 buddy = (PurpleBuddy *)node; |
| 876 success = FALSE; |
869 success = FALSE; |
| 877 } |
870 } |
| 878 else |
871 else |
| 879 gtk_entry_set_text(GTK_ENTRY(info->entry), purple_buddy_get_name(buddy)); |
872 gtk_entry_set_text(GTK_ENTRY(info->entry), purple_buddy_get_name(buddy)); |
| 880 |
873 |
| 881 gtk_drag_finish(dc, success, (dc->action == GDK_ACTION_MOVE), t); |
874 gtk_drag_finish(dc, success, |
| 882 } |
875 gdk_drag_context_get_actions(dc) == GDK_ACTION_MOVE, t); |
| 883 else if (sd->target == gdk_atom_intern("application/x-im-contact", FALSE)) |
876 } |
| |
877 else if (target == gdk_atom_intern("application/x-im-contact", FALSE)) |
| 884 { |
878 { |
| 885 char *protocol = NULL; |
879 char *protocol = NULL; |
| 886 char *username = NULL; |
880 char *username = NULL; |
| 887 PurpleAccount *account; |
881 PurpleAccount *account; |
| 888 |
882 |
| 889 if (pidgin_parse_x_im_contact((const char *)sd->data, FALSE, &account, |
883 if (pidgin_parse_x_im_contact((const char *) data, FALSE, &account, |
| 890 &protocol, &username, NULL)) |
884 &protocol, &username, NULL)) |
| 891 { |
885 { |
| 892 if (account == NULL) |
886 if (account == NULL) |
| 893 { |
887 { |
| 894 purple_notify_error(PIDGIN_CONVERSATION(info->conv), NULL, |
888 purple_notify_error(PIDGIN_CONVERSATION(info->conv), NULL, |
| 951 |
946 |
| 952 gtk_dialog_set_default_response(GTK_DIALOG(invite_dialog), |
947 gtk_dialog_set_default_response(GTK_DIALOG(invite_dialog), |
| 953 GTK_RESPONSE_OK); |
948 GTK_RESPONSE_OK); |
| 954 gtk_container_set_border_width(GTK_CONTAINER(invite_dialog), PIDGIN_HIG_BOX_SPACE); |
949 gtk_container_set_border_width(GTK_CONTAINER(invite_dialog), PIDGIN_HIG_BOX_SPACE); |
| 955 gtk_window_set_resizable(GTK_WINDOW(invite_dialog), FALSE); |
950 gtk_window_set_resizable(GTK_WINDOW(invite_dialog), FALSE); |
| 956 #if !GTK_CHECK_VERSION(2,22,0) |
951 /* TODO: set no separator using GTK+ 3.0 */ |
| |
952 #if 0 |
| 957 gtk_dialog_set_has_separator(GTK_DIALOG(invite_dialog), FALSE); |
953 gtk_dialog_set_has_separator(GTK_DIALOG(invite_dialog), FALSE); |
| 958 #endif |
954 #endif |
| 959 |
955 |
| 960 info->window = GTK_WIDGET(invite_dialog); |
956 info->window = GTK_WIDGET(invite_dialog); |
| 961 |
957 |
| 962 /* Setup the outside spacing. */ |
958 /* Setup the outside spacing. */ |
| 963 vbox = GTK_DIALOG(invite_dialog)->vbox; |
959 vbox = gtk_dialog_get_content_area(GTK_DIALOG(invite_dialog)); |
| 964 |
960 |
| 965 gtk_box_set_spacing(GTK_BOX(vbox), PIDGIN_HIG_BORDER); |
961 gtk_box_set_spacing(GTK_BOX(vbox), PIDGIN_HIG_BORDER); |
| 966 gtk_container_set_border_width(GTK_CONTAINER(vbox), PIDGIN_HIG_BOX_SPACE); |
962 gtk_container_set_border_width(GTK_CONTAINER(vbox), PIDGIN_HIG_BOX_SPACE); |
| 967 |
963 |
| 968 /* Setup the inner hbox and put the dialog's icon in it. */ |
964 /* Setup the inner hbox and put the dialog's icon in it. */ |
| 1155 return; |
1151 return; |
| 1156 |
1152 |
| 1157 gtkblist = pidgin_blist_get_default_gtk_blist(); |
1153 gtkblist = pidgin_blist_get_default_gtk_blist(); |
| 1158 |
1154 |
| 1159 cursor = gdk_cursor_new(GDK_WATCH); |
1155 cursor = gdk_cursor_new(GDK_WATCH); |
| 1160 gdk_window_set_cursor(gtkblist->window->window, cursor); |
1156 gdk_window_set_cursor(gtk_widget_get_window(gtkblist->window), cursor); |
| 1161 gdk_window_set_cursor(win->window->window, cursor); |
1157 gdk_window_set_cursor(gtk_widget_get_window(win->window), cursor); |
| 1162 gdk_cursor_unref(cursor); |
1158 gdk_cursor_unref(cursor); |
| 1163 |
1159 |
| 1164 name = purple_conversation_get_name(conv); |
1160 name = purple_conversation_get_name(conv); |
| 1165 account = purple_conversation_get_account(conv); |
1161 account = purple_conversation_get_account(conv); |
| 1166 |
1162 |
| 1170 PurpleBlistNode *node = cur->data; |
1166 PurpleBlistNode *node = cur->data; |
| 1171 if ((node != NULL) && ((node->prev != NULL) || (node->next != NULL))) |
1167 if ((node != NULL) && ((node->prev != NULL) || (node->next != NULL))) |
| 1172 { |
1168 { |
| 1173 pidgin_log_show_contact((PurpleContact *)node->parent); |
1169 pidgin_log_show_contact((PurpleContact *)node->parent); |
| 1174 g_slist_free(buddies); |
1170 g_slist_free(buddies); |
| 1175 gdk_window_set_cursor(gtkblist->window->window, NULL); |
1171 gdk_window_set_cursor(gtk_widget_get_window(gtkblist->window), NULL); |
| 1176 gdk_window_set_cursor(win->window->window, NULL); |
1172 gdk_window_set_cursor(gtk_widget_get_window(win->window), NULL); |
| 1177 return; |
1173 return; |
| 1178 } |
1174 } |
| 1179 } |
1175 } |
| 1180 g_slist_free(buddies); |
1176 g_slist_free(buddies); |
| 1181 |
1177 |
| 1182 pidgin_log_show(type, name, account); |
1178 pidgin_log_show(type, name, account); |
| 1183 |
1179 |
| 1184 gdk_window_set_cursor(gtkblist->window->window, NULL); |
1180 gdk_window_set_cursor(gtk_widget_get_window(gtkblist->window), NULL); |
| 1185 gdk_window_set_cursor(win->window->window, NULL); |
1181 gdk_window_set_cursor(gtk_widget_get_window(win->window), NULL); |
| 1186 } |
1182 } |
| 1187 |
1183 |
| 1188 static void |
1184 static void |
| 1189 menu_clear_cb(GtkAction *action, gpointer data) |
1185 menu_clear_cb(GtkAction *action, gpointer data) |
| 1190 { |
1186 { |
| 1977 pidgin_tooltip_destroy(); |
1973 pidgin_tooltip_destroy(); |
| 1978 |
1974 |
| 1979 /* If CTRL was held down... */ |
1975 /* If CTRL was held down... */ |
| 1980 if (event->state & GDK_CONTROL_MASK) { |
1976 if (event->state & GDK_CONTROL_MASK) { |
| 1981 switch (event->keyval) { |
1977 switch (event->keyval) { |
| 1982 case GDK_Page_Down: |
1978 case GDK_KEY_Page_Down: |
| 1983 case GDK_KP_Page_Down: |
1979 case GDK_KEY_KP_Page_Down: |
| 1984 case ']': |
1980 case ']': |
| 1985 if (!pidgin_conv_window_get_gtkconv_at_index(win, curconv + 1)) |
1981 if (!pidgin_conv_window_get_gtkconv_at_index(win, curconv + 1)) |
| 1986 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), 0); |
1982 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), 0); |
| 1987 else |
1983 else |
| 1988 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), curconv + 1); |
1984 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), curconv + 1); |
| 1989 return TRUE; |
1985 return TRUE; |
| 1990 break; |
1986 break; |
| 1991 |
1987 |
| 1992 case GDK_Page_Up: |
1988 case GDK_KEY_Page_Up: |
| 1993 case GDK_KP_Page_Up: |
1989 case GDK_KEY_KP_Page_Up: |
| 1994 case '[': |
1990 case '[': |
| 1995 if (!pidgin_conv_window_get_gtkconv_at_index(win, curconv - 1)) |
1991 if (!pidgin_conv_window_get_gtkconv_at_index(win, curconv - 1)) |
| 1996 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), -1); |
1992 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), -1); |
| 1997 else |
1993 else |
| 1998 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), curconv - 1); |
1994 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), curconv - 1); |
| 1999 return TRUE; |
1995 return TRUE; |
| 2000 break; |
1996 break; |
| 2001 |
1997 |
| 2002 case GDK_Tab: |
1998 case GDK_KEY_Tab: |
| 2003 case GDK_KP_Tab: |
1999 case GDK_KEY_KP_Tab: |
| 2004 case GDK_ISO_Left_Tab: |
2000 case GDK_KEY_ISO_Left_Tab: |
| 2005 if (event->state & GDK_SHIFT_MASK) { |
2001 if (event->state & GDK_SHIFT_MASK) { |
| 2006 move_to_next_unread_tab(gtkconv, FALSE); |
2002 move_to_next_unread_tab(gtkconv, FALSE); |
| 2007 } else { |
2003 } else { |
| 2008 move_to_next_unread_tab(gtkconv, TRUE); |
2004 move_to_next_unread_tab(gtkconv, TRUE); |
| 2009 } |
2005 } |
| 2010 |
2006 |
| 2011 return TRUE; |
2007 return TRUE; |
| 2012 break; |
2008 break; |
| 2013 |
2009 |
| 2014 case GDK_comma: |
2010 case GDK_KEY_comma: |
| 2015 gtk_notebook_reorder_child(GTK_NOTEBOOK(win->notebook), |
2011 gtk_notebook_reorder_child(GTK_NOTEBOOK(win->notebook), |
| 2016 gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), curconv), |
2012 gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), curconv), |
| 2017 curconv - 1); |
2013 curconv - 1); |
| 2018 return TRUE; |
2014 return TRUE; |
| 2019 break; |
2015 break; |
| 2020 |
2016 |
| 2021 case GDK_period: |
2017 case GDK_KEY_period: |
| 2022 gtk_notebook_reorder_child(GTK_NOTEBOOK(win->notebook), |
2018 gtk_notebook_reorder_child(GTK_NOTEBOOK(win->notebook), |
| 2023 gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), curconv), |
2019 gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), curconv), |
| 2024 (curconv + 1) % gtk_notebook_get_n_pages(GTK_NOTEBOOK(win->notebook))); |
2020 (curconv + 1) % gtk_notebook_get_n_pages(GTK_NOTEBOOK(win->notebook))); |
| 2025 return TRUE; |
2021 return TRUE; |
| 2026 break; |
2022 break; |
| 2027 case GDK_F6: |
2023 case GDK_KEY_F6: |
| 2028 if (gtkconv_cycle_focus(gtkconv, event->state & GDK_SHIFT_MASK ? GTK_DIR_TAB_BACKWARD : GTK_DIR_TAB_FORWARD)) |
2024 if (gtkconv_cycle_focus(gtkconv, event->state & GDK_SHIFT_MASK ? GTK_DIR_TAB_BACKWARD : GTK_DIR_TAB_FORWARD)) |
| 2029 return TRUE; |
2025 return TRUE; |
| 2030 break; |
2026 break; |
| 2031 } /* End of switch */ |
2027 } /* End of switch */ |
| 2032 } |
2028 } |
| 2194 conv, event->state & GDK_SHIFT_MASK)); |
2190 conv, event->state & GDK_SHIFT_MASK)); |
| 2195 return plugin_return ? TRUE : tab_complete(conv); |
2191 return plugin_return ? TRUE : tab_complete(conv); |
| 2196 } |
2192 } |
| 2197 break; |
2193 break; |
| 2198 |
2194 |
| 2199 case GDK_Page_Up: |
2195 case GDK_KEY_Page_Up: |
| 2200 case GDK_KP_Page_Up: |
2196 case GDK_KEY_KP_Page_Up: |
| 2201 gtk_webview_page_up(GTK_WEBVIEW(gtkconv->webview)); |
2197 gtk_webview_page_up(GTK_WEBVIEW(gtkconv->webview)); |
| 2202 return TRUE; |
2198 return TRUE; |
| 2203 break; |
2199 break; |
| 2204 |
2200 |
| 2205 case GDK_Page_Down: |
2201 case GDK_KEY_Page_Down: |
| 2206 case GDK_KP_Page_Down: |
2202 case GDK_KEY_KP_Page_Down: |
| 2207 gtk_webview_page_down(GTK_WEBVIEW(gtkconv->webview)); |
2203 gtk_webview_page_down(GTK_WEBVIEW(gtkconv->webview)); |
| 2208 return TRUE; |
2204 return TRUE; |
| 2209 break; |
2205 break; |
| 2210 |
2206 |
| 2211 } |
2207 } |
| 2245 { |
2241 { |
| 2246 PidginConversation *gtkconv = data; |
2242 PidginConversation *gtkconv = data; |
| 2247 |
2243 |
| 2248 /* If we have a valid key for the conversation display, then exit */ |
2244 /* If we have a valid key for the conversation display, then exit */ |
| 2249 if ((event->state & GDK_CONTROL_MASK) || |
2245 if ((event->state & GDK_CONTROL_MASK) || |
| 2250 (event->keyval == GDK_F6) || |
2246 (event->keyval == GDK_KEY_F6) || |
| 2251 (event->keyval == GDK_F10) || |
2247 (event->keyval == GDK_KEY_F10) || |
| 2252 (event->keyval == GDK_Shift_L) || |
2248 (event->keyval == GDK_KEY_Shift_L) || |
| 2253 (event->keyval == GDK_Shift_R) || |
2249 (event->keyval == GDK_KEY_Shift_R) || |
| 2254 (event->keyval == GDK_Control_L) || |
2250 (event->keyval == GDK_KEY_Control_L) || |
| 2255 (event->keyval == GDK_Control_R) || |
2251 (event->keyval == GDK_KEY_Control_R) || |
| 2256 (event->keyval == GDK_Escape) || |
2252 (event->keyval == GDK_KEY_Escape) || |
| 2257 (event->keyval == GDK_Up) || |
2253 (event->keyval == GDK_KEY_Up) || |
| 2258 (event->keyval == GDK_Down) || |
2254 (event->keyval == GDK_KEY_Down) || |
| 2259 (event->keyval == GDK_Left) || |
2255 (event->keyval == GDK_KEY_Left) || |
| 2260 (event->keyval == GDK_Right) || |
2256 (event->keyval == GDK_KEY_Right) || |
| 2261 (event->keyval == GDK_Page_Up) || |
2257 (event->keyval == GDK_KEY_Page_Up) || |
| 2262 (event->keyval == GDK_KP_Page_Up) || |
2258 (event->keyval == GDK_KEY_KP_Page_Up) || |
| 2263 (event->keyval == GDK_Page_Down) || |
2259 (event->keyval == GDK_KEY_Page_Down) || |
| 2264 (event->keyval == GDK_KP_Page_Down) || |
2260 (event->keyval == GDK_KEY_KP_Page_Down) || |
| 2265 (event->keyval == GDK_Home) || |
2261 (event->keyval == GDK_KEY_Home) || |
| 2266 (event->keyval == GDK_End) || |
2262 (event->keyval == GDK_KEY_End) || |
| 2267 (event->keyval == GDK_Tab) || |
2263 (event->keyval == GDK_KEY_Tab) || |
| 2268 (event->keyval == GDK_KP_Tab) || |
2264 (event->keyval == GDK_KEY_KP_Tab) || |
| 2269 (event->keyval == GDK_ISO_Left_Tab)) |
2265 (event->keyval == GDK_KEY_ISO_Left_Tab)) |
| 2270 { |
2266 { |
| 2271 if (event->type == GDK_KEY_PRESS) |
2267 if (event->type == GDK_KEY_PRESS) |
| 2272 return conv_keypress_common(gtkconv, event); |
2268 return conv_keypress_common(gtkconv, event); |
| 2273 return FALSE; |
2269 return FALSE; |
| 2274 } |
2270 } |
| 3776 case 4: |
3772 case 4: |
| 3777 stock_id = PIDGIN_STOCK_ANIMATION_TYPING4; |
3773 stock_id = PIDGIN_STOCK_ANIMATION_TYPING4; |
| 3778 break; |
3774 break; |
| 3779 } |
3775 } |
| 3780 if (gtkwin->menu.typing_icon == NULL) { |
3776 if (gtkwin->menu.typing_icon == NULL) { |
| 3781 gtkwin->menu.typing_icon = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU); |
3777 gtkwin->menu.typing_icon = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU); |
| 3782 pidgin_menu_tray_append(PIDGIN_MENU_TRAY(gtkwin->menu.tray), |
3778 pidgin_menu_tray_append(PIDGIN_MENU_TRAY(gtkwin->menu.tray), |
| 3783 gtkwin->menu.typing_icon, |
3779 gtkwin->menu.typing_icon, |
| 3784 _("User is typing...")); |
3780 _("User is typing...")); |
| 3785 } else { |
3781 } else { |
| 3786 gtk_image_set_from_stock(GTK_IMAGE(gtkwin->menu.typing_icon), stock_id, GTK_ICON_SIZE_MENU); |
3782 gtk_image_set_from_stock(GTK_IMAGE(gtkwin->menu.typing_icon), stock_id, GTK_ICON_SIZE_MENU); |
| 3787 } |
3783 } |
| 3788 gtk_widget_show(gtkwin->menu.typing_icon); |
3784 gtk_widget_show(gtkwin->menu.typing_icon); |
| 3789 return TRUE; |
3785 return TRUE; |
| 4100 gtk_widget_show(win->menu.send_to); |
4099 gtk_widget_show(win->menu.send_to); |
| 4101 /* TODO: This should never be insensitive. Possibly hidden or not. */ |
4100 /* TODO: This should never be insensitive. Possibly hidden or not. */ |
| 4102 if (!group) |
4101 if (!group) |
| 4103 gtk_widget_set_sensitive(win->menu.send_to, FALSE); |
4102 gtk_widget_set_sensitive(win->menu.send_to, FALSE); |
| 4104 update_send_to_selection(win); |
4103 update_send_to_selection(win); |
| |
4104 #endif |
| 4105 } |
4105 } |
| 4106 |
4106 |
| 4107 static const char * |
4107 static const char * |
| 4108 get_chat_buddy_status_icon(PurpleConvChat *chat, const char *name, PurpleConvChatBuddyFlags flags) |
4108 get_chat_buddy_status_icon(PurpleConvChat *chat, const char *name, PurpleConvChatBuddyFlags flags) |
| 4109 { |
4109 { |
| 4752 GtkTextIter iter; |
4752 GtkTextIter iter; |
| 4753 int lines; |
4753 int lines; |
| 4754 GdkRectangle oneline; |
4754 GdkRectangle oneline; |
| 4755 int height, diff; |
4755 int height, diff; |
| 4756 int pad_top, pad_inside, pad_bottom; |
4756 int pad_top, pad_inside, pad_bottom; |
| 4757 int total_height = (gtkconv->webview->allocation.height + gtkconv->entry->allocation.height); |
4757 int total_height; |
| 4758 int max_height = total_height / 2; |
4758 int max_height; |
| 4759 int min_lines = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/minimum_entry_lines"); |
4759 int min_lines = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/minimum_entry_lines"); |
| 4760 int min_height; |
4760 int min_height; |
| 4761 gboolean interior_focus; |
4761 gboolean interior_focus; |
| 4762 int focus_width; |
4762 int focus_width; |
| |
4763 GtkAllocation webview_allocation; |
| |
4764 GtkAllocation entry_allocation; |
| |
4765 GtkAllocation lower_hbox_allocation; |
| |
4766 |
| |
4767 gtk_widget_get_allocation(gtkconv->webview, &webview_allocation); |
| |
4768 gtk_widget_get_allocation(gtkconv->entry, &entry_allocation); |
| |
4769 gtk_widget_get_allocation(gtkconv->lower_hbox, &lower_hbox_allocation); |
| |
4770 total_height = webview_allocation.height + entry_allocation.height; |
| |
4771 max_height = total_height / 2; |
| 4763 |
4772 |
| 4764 pad_top = gtk_text_view_get_pixels_above_lines(GTK_TEXT_VIEW(gtkconv->entry)); |
4773 pad_top = gtk_text_view_get_pixels_above_lines(GTK_TEXT_VIEW(gtkconv->entry)); |
| 4765 pad_bottom = gtk_text_view_get_pixels_below_lines(GTK_TEXT_VIEW(gtkconv->entry)); |
4774 pad_bottom = gtk_text_view_get_pixels_below_lines(GTK_TEXT_VIEW(gtkconv->entry)); |
| 4766 pad_inside = gtk_text_view_get_pixels_inside_wrap(GTK_TEXT_VIEW(gtkconv->entry)); |
4775 pad_inside = gtk_text_view_get_pixels_inside_wrap(GTK_TEXT_VIEW(gtkconv->entry)); |
| 4767 |
4776 |
| 4791 "focus-line-width", &focus_width, |
4800 "focus-line-width", &focus_width, |
| 4792 NULL); |
4801 NULL); |
| 4793 if (!interior_focus) |
4802 if (!interior_focus) |
| 4794 height += 2 * focus_width; |
4803 height += 2 * focus_width; |
| 4795 |
4804 |
| 4796 diff = height - gtkconv->entry->allocation.height; |
4805 diff = height - entry_allocation.height; |
| 4797 if (ABS(diff) < oneline.height / 2) |
4806 if (ABS(diff) < oneline.height / 2) |
| 4798 return FALSE; |
4807 return FALSE; |
| 4799 |
4808 |
| |
4809 purple_debug_info("pidgin", "resizing to %d, %d lines, diff %d\n", |
| |
4810 diff + lower_hbox_allocation.height, min_lines, diff); |
| |
4811 |
| 4800 gtk_widget_set_size_request(gtkconv->lower_hbox, -1, |
4812 gtk_widget_set_size_request(gtkconv->lower_hbox, -1, |
| 4801 diff + gtkconv->lower_hbox->allocation.height); |
4813 diff + lower_hbox_allocation.height); |
| 4802 |
4814 |
| 4803 return FALSE; |
4815 return FALSE; |
| 4804 } |
4816 } |
| 4805 |
4817 |
| 4806 static void |
4818 static void |
| 4843 gtk_widget_set_size_request(gtkchat->topic_text, -1, BUDDYICON_SIZE_MIN); |
4855 gtk_widget_set_size_request(gtkchat->topic_text, -1, BUDDYICON_SIZE_MIN); |
| 4844 |
4856 |
| 4845 if(prpl_info->set_chat_topic == NULL) { |
4857 if(prpl_info->set_chat_topic == NULL) { |
| 4846 gtk_editable_set_editable(GTK_EDITABLE(gtkchat->topic_text), FALSE); |
4858 gtk_editable_set_editable(GTK_EDITABLE(gtkchat->topic_text), FALSE); |
| 4847 } else { |
4859 } else { |
| 4848 g_signal_connect(GTK_OBJECT(gtkchat->topic_text), "activate", |
4860 g_signal_connect(G_OBJECT(gtkchat->topic_text), "activate", |
| 4849 G_CALLBACK(topic_callback), gtkconv); |
4861 G_CALLBACK(topic_callback), gtkconv); |
| 4850 } |
4862 } |
| 4851 |
4863 |
| 4852 gtk_box_pack_start(GTK_BOX(hbox), gtkchat->topic_text, TRUE, TRUE, 0); |
4864 gtk_box_pack_start(GTK_BOX(hbox), gtkchat->topic_text, TRUE, TRUE, 0); |
| 4853 g_signal_connect(G_OBJECT(gtkchat->topic_text), "key_press_event", |
4865 g_signal_connect(G_OBJECT(gtkchat->topic_text), "key_press_event", |
| 5014 pidgin_conv_end_quickfind(PidginConversation *gtkconv) |
5026 pidgin_conv_end_quickfind(PidginConversation *gtkconv) |
| 5015 { |
5027 { |
| 5016 gtk_widget_modify_base(gtkconv->quickfind.entry, GTK_STATE_NORMAL, NULL); |
5028 gtk_widget_modify_base(gtkconv->quickfind.entry, GTK_STATE_NORMAL, NULL); |
| 5017 |
5029 |
| 5018 webkit_web_view_unmark_text_matches(WEBKIT_WEB_VIEW(gtkconv->webview)); |
5030 webkit_web_view_unmark_text_matches(WEBKIT_WEB_VIEW(gtkconv->webview)); |
| 5019 gtk_widget_hide_all(gtkconv->quickfind.container); |
5031 gtk_widget_hide(gtkconv->quickfind.container); |
| 5020 |
5032 |
| 5021 gtk_widget_grab_focus(gtkconv->entry); |
5033 gtk_widget_grab_focus(gtkconv->entry); |
| 5022 return TRUE; |
5034 return TRUE; |
| 5023 } |
5035 } |
| 5024 |
5036 |
| 5025 static gboolean |
5037 static gboolean |
| 5026 quickfind_process_input(GtkWidget *entry, GdkEventKey *event, PidginConversation *gtkconv) |
5038 quickfind_process_input(GtkWidget *entry, GdkEventKey *event, PidginConversation *gtkconv) |
| 5027 { |
5039 { |
| 5028 switch (event->keyval) { |
5040 switch (event->keyval) { |
| 5029 case GDK_Return: |
5041 case GDK_KEY_Return: |
| 5030 case GDK_KP_Enter: |
5042 case GDK_KEY_KP_Enter: |
| 5031 if (webkit_web_view_search_text(WEBKIT_WEB_VIEW(gtkconv->webview), gtk_entry_get_text(GTK_ENTRY(entry)), FALSE, TRUE, TRUE)) { |
5043 if (webkit_web_view_search_text(WEBKIT_WEB_VIEW(gtkconv->webview), gtk_entry_get_text(GTK_ENTRY(entry)), FALSE, TRUE, TRUE)) { |
| 5032 gtk_widget_modify_base(gtkconv->quickfind.entry, GTK_STATE_NORMAL, NULL); |
5044 gtk_widget_modify_base(gtkconv->quickfind.entry, GTK_STATE_NORMAL, NULL); |
| 5033 } else { |
5045 } else { |
| 5034 GdkColor col; |
5046 GdkColor col; |
| 5035 col.red = 0xffff; |
5047 col.red = 0xffff; |
| 5036 col.green = 0xafff; |
5048 col.green = 0xafff; |
| 5037 col.blue = 0xafff; |
5049 col.blue = 0xafff; |
| 5038 gtk_widget_modify_base(gtkconv->quickfind.entry, GTK_STATE_NORMAL, &col); |
5050 gtk_widget_modify_base(gtkconv->quickfind.entry, GTK_STATE_NORMAL, &col); |
| 5039 } |
5051 } |
| 5040 break; |
5052 break; |
| 5041 case GDK_Escape: |
5053 case GDK_KEY_Escape: |
| 5042 pidgin_conv_end_quickfind(gtkconv); |
5054 pidgin_conv_end_quickfind(gtkconv); |
| 5043 break; |
5055 break; |
| 5044 default: |
5056 default: |
| 5045 return FALSE; |
5057 return FALSE; |
| 5046 } |
5058 } |
| 5493 PidginWindow *win = gtkconv->win; |
5505 PidginWindow *win = gtkconv->win; |
| 5494 PurpleConversation *c; |
5506 PurpleConversation *c; |
| 5495 PurpleAccount *convaccount = purple_conversation_get_account(conv); |
5507 PurpleAccount *convaccount = purple_conversation_get_account(conv); |
| 5496 PurpleConnection *gc = purple_account_get_connection(convaccount); |
5508 PurpleConnection *gc = purple_account_get_connection(convaccount); |
| 5497 PurplePluginProtocolInfo *prpl_info = gc ? PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)) : NULL; |
5509 PurplePluginProtocolInfo *prpl_info = gc ? PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)) : NULL; |
| 5498 |
5510 GdkAtom target = gtk_selection_data_get_target(sd); |
| 5499 if (sd->target == gdk_atom_intern("PURPLE_BLIST_NODE", FALSE)) |
5511 const guchar *data = gtk_selection_data_get_data(sd); |
| |
5512 |
| |
5513 if (target == gdk_atom_intern("PURPLE_BLIST_NODE", FALSE)) |
| 5500 { |
5514 { |
| 5501 PurpleBlistNode *n = NULL; |
5515 PurpleBlistNode *n = NULL; |
| 5502 PurpleBuddy *b; |
5516 PurpleBuddy *b; |
| 5503 PidginConversation *gtkconv = NULL; |
5517 PidginConversation *gtkconv = NULL; |
| 5504 PurpleAccount *buddyaccount; |
5518 PurpleAccount *buddyaccount; |
| 5505 const char *buddyname; |
5519 const char *buddyname; |
| 5506 |
5520 |
| 5507 n = *(PurpleBlistNode **)sd->data; |
5521 n = *(PurpleBlistNode **) data; |
| 5508 |
5522 |
| 5509 if (PURPLE_BLIST_NODE_IS_CONTACT(n)) |
5523 if (PURPLE_BLIST_NODE_IS_CONTACT(n)) |
| 5510 b = purple_contact_get_priority_buddy((PurpleContact*)n); |
5524 b = purple_contact_get_priority_buddy((PurpleContact*)n); |
| 5511 else if (PURPLE_BLIST_NODE_IS_BUDDY(n)) |
5525 else if (PURPLE_BLIST_NODE_IS_BUDDY(n)) |
| 5512 b = (PurpleBuddy*)n; |
5526 b = (PurpleBuddy*)n; |
| 5550 |
5564 |
| 5551 /* Make this conversation the active conversation */ |
5565 /* Make this conversation the active conversation */ |
| 5552 pidgin_conv_window_switch_gtkconv(win, gtkconv); |
5566 pidgin_conv_window_switch_gtkconv(win, gtkconv); |
| 5553 } |
5567 } |
| 5554 |
5568 |
| 5555 gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); |
5569 gtk_drag_finish(dc, TRUE, |
| 5556 } |
5570 gdk_drag_context_get_actions(dc) == GDK_ACTION_MOVE, t); |
| 5557 else if (sd->target == gdk_atom_intern("application/x-im-contact", FALSE)) |
5571 } |
| |
5572 else if (target == gdk_atom_intern("application/x-im-contact", FALSE)) |
| 5558 { |
5573 { |
| 5559 char *protocol = NULL; |
5574 char *protocol = NULL; |
| 5560 char *username = NULL; |
5575 char *username = NULL; |
| 5561 PurpleAccount *account; |
5576 PurpleAccount *account; |
| 5562 PidginConversation *gtkconv; |
5577 PidginConversation *gtkconv; |
| 5563 |
5578 |
| 5564 if (pidgin_parse_x_im_contact((const char *)sd->data, FALSE, &account, |
5579 if (pidgin_parse_x_im_contact((const char *) data, FALSE, &account, |
| 5565 &protocol, &username, NULL)) |
5580 &protocol, &username, NULL)) |
| 5566 { |
5581 { |
| 5567 if (account == NULL) |
5582 if (account == NULL) |
| 5568 { |
5583 { |
| 5569 purple_notify_error(win, NULL, |
5584 purple_notify_error(win, NULL, |
| 5590 } |
5605 } |
| 5591 |
5606 |
| 5592 g_free(username); |
5607 g_free(username); |
| 5593 g_free(protocol); |
5608 g_free(protocol); |
| 5594 |
5609 |
| 5595 gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); |
5610 gtk_drag_finish(dc, TRUE, |
| 5596 } |
5611 gdk_drag_context_get_actions(dc) == GDK_ACTION_MOVE, t); |
| 5597 else if (sd->target == gdk_atom_intern("text/uri-list", FALSE)) { |
5612 } |
| |
5613 else if (target == gdk_atom_intern("text/uri-list", FALSE)) { |
| 5598 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) |
5614 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) |
| 5599 pidgin_dnd_file_manage(sd, convaccount, purple_conversation_get_name(conv)); |
5615 pidgin_dnd_file_manage(sd, convaccount, purple_conversation_get_name(conv)); |
| 5600 gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); |
5616 gtk_drag_finish(dc, TRUE, |
| |
5617 gdk_drag_context_get_actions(dc) == GDK_ACTION_MOVE, t); |
| 5601 } |
5618 } |
| 5602 else |
5619 else |
| 5603 gtk_drag_finish(dc, FALSE, FALSE, t); |
5620 gtk_drag_finish(dc, FALSE, FALSE, t); |
| 5604 } |
5621 } |
| 5605 |
5622 |
| 6008 if (event->type == GDK_BUTTON_PRESS |
6025 if (event->type == GDK_BUTTON_PRESS |
| 6009 || event->type == GDK_2BUTTON_PRESS) { |
6026 || event->type == GDK_2BUTTON_PRESS) { |
| 6010 GdkEventButton *btn_event = (GdkEventButton*) event; |
6027 GdkEventButton *btn_event = (GdkEventButton*) event; |
| 6011 PurpleConversation *conv = data; |
6028 PurpleConversation *conv = data; |
| 6012 char *buddyname; |
6029 char *buddyname; |
| |
6030 gchar *name; |
| |
6031 |
| |
6032 g_object_get(G_OBJECT(tag), "name", &name, NULL); |
| 6013 |
6033 |
| 6014 /* strlen("BUDDY " or "HILIT ") == 6 */ |
6034 /* strlen("BUDDY " or "HILIT ") == 6 */ |
| 6015 g_return_val_if_fail((tag->name != NULL) |
6035 g_return_val_if_fail((name != NULL) && (strlen(name) > 6), FALSE); |
| 6016 && (strlen(tag->name) > 6), FALSE); |
6036 |
| 6017 |
6037 buddyname = name + 6; |
| 6018 buddyname = (tag->name) + 6; |
|
| 6019 |
6038 |
| 6020 /* emit chat-nick-clicked signal */ |
6039 /* emit chat-nick-clicked signal */ |
| 6021 if (event->type == GDK_BUTTON_PRESS) { |
6040 if (event->type == GDK_BUTTON_PRESS) { |
| 6022 gint plugin_return = GPOINTER_TO_INT(purple_signal_emit_return_1( |
6041 gint plugin_return = GPOINTER_TO_INT(purple_signal_emit_return_1( |
| 6023 pidgin_conversations_get_handle(), "chat-nick-clicked", |
6042 pidgin_conversations_get_handle(), "chat-nick-clicked", |
| 6024 data, buddyname, btn_event->button)); |
6043 data, buddyname, btn_event->button)); |
| 6025 if (plugin_return) |
6044 if (plugin_return) { |
| |
6045 g_free(name); |
| 6026 return TRUE; |
6046 return TRUE; |
| 6027 } |
6047 } |
| 6028 |
6048 } |
| 6029 if (btn_event->button == 1 && |
6049 |
| 6030 event->type == GDK_2BUTTON_PRESS) { |
6050 if (btn_event->button == 1 && event->type == GDK_2BUTTON_PRESS) { |
| 6031 chat_do_im(PIDGIN_CONVERSATION(conv), buddyname); |
6051 chat_do_im(PIDGIN_CONVERSATION(conv), buddyname); |
| |
6052 g_free(name); |
| |
6053 |
| 6032 return TRUE; |
6054 return TRUE; |
| 6033 } else if (btn_event->button == 2 |
6055 } else if (btn_event->button == 2 && event->type == GDK_2BUTTON_PRESS) { |
| 6034 && event->type == GDK_2BUTTON_PRESS) { |
|
| 6035 chat_do_info(PIDGIN_CONVERSATION(conv), buddyname); |
6056 chat_do_info(PIDGIN_CONVERSATION(conv), buddyname); |
| |
6057 g_free(name); |
| 6036 |
6058 |
| 6037 return TRUE; |
6059 return TRUE; |
| 6038 } else if (btn_event->button == 3 |
6060 } else if (btn_event->button == 3 && event->type == GDK_BUTTON_PRESS) { |
| 6039 && event->type == GDK_BUTTON_PRESS) { |
|
| 6040 GtkTextIter start, end; |
6061 GtkTextIter start, end; |
| 6041 |
6062 |
| 6042 /* we shouldn't display the popup |
6063 /* we shouldn't display the popup |
| 6043 * if the user has selected something: */ |
6064 * if the user has selected something: */ |
| 6044 if (!gtk_text_buffer_get_selection_bounds( |
6065 if (!gtk_text_buffer_get_selection_bounds( |
| 7302 pidgin_themes_smiley_themeize(PIDGIN_CONVERSATION(conv)->webview); |
7327 pidgin_themes_smiley_themeize(PIDGIN_CONVERSATION(conv)->webview); |
| 7303 #endif |
7328 #endif |
| 7304 |
7329 |
| 7305 if ((fields & PIDGIN_CONV_COLORIZE_TITLE) || |
7330 if ((fields & PIDGIN_CONV_COLORIZE_TITLE) || |
| 7306 (fields & PIDGIN_CONV_SET_TITLE) || |
7331 (fields & PIDGIN_CONV_SET_TITLE) || |
| 7307 (fields & PIDGIN_CONV_TOPIC)) |
7332 (fields & PIDGIN_CONV_TOPIC)) |
| 7308 { |
7333 { |
| 7309 char *title; |
7334 char *title; |
| 7310 PurpleConvIm *im = NULL; |
7335 PurpleConvIm *im = NULL; |
| 7311 PurpleAccount *account = purple_conversation_get_account(conv); |
7336 PurpleAccount *account = purple_conversation_get_account(conv); |
| 7312 PurpleBuddy *buddy = NULL; |
7337 PurpleBuddy *buddy = NULL; |
| 7668 |
7693 |
| 7669 event = gtk_event_box_new(); |
7694 event = gtk_event_box_new(); |
| 7670 gtk_container_add(GTK_CONTAINER(gtkconv->u.im->icon_container), event); |
7695 gtk_container_add(GTK_CONTAINER(gtkconv->u.im->icon_container), event); |
| 7671 gtk_event_box_set_visible_window(GTK_EVENT_BOX(event), FALSE); |
7696 gtk_event_box_set_visible_window(GTK_EVENT_BOX(event), FALSE); |
| 7672 gtk_widget_add_events(event, |
7697 gtk_widget_add_events(event, |
| 7673 GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK); |
7698 GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK); |
| 7674 g_signal_connect(G_OBJECT(event), "button-press-event", |
7699 g_signal_connect(G_OBJECT(event), "button-press-event", |
| 7675 G_CALLBACK(icon_menu), gtkconv); |
7700 G_CALLBACK(icon_menu), gtkconv); |
| 7676 |
7701 |
| 7677 pidgin_tooltip_setup_for_widget(event, gtkconv, pidgin_conv_create_tooltip, NULL); |
7702 pidgin_tooltip_setup_for_widget(event, gtkconv, pidgin_conv_create_tooltip, NULL); |
| 7678 gtk_widget_show(event); |
7703 gtk_widget_show(event); |
| 7710 static gboolean |
7735 static gboolean |
| 7711 pidgin_conv_xy_to_right_infopane(PidginWindow *win, int x, int y) |
7736 pidgin_conv_xy_to_right_infopane(PidginWindow *win, int x, int y) |
| 7712 { |
7737 { |
| 7713 gint pane_x, pane_y, x_rel; |
7738 gint pane_x, pane_y, x_rel; |
| 7714 PidginConversation *gtkconv; |
7739 PidginConversation *gtkconv; |
| 7715 |
7740 GtkAllocation allocation; |
| 7716 gdk_window_get_origin(win->notebook->window, &pane_x, &pane_y); |
7741 |
| |
7742 gdk_window_get_origin(gtk_widget_get_window(win->notebook), |
| |
7743 &pane_x, &pane_y); |
| 7717 x_rel = x - pane_x; |
7744 x_rel = x - pane_x; |
| 7718 gtkconv = pidgin_conv_window_get_active_gtkconv(win); |
7745 gtkconv = pidgin_conv_window_get_active_gtkconv(win); |
| 7719 return (x_rel > gtkconv->infopane->allocation.x + gtkconv->infopane->allocation.width / 2); |
7746 gtk_widget_get_allocation(gtkconv->infopane, &allocation); |
| |
7747 return (x_rel > allocation.x + allocation.width / 2); |
| 7720 } |
7748 } |
| 7721 |
7749 |
| 7722 int |
7750 int |
| 7723 pidgin_conv_get_tab_at_xy(PidginWindow *win, int x, int y, gboolean *to_right) |
7751 pidgin_conv_get_tab_at_xy(PidginWindow *win, int x, int y, gboolean *to_right) |
| 7724 { |
7752 { |
| 7732 if (to_right) |
7760 if (to_right) |
| 7733 *to_right = FALSE; |
7761 *to_right = FALSE; |
| 7734 |
7762 |
| 7735 notebook = GTK_NOTEBOOK(win->notebook); |
7763 notebook = GTK_NOTEBOOK(win->notebook); |
| 7736 |
7764 |
| 7737 gdk_window_get_origin(win->notebook->window, &nb_x, &nb_y); |
7765 gdk_window_get_origin(gtk_widget_get_window(win->notebook), &nb_x, &nb_y); |
| 7738 x_rel = x - nb_x; |
7766 x_rel = x - nb_x; |
| 7739 y_rel = y - nb_y; |
7767 y_rel = y - nb_y; |
| 7740 |
7768 |
| 7741 horiz = (gtk_notebook_get_tab_pos(notebook) == GTK_POS_TOP || |
7769 horiz = (gtk_notebook_get_tab_pos(notebook) == GTK_POS_TOP || |
| 7742 gtk_notebook_get_tab_pos(notebook) == GTK_POS_BOTTOM); |
7770 gtk_notebook_get_tab_pos(notebook) == GTK_POS_BOTTOM); |
| 7743 |
7771 |
| 7744 count = gtk_notebook_get_n_pages(GTK_NOTEBOOK(notebook)); |
7772 count = gtk_notebook_get_n_pages(GTK_NOTEBOOK(notebook)); |
| 7745 |
7773 |
| 7746 for (i = 0; i < count; i++) { |
7774 for (i = 0; i < count; i++) { |
| |
7775 GtkAllocation allocation; |
| 7747 |
7776 |
| 7748 page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), i); |
7777 page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), i); |
| 7749 tab = gtk_notebook_get_tab_label(GTK_NOTEBOOK(notebook), page); |
7778 tab = gtk_notebook_get_tab_label(GTK_NOTEBOOK(notebook), page); |
| |
7779 gtk_widget_get_allocation(tab, &allocation); |
| 7750 |
7780 |
| 7751 /* Make sure the tab is not hidden beyond an arrow */ |
7781 /* Make sure the tab is not hidden beyond an arrow */ |
| 7752 if (!gtk_widget_is_drawable(tab) && gtk_notebook_get_show_tabs(notebook)) |
7782 if (!gtk_widget_is_drawable(tab) && gtk_notebook_get_show_tabs(notebook)) |
| 7753 continue; |
7783 continue; |
| 7754 |
7784 |
| 7755 if (horiz) { |
7785 if (horiz) { |
| 7756 if (x_rel >= tab->allocation.x - PIDGIN_HIG_BOX_SPACE && |
7786 if (x_rel >= allocation.x - PIDGIN_HIG_BOX_SPACE && |
| 7757 x_rel <= tab->allocation.x + tab->allocation.width + PIDGIN_HIG_BOX_SPACE) { |
7787 x_rel <= allocation.x + allocation.width + PIDGIN_HIG_BOX_SPACE) { |
| 7758 page_num = i; |
7788 page_num = i; |
| 7759 |
7789 |
| 7760 if (to_right && x_rel >= tab->allocation.x + tab->allocation.width/2) |
7790 if (to_right && x_rel >= allocation.x + allocation.width/2) |
| 7761 *to_right = TRUE; |
7791 *to_right = TRUE; |
| 7762 |
7792 |
| 7763 break; |
7793 break; |
| 7764 } |
7794 } |
| 7765 } else { |
7795 } else { |
| 7766 if (y_rel >= tab->allocation.y - PIDGIN_HIG_BOX_SPACE && |
7796 if (y_rel >= allocation.y - PIDGIN_HIG_BOX_SPACE && |
| 7767 y_rel <= tab->allocation.y + tab->allocation.height + PIDGIN_HIG_BOX_SPACE) { |
7797 y_rel <= allocation.y + allocation.height + PIDGIN_HIG_BOX_SPACE) { |
| 7768 page_num = i; |
7798 page_num = i; |
| 7769 |
7799 |
| 7770 if (to_right && y_rel >= tab->allocation.y + tab->allocation.height/2) |
7800 if (to_right && y_rel >= allocation.y + allocation.height/2) |
| 7771 *to_right = TRUE; |
7801 *to_right = TRUE; |
| 7772 |
7802 |
| 7773 break; |
7803 break; |
| 7774 } |
7804 } |
| 7775 } |
7805 } |
| 8530 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/im/show_buddy_icons", |
8560 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/im/show_buddy_icons", |
| 8531 show_buddy_icons_pref_cb, NULL); |
8561 show_buddy_icons_pref_cb, NULL); |
| 8532 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/blist/show_protocol_icons", |
8562 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/blist/show_protocol_icons", |
| 8533 show_protocol_icons_pref_cb, NULL); |
8563 show_protocol_icons_pref_cb, NULL); |
| 8534 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/im/hide_new", |
8564 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/im/hide_new", |
| 8535 hide_new_pref_cb, NULL); |
8565 hide_new_pref_cb, NULL); |
| 8536 |
8566 |
| 8537 |
8567 |
| 8538 |
8568 |
| 8539 /********************************************************************** |
8569 /********************************************************************** |
| 8540 * Register signals |
8570 * Register signals |
| 8687 |
8717 |
| 8688 hidden_convwin = pidgin_conv_window_new(); |
8718 hidden_convwin = pidgin_conv_window_new(); |
| 8689 window_list = g_list_remove(window_list, hidden_convwin); |
8719 window_list = g_list_remove(window_list, hidden_convwin); |
| 8690 |
8720 |
| 8691 purple_signal_connect(purple_accounts_get_handle(), "account-status-changed", |
8721 purple_signal_connect(purple_accounts_get_handle(), "account-status-changed", |
| 8692 handle, PURPLE_CALLBACK(account_status_changed_cb), NULL); |
8722 handle, PURPLE_CALLBACK(account_status_changed_cb), NULL); |
| 8693 |
8723 |
| 8694 /* Callbacks to update a conversation */ |
8724 /* Callbacks to update a conversation */ |
| 8695 purple_signal_connect(blist_handle, "blist-node-added", handle, |
8725 purple_signal_connect(blist_handle, "blist-node-added", handle, |
| 8696 G_CALLBACK(buddy_update_cb), NULL); |
8726 G_CALLBACK(buddy_update_cb), NULL); |
| 8697 purple_signal_connect(blist_handle, "blist-node-removed", handle, |
8727 purple_signal_connect(blist_handle, "blist-node-removed", handle, |
| 8876 GTK_RESPONSE_OK); |
8906 GTK_RESPONSE_OK); |
| 8877 |
8907 |
| 8878 gtk_container_set_border_width(GTK_CONTAINER(warn_close_dialog), |
8908 gtk_container_set_border_width(GTK_CONTAINER(warn_close_dialog), |
| 8879 6); |
8909 6); |
| 8880 gtk_window_set_resizable(GTK_WINDOW(warn_close_dialog), FALSE); |
8910 gtk_window_set_resizable(GTK_WINDOW(warn_close_dialog), FALSE); |
| 8881 #if !GTK_CHECK_VERSION(2,22,0) |
8911 |
| 8882 gtk_dialog_set_has_separator(GTK_DIALOG(warn_close_dialog), FALSE); |
8912 /* TODO: figure out how to set no separator in GTK+ 3.0 */ |
| |
8913 #if 0 |
| |
8914 gtk_dialog_set_has_separator(GTK_DIALOG(warn_close_dialog), |
| |
8915 FALSE); |
| 8883 #endif |
8916 #endif |
| 8884 |
8917 |
| 8885 /* Setup the outside spacing. */ |
8918 /* Setup the outside spacing. */ |
| 8886 vbox = GTK_DIALOG(warn_close_dialog)->vbox; |
8919 vbox = gtk_dialog_get_content_area(GTK_DIALOG(warn_close_dialog)); |
| 8887 |
8920 |
| 8888 gtk_box_set_spacing(GTK_BOX(vbox), 12); |
8921 gtk_box_set_spacing(GTK_BOX(vbox), 12); |
| 8889 gtk_container_set_border_width(GTK_CONTAINER(vbox), 6); |
8922 gtk_container_set_border_width(GTK_CONTAINER(vbox), 6); |
| 8890 |
8923 |
| 8891 img = gtk_image_new_from_stock(PIDGIN_STOCK_DIALOG_WARNING, |
8924 img = gtk_image_new_from_stock(PIDGIN_STOCK_DIALOG_WARNING, |
| 9035 #ifndef _WIN32 |
9068 #ifndef _WIN32 |
| 9036 /* Currently for win32 GTK+ (as of 2.2.1), gdk_pointer_is_grabbed will |
9069 /* Currently for win32 GTK+ (as of 2.2.1), gdk_pointer_is_grabbed will |
| 9037 always be true after a button press. */ |
9070 always be true after a button press. */ |
| 9038 if (!gdk_pointer_is_grabbed()) |
9071 if (!gdk_pointer_is_grabbed()) |
| 9039 #endif |
9072 #endif |
| 9040 gdk_pointer_grab(gtkwin->notebook->window, FALSE, |
9073 gdk_pointer_grab(gtk_widget_get_window(gtkwin->notebook), FALSE, |
| 9041 GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, |
9074 GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, |
| 9042 NULL, cursor, GDK_CURRENT_TIME); |
9075 NULL, cursor, GDK_CURRENT_TIME); |
| 9043 } |
9076 } |
| 9044 |
9077 |
| 9045 static gboolean |
9078 static gboolean |
| 9155 if (e->type != GDK_BUTTON_PRESS) |
9188 if (e->type != GDK_BUTTON_PRESS) |
| 9156 return FALSE; |
9189 return FALSE; |
| 9157 |
9190 |
| 9158 if (e->button == 1) { |
9191 if (e->button == 1) { |
| 9159 int nb_x, nb_y; |
9192 int nb_x, nb_y; |
| |
9193 GtkAllocation allocation; |
| |
9194 |
| |
9195 gtk_widget_get_allocation(gtkconv->infopane_hbox, &allocation); |
| 9160 |
9196 |
| 9161 if (gtkconv->win->in_drag) |
9197 if (gtkconv->win->in_drag) |
| 9162 return TRUE; |
9198 return TRUE; |
| 9163 |
9199 |
| 9164 gtkconv->win->in_predrag = TRUE; |
9200 gtkconv->win->in_predrag = TRUE; |
| 9165 gtkconv->win->drag_tab = gtk_notebook_page_num(GTK_NOTEBOOK(gtkconv->win->notebook), gtkconv->tab_cont); |
9201 gtkconv->win->drag_tab = gtk_notebook_page_num(GTK_NOTEBOOK(gtkconv->win->notebook), gtkconv->tab_cont); |
| 9166 |
9202 |
| 9167 gdk_window_get_origin(gtkconv->infopane_hbox->window, &nb_x, &nb_y); |
9203 gdk_window_get_origin(gtk_widget_get_window(gtkconv->infopane_hbox), &nb_x, &nb_y); |
| 9168 |
9204 |
| 9169 gtkconv->win->drag_min_x = gtkconv->infopane_hbox->allocation.x + nb_x; |
9205 gtkconv->win->drag_min_x = allocation.x + nb_x; |
| 9170 gtkconv->win->drag_min_y = gtkconv->infopane_hbox->allocation.y + nb_y; |
9206 gtkconv->win->drag_min_y = allocation.y + nb_y; |
| 9171 gtkconv->win->drag_max_x = gtkconv->infopane_hbox->allocation.width + gtkconv->win->drag_min_x; |
9207 gtkconv->win->drag_max_x = allocation.width + gtkconv->win->drag_min_x; |
| 9172 gtkconv->win->drag_max_y = gtkconv->infopane_hbox->allocation.height + gtkconv->win->drag_min_y; |
9208 gtkconv->win->drag_max_y = allocation.height + gtkconv->win->drag_min_y; |
| 9173 |
9209 |
| 9174 gtkconv->win->drag_motion_signal = g_signal_connect(G_OBJECT(gtkconv->win->notebook), "motion_notify_event", |
9210 gtkconv->win->drag_motion_signal = g_signal_connect(G_OBJECT(gtkconv->win->notebook), "motion_notify_event", |
| 9175 G_CALLBACK(notebook_motion_cb), gtkconv->win); |
9211 G_CALLBACK(notebook_motion_cb), gtkconv->win); |
| 9176 gtkconv->win->drag_leave_signal = g_signal_connect(G_OBJECT(gtkconv->win->notebook), "leave_notify_event", |
9212 gtkconv->win->drag_leave_signal = g_signal_connect(G_OBJECT(gtkconv->win->notebook), "leave_notify_event", |
| 9177 G_CALLBACK(notebook_leave_cb), gtkconv->win); |
9213 G_CALLBACK(notebook_leave_cb), gtkconv->win); |
| 9180 |
9216 |
| 9181 if (e->button == 3) { |
9217 if (e->button == 3) { |
| 9182 /* Right click was pressed. Popup the context menu. */ |
9218 /* Right click was pressed. Popup the context menu. */ |
| 9183 GtkWidget *menu = gtk_menu_new(), *sub; |
9219 GtkWidget *menu = gtk_menu_new(), *sub; |
| 9184 gboolean populated = populate_menu_with_options(menu, gtkconv, TRUE); |
9220 gboolean populated = populate_menu_with_options(menu, gtkconv, TRUE); |
| 9185 |
9221 #if 0 /* TODO */ |
| 9186 sub = gtk_menu_item_get_submenu(GTK_MENU_ITEM(gtkconv->win->menu.send_to)); |
9222 sub = gtk_menu_item_get_submenu(GTK_MENU_ITEM(gtkconv->win->menu.send_to)); |
| 9187 if (sub && gtk_widget_is_sensitive(gtkconv->win->menu.send_to)) { |
9223 if (sub && gtk_widget_is_sensitive(gtkconv->win->menu.send_to)) { |
| 9188 GtkWidget *item = gtk_menu_item_new_with_mnemonic(_("S_end To")); |
9224 GtkWidget *item = gtk_menu_item_new_with_mnemonic(_("S_end To")); |
| 9189 if (populated) |
9225 if (populated) |
| 9190 pidgin_separator(menu); |
9226 pidgin_separator(menu); |
| 9194 gtk_widget_show_all(sub); |
9230 gtk_widget_show_all(sub); |
| 9195 } else if (!populated) { |
9231 } else if (!populated) { |
| 9196 gtk_widget_destroy(menu); |
9232 gtk_widget_destroy(menu); |
| 9197 return FALSE; |
9233 return FALSE; |
| 9198 } |
9234 } |
| 9199 |
9235 #endif |
| 9200 gtk_widget_show_all(menu); |
9236 gtk_widget_show_all(menu); |
| 9201 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, e->button, e->time); |
9237 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, e->button, e->time); |
| 9202 return TRUE; |
9238 return TRUE; |
| 9203 } |
9239 } |
| 9204 return FALSE; |
9240 return FALSE; |
| 9246 |
9283 |
| 9247 /* |
9284 /* |
| 9248 * Get the relative position of the press event, with regards to |
9285 * Get the relative position of the press event, with regards to |
| 9249 * the position of the notebook. |
9286 * the position of the notebook. |
| 9250 */ |
9287 */ |
| 9251 gdk_window_get_origin(win->notebook->window, &nb_x, &nb_y); |
9288 gdk_window_get_origin(gtk_widget_get_window(win->notebook), &nb_x, &nb_y); |
| 9252 |
9289 |
| 9253 /* Reset the min/max x/y */ |
9290 /* Reset the min/max x/y */ |
| 9254 win->drag_min_x = 0; |
9291 win->drag_min_x = 0; |
| 9255 win->drag_min_y = 0; |
9292 win->drag_min_y = 0; |
| 9256 win->drag_max_x = 0; |
9293 win->drag_max_x = 0; |
| 9258 |
9295 |
| 9259 /* Find out which tab was dragged. */ |
9296 /* Find out which tab was dragged. */ |
| 9260 page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), tab_clicked); |
9297 page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), tab_clicked); |
| 9261 tab = gtk_notebook_get_tab_label(GTK_NOTEBOOK(win->notebook), page); |
9298 tab = gtk_notebook_get_tab_label(GTK_NOTEBOOK(win->notebook), page); |
| 9262 |
9299 |
| 9263 win->drag_min_x = tab->allocation.x + nb_x; |
9300 gtk_widget_get_allocation(tab, &allocation); |
| 9264 win->drag_min_y = tab->allocation.y + nb_y; |
9301 |
| 9265 win->drag_max_x = tab->allocation.width + win->drag_min_x; |
9302 win->drag_min_x = allocation.x + nb_x; |
| 9266 win->drag_max_y = tab->allocation.height + win->drag_min_y; |
9303 win->drag_min_y = allocation.y + nb_y; |
| |
9304 win->drag_max_x = allocation.width + win->drag_min_x; |
| |
9305 win->drag_max_y = allocation.height + win->drag_min_y; |
| 9267 |
9306 |
| 9268 /* Make sure the click occurred in the tab. */ |
9307 /* Make sure the click occurred in the tab. */ |
| 9269 if (e->x_root < win->drag_min_x || |
9308 if (e->x_root < win->drag_min_x || |
| 9270 e->x_root >= win->drag_max_x || |
9309 e->x_root >= win->drag_max_x || |
| 9271 e->y_root < win->drag_min_y || |
9310 e->y_root < win->drag_min_y || |
| 9272 e->y_root >= win->drag_max_y) { |
9311 e->y_root >= win->drag_max_y) { |
| 9273 |
9312 |
| 9274 return FALSE; |
9313 return FALSE; |
| 9275 } |
9314 } |
| 9276 |
9315 |
| 9277 win->in_predrag = TRUE; |
9316 win->in_predrag = TRUE; |
| 9278 win->drag_tab = tab_clicked; |
9317 win->drag_tab = tab_clicked; |
| 9279 |
9318 |
| 9280 /* Connect the new motion signals. */ |
9319 /* Connect the new motion signals. */ |
| 9498 |
9537 |
| 9499 if (gtkconv) |
9538 if (gtkconv) |
| 9500 close_conv_cb(NULL, gtkconv); |
9539 close_conv_cb(NULL, gtkconv); |
| 9501 } |
9540 } |
| 9502 |
9541 |
| |
9542 /* TODO: I don't know if this doable in GTK+ 3.0 */ |
| |
9543 #if 0 |
| 9503 static gboolean |
9544 static gboolean |
| 9504 right_click_menu_cb(GtkNotebook *notebook, GdkEventButton *event, PidginWindow *win) |
9545 right_click_menu_cb(GtkNotebook *notebook, GdkEventButton *event, PidginWindow *win) |
| 9505 { |
9546 { |
| 9506 GtkWidget *item, *menu; |
9547 GtkWidget *item; |
| 9507 PidginConversation *gtkconv; |
9548 PidginConversation *gtkconv; |
| |
9549 GtkWidget *menu = gtk_notebook_get_menu |
| 9508 |
9550 |
| 9509 if (event->type != GDK_BUTTON_PRESS || event->button != 3) |
9551 if (event->type != GDK_BUTTON_PRESS || event->button != 3) |
| 9510 return FALSE; |
9552 return FALSE; |
| 9511 |
9553 |
| 9512 gtkconv = pidgin_conv_window_get_gtkconv_at_index(win, |
9554 gtkconv = pidgin_conv_window_get_gtkconv_at_index(win, |
| 9549 g_signal_connect(G_OBJECT(item), "activate", |
9591 g_signal_connect(G_OBJECT(item), "activate", |
| 9550 G_CALLBACK(close_tab_cb), menu); |
9592 G_CALLBACK(close_tab_cb), menu); |
| 9551 |
9593 |
| 9552 return FALSE; |
9594 return FALSE; |
| 9553 } |
9595 } |
| |
9596 #endif |
| 9554 |
9597 |
| 9555 static void |
9598 static void |
| 9556 remove_edit_entry(PidginConversation *gtkconv, GtkWidget *entry) |
9599 remove_edit_entry(PidginConversation *gtkconv, GtkWidget *entry) |
| 9557 { |
9600 { |
| 9558 g_signal_handlers_disconnect_matched(G_OBJECT(entry), G_SIGNAL_MATCH_DATA, |
9601 g_signal_handlers_disconnect_matched(G_OBJECT(entry), G_SIGNAL_MATCH_DATA, |
| 9597 |
9640 |
| 9598 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { |
9641 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { |
| 9599 PurpleBuddy *buddy; |
9642 PurpleBuddy *buddy; |
| 9600 buddy = purple_find_buddy(account, name); |
9643 buddy = purple_find_buddy(account, name); |
| 9601 if (buddy != NULL) { |
9644 if (buddy != NULL) { |
| 9602 purple_blist_alias_buddy(buddy, |
9645 purple_blist_alias_buddy(buddy, gtk_entry_get_text(entry)); |
| 9603 gtk_entry_get_text(entry)); |
|
| 9604 } |
9646 } |
| 9605 serv_alias_buddy(buddy); |
9647 serv_alias_buddy(buddy); |
| 9606 } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { |
9648 } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { |
| 9607 gtk_entry_set_text(GTK_ENTRY(gtkconv->u.chat->topic_text), gtk_entry_get_text(entry)); |
9649 gtk_entry_set_text(GTK_ENTRY(gtkconv->u.chat->topic_text), gtk_entry_get_text(entry)); |
| 9608 topic_callback(NULL, gtkconv); |
9650 topic_callback(NULL, gtkconv); |
| 9744 |
9786 |
| 9745 static GList* |
9787 static GList* |
| 9746 make_status_icon_list(const char *stock, GtkWidget *w) |
9788 make_status_icon_list(const char *stock, GtkWidget *w) |
| 9747 { |
9789 { |
| 9748 GList *l = NULL; |
9790 GList *l = NULL; |
| 9749 l = g_list_append(l, gtk_widget_render_icon (w, stock, |
9791 l = g_list_append(l, |
| 9750 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL), "GtkWindow")); |
9792 gtk_widget_render_icon(w, stock, |
| 9751 l = g_list_append(l, gtk_widget_render_icon (w, stock, |
9793 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL), "GtkWindow")); |
| 9752 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_SMALL), "GtkWindow")); |
9794 l = g_list_append(l, |
| 9753 l = g_list_append(l, gtk_widget_render_icon (w, stock, |
9795 gtk_widget_render_icon(w, stock, |
| 9754 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_MEDIUM), "GtkWindow")); |
9796 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_SMALL), "GtkWindow")); |
| 9755 l = g_list_append(l, gtk_widget_render_icon (w, stock, |
9797 l = g_list_append(l, |
| 9756 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_LARGE), "GtkWindow")); |
9798 gtk_widget_render_icon(w, stock, |
| |
9799 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_MEDIUM), "GtkWindow")); |
| |
9800 l = g_list_append(l, |
| |
9801 gtk_widget_render_icon(w, stock, |
| |
9802 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_LARGE), "GtkWindow")); |
| 9757 return l; |
9803 return l; |
| 9758 } |
9804 } |
| 9759 |
9805 |
| 9760 static void |
9806 static void |
| 9761 create_icon_lists(GtkWidget *w) |
9807 create_icon_lists(GtkWidget *w) |
| 9782 else |
9828 else |
| 9783 return FALSE; /* carry on normally */ |
9829 return FALSE; /* carry on normally */ |
| 9784 |
9830 |
| 9785 /* Workaround for GTK+ bug # 169811 - "configure_event" is fired |
9831 /* Workaround for GTK+ bug # 169811 - "configure_event" is fired |
| 9786 * when the window is being maximized */ |
9832 * when the window is being maximized */ |
| 9787 if (gdk_window_get_state(w->window) & GDK_WINDOW_STATE_MAXIMIZED) |
9833 if (gdk_window_get_state(gtk_widget_get_window(w)) & GDK_WINDOW_STATE_MAXIMIZED) |
| 9788 return FALSE; |
9834 return FALSE; |
| 9789 |
9835 |
| 9790 /* don't save off-screen positioning */ |
9836 /* don't save off-screen positioning */ |
| 9791 if (x + event->width < 0 || |
9837 if (x + event->width < 0 || |
| 9792 y + event->height < 0 || |
9838 y + event->height < 0 || |
| 9807 |
9853 |
| 9808 static void |
9854 static void |
| 9809 pidgin_conv_set_position_size(PidginWindow *win, int conv_x, int conv_y, |
9855 pidgin_conv_set_position_size(PidginWindow *win, int conv_x, int conv_y, |
| 9810 int conv_width, int conv_height) |
9856 int conv_width, int conv_height) |
| 9811 { |
9857 { |
| 9812 /* if the window exists, is hidden, we're saving positions, and the |
9858 /* if the window exists, is hidden, we're saving positions, and the |
| 9813 * position is sane... */ |
9859 * position is sane... */ |
| 9814 if (win && win->window && |
9860 if (win && win->window && |
| 9815 !gtk_widget_get_visible(win->window) && conv_width != 0) { |
9861 !gtk_widget_get_visible(win->window) && conv_width != 0) { |
| 9816 |
9862 |
| 9817 #ifdef _WIN32 /* only override window manager placement on Windows */ |
9863 #ifdef _WIN32 /* only override window manager placement on Windows */ |
| 9818 /* ...check position is on screen... */ |
9864 /* ...check position is on screen... */ |
| 9895 gtk_notebook_set_scrollable(GTK_NOTEBOOK(win->notebook), TRUE); |
9941 gtk_notebook_set_scrollable(GTK_NOTEBOOK(win->notebook), TRUE); |
| 9896 gtk_notebook_popup_enable(GTK_NOTEBOOK(win->notebook)); |
9942 gtk_notebook_popup_enable(GTK_NOTEBOOK(win->notebook)); |
| 9897 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), FALSE); |
9943 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), FALSE); |
| 9898 gtk_notebook_set_show_border(GTK_NOTEBOOK(win->notebook), TRUE); |
9944 gtk_notebook_set_show_border(GTK_NOTEBOOK(win->notebook), TRUE); |
| 9899 |
9945 |
| |
9946 /* TODO: figure out how to add custom stuff to the right-click menu in |
| |
9947 GtkNotebook in GTK+ 3.0 */ |
| |
9948 #if 0 |
| 9900 g_signal_connect(G_OBJECT(win->notebook), "button-press-event", |
9949 g_signal_connect(G_OBJECT(win->notebook), "button-press-event", |
| 9901 G_CALLBACK(right_click_menu_cb), win); |
9950 G_CALLBACK(right_click_menu_cb), win); |
| |
9951 #endif |
| 9902 |
9952 |
| 9903 gtk_widget_show(win->notebook); |
9953 gtk_widget_show(win->notebook); |
| 9904 |
9954 |
| 9905 g_signal_connect(G_OBJECT(win->notebook), "switch_page", |
9955 g_signal_connect(G_OBJECT(win->notebook), "switch_page", |
| 9906 G_CALLBACK(before_switch_conv_cb), win); |
9956 G_CALLBACK(before_switch_conv_cb), win); |
| 10163 gtk_event_box_set_visible_window(GTK_EVENT_BOX(ebox), FALSE); |
10213 gtk_event_box_set_visible_window(GTK_EVENT_BOX(ebox), FALSE); |
| 10164 gtk_container_add(GTK_CONTAINER(ebox), gtkconv->tabby); |
10214 gtk_container_add(GTK_CONTAINER(ebox), gtkconv->tabby); |
| 10165 g_signal_connect(G_OBJECT(ebox), "enter-notify-event", |
10215 g_signal_connect(G_OBJECT(ebox), "enter-notify-event", |
| 10166 G_CALLBACK(gtkconv_tab_set_tip), gtkconv); |
10216 G_CALLBACK(gtkconv_tab_set_tip), gtkconv); |
| 10167 |
10217 |
| 10168 if (gtkconv->tab_label->parent == NULL) { |
10218 if (gtk_widget_get_parent(gtkconv->tab_label) == NULL) { |
| 10169 /* Pack if it's a new widget */ |
10219 /* Pack if it's a new widget */ |
| 10170 gtk_box_pack_start(GTK_BOX(gtkconv->tabby), first, FALSE, FALSE, 0); |
10220 gtk_box_pack_start(GTK_BOX(gtkconv->tabby), first, FALSE, FALSE, 0); |
| 10171 gtk_box_pack_start(GTK_BOX(gtkconv->tabby), gtkconv->tab_label, TRUE, TRUE, 0); |
10221 gtk_box_pack_start(GTK_BOX(gtkconv->tabby), gtkconv->tab_label, TRUE, TRUE, 0); |
| 10172 gtk_box_pack_start(GTK_BOX(gtkconv->tabby), third, FALSE, FALSE, 0); |
10222 gtk_box_pack_start(GTK_BOX(gtkconv->tabby), third, FALSE, FALSE, 0); |
| 10173 |
10223 |
| 10422 else |
10472 else |
| 10423 return FALSE; /* carry on normally */ |
10473 return FALSE; /* carry on normally */ |
| 10424 |
10474 |
| 10425 /* Workaround for GTK+ bug # 169811 - "configure_event" is fired |
10475 /* Workaround for GTK+ bug # 169811 - "configure_event" is fired |
| 10426 * when the window is being maximized */ |
10476 * when the window is being maximized */ |
| 10427 if (gdk_window_get_state(w->window) & GDK_WINDOW_STATE_MAXIMIZED) |
10477 if (gdk_window_get_state(gtk_widget_get_window(w)) & GDK_WINDOW_STATE_MAXIMIZED) |
| 10428 return FALSE; |
10478 return FALSE; |
| 10429 |
10479 |
| 10430 /* don't save off-screen positioning */ |
10480 /* don't save off-screen positioning */ |
| 10431 if (x + event->width < 0 || |
10481 if (x + event->width < 0 || |
| 10432 y + event->height < 0 || |
10482 y + event->height < 0 || |