static void gtk_combo_button_destroy (GtkObject * combo_button) { gtk_widget_destroy (GTK_COMBO_BUTTON (combo_button)->popwin); gtk_widget_unref (GTK_COMBO_BUTTON (combo_button)->popwin); if (GTK_OBJECT_CLASS (parent_class)->destroy) (*GTK_OBJECT_CLASS (parent_class)->destroy) (combo_button); }
static void gtk_combo_button_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { GtkComboButton *combo_button; GtkAllocation button_allocation; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_COMBO_BUTTON (widget)); g_return_if_fail (allocation != NULL); GTK_WIDGET_CLASS (parent_class)->size_allocate (widget, allocation); combo_button = GTK_COMBO_BUTTON (widget); button_allocation = combo_button->button->allocation; /* button_allocation.width = MIN(button_allocation.width, combo_button->button->requisition.width); button_allocation.height = MIN(button_allocation.height, combo_button->button->requisition.height); button_allocation.x += (combo_button->button->allocation.width- button_allocation.width) / 2; button_allocation.y += (combo_button->button->allocation.height- button_allocation.height) / 2; */ gtk_widget_size_allocate (combo_button->button, &button_allocation); button_allocation.x=combo_button->button->allocation.x + combo_button->button->allocation.width; button_allocation.width=combo_button->arrow->requisition.width; gtk_widget_size_allocate (combo_button->arrow, &button_allocation); }
static void gtk_combo_button_size_request (GtkWidget *widget, GtkRequisition *requisition) { GtkComboButton *combo_button; GtkRequisition box_requisition; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_COMBO_BUTTON (widget)); g_return_if_fail (requisition != NULL); GTK_WIDGET_CLASS (parent_class)->size_request (widget, &box_requisition); combo_button=GTK_COMBO_BUTTON(widget); /* size = MIN(box_requisition.width, box_requisition.height); size = MIN(combo_button->button->requisition.width, box_requisition.height); size = MIN(combo_button->button->requisition.width, box_requisition.height); widget->requisition.height = size; widget->requisition.width = size + combo_button->arrow->requisition.width; */ widget->requisition.height = box_requisition.height; widget->requisition.width = box_requisition.width; }
static gint gtk_combo_button_button_press (GtkWidget * widget, GdkEvent * event, gpointer data) { GtkWidget *child; child = gtk_get_event_widget (event); if (child != widget) { while (child) { if (child == widget) return FALSE; child = child->parent; } } gtk_widget_hide (widget); gtk_grab_remove (widget); gdk_pointer_ungrab (GDK_CURRENT_TIME); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(GTK_COMBO_BUTTON(data)->arrow), FALSE); return TRUE; }
static void gtk_border_combo_realize(GtkWidget *widget) { GtkComboButton *combo; GtkBorderCombo *border_combo; GtkWidget *pixmap; GtkRequisition requisition; GdkPixmap *border_pixmap; gint i,j; gchar *border[18]; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_BORDER_COMBO (widget)); GTK_WIDGET_CLASS (parent_class)->realize (widget); combo=GTK_COMBO_BUTTON(widget); border_combo=GTK_BORDER_COMBO(widget); border_combo->table = gtk_table_new (border_combo->nrows, border_combo->ncols, TRUE); border_combo->button = (GtkWidget ***)g_malloc(border_combo->nrows*sizeof(GtkWidget **)); for(i = 0; i < border_combo->nrows; i++){ border_combo->button[i] = (GtkWidget **)g_malloc(border_combo->ncols*sizeof(GtkWidget *)); for(j = 0; j < border_combo->ncols; j++){ border_combo->button[i][j] = gtk_toggle_button_new(); gtk_button_set_relief(GTK_BUTTON(border_combo->button[i][j]), GTK_RELIEF_NONE); gtk_table_attach (GTK_TABLE(border_combo->table), border_combo->button[i][j], j, j+1, i, i+1, GTK_SHRINK, GTK_SHRINK, 0, 0); gtk_widget_set_usize(border_combo->button[i][j], 24, 24); gtk_widget_show(border_combo->button[i][j]); gtk_signal_connect (GTK_OBJECT (border_combo->button[i][j]), "toggled", (GtkSignalFunc) gtk_border_combo_update, border_combo); } } gtk_container_add(GTK_CONTAINER(GTK_COMBO_BUTTON(border_combo)->frame), border_combo->table); gtk_widget_show(border_combo->table); if(!GTK_BIN(combo->button)->child && widget->window){ border_pixmap=gdk_pixmap_create_from_xpm_d( widget->window, NULL, &(combo->button->style->bg[GTK_STATE_NORMAL]), xpm_border); pixmap=gtk_pixmap_new(border_pixmap, NULL); gtk_container_add(GTK_CONTAINER(combo->button), pixmap); gtk_widget_show(pixmap); } GTK_WIDGET_CLASS (parent_class)->size_request (widget, &requisition); /* EMPTY */ for(i=0; i<18; i++) border[i]=xpm_border[i]; pixmap=create_border_pixmap(border_combo, border); gtk_container_add(GTK_CONTAINER(border_combo->button[0][0]), pixmap); gtk_widget_show(pixmap); /* TOP */ border[4]=full; pixmap=create_border_pixmap(border_combo, border); gtk_container_add(GTK_CONTAINER(border_combo->button[0][1]), pixmap); gtk_widget_show(pixmap); /* BOTTOM */ border[4]=dotted; border[16]=full; pixmap=create_border_pixmap(border_combo, border); gtk_container_add(GTK_CONTAINER(border_combo->button[0][2]), pixmap); gtk_widget_show(pixmap); /* RIGHT */ border[16]=dotted; for(i=5; i<16; i=i+2) border[i]=side001; pixmap=create_border_pixmap(border_combo, border); gtk_container_add(GTK_CONTAINER(border_combo->button[0][3]), pixmap); gtk_widget_show(pixmap); /* LEFT */ for(i=5; i<16; i=i+2) border[i]=side100; pixmap=create_border_pixmap(border_combo, border); gtk_container_add(GTK_CONTAINER(border_combo->button[1][0]), pixmap); gtk_widget_show(pixmap); /* v101 */ for(i=5; i<16; i=i+2) border[i]=side101; pixmap=create_border_pixmap(border_combo, border); gtk_container_add(GTK_CONTAINER(border_combo->button[1][1]), pixmap); gtk_widget_show(pixmap); /* h101 */ for(i=5; i<16; i=i+2) border[i]=side000; border[4]=full; border[16]=full; pixmap=create_border_pixmap(border_combo, border); gtk_container_add(GTK_CONTAINER(border_combo->button[1][2]), pixmap); gtk_widget_show(pixmap); /* v111 */ border[4]=dotted; border[16]=dotted; for(i=5; i<16; i=i+2) border[i]=side111; pixmap=create_border_pixmap(border_combo, border); gtk_container_add(GTK_CONTAINER(border_combo->button[1][3]), pixmap); gtk_widget_show(pixmap); /* h111 */ for(i=5; i<16; i=i+2) border[i]=side000; border[4]=full; border[16]=full; border[10]=full; pixmap=create_border_pixmap(border_combo, border); gtk_container_add(GTK_CONTAINER(border_combo->button[2][0]), pixmap); gtk_widget_show(pixmap); /* CROSS */ border[4]=dotted; border[16]=dotted; for(i=5; i<16; i=i+2) border[i]=side010; pixmap=create_border_pixmap(border_combo, border); gtk_container_add(GTK_CONTAINER(border_combo->button[2][1]), pixmap); gtk_widget_show(pixmap); /* sides */ for(i=5; i<16; i=i+2) border[i]=side101; border[4]=full; border[16]=full; border[10]=dotted; pixmap=create_border_pixmap(border_combo, border); gtk_container_add(GTK_CONTAINER(border_combo->button[2][2]), pixmap); gtk_widget_show(pixmap); /* FULL */ for(i=5; i<16; i=i+2) border[i]=side111; border[4]=full; border[10]=full; border[16]=full; pixmap=create_border_pixmap(border_combo, border); gtk_container_add(GTK_CONTAINER(border_combo->button[2][3]), pixmap); gtk_widget_show(pixmap); gtk_signal_connect (GTK_OBJECT (combo->button), "clicked", (GtkSignalFunc) gtk_border_combo_update, border_combo); }
static void gtk_border_combo_update (GtkWidget * widget, GtkBorderCombo * border_combo) { gint i,j; gint focus_row = -1, focus_col = -1; gint new_row = -1, new_col = -1; gint new_selection=FALSE; gint row,column; GdkPixmap *window; row=border_combo->row; column=border_combo->column; for(i=0 ; i<border_combo->nrows; i++) for(j=0; j<border_combo->ncols; j++){ if(GTK_WIDGET_HAS_FOCUS(border_combo->button[i][j])){ focus_row=i; focus_col=j; } if(border_combo->button[i][j]->state==GTK_STATE_ACTIVE){ if(i != row || j != column){ new_selection=TRUE; new_row=i; new_col=j; } } } if(!new_selection && focus_row >= 0 && focus_col >= 0){ if(focus_row != row || focus_col != column){ new_selection = TRUE; new_row=focus_row; new_col=focus_col; } } if(new_selection){ if(row >= 0 && column >= 0){ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(border_combo->button[row][column]), FALSE); gtk_widget_queue_draw(border_combo->button[row][column]); } border_combo->row=new_row; border_combo->column=new_col; window=GTK_PIXMAP(GTK_BIN(GTK_COMBO_BUTTON(border_combo)->button) ->child)->pixmap; gdk_window_copy_area(window, widget->style->fg_gc[GTK_STATE_NORMAL], 0,0, GTK_PIXMAP(GTK_BIN(border_combo->button[new_row][new_col])->child)->pixmap, 0,0,16,16); gtk_widget_queue_draw(GTK_COMBO_BUTTON(border_combo)->button); gtk_signal_emit (GTK_OBJECT(border_combo), border_combo_signals[CHANGED], new_row * border_combo->ncols + new_col); } if(!new_selection && row >= 0 && column >= 0){ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(border_combo->button[row][column]), TRUE); gtk_widget_queue_draw(border_combo->button[row][column]); gtk_signal_emit (GTK_OBJECT(border_combo), border_combo_signals[CHANGED], row * border_combo->ncols + column); } gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(GTK_COMBO_BUTTON(border_combo)->arrow), FALSE); gtk_grab_remove(GTK_COMBO_BUTTON(border_combo)->popwin); gdk_pointer_ungrab(GDK_CURRENT_TIME); gtk_widget_hide(GTK_COMBO_BUTTON(border_combo)->popwin); return; }