Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Refactor:GTK: switch to GTK3 #1008

Open
wants to merge 7 commits into
base: trunk
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ jobs:
name: Setup requirements
command: |
bash scripts/setup_common_requirements.sh
apt-get install -y libpng-dev libfreetype6-dev libdbus-glib-1-dev libgtk2.0-dev curl
apt-get install -y libpng-dev libfreetype6-dev libdbus-glib-1-dev libgtk-3-dev curl
- run:
name: Build for Linux
command: bash scripts/build_linux.sh
Expand Down
26 changes: 14 additions & 12 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ add_module(graphics/qt5 "Qt5 libraries not found" FALSE)
add_module(graphics/svg_debug "native Glib not found" FALSE)
add_module(gui/qml "Qt Declarative not found" FALSE)
add_module(gui/qt5_qml "Qt5 Declarative not found" FALSE)
add_module(gui/gtk "GTK libs not found" FALSE)
add_module(gui/gtk "GTK3 libs not found" FALSE)
add_module(vehicle/geoclue "geoclue lib not found" FALSE)
add_module(vehicle/gpsd "gpsd lib not found" FALSE)
add_module(vehicle/gypsy "gypsy lib not found" FALSE)
Expand Down Expand Up @@ -197,6 +197,7 @@ if(PKG_CONFIG_FOUND)
set_with_reason(vehicle/gpsd_dbus "dbus-glib-1 found" TRUE ${DBUSGLIB_LIBRARIES})
endif()

pkg_check_modules(GTK3 gtk+-3.0)
pkg_check_modules(LIBLOCATION liblocation)
pkg_check_modules(LIBOSSO libosso)
# Accept even old versions of libgps, because N810 uses an old version (see #1179).
Expand Down Expand Up @@ -234,7 +235,6 @@ find_package(SDL_image)
find_library(GLES2 GLESv2)
find_package(OpenGL)
find_package(GLUT)
find_package(GTK2 2.6 COMPONENTS gtk)
find_package(Gettext)
find_package(PNG)
find_package(PythonLibs)
Expand Down Expand Up @@ -417,16 +417,17 @@ if (Qt5Positioning_FOUND)
${Qt5Positioning_LIBRARIES}
${Qt5Sensors_LIBRARIES})
endif ()
if(GTK2_FOUND)
if(GTK3_FOUND)
# Include gtk.h with "SYSTEM" to avoid GCC compiler warning for gtkitemfactory.h.
include_directories(SYSTEM ${GTK2_GTK_INCLUDE_DIR})
include_directories(${GTK2_INCLUDE_DIRS})
set(HAVE_GTK2 1)
set_with_reason(gui/gtk "GTK libs found" TRUE ${GTK2_LIBRARIES})
include_directories(SYSTEM ${GTK3_GTK_INCLUDE_DIR})
include_directories(${GTK3_INCLUDE_DIRS})
set(HAVE_GTK3 1)
set_with_reason(gui/gtk "GTK libs found" TRUE ${GTK3_LIBRARIES})
if(FREETYPE_FOUND)
set_with_reason(graphics/gtk_drawing_area "GTK libs found" TRUE ${GTK2_LIBRARIES})
set_with_reason(graphics/gtk_drawing_area "GTK3 libs found"
TRUE ${GTK3_LIBRARIES})
endif(FREETYPE_FOUND)
endif(GTK2_FOUND)
endif(GTK3_FOUND)

CHECK_LIBRARY_EXISTS(freeimage FreeImage_Load "" HAVE_FREEIMAGE)
if (USE_OPENGLES OR USE_OPENGLES2)
Expand Down Expand Up @@ -664,10 +665,11 @@ if(WIN32 OR WINCE)
set(TEXTURE_DIR textures)


if(HAVE_GTK2 AND NOT MSVC)
#GTK requires special compile flags
if(HAVE_GTK3 AND NOT MSVC)
# GTK2 requires special compile flags,
# TODO verify if still valid for GTK3
add_definitions("-mms-bitfields")
endif(HAVE_GTK2 AND NOT MSVC)
endif(HAVE_GTK3 AND NOT MSVC)
if(MSVC AND support/espeak)
add_definitions(-DPLATFORM_WINDOWS)
endif(MSVC AND support/espeak)
Expand Down
2 changes: 1 addition & 1 deletion config.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@

