summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--navit/attr_def.h1
-rw-r--r--navit/graphics.c12
-rw-r--r--navit/graphics.h2
-rw-r--r--navit/graphics/gtk_drawing_area/graphics_gtk_drawing_area.c78
-rw-r--r--navit/gui/internal/gui_internal.c38
-rw-r--r--navit/navit.c2
6 files changed, 98 insertions, 35 deletions
diff --git a/navit/attr_def.h b/navit/attr_def.h
index 85592c135..9f0aea3f0 100644
--- a/navit/attr_def.h
+++ b/navit/attr_def.h
@@ -123,6 +123,7 @@ ATTR(delay)
ATTR(lag)
ATTR(bpp)
ATTR(fullscreen)
+ATTR(windowid)
ATTR2(0x00027500,type_rel_abs_begin)
/* These attributes are int that can either hold relative *
* or absolute values. A relative value is indicated by *
diff --git a/navit/graphics.c b/navit/graphics.c
index 4073daa3b..f8605bc71 100644
--- a/navit/graphics.c
+++ b/navit/graphics.c
@@ -104,6 +104,16 @@ struct displaylist {
static void draw_circle(struct point *pnt, int diameter, int scale, int start, int len, struct point *res, int *pos, int dir);
static void graphics_process_selection(struct graphics *gra, struct displaylist *dl);
+int
+graphics_set_attr(struct graphics *gra, struct attr *attr)
+{
+ int ret=1;
+ dbg(0,"enter\n");
+ if (gra->meth.set_attr)
+ ret=gra->meth.set_attr(gra->priv, attr);
+ return ret != 0;
+}
+
void
graphics_set_rect(struct graphics *gra, struct point_rect *pr)
{
@@ -197,6 +207,8 @@ graphics_overlay_resize(struct graphics *this_, struct point *p, int w, int h, i
*/
void graphics_init(struct graphics *this_)
{
+ if (this_->gc[0])
+ return;
this_->gc[0]=graphics_gc_new(this_);
graphics_gc_set_background(this_->gc[0], &(struct color) { 0xffff, 0xefef, 0xb7b7, 0xffff});
graphics_gc_set_foreground(this_->gc[0], &(struct color) { 0xffff, 0xefef, 0xb7b7, 0xffff });
diff --git a/navit/graphics.h b/navit/graphics.h
index 8136dc03d..11c7939f9 100644
--- a/navit/graphics.h
+++ b/navit/graphics.h
@@ -68,6 +68,7 @@ struct graphics_methods {
void (*get_text_bbox)(struct graphics_priv *gr, struct graphics_font_priv *font, char *text, int dx, int dy, struct point *ret, int estimate);
void (*overlay_disable)(struct graphics_priv *gr, int disable);
void (*overlay_resize)(struct graphics_priv *gr, struct point *p, int w, int h, int alpha, int wraparound);
+ int (*set_attr)(struct graphics_priv *gr, struct attr *attr);
};
@@ -132,6 +133,7 @@ struct mapset;
struct point;
struct point_rect;
struct transformation;
+int graphics_set_attr(struct graphics *gra, struct attr *attr);
void graphics_set_rect(struct graphics *gra, struct point_rect *pr);
struct graphics *graphics_new(struct attr *parent, struct attr **attrs);
int graphics_get_attr(struct graphics *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter);
diff --git a/navit/graphics/gtk_drawing_area/graphics_gtk_drawing_area.c b/navit/graphics/gtk_drawing_area/graphics_gtk_drawing_area.c
index 35d51450f..002cb875f 100644
--- a/navit/graphics/gtk_drawing_area/graphics_gtk_drawing_area.c
+++ b/navit/graphics/gtk_drawing_area/graphics_gtk_drawing_area.c
@@ -89,6 +89,7 @@ struct graphics_priv {
struct timeval button_press[8];
struct timeval button_release[8];
int timeout;
+ int delay;
};
@@ -759,13 +760,20 @@ motion_notify(GtkWidget * widget, GdkEventMotion * event, gpointer user_data)
* * Exit navit (X pressed)
* * @param widget active widget
* * @param event the event (delete_event)
- * * @param nav our Navit context
+ * * @param user_data Pointer to private data structure
* * @returns TRUE
* */
static gint
-delete(GtkWidget *widget, GdkEventKey *event, struct navit *nav)
+delete(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
{
- navit_destroy(nav);
+ struct graphics_priv *this=user_data;
+ dbg(0,"enter this->win=%p\n",this->win);
+ if (this->delay & 2) {
+ if (this->win)
+ this->win=NULL;
+ } else {
+ navit_destroy(this->nav);
+ }
return TRUE;
}
@@ -886,6 +894,45 @@ overlay_resize(struct graphics_priv *this, struct point *p, int w, int h, int al
}
}
+static void
+get_data_window(struct graphics_priv *this, unsigned int xid)
+{
+ if (!xid)
+ this->win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ else
+ this->win = gtk_plug_new(xid);
+ if (!gtk_widget_get_parent(this->widget))
+ gtk_widget_ref(this->widget);
+ gtk_window_set_default_size(GTK_WINDOW(this->win), this->win_w, this->win_h);
+ dbg(1,"h= %i, w= %i\n",this->win_h, this->win_w);
+ gtk_window_set_title(GTK_WINDOW(this->win), "Navit");
+ gtk_window_set_wmclass (GTK_WINDOW (this->win), "navit", "Navit");
+ gtk_widget_realize(this->win);
+ if (gtk_widget_get_parent(this->widget))
+ gtk_widget_reparent(this->widget, this->win);
+ 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_sensitive(this->widget, TRUE);
+ gtk_widget_grab_focus(this->widget);
+ g_signal_connect(G_OBJECT(this->widget), "key-press-event", G_CALLBACK(keypress), this);
+ g_signal_connect(G_OBJECT(this->win), "delete_event", G_CALLBACK(delete), this);
+}
+
+static int
+set_attr(struct graphics_priv *gr, struct attr *attr)
+{
+ dbg(0,"enter\n");
+ switch (attr->type) {
+ case attr_windowid:
+ get_data_window(gr, attr->u.num);
+ return 1;
+ default:
+ return 0;
+ }
+}
+
static struct graphics_priv *
overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound)
{
@@ -954,7 +1001,8 @@ graphics_gtk_drawing_area_disable_suspend(struct window *w)
#else
dbg(1, "failed to kill() under Windows\n");
#endif
-}
+}
+
static void *
get_data(struct graphics_priv *this, char *type)
@@ -971,22 +1019,8 @@ get_data(struct graphics_priv *this, char *type)
unsigned xid = 0;
if (cp)
xid = strtol(cp, NULL, 0);
- if (!xid)
- this->win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- else
- this->win = gtk_plug_new(xid);
- gtk_window_set_default_size(GTK_WINDOW(this->win), this->win_w, this->win_h);
- dbg(1,"h= %i, w= %i\n",this->win_h, this->win_w);
- gtk_window_set_title(GTK_WINDOW(this->win), "Navit");
- gtk_window_set_wmclass (GTK_WINDOW (this->win), "navit", "Navit");
- gtk_widget_realize(this->win);
- 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_sensitive(this->widget, TRUE);
- gtk_widget_grab_focus(this->widget);
- g_signal_connect(G_OBJECT(this->widget), "key-press-event", G_CALLBACK(keypress), this);
- g_signal_connect(G_OBJECT(this->win), "delete_event", G_CALLBACK(delete), this->nav);
+ if (!(this->delay & 1))
+ get_data_window(this, xid);
this->window.fullscreen=graphics_gtk_drawing_area_fullscreen;
this->window.disable_suspend=graphics_gtk_drawing_area_disable_suspend;
this->window.priv=this;
@@ -1029,6 +1063,7 @@ static struct graphics_methods graphics_methods = {
NULL,
overlay_disable,
overlay_resize,
+ set_attr,
};
static struct graphics_priv *
@@ -1070,6 +1105,9 @@ graphics_gtk_drawing_area_new(struct navit *nav, struct graphics_methods *meth,
this->timeout=100;
if ((attr=attr_search(attrs, NULL, attr_timeout)))
this->timeout=attr->u.num;
+ this->delay=0;
+ if ((attr=attr_search(attrs, NULL, attr_delay)))
+ this->delay=attr->u.num;
this->cbl=cbl;
this->colormap=gdk_colormap_new(gdk_visual_get_system(),FALSE);
gtk_widget_set_events(draw, GDK_BUTTON_PRESS_MASK|GDK_BUTTON_RELEASE_MASK|GDK_POINTER_MOTION_MASK|GDK_KEY_PRESS_MASK);
diff --git a/navit/gui/internal/gui_internal.c b/navit/gui/internal/gui_internal.c
index 26576ea9d..ce0291f9e 100644
--- a/navit/gui/internal/gui_internal.c
+++ b/navit/gui/internal/gui_internal.c
@@ -3701,6 +3701,29 @@ static void gui_internal_button(void *data, int pressed, int button, struct poin
}
}
+static void
+gui_internal_setup_gc(struct gui_priv *this)
+{
+ struct color cbh={0x9fff,0x9fff,0x9fff,0xffff};
+ struct color cf={0xbfff,0xbfff,0xbfff,0xffff};
+ struct graphics *gra=this->gra;
+
+ if (this->background)
+ return;
+ this->background=graphics_gc_new(gra);
+ this->background2=graphics_gc_new(gra);
+ this->highlight_background=graphics_gc_new(gra);
+ graphics_gc_set_foreground(this->highlight_background, &cbh);
+ this->foreground=graphics_gc_new(gra);
+ graphics_gc_set_foreground(this->foreground, &cf);
+ this->text_background=graphics_gc_new(gra);
+ this->text_foreground=graphics_gc_new(gra);
+ graphics_gc_set_foreground(this->background, &this->background_color);
+ graphics_gc_set_foreground(this->background2, &this->background2_color);
+ graphics_gc_set_foreground(this->text_background, &this->text_background_color);
+ graphics_gc_set_foreground(this->text_foreground, &this->text_foreground_color);
+}
+
//##############################################################################################################
//# Description:
//# Comment:
@@ -3710,6 +3733,7 @@ static void gui_internal_resize(void *data, int w, int h)
{
struct gui_priv *this=data;
+ gui_internal_setup_gc(this);
if( this->root.w==w && this->root.h==h)
return;
@@ -3903,8 +3927,6 @@ static void gui_internal_keypress(void *data, char *key)
static int gui_internal_set_graphics(struct gui_priv *this, struct graphics *gra)
{
struct window *win;
- struct color cbh={0x9fff,0x9fff,0x9fff,0xffff};
- struct color cf={0xbfff,0xbfff,0xbfff,0xffff};
struct transformation *trans=navit_get_trans(this->nav);
win=graphics_get_data(gra, "window");
@@ -3923,18 +3945,6 @@ static int gui_internal_set_graphics(struct gui_priv *this, struct graphics *gra
graphics_add_callback(gra, this->motion_cb);
this->keypress_cb=callback_new_attr_1(callback_cast(gui_internal_keypress), attr_keypress, this);
graphics_add_callback(gra, this->keypress_cb);
- this->background=graphics_gc_new(gra);
- this->background2=graphics_gc_new(gra);
- this->highlight_background=graphics_gc_new(gra);
- graphics_gc_set_foreground(this->highlight_background, &cbh);
- this->foreground=graphics_gc_new(gra);
- graphics_gc_set_foreground(this->foreground, &cf);
- this->text_background=graphics_gc_new(gra);
- this->text_foreground=graphics_gc_new(gra);
- graphics_gc_set_foreground(this->background, &this->background_color);
- graphics_gc_set_foreground(this->background2, &this->background2_color);
- graphics_gc_set_foreground(this->text_background, &this->text_background_color);
- graphics_gc_set_foreground(this->text_foreground, &this->text_foreground_color);
// set fullscreen if needed
if (this->fullscreen)
diff --git a/navit/navit.c b/navit/navit.c
index 1decda785..c0849612a 100644
--- a/navit/navit.c
+++ b/navit/navit.c
@@ -243,6 +243,7 @@ navit_handle_resize(struct navit *this_, int w, int h)
sel.u.p_rect.rl.x=w;
sel.u.p_rect.rl.y=h;
transform_set_screen_selection(this_->trans, &sel);
+ graphics_init(this_->gra);
this_->ready |= 2;
graphics_set_rect(this_->gra, &sel.u.p_rect);
if (this_->ready == 3)
@@ -1297,7 +1298,6 @@ navit_init(struct navit *this_)
return;
}
dbg(2,"Initializing graphics\n");
- graphics_init(this_->gra);
dbg(2,"Setting Vehicle\n");
navit_set_vehicle(this_, this_->vehicle);
dbg(2,"Adding dynamic maps to mapset %p\n",this_->mapsets);