static GtkCellArea * create_cell_area (void) { GtkCellArea *area; GtkCellRenderer *renderer; area = gtk_cell_area_box_new (); cell_1 = renderer = gtk_cell_renderer_text_new (); gtk_cell_area_box_pack_start (GTK_CELL_AREA_BOX (area), renderer, FALSE, FALSE, FALSE); gtk_cell_area_attribute_connect (area, renderer, "text", SIMPLE_COLUMN_NAME); cell_2 = renderer = gtk_cell_renderer_pixbuf_new (); g_object_set (G_OBJECT (renderer), "xalign", 0.0F, NULL); gtk_cell_area_box_pack_start (GTK_CELL_AREA_BOX (area), renderer, TRUE, FALSE, FALSE); gtk_cell_area_attribute_connect (area, renderer, "icon-name", SIMPLE_COLUMN_ICON); cell_3 = renderer = gtk_cell_renderer_text_new (); g_object_set (G_OBJECT (renderer), "wrap-mode", PANGO_WRAP_WORD, "wrap-width", 215, NULL); gtk_cell_area_box_pack_start (GTK_CELL_AREA_BOX (area), renderer, FALSE, TRUE, FALSE); gtk_cell_area_attribute_connect (area, renderer, "text", SIMPLE_COLUMN_DESCRIPTION); return area; }
static GObject * gtk_cell_view_constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_properties) { GObject *object; GtkCellView *view; GtkCellViewPrivate *priv; object = G_OBJECT_CLASS (gtk_cell_view_parent_class)->constructor (type, n_construct_properties, construct_properties); view = GTK_CELL_VIEW (object); priv = view->priv; if (!priv->area) { priv->area = gtk_cell_area_box_new (); g_object_ref_sink (priv->area); } if (!priv->context) priv->context = gtk_cell_area_create_context (priv->area); priv->size_changed_id = g_signal_connect (priv->context, "notify", G_CALLBACK (context_size_changed_cb), view); return object; }
static void cell_area_scaffold_init (CellAreaScaffold *scaffold) { CellAreaScaffoldPrivate *priv; scaffold->priv = G_TYPE_INSTANCE_GET_PRIVATE (scaffold, TYPE_CELL_AREA_SCAFFOLD, CellAreaScaffoldPrivate); priv = scaffold->priv; priv->area = gtk_cell_area_box_new (); priv->context = gtk_cell_area_create_context (priv->area); priv->row_data = g_array_new (FALSE, FALSE, sizeof (RowData)); gtk_widget_set_has_window (GTK_WIDGET (scaffold), FALSE); gtk_widget_set_can_focus (GTK_WIDGET (scaffold), TRUE); priv->size_changed_id = g_signal_connect (priv->context, "notify", G_CALLBACK (size_changed_cb), scaffold); priv->focus_changed_id = g_signal_connect (priv->area, "focus-changed", G_CALLBACK (focus_changed_cb), scaffold); priv->add_editable_id = g_signal_connect (priv->area, "add-editable", G_CALLBACK (add_editable_cb), scaffold); priv->remove_editable_id = g_signal_connect (priv->area, "remove-editable", G_CALLBACK (remove_editable_cb), scaffold); }
/* test that new_with_area() keeps the provided area */ static void test_completion_new_with_area (void) { GtkEntryCompletion *c; GtkCellArea *area; area = gtk_cell_area_box_new (); c = gtk_entry_completion_new_with_area (area); g_assert (gtk_cell_layout_get_area (GTK_CELL_LAYOUT (c)) == area); g_object_ref_sink (c); g_object_unref (c); }
/* test that new_with_area() keeps the provided area */ static void test_column_new_with_area (void) { GtkTreeViewColumn *col; GtkCellArea *area; area = gtk_cell_area_box_new (); col = gtk_tree_view_column_new_with_area (area); g_assert (gtk_cell_layout_get_area (GTK_CELL_LAYOUT (col)) == area); g_object_ref_sink (col); g_object_unref (col); }
/* test that new_with_area() keeps the provided area */ static void test_iconview_new_with_area (void) { GtkWidget *view; GtkCellArea *area; area = gtk_cell_area_box_new (); view = gtk_icon_view_new_with_area (area); g_assert (gtk_cell_layout_get_area (GTK_CELL_LAYOUT (view)) == area); g_object_ref_sink (view); g_object_unref (view); }
/* GtkCellLayout implementation */ static GtkCellArea * gtk_cell_view_cell_layout_get_area (GtkCellLayout *layout) { GtkCellView *cellview = GTK_CELL_VIEW (layout); GtkCellViewPrivate *priv = cellview->priv; if (G_UNLIKELY (!priv->area)) { priv->area = gtk_cell_area_box_new (); g_object_ref_sink (priv->area); } return priv->area; }
/* test that g_object_new keeps the provided area */ static void test_completion_object_new (void) { GtkEntryCompletion *c; GtkCellArea *area; area = gtk_cell_area_box_new (); gtk_orientable_set_orientation (GTK_ORIENTABLE (area), GTK_ORIENTATION_HORIZONTAL); c = g_object_new (GTK_TYPE_ENTRY_COMPLETION, "cell-area", area, NULL); g_assert (gtk_cell_layout_get_area (GTK_CELL_LAYOUT (c)) == area); g_object_ref_sink (c); g_object_unref (c); }
/* test that g_object_new keeps the provided area */ static void test_column_object_new (void) { GtkTreeViewColumn *col; GtkCellArea *area; area = gtk_cell_area_box_new (); gtk_orientable_set_orientation (GTK_ORIENTABLE (area), GTK_ORIENTATION_HORIZONTAL); col = g_object_new (GTK_TYPE_TREE_VIEW_COLUMN, "cell-area", area, NULL); g_assert (gtk_cell_layout_get_area (GTK_CELL_LAYOUT (col)) == area); g_object_ref_sink (col); g_object_unref (col); }
/* test that g_object_new keeps the provided area */ static void test_cellview_object_new (void) { GtkWidget *view; GtkCellArea *area; area = gtk_cell_area_box_new (); gtk_orientable_set_orientation (GTK_ORIENTABLE (area), GTK_ORIENTATION_HORIZONTAL); view = g_object_new (GTK_TYPE_CELL_VIEW, "cell-area", area, NULL); g_assert (gtk_cell_layout_get_area (GTK_CELL_LAYOUT (view)) == area); g_object_ref_sink (view); g_object_unref (view); }
/* test that new_with_context() keeps the provided area */ static void test_cellview_new_with_context (void) { GtkWidget *view; GtkCellArea *area; GtkCellAreaContext *context; area = gtk_cell_area_box_new (); context = gtk_cell_area_create_context (area); view = gtk_cell_view_new_with_context (area, context); g_assert (gtk_cell_layout_get_area (GTK_CELL_LAYOUT (view)) == area); g_object_ref_sink (view); g_object_unref (view); }
/* test that a completion subclass keeps the provided area */ static void test_completion_subclass1 (void) { GtkEntryCompletion *c; GtkCellArea *area; subclass_init = 0; area = gtk_cell_area_box_new (); c = g_object_new (my_entry_completion_get_type (), "cell-area", area, NULL); g_assert (area == gtk_cell_layout_get_area (GTK_CELL_LAYOUT (c))); g_assert (gtk_orientable_get_orientation (GTK_ORIENTABLE (area)) == GTK_ORIENTATION_HORIZONTAL); g_object_ref_sink (c); g_object_unref (c); }
/* test that a column subclass keeps the provided area */ static void test_column_subclass1 (void) { GtkTreeViewColumn *col; GtkCellArea *area; subclass_init = 0; area = gtk_cell_area_box_new (); col = g_object_new (my_tree_view_column_get_type (), "cell-area", area, NULL); g_assert (area == gtk_cell_layout_get_area (GTK_CELL_LAYOUT (col))); g_assert (gtk_orientable_get_orientation (GTK_ORIENTABLE (area)) == GTK_ORIENTATION_HORIZONTAL); g_object_ref_sink (col); g_object_unref (col); }
/* test that a cellview subclass keeps the provided area */ static void test_cellview_subclass1 (void) { GtkWidget *view; GtkCellArea *area; subclass_init = 0; area = gtk_cell_area_box_new (); view = g_object_new (my_cell_view_get_type (), "cell-area", area, NULL); g_assert (area == gtk_cell_layout_get_area (GTK_CELL_LAYOUT (view))); g_assert (gtk_orientable_get_orientation (GTK_ORIENTABLE (area)) == GTK_ORIENTATION_HORIZONTAL); g_object_ref_sink (view); g_object_unref (view); }
/* test we get a warning if an area is provided, but ignored */ static void test_completion_subclass3 (void) { subclass_init = 1; if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) { GtkEntryCompletion *c; GtkCellArea *area; area = gtk_cell_area_box_new (); c = g_object_new (my_entry_completion_get_type (), "cell-area", area, NULL); g_assert (area == gtk_cell_layout_get_area (GTK_CELL_LAYOUT (c))); g_assert (gtk_orientable_get_orientation (GTK_ORIENTABLE (area)) == GTK_ORIENTATION_VERTICAL); g_object_ref_sink (c); g_object_unref (c); exit (0); } g_test_trap_assert_failed (); g_test_trap_assert_stderr ("*ignoring construct property*"); }
static void ring_main_window_init(RingMainWindow *win) { RingMainWindowPrivate *priv = RING_MAIN_WINDOW_GET_PRIVATE(win); gtk_widget_init_template(GTK_WIDGET(win)); /* set window icon */ GError *error = NULL; GdkPixbuf* icon = gdk_pixbuf_new_from_resource("/cx/ring/RingGnome/ring-symbol-blue", &error); if (icon == NULL) { g_debug("Could not load icon: %s", error->message); g_clear_error(&error); } else gtk_window_set_icon(GTK_WINDOW(win), icon); /* set menu icon */ GdkPixbuf* image_ring = gdk_pixbuf_new_from_resource_at_scale("/cx/ring/RingGnome/ring-symbol-blue", -1, 24, TRUE, &error); if (image_ring == NULL) { g_debug("Could not load icon: %s", error->message); g_clear_error(&error); } else gtk_image_set_from_pixbuf(GTK_IMAGE(priv->image_ring), image_ring); /* ring menu */ GtkBuilder *builder = gtk_builder_new_from_resource("/cx/ring/RingGnome/ringgearsmenu.ui"); GMenuModel *menu = G_MENU_MODEL(gtk_builder_get_object(builder, "menu")); gtk_menu_button_set_menu_model(GTK_MENU_BUTTON(priv->ring_menu), menu); g_object_unref(builder); /* settings icon */ gtk_image_set_from_icon_name(GTK_IMAGE(priv->image_settings), "emblem-system-symbolic", GTK_ICON_SIZE_LARGE_TOOLBAR); /* connect settings button signal */ g_signal_connect(priv->ring_settings, "clicked", G_CALLBACK(settings_clicked), win); /* add the call view to the main stack */ gtk_stack_add_named(GTK_STACK(priv->stack_main_view), priv->vbox_call_view, CALL_VIEW_NAME); if (has_ring_account()) { /* user has ring account, so show the call view right away */ gtk_stack_set_visible_child(GTK_STACK(priv->stack_main_view), priv->vbox_call_view); } else { /* user has to create the ring account */ show_account_creation(win); } /* init the settings views */ priv->account_settings_view = account_view_new(); gtk_stack_add_named(GTK_STACK(priv->stack_main_view), priv->account_settings_view, ACCOUNT_SETTINGS_VIEW_NAME); priv->media_settings_view = media_settings_view_new(); gtk_stack_add_named(GTK_STACK(priv->stack_main_view), priv->media_settings_view, MEDIA_SETTINGS_VIEW_NAME); priv->general_settings_view = general_settings_view_new(); gtk_stack_add_named(GTK_STACK(priv->stack_main_view), priv->general_settings_view, GENERAL_SETTINGS_VIEW_NAME); /* make the setting we will show first the active one */ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->radiobutton_general_settings), TRUE); priv->last_settings_view = priv->general_settings_view; /* connect the settings button signals to switch settings views */ g_signal_connect(priv->radiobutton_media_settings, "toggled", G_CALLBACK(show_media_settings), win); g_signal_connect(priv->radiobutton_account_settings, "toggled", G_CALLBACK(show_account_settings), win); g_signal_connect(priv->radiobutton_general_settings, "toggled", G_CALLBACK(show_general_settings), win); /* populate the notebook */ auto smart_view = recent_contacts_view_new(); gtk_container_add(GTK_CONTAINER(priv->scrolled_window_smartview), smart_view); auto contacts_view = contacts_view_new(); gtk_container_add(GTK_CONTAINER(priv->scrolled_window_contacts), contacts_view); auto history_view = history_view_new(); gtk_container_add(GTK_CONTAINER(priv->scrolled_window_history), history_view); /* welcome/default view */ priv->welcome_view = ring_welcome_view_new(); g_object_ref(priv->welcome_view); // gtk_stack_add_named(GTK_STACK(priv->stack_call_view), welcome_view, DEFAULT_VIEW_NAME); gtk_container_add(GTK_CONTAINER(priv->frame_call), priv->welcome_view); gtk_widget_show(priv->welcome_view); /* call/chat selection */ QObject::connect( RecentModel::instance().selectionModel(), &QItemSelectionModel::currentChanged, [win](const QModelIndex current, G_GNUC_UNUSED const QModelIndex & previous) { if (auto call = RecentModel::instance().getActiveCall(current)) { /* if the call is on hold, we want to put it off hold automatically * when switching to it */ if (call->state() == Call::State::HOLD) call << Call::Action::HOLD; } selection_changed(current, win); } ); /* connect to dataChanged of the RecentModel to see if we need to change the view */ QObject::connect( &RecentModel::instance(), &RecentModel::dataChanged, [win](const QModelIndex & topLeft, G_GNUC_UNUSED const QModelIndex & bottomRight, G_GNUC_UNUSED const QVector<int> & roles) { /* it is possible for dataChanged to be emitted inside of a dataChanged handler or * some other signal; since the connection is via a lambda, Qt would cause the * handler to be called directly. This is not behaviour we usually want, so we call our * function via g_idle so that it gets called after the initial handler is done. */ if (topLeft == RecentModel::instance().selectionModel()->currentIndex()) g_idle_add((GSourceFunc)selected_item_changed, win); } ); g_signal_connect(priv->button_placecall, "clicked", G_CALLBACK(search_entry_placecall), win); g_signal_connect(priv->search_entry, "activate", G_CALLBACK(search_entry_placecall), win); /* autocompletion */ priv->q_completion_model = new NumberCompletionModel(); /* autocompletion renderers */ GtkCellArea *completion_area = gtk_cell_area_box_new(); /* photo renderer */ GtkCellRenderer *renderer = gtk_cell_renderer_pixbuf_new(); gtk_cell_area_box_pack_start(GTK_CELL_AREA_BOX(completion_area), renderer, TRUE, /* expand */ TRUE, /* align */ TRUE); /* fixed size */ gtk_cell_layout_set_cell_data_func(GTK_CELL_LAYOUT(completion_area), renderer, (GtkCellLayoutDataFunc)autocompletion_photo_render, NULL, NULL); /* name renderer */ renderer = gtk_cell_renderer_text_new(); g_object_set(G_OBJECT(renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL); gtk_cell_area_box_pack_start(GTK_CELL_AREA_BOX(completion_area), renderer, TRUE, /* expand */ TRUE, /* align */ TRUE); /* fixed size */ gtk_cell_layout_set_cell_data_func(GTK_CELL_LAYOUT(completion_area), renderer, (GtkCellLayoutDataFunc)autocompletion_name_render, NULL, NULL); /* number renderer */ renderer = gtk_cell_renderer_text_new(); g_object_set(G_OBJECT(renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL); gtk_cell_area_box_pack_start(GTK_CELL_AREA_BOX(completion_area), renderer, TRUE, /* expand */ TRUE, /* align */ TRUE); /* fixed size */ gtk_cell_layout_set_cell_data_func(GTK_CELL_LAYOUT(completion_area), renderer, (GtkCellLayoutDataFunc)autocompletion_number_render, NULL, NULL); /* account renderer */ renderer = gtk_cell_renderer_text_new(); g_object_set(G_OBJECT(renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL); gtk_cell_area_box_pack_start(GTK_CELL_AREA_BOX(completion_area), renderer, TRUE, /* expand */ TRUE, /* align */ TRUE); /* fixed size */ gtk_cell_layout_set_cell_data_func(GTK_CELL_LAYOUT(completion_area), renderer, (GtkCellLayoutDataFunc)autocompletion_account_render, NULL, NULL); GtkEntryCompletion *entry_completion = gtk_entry_completion_new_with_area(completion_area); GtkQTreeModel *completion_model = gtk_q_tree_model_new( (QAbstractItemModel *)priv->q_completion_model, 1, Qt::DisplayRole, G_TYPE_STRING); gtk_entry_completion_set_model(entry_completion, GTK_TREE_MODEL(completion_model)); gtk_entry_set_completion(GTK_ENTRY(priv->search_entry), entry_completion); gtk_entry_completion_set_match_func( entry_completion, (GtkEntryCompletionMatchFunc) completion_match_func, NULL, NULL); /* connect signal to when text is entered in the entry */ g_signal_connect(priv->search_entry, "changed", G_CALLBACK(search_entry_text_changed), win); g_signal_connect(entry_completion, "match-selected", G_CALLBACK(select_autocompletion), win); /* connect to incoming call and focus */ QObject::connect( &CallModel::instance(), &CallModel::incomingCall, [=](Call* call) { CallModel::instance().selectionModel()->setCurrentIndex( CallModel::instance().getIndex(call), QItemSelectionModel::ClearAndSelect); } ); /* react to digit key press events */ g_signal_connect(win, "key-press-event", G_CALLBACK(dtmf_pressed), NULL); /* set the search entry placeholder text */ gtk_entry_set_placeholder_text(GTK_ENTRY(priv->search_entry), C_("Please try to make the translation 50 chars or less so that it fits into the layout", "Search contacts or enter number")); }