comparison pidgin/gtkconv.c @ 18229:8dff6641287b

disapproval of revision '2a48d00e606eaf3e2c5c492cdee05b1a069468ee'
author Sean Egan <seanegan@gmail.com>
date Sun, 22 Jul 2007 07:02:21 +0000
parents 3449f18ff2e2
children 5733c0691c25
comparison
equal deleted inserted replaced
18228:3449f18ff2e2 18229:8dff6641287b
182 static GdkColor* generate_nick_colors(guint *numcolors, GdkColor background); 182 static GdkColor* generate_nick_colors(guint *numcolors, GdkColor background);
183 static gboolean color_is_visible(GdkColor foreground, GdkColor background, int color_contrast, int brightness_contrast); 183 static gboolean color_is_visible(GdkColor foreground, GdkColor background, int color_contrast, int brightness_contrast);
184 static void pidgin_conv_update_fields(PurpleConversation *conv, PidginConvFields fields); 184 static void pidgin_conv_update_fields(PurpleConversation *conv, PidginConvFields fields);
185 static void focus_out_from_menubar(GtkWidget *wid, PidginWindow *win); 185 static void focus_out_from_menubar(GtkWidget *wid, PidginWindow *win);
186 static void pidgin_conv_tab_pack(PidginWindow *win, PidginConversation *gtkconv); 186 static void pidgin_conv_tab_pack(PidginWindow *win, PidginConversation *gtkconv);
187 static gboolean infopane_release_cb(GtkWidget *widget, GdkEventButton *e, PidginConversation *conv);
188 static gboolean infopane_press_cb(GtkWidget *widget, GdkEventButton *e, PidginConversation *conv);
187 189
188 static GdkColor *get_nick_color(PidginConversation *gtkconv, const char *name) { 190 static GdkColor *get_nick_color(PidginConversation *gtkconv, const char *name) {
189 static GdkColor col; 191 static GdkColor col;
190 GtkStyle *style = gtk_widget_get_style(gtkconv->imhtml); 192 GtkStyle *style = gtk_widget_get_style(gtkconv->imhtml);
191 float scale; 193 float scale;
4375 } 4377 }
4376 4378
4377 static GtkWidget * 4379 static GtkWidget *
4378 setup_common_pane(PidginConversation *gtkconv) 4380 setup_common_pane(PidginConversation *gtkconv)
4379 { 4381 {
4380 GtkWidget *paned, *vbox, *frame, *imhtml_sw; 4382 GtkWidget *paned, *vbox, *frame, *imhtml_sw, *event_box;
4381 GtkCellRenderer *rend; 4383 GtkCellRenderer *rend;
4382 GtkTreePath *path; 4384 GtkTreePath *path;
4383 PurpleConversation *conv = gtkconv->active_conv; 4385 PurpleConversation *conv = gtkconv->active_conv;
4384 gboolean chat = (conv->type == PURPLE_CONV_TYPE_CHAT); 4386 gboolean chat = (conv->type == PURPLE_CONV_TYPE_CHAT);
4385 GtkPolicyType imhtml_sw_hscroll; 4387 GtkPolicyType imhtml_sw_hscroll;
4391 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); 4393 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
4392 gtk_paned_pack1(GTK_PANED(paned), vbox, TRUE, TRUE); 4394 gtk_paned_pack1(GTK_PANED(paned), vbox, TRUE, TRUE);
4393 gtk_widget_show(vbox); 4395 gtk_widget_show(vbox);
4394 4396
4395 /* Setup the info pane */ 4397 /* Setup the info pane */
4398 event_box = gtk_event_box_new();
4399 gtk_widget_show(event_box);
4396 gtkconv->infopane_hbox = gtk_hbox_new(FALSE, 0); 4400 gtkconv->infopane_hbox = gtk_hbox_new(FALSE, 0);
4397 gtk_box_pack_start(GTK_BOX(vbox), gtkconv->infopane_hbox, FALSE, FALSE, 0); 4401 gtk_box_pack_start(GTK_BOX(vbox), event_box, FALSE, FALSE, 0);
4402 gtk_container_add(GTK_CONTAINER(event_box), gtkconv->infopane_hbox);
4398 gtk_widget_show(gtkconv->infopane_hbox); 4403 gtk_widget_show(gtkconv->infopane_hbox);
4404 gtk_widget_add_events(event_box,
4405 GDK_BUTTON1_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK);
4406 g_signal_connect(G_OBJECT(event_box), "button_press_event",
4407 G_CALLBACK(infopane_press_cb), gtkconv);
4408 g_signal_connect(G_OBJECT(event_box), "button_release_event",
4409 G_CALLBACK(infopane_release_cb), gtkconv);
4410
4399 4411
4400 gtkconv->infopane = gtk_cell_view_new(); 4412 gtkconv->infopane = gtk_cell_view_new();
4401 gtkconv->infopane_model = gtk_list_store_new(NUM_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING); 4413 gtkconv->infopane_model = gtk_list_store_new(NUM_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING);
4402 gtk_cell_view_set_model(GTK_CELL_VIEW(gtkconv->infopane), 4414 gtk_cell_view_set_model(GTK_CELL_VIEW(gtkconv->infopane),
4403 GTK_TREE_MODEL(gtkconv->infopane_model)); 4415 GTK_TREE_MODEL(gtkconv->infopane_model));
7592 } 7604 }
7593 7605
7594 /* 7606 /*
7595 * THANK YOU GALEON! 7607 * THANK YOU GALEON!
7596 */ 7608 */
7609
7610 static gboolean
7611 infopane_press_cb(GtkWidget *widget, GdkEventButton *e, PidginConversation *gtkconv)
7612 {
7613 int nb_x, nb_y;
7614
7615 if (e->button != 1 || e->type != GDK_BUTTON_PRESS)
7616 return FALSE;
7617
7618 if (gtkconv->win->in_drag) {
7619 purple_debug(PURPLE_DEBUG_WARNING, "gtkconv",
7620 "Already in the middle of a window drag at tab_press_cb\n");
7621 return TRUE;
7622 }
7623
7624 gtkconv->win->in_predrag = TRUE;
7625 gtkconv->win->drag_tab = gtk_notebook_page_num(GTK_NOTEBOOK(gtkconv->win->notebook), gtkconv->tab_cont);
7626
7627 gdk_window_get_origin(gtkconv->infopane_hbox->window, &nb_x, &nb_y);
7628
7629 gtkconv->win->drag_min_x = gtkconv->infopane_hbox->allocation.x + nb_x;
7630 gtkconv->win->drag_min_y = gtkconv->infopane_hbox->allocation.y + nb_y;
7631 gtkconv->win->drag_max_x = gtkconv->infopane_hbox->allocation.width + gtkconv->win->drag_min_x;
7632 gtkconv->win->drag_max_y = gtkconv->infopane_hbox->allocation.height + gtkconv->win->drag_min_y;
7633
7634
7635 /* Connect the new motion signals. */
7636 gtkconv->win->drag_motion_signal =
7637 g_signal_connect(G_OBJECT(gtkconv->win->notebook), "motion_notify_event",
7638 G_CALLBACK(notebook_motion_cb), gtkconv->win);
7639
7640 gtkconv->win->drag_leave_signal =
7641 g_signal_connect(G_OBJECT(gtkconv->win->notebook), "leave_notify_event",
7642 G_CALLBACK(notebook_leave_cb), gtkconv->win);
7643
7644 return FALSE;
7645
7646 }
7647
7597 static gboolean 7648 static gboolean
7598 notebook_press_cb(GtkWidget *widget, GdkEventButton *e, PidginWindow *win) 7649 notebook_press_cb(GtkWidget *widget, GdkEventButton *e, PidginWindow *win)
7599 { 7650 {
7600 gint nb_x, nb_y, x_rel, y_rel; 7651 gint nb_x, nb_y, x_rel, y_rel;
7601 int tab_clicked; 7652 int tab_clicked;
7678 win->drag_leave_signal = 7729 win->drag_leave_signal =
7679 g_signal_connect(G_OBJECT(widget), "leave_notify_event", 7730 g_signal_connect(G_OBJECT(widget), "leave_notify_event",
7680 G_CALLBACK(notebook_leave_cb), win); 7731 G_CALLBACK(notebook_leave_cb), win);
7681 7732
7682 return FALSE; 7733 return FALSE;
7734 }
7735
7736 static gboolean
7737 infopane_release_cb(GtkWidget *widget, GdkEventButton *e, PidginConversation *gtkconv)
7738 {
7683 } 7739 }
7684 7740
7685 static gboolean 7741 static gboolean
7686 notebook_release_cb(GtkWidget *widget, GdkEventButton *e, PidginWindow *win) 7742 notebook_release_cb(GtkWidget *widget, GdkEventButton *e, PidginWindow *win)
7687 { 7743 {
8372 8428
8373 if (pidgin_conv_window_get_gtkconv_count(win) == 1) { 8429 if (pidgin_conv_window_get_gtkconv_count(win) == 1) {
8374 /* Er, bug in notebooks? Switch to the page manually. */ 8430 /* Er, bug in notebooks? Switch to the page manually. */
8375 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), 0); 8431 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), 0);
8376 8432
8377 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), 8433 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), FALSE);
8378 purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/tabs"));
8379 } else 8434 } else
8380 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), TRUE); 8435 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), TRUE);
8381 8436
8382 focus_gtkconv = g_list_nth_data(pidgin_conv_window_get_gtkconvs(win), 8437 focus_gtkconv = g_list_nth_data(pidgin_conv_window_get_gtkconvs(win),
8383 gtk_notebook_get_current_page(GTK_NOTEBOOK(win->notebook))); 8438 gtk_notebook_get_current_page(GTK_NOTEBOOK(win->notebook)));
8489 g_object_ref(gtkconv->tab_cont); 8544 g_object_ref(gtkconv->tab_cont);
8490 gtk_object_sink(GTK_OBJECT(gtkconv->tab_cont)); 8545 gtk_object_sink(GTK_OBJECT(gtkconv->tab_cont));
8491 8546
8492 gtk_notebook_remove_page(GTK_NOTEBOOK(win->notebook), index); 8547 gtk_notebook_remove_page(GTK_NOTEBOOK(win->notebook), index);
8493 8548
8494 /* go back to tabless if need be */ 8549 /* go back to tabless */
8495 if (pidgin_conv_window_get_gtkconv_count(win) <= 2) { 8550 if (pidgin_conv_window_get_gtkconv_count(win) <= 2) {
8496 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), 8551 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), FALSE);
8497 purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/tabs"));
8498 } 8552 }
8499 8553
8500 win->gtkconvs = g_list_remove(win->gtkconvs, gtkconv); 8554 win->gtkconvs = g_list_remove(win->gtkconvs, gtkconv);
8555
8556 if (!win->gtkconvs || !win->gtkconvs->next)
8557 gtk_notebook_set_show_tabs(win->notebook, FALSE);
8501 8558
8502 if (!win->gtkconvs && win != hidden_convwin) 8559 if (!win->gtkconvs && win != hidden_convwin)
8503 pidgin_conv_window_destroy(win); 8560 pidgin_conv_window_destroy(win);
8504 } 8561 }
8505 8562