#cmakedefine USE_ROUTING 1

#cmakedefine HAVE_GTK2 1
#cmakedefine HAVE_GTK3 1

#cmakedefine HAVE_FONTCONFIG 1

Expand Down
2 changes: 1 addition & 1 deletion navit/graphics/gtk_drawing_area/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
set(graphics_gtk_drawing_area_LIBS ${IMLIB2_LDFLAGS} ${GTK2_LIBRARIES})
set(graphics_gtk_drawing_area_LIBS ${IMLIB2_LDFLAGS} ${GTK3_LIBRARIES})
module_add_library(graphics_gtk_drawing_area graphics_gtk_drawing_area.c)

65 changes: 45 additions & 20 deletions navit/graphics/gtk_drawing_area/graphics_gtk_drawing_area.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include <math.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include <gtk/gtkx.h>
#include <cairo.h>
#include <locale.h> /* For WIN32 */
#if !defined(GDK_KEY_Book) || !defined(GDK_Book) || !defined(GDK_Calendar)
Expand Down Expand Up @@ -612,23 +613,28 @@ static void background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc)

static void draw_mode(struct graphics_priv *gr, enum draw_mode_num mode) {
if (mode == draw_mode_end) {
GdkWindow * gdk_window = gtk_widget_get_window(gr->widget);
// Just invalidate the whole window. We could only the invalidate the area of
// graphics_priv, but that is probably not significantly faster.
gdk_window_invalidate_rect(gr->widget->window, NULL, TRUE);
gdk_window_invalidate_rect(gdk_window, NULL, TRUE);
}
}

/* Events */

static gint configure(GtkWidget * widget, GdkEventConfigure * event, gpointer user_data) {
struct graphics_priv *gra=user_data;
GtkAllocation *allocation = g_new0 (GtkAllocation, 1);

if (! gra->visible)
return TRUE;
#ifndef _WIN32
dbg(lvl_debug,"window=%lu", GDK_WINDOW_XID(widget->window));
GdkWindow * gdk_window = gtk_widget_get_window(widget);
dbg(lvl_debug,"window=%lu", GDK_WINDOW_XID(gdk_window));
#endif
gra->width=widget->allocation.width;
gra->height=widget->allocation.height;
gtk_widget_get_allocation(GTK_WIDGET(widget), allocation);
gra->width = allocation->width;
gra->height = allocation->height;
cairo_surface_t *surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, gra->width, gra->height);
if (gra->cairo)
cairo_destroy(gra->cairo);
Expand All @@ -639,30 +645,39 @@ static gint configure(GtkWidget * widget, GdkEventConfigure * event, gpointer us
return TRUE;
}

