Diff of /trunk/src/misc.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 287 by harbaum, Wed May 26 19:21:47 2010 UTC revision 288 by harbaum, Mon Jun 7 19:19:50 2010 UTC
# Line 2251  int number_editor_get_value(GtkWidget *w Line 2251  int number_editor_get_value(GtkWidget *w
2251    return number_editor_get(widget);    return number_editor_get(widget);
2252  #endif  #endif
2253  }  }
2254    
2255    #ifdef MAEMO5
2256    gboolean is_portrait() {
2257      GdkScreen *screen = gdk_screen_get_default();
2258      return (gdk_screen_get_width(screen) < gdk_screen_get_height(screen));
2259    }
2260    
2261    static
2262    void on_orientation_changed(GdkScreen *screen, gpointer userdata) {
2263      GtkWidget *vbox = GTK_WIDGET(userdata);
2264      GtkWidget *hbox0 = g_object_get_data(G_OBJECT(vbox), "hbox0");
2265      GtkWidget *hbox1 = g_object_get_data(G_OBJECT(vbox), "hbox1");
2266    
2267      GSList *xbut = g_object_get_data(G_OBJECT(vbox), "xbut");
2268      if(!xbut) return;
2269    
2270      int i;
2271      for(i=0;i<g_slist_length(xbut);i++) {
2272        GtkWidget *but = g_slist_nth_data(xbut, i);
2273        g_object_ref(G_OBJECT(but));
2274    
2275        if(is_portrait()) {
2276          /* move button from hbox0 to hbox1 */
2277          gtk_container_remove(GTK_CONTAINER(hbox0), but);
2278          gtk_box_pack_start_defaults(GTK_BOX(hbox1), but);
2279        } else {
2280          /* move button from hbox1 to hbox0 */
2281          gtk_container_remove(GTK_CONTAINER(hbox1), but);
2282          gtk_box_pack_start_defaults(GTK_BOX(hbox0), but);
2283        }
2284        g_object_unref(G_OBJECT(but));
2285      }
2286    
2287      gtk_window_resize(GTK_WINDOW(gtk_widget_get_toplevel(vbox)), 800, 800);
2288    }
2289    #endif
2290    
2291    GtkWidget *notebook_new(void) {
2292    #ifdef MAEMO5
2293      GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
2294    
2295      GtkWidget *notebook =  gtk_notebook_new();
2296    
2297      /* solution for fremantle: we use a row of ordinary buttons instead */
2298      /* of regular tabs */
2299    
2300      /* hide the regular tabs */
2301      gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), FALSE);
2302    
2303      gtk_box_pack_start_defaults(GTK_BOX(vbox), notebook);
2304    
2305      /* store a reference to the notebook in the vbox */
2306      g_object_set_data(G_OBJECT(vbox), "notebook", (gpointer)notebook);
2307    
2308      /* create hboxes for the buttons (second hbox for portrait mode) */
2309      GtkWidget *hbox0 = gtk_hbox_new(TRUE, 0);
2310      gtk_box_pack_start(GTK_BOX(vbox), hbox0, FALSE, FALSE, 0);
2311      g_object_set_data(G_OBJECT(vbox), "hbox0", (gpointer)hbox0);
2312      GtkWidget *hbox1 = gtk_hbox_new(TRUE, 0);
2313      gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE, 0);
2314      g_object_set_data(G_OBJECT(vbox), "hbox1", (gpointer)hbox1);
2315    
2316      /* this box needs to be re-arranged for portrait mode */
2317      GdkScreen *screen = gdk_screen_get_default();
2318      g_signal_connect(screen, "size-changed", G_CALLBACK(on_orientation_changed), vbox);
2319    
2320      return vbox;
2321    #else
2322      return gtk_notebook_new();
2323    #endif
2324    }
2325    
2326    GtkWidget *notebook_get_gtk_notebook(GtkWidget *notebook) {
2327    #ifdef MAEMO5
2328      return GTK_WIDGET(g_object_get_data(G_OBJECT(notebook), "notebook"));
2329    #else
2330      return notebook;
2331    #endif
2332    }
2333    
2334    #ifdef MAEMO5
2335    static void on_notebook_button_clicked(GtkWidget *button, gpointer data) {
2336      GtkNotebook *nb =
2337        GTK_NOTEBOOK(g_object_get_data(G_OBJECT(data), "notebook"));
2338    
2339      gint page = (gint)g_object_get_data(G_OBJECT(button), "page");
2340      gtk_notebook_set_current_page(nb, page);
2341    }
2342    #endif
2343    
2344    void notebook_append_page(GtkWidget *notebook,
2345                              GtkWidget *page, char *label) {
2346    #ifdef MAEMO5
2347      GtkNotebook *nb =
2348        GTK_NOTEBOOK(g_object_get_data(G_OBJECT(notebook), "notebook"));
2349    
2350      gint page_num = gtk_notebook_append_page(nb, page, gtk_label_new(label));
2351      GtkWidget *button = NULL;
2352    
2353      /* select button for page 0 by default */
2354      if(!page_num) {
2355        button = gtk_radio_button_new_with_label(NULL, label);
2356        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
2357        g_object_set_data(G_OBJECT(notebook), "group_master", (gpointer)button);
2358      } else {
2359        GtkWidget *master = g_object_get_data(G_OBJECT(notebook), "group_master");
2360        button = gtk_radio_button_new_with_label_from_widget(
2361                                     GTK_RADIO_BUTTON(master), label);
2362      }
2363    
2364      gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(button), FALSE);
2365      g_object_set_data(G_OBJECT(button), "page", (gpointer)page_num);
2366    
2367      gtk_signal_connect(GTK_OBJECT(button), "clicked",
2368               GTK_SIGNAL_FUNC(on_notebook_button_clicked), notebook);
2369    
2370      hildon_gtk_widget_set_theme_size(button,
2371               (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH));
2372    
2373      gtk_box_pack_start_defaults(
2374            GTK_BOX(g_object_get_data(G_OBJECT(notebook),
2375              (!is_portrait() || page_num < 3)?"hbox0":"hbox1")), button);
2376    
2377      /* update list of "buttons that need to be moved when switching orientation" */
2378      if(page_num >= 3) {
2379        GSList *xbut = g_object_get_data(G_OBJECT(notebook), "xbut");
2380        xbut = g_slist_append(xbut, button);
2381        g_object_set_data(G_OBJECT(notebook), "xbut", xbut);
2382      }
2383    
2384    #else
2385      gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page, gtk_label_new(label));
2386    #endif
2387    }
2388    
2389    GtkWidget *text_wrap(char *str) {
2390      GtkTextBuffer *buffer = gtk_text_buffer_new(NULL);
2391    
2392    #ifndef MAEMO5
2393      GtkWidget *view = gtk_text_view_new_with_buffer(buffer);
2394    #else
2395      GtkWidget *view = hildon_text_view_new();
2396      hildon_text_view_set_buffer(HILDON_TEXT_VIEW(view), buffer);
2397    #endif
2398    
2399      gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view), GTK_WRAP_WORD);
2400      gtk_text_view_set_editable(GTK_TEXT_VIEW(view), FALSE);
2401      gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(view), FALSE);
2402      gtk_text_view_set_justification(GTK_TEXT_VIEW(view), GTK_JUSTIFY_LEFT);
2403    
2404      gtk_text_buffer_set_text(buffer, str, -1);
2405    
2406    #ifdef MAEMO5
2407      /* in fremantle this is really tricky and we need to inherit the */
2408      /* style from the topmost window in the stack */
2409      HildonWindowStack *stack = hildon_window_stack_get_default();
2410      GList *list = hildon_window_stack_get_windows(stack);
2411      gtk_widget_set_style(view, GTK_WIDGET(list->data)->style);
2412      g_list_free(list);
2413    #else
2414      GtkStyle *style = gtk_widget_get_style(view);
2415      gtk_widget_modify_base(view, GTK_STATE_NORMAL, &style->bg[GTK_STATE_NORMAL]);
2416    #endif
2417    
2418      return view;
2419    }
2420    
2421    void text_set(GtkWidget *view, char *str) {
2422      GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
2423      gtk_text_buffer_set_text(buffer, str, -1);
2424    }
2425    

Legend:
Removed from v.287  
changed lines
  Added in v.288