• Login
sketchucation logo sketchucation
  • Login
πŸ€‘ SketchPlus 1.3 | 44 Tools for $15 until June 20th Buy Now

[Code] FAQ: Detect if plugin is running on the Mac vs PC ?

Scheduled Pinned Locked Moved Developers' Forum
6 Posts 2 Posters 1.9k Views 2 Watching
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D Offline
    Dan Rathbun
    last edited by Dan Rathbun 31 Jan 2011, 05:00

    FAQ: How can I detect if my plugin is running on the Mac vs. PC ?
    from: Frequently Asked Questions (FAQ)

    The answer (as of this posting date,) has a VERY POOR example. Do not use it.
    EDIT(31MAR2012): The FAQ page has at last been updated ! (Thanks Simone.)


    DO

    It is BEST to create Boolean constants for comparison:

    <span class="syntaxdefault">MAC </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> Object</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">RUBY_PLATFORM </span><span class="syntaxkeyword">=~</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">/(</span><span class="syntaxdefault">darwin</span><span class="syntaxkeyword">)/</span><span class="syntaxdefault">i </span><span class="syntaxkeyword">?</span><span class="syntaxdefault"> true </span><span class="syntaxkeyword">;</span><span class="syntaxdefault"> false </span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> unless defined</span><span class="syntaxkeyword">?(</span><span class="syntaxdefault">MAC</span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">WIN </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> not MAC </span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> unless defined</span><span class="syntaxkeyword">?(</span><span class="syntaxdefault">WIN</span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">OSX </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> MAC unless defined</span><span class="syntaxkeyword">?(</span><span class="syntaxdefault">OSX</span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">PC </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> WIN unless defined</span><span class="syntaxkeyword">?(</span><span class="syntaxdefault">PC</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span>
    
    • You can put these outside your author module (namespace,) so they are global constants* Or within anyone of your namespaces (submodules and/or classes,) so they are local.

    Then you can just have an if statement like:

    <span class="syntaxdefault">if MAC<br />  dialog</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">show_modal</span><span class="syntaxkeyword">()<br /></span><span class="syntaxdefault">elsif WIN<br />  dialog</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">show</span><span class="syntaxkeyword">()<br />else<br /></span><span class="syntaxdefault">  UI</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">messagebox</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'Unsupported Platform for UI;;WebDialog class.'</span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">end</span>
    

    or:

    if WIN
      require('WIN32OLE')
    else
      puts("Win32OLE.so is a Windows only utility!", MB_OK)
    end
    

    DO NOT

    <span class="syntaxdefault">PLATFORM </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">Object</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">RUBY_PLATFORM </span><span class="syntaxkeyword">=~</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">/</span><span class="syntaxdefault">mswin</span><span class="syntaxkeyword">/</span><span class="syntaxdefault">i</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">?</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">;</span><span class="syntaxdefault">windows </span><span class="syntaxkeyword">;</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">((</span><span class="syntaxdefault">Object</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">RUBY_PLATFORM </span><span class="syntaxkeyword">=~</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">/</span><span class="syntaxdefault">darwin</span><span class="syntaxkeyword">/</span><span class="syntaxdefault">i</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">?</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">;</span><span class="syntaxdefault">mac </span><span class="syntaxkeyword">;</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">;</span><span class="syntaxdefault">other</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span>
    

    The example overwrites (reassigns,) the value of the standard (although deprecated,) Ruby constant PLATFORM. The example should use another constant name, perhaps PLAT_SYM.

    Note also that the example creates interned String values that will later be used for comparison.
    Ruby is extremely SLOW at String comparison.
    Observe:
    PLAT_SYM.to_s == "windows"
    Is much slower than testing a boolean constant. Reason is that Ruby must create a new String instance object, whenever it encounters a literal quoted text in your code. (In this example, Ruby must create TWO new String instance objects, one on each side of the == operator. They are abandoned, aka unreferenced, after the line is evaluated. Ruby garbage collection will clean them up eventually. Sooner if the statement was within a method.)

    It also makes no sense, to assign Symbol constants, and then convert them to a String during a boolean test. It is better (if you absolutly need to use a Symbol,) to do Symbol comparison, like:
    PLAT_SYM == :windows


    Edited and re-organized, 09 FEB 2012.


    [Comment added to bottom of FAQ webpage and Documentation Bug Report filed. ~ Dan]

    I'm not here much anymore.

    1 Reply Last reply Reply Quote 0
    • D Offline
      Dan Rathbun
      last edited by 1 Apr 2012, 01:15

      (31MAR2012): The FAQ page has at last been updated ! (Thanks Simone.)

      I'm not here much anymore.

      1 Reply Last reply Reply Quote 0
      • T Offline
        thomthom
        last edited by 2 Apr 2012, 15:10

        @dan rathbun said:

        (31MAR2012): The FAQ page has at last been updated ! (Thanks Simone.)

        What was changed? The FAQ appear to use your "DO NOT" example... πŸ˜•

        Thomas Thomassen β€” SketchUp Monkey & Coding addict
        List of my plugins and link to the CookieWare fund

        1 Reply Last reply Reply Quote 0
        • D Offline
          Dan Rathbun
          last edited by 2 Apr 2012, 16:19

          @thomthom said:

          @dan rathbun said:

          (31MAR2012): The FAQ page has at last been updated ! (Thanks Simone.)

          What was changed? The FAQ appear to use your "DO NOT" example... πŸ˜•

          He changed the name of the constant from the Ruby PLATFORM to a custom CURRENT_PLATFORM (although he refused to give up the symbol type example,) he did add a (similar) boolean example as I gave it. (or close enough.)

          I guess it is the best I can hope for.

          I'm not here much anymore.

          1 Reply Last reply Reply Quote 0
          • T Offline
            thomthom
            last edited by 2 Apr 2012, 17:19

            I don't see the point at the Symbol pattern he used...

            Thomas Thomassen β€” SketchUp Monkey & Coding addict
            List of my plugins and link to the CookieWare fund

            1 Reply Last reply Reply Quote 0
            • D Offline
              Dan Rathbun
              last edited by 2 Apr 2012, 22:48

              Neither do I, as I had said in the OP.

              I'm not here much anymore.

              1 Reply Last reply Reply Quote 0
              • 1 / 1
              • First post
                Last post
              Buy SketchPlus
              Buy SUbD
              Buy WrapR
              Buy eBook
              Buy Modelur
              Buy Vertex Tools
              Buy SketchCuisine
              Buy FormFonts

              Advertisement