static gint expose(GtkWidget * widget, GdkEventExpose * event, gpointer user_data) {
static gboolean expose(GtkWidget *widget, cairo_t *cairo, gpointer user_data) {
struct graphics_priv *gra=user_data;
struct graphics_gc_priv *background_gc=gra->background_gc;
struct graphics_priv *overlay;
cairo_rectangle_int_t clip_rect;
GdkRectangle re;

gra->visible=1;
if (! gra->cairo)
configure(widget, NULL, user_data);

cairo_t *cairo=gdk_cairo_create(widget->window);
re.x=gtk_widget_get_allocated_width(widget);
re.y=gtk_widget_get_allocated_height(widget);
if (gdk_cairo_get_clip_rectangle (cairo, &clip_rect)) {
re.x=clip_rect.x;
re.y=clip_rect.y;
}

if (gra->p.x || gra->p.y) {
set_drawing_color(cairo, background_gc->c);
cairo_paint(cairo);
}

cairo_set_source_surface(cairo, cairo_get_target(gra->cairo), gra->p.x, gra->p.y);
cairo_paint(cairo);

overlay = gra->overlays;
while (overlay) {
overlay_draw(gra,overlay,&event->area,cairo);
overlay_draw(gra,overlay,&re,cairo);
overlay=overlay->next;
}

cairo_destroy(cairo);
// cairo_destroy(cairo);
return FALSE;
}

Expand Down Expand Up @@ -853,9 +868,10 @@ static void overlay_disable(struct graphics_priv *gr, int disabled) {
if (!gr->overlay_disabled != !disabled) {
gr->overlay_disabled=disabled;
if (gr->parent) {
GdkWindow * gdk_window = gtk_widget_get_window(gr->parent->widget);
GdkRectangle r;
overlay_rect(gr->parent, gr, &r);
gdk_window_invalidate_rect(gr->parent->widget->window, &r, TRUE);
gdk_window_invalidate_rect(gdk_window, &r, TRUE);
}
}
}
Expand Down Expand Up @@ -916,18 +932,19 @@ static void get_data_window(struct graphics_priv *this, unsigned int xid) {
else
this->win = gtk_plug_new(xid);
if (!gtk_widget_get_parent(this->widget))
gtk_widget_ref(this->widget);
g_object_ref(this->widget);
gtk_window_set_default_size(GTK_WINDOW(this->win), this->win_w, this->win_h);
dbg(lvl_debug,"h= %i, w= %i",this->win_h, this->win_w);
gtk_window_set_title(GTK_WINDOW(this->win), this->window_title);
gtk_window_set_wmclass (GTK_WINDOW (this->win), "navit", this->window_title);
gtk_widget_realize(this->win);
if (gtk_widget_get_parent(this->widget))
gtk_widget_reparent(this->widget, this->win);
else
if (gtk_widget_get_parent(this->widget)) {
gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(this->widget)), this->widget);
gtk_container_add(GTK_CONTAINER(this->win), this->widget);
} else {
gtk_container_add(GTK_CONTAINER(this->win), this->widget);
}
gtk_widget_show_all(this->win);
GTK_WIDGET_SET_FLAGS (this->widget, GTK_CAN_FOCUS);
gtk_widget_set_can_focus(this->widget, TRUE);
gtk_widget_set_sensitive(this->widget, TRUE);
gtk_widget_grab_focus(this->widget);
g_signal_connect(G_OBJECT(this->widget), "key-press-event", G_CALLBACK(keypress), this);
Expand Down Expand Up @@ -1015,8 +1032,15 @@ static void *get_data(struct graphics_priv *this, char const *type) {
if (!strcmp(type,"gtk_widget"))
return this->widget;
#ifndef _WIN32
if (!strcmp(type,"xwindow_id"))
return (void *)GDK_WINDOW_XID(this->win ? this->win->window : this->widget->window);
if (!strcmp(type,"xwindow_id")) {
if (this->win) {
GdkWindow * gdk_window = gtk_widget_get_window(this->win);
return (void *)GDK_WINDOW_XID(gdk_window);
}

GdkWindow * gdk_window = gtk_widget_get_window(this->widget);
return (void *)GDK_WINDOW_XID(gdk_window);
}
#endif
if (!strcmp(type,"window")) {
char *cp = getenv("NAVIT_XID");
Expand Down Expand Up @@ -1136,8 +1160,10 @@ static struct graphics_priv *graphics_gtk_drawing_area_new(struct navit *nav, st
else
this->window_title=g_strdup("Navit");
this->cbl=cbl;
gtk_widget_set_events(draw, GDK_BUTTON_PRESS_MASK|GDK_BUTTON_RELEASE_MASK|GDK_POINTER_MOTION_MASK|GDK_KEY_PRESS_MASK);
g_signal_connect(G_OBJECT(draw), "expose_event", G_CALLBACK(expose), this);
gtk_widget_set_events(draw,
GDK_BUTTON_PRESS_MASK|GDK_BUTTON_RELEASE_MASK|GDK_POINTER_MOTION_MASK|GDK_KEY_PRESS_MASK|GDK_SCROLL_MASK);

g_signal_connect(G_OBJECT(draw), "draw", G_CALLBACK(expose), this);
g_signal_connect(G_OBJECT(draw), "configure_event", G_CALLBACK(configure), this);
g_signal_connect(G_OBJECT(draw), "button_press_event", G_CALLBACK(button_press), this);
g_signal_connect(G_OBJECT(draw), "button_release_event", G_CALLBACK(button_release), this);
Expand All @@ -1157,7 +1183,6 @@ static struct graphics_priv *graphics_gtk_drawing_area_new(struct navit *nav, st

void plugin_init(void) {
gtk_init(&gtk_argc, &gtk_argv);
gtk_set_locale();
#ifdef HAVE_API_WIN32
setlocale(LC_NUMERIC, "C"); /* WIN32 gtk resets LC_NUMERIC */
#endif
Expand Down
4 changes: 2 additions & 2 deletions navit/gui/gtk/destination.c
Original file line number Diff line number Diff line change
Expand Up @@ -545,7 +545,7 @@ int destination_address(struct navit *nav) {
gtk_widget_grab_focus(search->entry_city);

gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 0);
keyboard=gtk_socket_new();
// keyboard=gtk_socket_new();
gtk_box_pack_end(GTK_BOX(vbox), keyboard, FALSE, FALSE, 0);
gtk_container_add(GTK_CONTAINER(window2), vbox);
#if 0
Expand All @@ -554,7 +554,7 @@ int destination_address(struct navit *nav) {
gtk_widget_show_all(window2);

#ifndef _WIN32
gtk_socket_steal(GTK_SOCKET(keyboard), spawn_xkbd("xkbd","-geometry 200x100"));
// gtk_socket_steal(GTK_SOCKET(keyboard), spawn_xkbd("xkbd","-geometry 200x100"));
#endif

country_attr=country_default();
Expand Down
2 changes: 1 addition & 1 deletion navit/gui/gtk/gui_gtk_action.c
Original file line number Diff line number Diff line change
Expand Up @@ -593,7 +593,7 @@ static struct menu_priv *gui_gtk_ui_new (struct gui_priv *this, struct menu_meth
ret->gui=this;

widget=gtk_ui_manager_get_widget(this->ui_manager, path);
GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS);
gtk_widget_set_can_focus(widget, FALSE);
if (widget_ret)
*widget_ret=widget;
if (! popup) {
Expand Down
35 changes: 18 additions & 17 deletions navit/gui/gtk/gui_gtk_poi.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

#include <stdlib.h>
#include <gtk/gtk.h>
#include <gtk/gtkx.h>
#include "gui_gtk_poi.h"
#include "popup.h"
#include "debug.h"
Expand Down Expand Up @@ -351,7 +352,7 @@ static void button_visit_clicked(GtkWidget *widget, struct gtk_poi_search *searc
* @param nav The navit instance
*/
void gtk_gui_poi(struct navit *nav) {
GtkWidget *window2,*vbox, *keyboard, *table;
GtkWidget *window2, *vbox, *keyboard, *grid;
GtkWidget *label_category, *label_poi;
GtkWidget *listbox_cat, *listbox_poi;
GtkCellRenderer *renderer;
Expand All @@ -362,10 +363,9 @@ void gtk_gui_poi(struct navit *nav) {
navit_populate_search_results_map(search->nav, NULL, NULL); /* Remove any highlighted point on the map */
window2 = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window2),_("POI search"));
gtk_window_set_wmclass (GTK_WINDOW (window2), "navit", "Navit");
gtk_window_set_default_size (GTK_WINDOW (window2),700,550);
vbox = gtk_vbox_new(FALSE, 0);
table = gtk_table_new(4, 4, FALSE);
vbox = gtk_box_new( GTK_ORIENTATION_VERTICAL, 0);
grid = gtk_grid_new();

label_category = gtk_label_new(_("Select a category"));
label_poi=gtk_label_new(_("Select a POI"));
Expand All @@ -384,13 +384,15 @@ void gtk_gui_poi(struct navit *nav) {
search->label_distance = gtk_label_new(_("Select a search radius from screen center in miles"));
}

search->entry_distance=gtk_entry_new_with_max_length(2);
//search->entry_distance=gtk_entry_new_with_max_length(2);
search->entry_distance=gtk_entry_new();
gtk_entry_set_max_length(GTK_ENTRY(search->entry_distance),2);
gtk_entry_set_text(GTK_ENTRY(search->entry_distance),"10");

search->treeview_cat=gtk_tree_view_new();
listbox_cat = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (listbox_cat), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(listbox_cat),search->treeview_cat);
gtk_container_add(GTK_CONTAINER(listbox_cat), search->treeview_cat);
search->store_cat = gtk_list_store_new (3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING);
renderer=gtk_cell_renderer_pixbuf_new();
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (search->treeview_cat),-1, _(" "), renderer, "pixbuf", 0,
Expand All @@ -405,7 +407,7 @@ void gtk_gui_poi(struct navit *nav) {
search->treeview_poi=gtk_tree_view_new();
listbox_poi = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (listbox_poi), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(listbox_poi),search->treeview_poi);
gtk_container_add(GTK_CONTAINER(listbox_poi), search->treeview_poi);
search->store_poi = gtk_list_store_new (5, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_LONG, G_TYPE_LONG);
renderer=gtk_cell_renderer_text_new();
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (search->treeview_poi),-1, _("Direction"), renderer, "text",
Expand All @@ -426,16 +428,15 @@ void gtk_gui_poi(struct navit *nav) {
gtk_widget_set_sensitive(search->button_map,FALSE);
gtk_widget_set_sensitive(search->button_destination,FALSE);

gtk_table_attach(GTK_TABLE(table), search->label_distance, 0, 1, 0, 1, 0, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), search->entry_distance, 1, 2, 0, 1, 0, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), label_category, 0, 1, 2, 3, 0, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), listbox_cat, 0, 1, 3, 4, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0);
gtk_table_attach(GTK_TABLE(table), label_poi, 1, 4, 2, 3, 0, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), listbox_poi, 1, 4, 3, 4, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0);
gtk_table_attach(GTK_TABLE(table), search->button_map, 0, 1, 4, 5, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), search->button_visit, 1, 2, 4, 5, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach(GTK_TABLE(table), search->button_destination, 2, 3, 4, 5, GTK_FILL, GTK_FILL, 0, 0);
gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 0);
gtk_grid_attach(GTK_GRID(grid), search->label_distance, 0, 0, 1, 1);
gtk_grid_attach(GTK_GRID(grid), search->entry_distance, 1, 0, 1, 1);
gtk_grid_attach(GTK_GRID(grid), label_category, 0, 2, 1, 1);
gtk_grid_attach(GTK_GRID(grid), label_poi, 1, 2, 3, 1);
gtk_grid_attach(GTK_GRID(grid), listbox_cat, 0, 3, 1, 1);
gtk_grid_attach(GTK_GRID(grid), listbox_poi, 1, 3, 3, 1);
gtk_grid_attach(GTK_GRID(grid), search->button_map, 0, 4, 1, 1);
gtk_grid_attach(GTK_GRID(grid), search->button_visit, 1, 4, 3, 1);
gtk_grid_attach(GTK_GRID(grid), search->button_destination, 2, 4, 1, 1);

g_signal_connect(G_OBJECT(search->entry_distance), "changed", G_CALLBACK(treeview_poi_reload), search);
g_signal_connect(G_OBJECT(search->button_visit), "clicked", G_CALLBACK(button_visit_clicked), search);
Expand Down
2 changes: 1 addition & 1 deletion navit/gui/gtk/gui_gtk_statusbar.c
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ gui_gtk_statusbar_new(struct gui_priv *gui) {
gtk_box_pack_start(GTK_BOX(this->hbox), this->gps, TRUE, TRUE, 2);
gtk_box_pack_start(GTK_BOX(this->hbox), gtk_vseparator_new(), TRUE, TRUE, 2);
gtk_box_pack_start(GTK_BOX(this->hbox), this->route, TRUE, TRUE, 2);
GTK_WIDGET_UNSET_FLAGS (this->hbox, GTK_CAN_FOCUS);
gtk_widget_set_can_focus(this->hbox, FALSE);

gtk_box_pack_end(GTK_BOX(gui->vbox), this->hbox, FALSE, FALSE, 0);
gtk_widget_show_all(this->hbox);
Expand Down
Loading